UNPKG

grix-connector

Version:

Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.

2 lines (1 loc) 2.36 kB
import{readdirSync as h,statSync as l}from"node:fs";import i from"node:path";import{homedir as f}from"node:os";class g{cachedEntries=null;builtAt=0;dirSignatures=new Map;inflight=null;minCheckIntervalMs;maxTTLMs;scanner;resolveLeafDirs;constructor(t,s,e){this.scanner=t,this.resolveLeafDirs=s,this.minCheckIntervalMs=e?.minCheckIntervalMs??2e3,this.maxTTLMs=e?.maxTTLMs??3e4}invalidate(){this.cachedEntries=null,this.builtAt=0,this.dirSignatures.clear()}get(){const t=Date.now();return this.cachedEntries&&t-this.builtAt<this.minCheckIntervalMs?this.cachedEntries:!this.cachedEntries||t-this.builtAt>=this.maxTTLMs?this.rebuild():this.hasSignatureChanged()?this.rebuild():this.cachedEntries}rebuild(){const t=this.scanner();return this.cachedEntries=t,this.builtAt=Date.now(),this.refreshSignatures(),t}hasSignatureChanged(){const t=this.resolveLeafDirs();if(t.length!==this.dirSignatures.size)return!0;for(const s of t){const e=this.dirSignatures.get(s);if(!e)return!0;try{if(l(s).mtimeMs!==e.mtimeMs||h(s).length!==e.childCount)return!0}catch{return!0}}return!1}refreshSignatures(){this.dirSignatures.clear();const t=this.resolveLeafDirs();for(const s of t)try{const e=l(s),r=h(s);this.dirSignatures.set(s,{mtimeMs:e.mtimeMs,childCount:r.length})}catch{}}}function y(n){const t=n||process.env.CODEX_HOME||i.join(f(),".codex"),s=[i.join(t,"sessions"),i.join(t,"archived_sessions")],e=[];for(const r of s)e.push(r),d(r,3,7,e);return e}function j(n){const t=n||i.join(f(),".claude","projects"),s=[t];try{const e=h(t,{withFileTypes:!0});for(const r of e)r.isDirectory()&&s.push(i.join(t,r.name))}catch{}return s}function v(n){const t=n||f(),s=[],e=i.join(t,".gemini","tmp");s.push(e);try{const o=h(e,{withFileTypes:!0});for(const c of o)if(c.isDirectory()){const u=i.join(e,c.name,"chats");s.push(u)}}catch{}const r=i.join(t,".qwen","projects");s.push(r);try{const o=h(r,{withFileTypes:!0});for(const c of o)if(c.isDirectory()){const u=i.join(r,c.name,"chats");s.push(u)}}catch{}const a=i.join(t,".kiro","sessions","cli");return s.push(a),s}function d(n,t,s,e){if(t<=0){e.push(n);return}let r;try{r=h(n)}catch{return}r.sort((o,c)=>c.localeCompare(o));const a=r.slice(0,s);for(const o of a){const c=i.join(n,o);try{l(c).isDirectory()&&d(c,t-1,s,e)}catch{}}}export{g as SessionScanCache,v as resolveAcpLeafDirs,j as resolveClaudeLeafDirs,y as resolveCodexLeafDirs};