bridge-agent 0.17.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ Expecting one of '${n.join("', '")}'`);let o=`${e}Help`;return this.on(o,i=>{let
|
|
|
30
30
|
`)}),e.ptySpawned=!0,console.error("[probe-pty] PTY spawn + echo OK")}catch(i){e.ptySpawnError=String(i),console.error(`[probe-pty] PTY spawn/echo FAILED: ${i}`)}let n=Date.now()-t;e.ok=e.ptyLoaded&&e.ptySpawned&&e.ptyOutputReceived;let o=`[probe-pty] ${e.ok?"PASS":"FAIL"} (${n}ms) loaded=${e.ptyLoaded} spawned=${e.ptySpawned} output=${e.ptyOutputReceived} arch=${e.arch} platform=${e.platform} pkg=${e.isPkg}`;e.ok,console.error(o),process.stdout.write(JSON.stringify(e)+`
|
|
31
31
|
`),process.exit(e.ok?0:1)}var Pl=Nt(()=>{"use strict";go()});var Ji=E(qi(),1),{program:Zf,createCommand:eh,createArgument:th,createOption:rh,CommanderError:nh,InvalidArgumentError:oh,InvalidOptionArgumentError:ih,Command:Vi,Argument:sh,Option:ah,Help:ch}=Ji.default;var Vc=require("node:http"),te=require("node:child_process"),A=require("node:fs"),Kc=require("node:crypto"),Ze=require("node:os"),Q=E(require("path"));var ws=E(require("node-pty")),Pe=require("node:fs"),Ss=E(require("node:path"));var ao=E(ls()),Ie=E(require("fs")),it=E(require("path")),us=E(require("net")),ps=require("child_process"),so=t=>t+`
|
|
32
32
|
`,ot=t=>t.replace(/[\r\n]+$/,"")+"\r",Ge=[{key:"sh",displayName:"Shell",binary:"sh",checkAuth:async()=>!0,formatInput:so},{key:"claude",displayName:"Claude Code",binary:"claude",checkAuth:async()=>ir(".claude")||Me("ANTHROPIC_API_KEY"),assignSessionId:!0,spawnArgs:["--dangerously-skip-permissions"],resumeArgs:t=>["--dangerously-skip-permissions","--resume",t],formatInput:ot,versionDirGlobs:[".local/share/claude/versions/*"],modelArgs:t=>({args:["--model",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"submit"})},{key:"codex",displayName:"Codex CLI",binary:"codex",checkAuth:async()=>Me("OPENAI_API_KEY"),spawnArgs:["-a","never","--sandbox","workspace-write"],formatInput:ot,modelArgs:t=>({args:["-m",t]})},{key:"qwen",displayName:"Qwen CLI",binary:"qwen",checkAuth:async()=>ir(".qwen"),assignSessionId:!0,spawnArgs:["--yolo"],resumeArgs:t=>["--resume",t,"--yolo"],formatInput:ot,versionDirGlobs:[".local/share/qwen/versions/*"],modelArgs:t=>({args:["-m",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"submit"})},{key:"agy",displayName:"Antigravity",binary:"agy",checkAuth:async()=>ud(".gemini/oauth_creds.json")||Me("GEMINI_API_KEY"),spawnArgs:["--dangerously-skip-permissions"],captureSessionId:!0,resumeArgs:t=>["--dangerously-skip-permissions","--conversation",t],formatInput:ot,versionDirGlobs:[".local/bin"],modelArgs:t=>({args:["--model",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"submit"})},{key:"ollama",displayName:"Ollama",binary:"ollama",checkAuth:async()=>pd(11434),formatInput:so,modelArgs:t=>({args:["run",t],prepend:!0}),modelSwitch:t=>({text:`/load ${t}`,mode:"submit"}),listModels:{args:["list"],parse:t=>t.split(`
|
|
33
|
-
`).slice(1).map(e=>e.split(/\s+/)[0]??"").filter(Boolean)}},{key:"aider",displayName:"Aider",binary:"aider",checkAuth:async()=>Me("OPENAI_API_KEY")||Me("ANTHROPIC_API_KEY"),formatInput:so,modelArgs:t=>({args:["--model",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"submit"})},{key:"kimi",displayName:"Kimi Code",binary:"kimi",checkAuth:async()=>ir(".kimi")||Me("KIMI_API_KEY"),captureSessionId:!0,spawnArgs:["--yolo"],resumeArgs:t=>["-r",t,"--yolo"],formatInput:ot,versionDirGlobs:[".local/share/uv/tools/kimi-cli/bin",".local/share/kimi/versions/*"],modelArgs:t=>({args:["-m",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"paste"})},{key:"forge",displayName:"Forge",binary:"forge",checkAuth:async()=>ir(".forge/.credentials.json")||Me("FORGE_API_KEY"),assignSessionId:!0,resumeArgs:t=>["--conversation-id",t],formatInput:ot},{key:"opencode",displayName:"OpenCode",binary:"opencode",checkAuth:async()=>ir(".config/opencode")||Me("OPENCODE_API_KEY")||Me("ANTHROPIC_API_KEY")||Me("OPENAI_API_KEY"),formatInput:ot,versionDirGlobs:[".opencode/bin"],env:{OPENCODE_CONFIG_CONTENT:'{"permission":"allow"}'},modelArgs:t=>({args:["-m",t]}),listModels:{args:["models"],parse:t=>t.split(`
|
|
33
|
+
`).slice(1).map(e=>e.split(/\s+/)[0]??"").filter(Boolean)}},{key:"aider",displayName:"Aider",binary:"aider",checkAuth:async()=>Me("OPENAI_API_KEY")||Me("ANTHROPIC_API_KEY"),formatInput:so,modelArgs:t=>({args:["--model",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"submit"})},{key:"kimi",displayName:"Kimi Code",binary:"kimi",checkAuth:async()=>ir(".kimi")||Me("KIMI_API_KEY"),captureSessionId:!0,spawnArgs:["--yolo"],resumeArgs:t=>["-r",t,"--yolo"],formatInput:ot,versionDirGlobs:[".local/share/uv/tools/kimi-cli/bin",".local/share/kimi/versions/*"],modelArgs:t=>({args:["-m",t]}),modelSwitch:t=>({text:`/model ${t}`,mode:"paste"})},{key:"forge",displayName:"Forge",binary:"forge",checkAuth:async()=>ir(".forge/.credentials.json")||Me("FORGE_API_KEY"),assignSessionId:!0,resumeArgs:t=>["--conversation-id",t],formatInput:ot,env:{CI:"1"}},{key:"opencode",displayName:"OpenCode",binary:"opencode",checkAuth:async()=>ir(".config/opencode")||Me("OPENCODE_API_KEY")||Me("ANTHROPIC_API_KEY")||Me("OPENAI_API_KEY"),formatInput:ot,versionDirGlobs:[".opencode/bin"],env:{OPENCODE_CONFIG_CONTENT:'{"permission":"allow"}'},modelArgs:t=>({args:["-m",t]}),listModels:{args:["models"],parse:t=>t.split(`
|
|
34
34
|
`).map(e=>e.trim()).filter(Boolean)}},{key:"copilot",displayName:"GitHub Copilot",binary:"copilot",checkAuth:async()=>{let t=it.default.join(process.env.HOME??"",".config","gh","hosts.yml");try{return Ie.default.existsSync(t)&&Ie.default.readFileSync(t,"utf8").includes("oauth_token:")}catch{return!1}},assignSessionId:!0,spawnArgs:["--yolo"],resumeArgs:t=>["--yolo","--session-id",t],formatInput:ot,versionDirGlobs:[".npm-global/bin/copilot",".local/share/npm/bin/copilot",".local/bin/copilot"],modelArgs:t=>({args:["--model",t]})}];var ds=process.env.HOME??"/Users/unknown";function Hr(t){try{let e=(0,ps.spawnSync)(t,["--version"],{timeout:5e3});return e.status!==0?void 0:(e.stdout??e.stderr??Buffer.from("")).toString("utf8").split(`
|
|
35
35
|
`)[0].trim()||void 0}catch{return}}function ld(t){if(!t.versionDirGlobs?.length)return[];let e=[],r=t.versionDirGlobs;for(let n of r){let o=it.default.join(ds,n.replace(/\/\*$/,""));if(n.endsWith("/*")){let i=[];try{i=Ie.default.readdirSync(o)}catch{}i.sort((s,a)=>a.localeCompare(s));for(let s of i){let a=it.default.join(o,s,t.binary);if(Ie.default.existsSync(a)){let c=Hr(a);e.push({path:a,version:c})}}}else{let i=it.default.join(ds,n);try{Ie.default.statSync(i).isDirectory()&&(i=it.default.join(i,t.binary))}catch{}if(Ie.default.existsSync(i)){let s=Hr(i);e.push({path:i,version:s})}}}return e}async function dd(t,e={}){if(e[t.key]){let n=e[t.key],o=Hr(n);if(o)return{path:n,version:o}}try{let n=await(0,ao.default)(t.binary);if(n&&Ie.default.existsSync(n)){let o=Hr(n);if(o!==void 0)return{path:n,version:o}}}catch{}let r=ld(t);for(let n of r)if(n.version!==void 0)return n;try{let n=await(0,ao.default)(t.binary);if(n)return{path:n}}catch{}throw new Error(`No working binary found for agent '${t.key}'`)}async function co(t={}){let e=[];for(let r of Ge)try{let{path:n,version:o}=await dd(r,t),s=await r.checkAuth()?"ok":"missing";e.push({key:r.key,displayName:r.displayName,binaryPath:n,authStatus:s,version:o})}catch{}return console.log("[daemon] agent.detect.done",{found:e.map(r=>r.key),missing:Ge.map(r=>r.key).filter(r=>!e.find(n=>n.key===r))}),e}function ir(t){return Ie.default.existsSync(it.default.join(process.env.HOME??"",t))}function ud(t){try{let e=it.default.join(process.env.HOME??"",t);return Ie.default.existsSync(e)&&Ie.default.statSync(e).size>0}catch{return!1}}function Me(t){return!!process.env[t]}async function pd(t){return new Promise(e=>{let r=us.default.createConnection(t,"127.0.0.1");r.setTimeout(200),r.on("connect",()=>{r.destroy(),e(!0)}),r.on("error",()=>e(!1)),r.on("timeout",()=>{r.destroy(),e(!1)})})}var fs=new Set(["PATH","HOME","USER","LOGNAME","SHELL","PWD","OLDPWD","SHLVL","TMPDIR","TMP","TEMP","TERM","COLORTERM","LANG","TZ","TERM_PROGRAM","TERM_PROGRAM_VERSION","TERM_SESSION_ID","DISPLAY","WAYLAND_DISPLAY","__CFBundleIdentifier","COMMAND_MODE","ANTHROPIC_API_KEY","OPENAI_API_KEY","GEMINI_API_KEY","KIMI_API_KEY","FORGE_API_KEY","OPENCODE_API_KEY","OLLAMA_HOST","HTTP_MODE","NODE_PATH","NODE_OPTIONS","NODE_ENV","npm_config_global_prefix","npm_config_prefix","npm_config_cache","npm_config_userconfig","PNPM_HOME","BUN_INSTALL","VOLTA_HOME","DENO_INSTALL","DENO_DIR","PYTHONPATH","PYTHONHOME","VIRTUAL_ENV","GOPATH","GOROOT","GOBIN","GOMODCACHE","GOPROXY","CARGO_HOME","RUSTUP_HOME","RUST_BACKTRACE","JAVA_HOME","JDK_HOME","JRE_HOME","ANDROID_HOME","ANDROID_SDK_ROOT","HOMEBREW_PREFIX","HOMEBREW_CELLAR","HOMEBREW_REPOSITORY","EDITOR","VISUAL","PAGER","MANPATH","INFOPATH","DBUS_SESSION_BUS_ADDRESS","XDG_SESSION_TYPE","GIT_AUTHOR_NAME","GIT_AUTHOR_EMAIL","GIT_AUTHOR_DATE","GIT_COMMITTER_NAME","GIT_COMMITTER_EMAIL","GIT_COMMITTER_DATE","RBENV_ROOT","RBENV_VERSION"]),hs=["LC_","XDG_","NVM_","PYENV_","CONDA_","ITERM_"],fd=[/_KEY$/i,/_(TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?|PRIVATE_KEY|SECRET_KEY|ACCESS_KEY|API_SECRET)$/i,/^(TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?|PRIVATE_KEY|SECRET_KEY|ACCESS_KEY|API_SECRET|KEY)$/i];if(fs.size===0&&hs.length===0)throw new Error("[daemon] env.filter.fail_fast: both ALLOWED_EXACT and ALLOWED_PREFIXES are empty \u2014 env scoping would drop everything. This is a build/config error.");function lo(t){let e={},r=[];for(let[n,o]of Object.entries(t))if(o!==void 0){if(fs.has(n)){e[n]=o;continue}if(n.startsWith("BRIDGE_")){e[n]=o;continue}if(fd.some(i=>i.test(n))){r.push(n);continue}if(hs.some(i=>n.startsWith(i))){e[n]=o;continue}r.push(n)}return e.PATH||(e.PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"),{env:e,dropped:r}}oe();var Vr=require("node:fs"),bs=E(require("node:path"));oe();var Jr=null;function hd(){return Jr!==null||(Jr=st().lifecycle),Jr}function O(t,e={},r="daemon"){let n={ts:Date.now(),event:t,component:r,pid:process.pid,...e},o=process.env.BRIDGE_REQUEST_ID;o&&(n.requestId=o);let i=JSON.stringify(n)+`
|
|
36
36
|
`;try{let s=hd();(0,Vr.mkdirSync)(bs.default.dirname(s),{recursive:!0}),(0,Vr.appendFileSync)(s,i,"utf-8")}catch{}console.log(i.trim())}var Kr=class{handles=new Map;panelMetaMap=new Map;nextInstanceId=1;lastErrors=new Map;livenessTimer=null;currentWs=null;tombstone=new Set;tombstoneRejected=0;sessionIdToAgentId=new Map;setCurrentWs(e){this.currentWs=e}getCurrentWs(){return this.currentWs}startLivenessCheck(e=6e4){this.livenessTimer||(this.livenessTimer=setInterval(()=>{for(let[r,n]of this.handles.entries()){if(n.killed)continue;let o=!1;try{o=process.kill(n.pid,0)}catch{o=!1}o||(console.warn("[daemon] pty.liveness.dead",{agentId:r,pid:n.pid}),this.handles.delete(r),this.panelMetaMap.delete(r),this.unregisterSessionId(r),n.onExit(137,"SIGKILL"))}},e),console.log("[daemon] pty.liveness.started",{intervalMs:e}))}stopLivenessCheck(){this.livenessTimer&&(clearInterval(this.livenessTimer),this.livenessTimer=null,console.log("[daemon] pty.liveness.stopped"))}spawn(e,r,n,o,i,s,a,c,l){let d=this.handles.get(e);d&&(console.warn("[daemon] pty.spawn.replace_existing",{agentId:e,oldPid:d.pid,newAgentKey:r}),this.kill(e,!0));let u=Math.max(1,Math.min(500,i)),p=Math.max(1,Math.min(500,s)),f=process.env.BRIDGE_ENV_WHITELIST!=="0",h,y=[];if(f){let T=lo(process.env);h=T.env,y=T.dropped,y.length&&console.debug("[daemon] env.filter",{agentId:e,droppedCount:y.length,dropped:y}),h.HOME===void 0&&console.warn("[daemon] env.filter.no_home",{agentId:e})}else{let T=lo(process.env);T.dropped.length&&console.debug("[daemon] env.filter.shadow",{agentId:e,wouldDrop:T.dropped}),h={...process.env}}let v={...h,TERM:"xterm-256color",COLORTERM:"truecolor"};l?.projectEnv&&Object.assign(v,l.projectEnv);let x=Ge.find(T=>T.key===r);x?.env&&Object.assign(v,x.env),l?.agentEnv&&Object.assign(v,l.agentEnv),l&&(v.BRIDGE_SERVER_URL=l.serverUrl,v.BRIDGE_TOKEN=l.token,v.BRIDGE_WORKSPACE_ID=l.workspaceId,v.BRIDGE_PROJECT_ID=l.projectId||"");let P=process.env.BRIDGE_MCP_URL;P?v.BRIDGE_MCP_URL=P:delete v.BRIDGE_MCP_URL;let C={name:"xterm-256color",cols:u,rows:p,cwd:l?.cwd,env:v},N;try{N=ws.spawn(n,o,C)}catch(T){let m=T instanceof Error?T.message:String(T);return this.lastErrors.set(e,m),console.error("[daemon] pty.spawn.failed",{agentId:e,agentKey:r,error:m}),!1}let D=this.nextInstanceId++,L={agentId:e,agentKey:r,process:N,pid:N.pid,killed:!1,instanceId:D,onExit:c};N.onData(T=>{let m=this.handles.get(e);!m||m.instanceId!==D||L.killed||a(Buffer.from(T).toString("base64"))}),N.onExit(({exitCode:T,signal:m})=>{let S=this.handles.get(e);!S||S.instanceId!==D||L.killed||L.killed||(this.handles.delete(e),this.panelMetaMap.delete(e),this.unregisterSessionId(e),console.log("[daemon] pty.exit",{agentId:e,exitCode:T,signal:m}),c(T??null,m?String(m):null))}),this.lastErrors.delete(e),this.handles.set(e,L);try{let T=sr();(0,Pe.mkdirSync)(Ss.default.dirname(T),{recursive:!0});let m=N.pid,S=[];if((0,Pe.existsSync)(T))try{let w=(0,Pe.readFileSync)(T,"utf8");w.trim()&&(S=JSON.parse(w)),Array.isArray(S)||(S=[])}catch{S=[]}S.push({agentId:e,agentKey:r,pid:N.pid,pgid:m,startedAt:Date.now(),daemonPid:process.pid});let _=T+".tmp";(0,Pe.writeFileSync)(_,JSON.stringify(S),"utf-8"),(0,Pe.renameSync)(_,T)}catch{}return console.log("[daemon] pty.spawn.success",{agentId:e,agentKey:r,args:o,cwd:l?.cwd}),!0}write(e,r,n,o){let i=this.handles.get(e);if(!i)return this.tombstone.has(e)?(this.tombstoneRejected++,!1):(console.warn("[daemon] pty.write.no_handle",{agentId:e.slice(-8),source:n,dataLength:r.length}),!1);let s=Buffer.from(r,"base64").toString(),a=Ge.find(l=>l.key===i.agentKey),c=n==="orchestrator"&&a?.formatInput&&!o?.raw?a.formatInput(s):s;return i.process.write(c),!0}kill(e,r=!1){let n=this.handles.get(e);if(!n)return;n.killed=!0,this.handles.delete(e),this.panelMetaMap.delete(e),this.unregisterSessionId(e),this.tombstone.add(e);let o=n.pid;if(r){try{process.kill(-o,"SIGTERM")}catch{n.process.kill()}setTimeout(()=>{try{process.kill(-o,"SIGKILL")}catch{}},2e3)}else try{process.kill(-o,"SIGTERM")}catch{n.process.kill()}n.onExit(null,"SIGTERM"),console.log("[daemon] pty.kill",{agentId:e,force:r})}resize(e,r,n){let o=this.handles.get(e);if(!o)return;let i=Math.max(1,Math.min(500,r)),s=Math.max(1,Math.min(500,n));o.process.resize(i,s);try{process.kill(-o.process.pid,"SIGWINCH")}catch{}O("pty.sigwinch.sent",{agentId:e,agentKey:o.agentKey,cols:i,rows:s}),(o.agentKey==="kimi"||o.agentKey==="copilot"||o.agentKey==="codex")&&setTimeout(()=>{let a=this.handles.get(e);if(!(!a||a.killed)){a.process.resize(i,s);try{process.kill(-a.process.pid,"SIGWINCH")}catch{}O("pty.sigwinch.sent.reissue",{agentId:e,agentKey:a.agentKey,cols:i,rows:s})}},80)}getLastError(e){return this.lastErrors.get(e)}killAll(){try{(0,Pe.writeFileSync)(sr(),"","utf-8")}catch{}for(let e of this.handles.values())try{process.kill(-e.pid,"SIGTERM")}catch{e.process.kill()}this.handles.clear(),this.panelMetaMap.clear(),this.sessionIdToAgentId.clear(),O("lifecycle.killAll.complete",{component:"daemon"})}getLiveAgentIds(){return[...this.handles.keys()]}setPanelMeta(e,r){this.panelMetaMap.set(e,r)}clearPanelMeta(e){this.panelMetaMap.delete(e)}getLivePanels(){let e=[];for(let r of this.handles.keys()){let n=this.panelMetaMap.get(r);n&&e.push(n)}return e}getAgentKey(e){return this.handles.get(e)?.agentKey}pause(e){let r=this.handles.get(e);r&&!r.killed&&r.process.pause()}resume(e){let r=this.handles.get(e);r&&!r.killed&&r.process.resume()}killBySessionId(e){let r=this.sessionIdToAgentId.get(e);return r&&this.handles.has(r)?(console.log("[daemon] pty.kill_by_session",{sessionId:e,existingAgentId:r}),this.kill(r,!0),this.sessionIdToAgentId.delete(e),!0):!1}registerSessionId(e,r){this.sessionIdToAgentId.set(r,e)}unregisterSessionId(e){for(let[r,n]of this.sessionIdToAgentId)if(n===e){this.sessionIdToAgentId.delete(r);return}}};go();var Lu=E(wa(),1),ju=E(sn(),1),Bu=E(jt(),1),$u=E(xo(),1),Fu=E(Po(),1),Uu=E(Mo(),1),Pa=E(dn(),1),Wu=E(Ta(),1);var b=Pa.default;var g=E(require("fs")),Cr=require("node:fs/promises"),I=E(require("path")),M=E(require("os")),ke=require("node:child_process"),Xe=require("node:crypto");var mr=["claude","codex","qwen","kimi","forge","opencode","agy","copilot"];var pn=["developer","reviewer","planner","executor","shell","runner","orchestrator"],Hh=pn.filter(t=>t!=="orchestrator"),qh=[...pn,"system"];var Aa=t=>t;var Ca=t=>t,Ra=t=>t,Na=3e3;function jo(t){return(process.env.JERICO_FEATURES??"").split(",").map(r=>r.trim()).filter(Boolean).includes(t)}var Da={developer:`# Bridge Worker \u2014 Developer Role
|
|
@@ -273,7 +273,7 @@ session. You may call bridge_get_role_prompt again at any time to refresh.
|
|
|
273
273
|
|
|
274
274
|
If bridge_get_role_prompt is unavailable, fall back to default behavior for role=${t}.`}var Hu=/^[A-Za-z0-9][A-Za-z0-9._:\/-]{0,127}$/;function $o(t){return t?Hu.test(t):!1}var qu=new Set(["claude","aider","ollama"]);function Ba(t){return qu.has(t)}var $a=E(require("os"));async function Fo(){return $a.default.platform()!=="darwin"?null:{key:"sim_ios",displayName:"iOS Simulator",binaryPath:"xcrun",authStatus:"ok"}}var dt=require("child_process"),Wo=require("fs/promises"),Ha=require("crypto"),Gt=E(require("fs")),hn=E(require("path")),Go=E(require("os"));var yr=require("child_process"),Fa=require("fs/promises"),Ua=E(require("path")),Wa=E(require("os"));async function Ju(){return new Promise(t=>{let e=(0,yr.spawn)("xcrun",["simctl","list","devices","booted","--json"],{timeout:5e3}),r="";e.stdout.on("data",n=>{r+=n.toString("utf8")}),e.on("close",n=>{if(n!==0){t(null);return}try{let o=JSON.parse(r);for(let i of Object.values(o.devices)){let s=i.find(a=>a.state==="Booted");if(s){t(s.udid);return}}t(null)}catch{t(null)}}),e.on("error",()=>t(null))})}async function Vu(){return new Promise(t=>{let e=(0,yr.spawn)("xcrun",["simctl","list","devices","available","--json"],{timeout:5e3}),r="";e.stdout.on("data",n=>{r+=n.toString("utf8")}),e.on("close",n=>{if(n!==0){t([]);return}try{let o=JSON.parse(r),i=[];for(let[s,a]of Object.entries(o.devices)){for(let c of a){let l=s.replace(/^com\.apple\.CoreSimulator\.SimRuntime\./,"").replace(/-/g,".");if(i.push(`${c.name} (${l})`),i.length>=3)break}if(i.length>=3)break}t(i)}catch{t([])}}),e.on("error",()=>t([]))})}async function Uo(t){let e=[],r=null,n=await new Promise(i=>{let s=(0,yr.spawn)("xcrun",["simctl","help"],{timeout:2e3});s.on("close",a=>i(a===0)),s.on("error",()=>i(!1)),s.stdout?.resume(),s.stderr?.resume()});e.push({id:"xcrun_exists",status:n?"pass":"fail",label:"Xcode CLI tools",detail:n?void 0:"Xcode command-line tools not found. Install them to use the iOS Simulator panel.",fixCmd:n?void 0:"xcode-select --install"});let o=!1;if(n){let i=Ua.default.join(Wa.default.homedir(),".local/bin/idb");o=await(0,Fa.access)(i).then(()=>!0).catch(()=>!1)}if(e.push({id:"idb_present",status:o?"pass":"fail",label:"idb",detail:o?void 0:"idb not found at ~/.local/bin/idb. Required for simulator automation.",fixCmd:o?void 0:"pip3 install fb-idb && brew install facebook/fb/idb-companion"}),n){let i=await new Promise(s=>{let a=(0,yr.spawn)("xcrun",["simctl","list","--json"],{timeout:5e3});a.on("close",c=>s(c===0)),a.on("error",()=>s(!1)),a.stdout?.resume(),a.stderr?.resume()});if(e.push({id:"simctl_ok",status:i?"pass":"fail",label:"simctl",detail:i?void 0:"simctl is not responding. Xcode may not be fully installed.",fixCmd:i?void 0:"sudo xcode-select --reset"}),i)if(r=await Ju(),r)e.push({id:"booted_simulator",status:"pass",label:"Booted simulator"});else{let s=await Vu();e.push({id:"booted_simulator",status:"fail",label:"Booted simulator",detail:s.length>0?`No simulator is booted. Available: ${s.join(", ")}. Open Simulator.app and boot one.`:"No simulator is booted and no devices found. Open Xcode \u2192 Window \u2192 Devices and Simulators to add one.",fixCmd:"open -a Simulator"})}else e.push({id:"booted_simulator",status:"fail",label:"Booted simulator",detail:"Skipped \u2014 previous check failed"})}else e.push({id:"simctl_ok",status:"fail",label:"simctl",detail:"Skipped \u2014 previous check failed"}),e.push({id:"booted_simulator",status:"fail",label:"Booted simulator",detail:"Skipped \u2014 previous check failed"});return{checks:e,udid:r}}var Ho=hn.default.join(Go.default.homedir(),".local/bin/idb");async function Ga(t){try{let e=await new Promise((i,s)=>{let a=(0,dt.spawn)(Ho,["describe","--udid",t,"--json"],{timeout:1e4}),c="",l="";a.stdout.on("data",d=>{c+=d.toString("utf8")}),a.stderr.on("data",d=>{l+=d.toString("utf8")}),a.on("close",d=>{d!==0?s(new Error(l||`idb exited ${d}`)):i(c)}),a.on("error",d=>s(d))}),r=JSON.parse(e),n=r.screen_dimensions?.width_points,o=r.screen_dimensions?.height_points;if(Number.isFinite(n)&&Number.isFinite(o))return{width:n,height:o}}catch(e){console.warn("[daemon] simulator.metadata.error",{udid:t,error:String(e)})}return{}}function Ku(t,e,r){let n=Buffer.from(t,"utf-8"),o=Buffer.allocUnsafe(1+n.length+4);return o.writeUInt8(n.length,0),n.copy(o,1),o.writeUInt16BE(Math.max(0,Math.min(65535,e)),1+n.length),o.writeUInt16BE(Math.max(0,Math.min(65535,r)),1+n.length+2),o}function Yu(t,e){let r=`/tmp/sim_frame_${e}.png`,n=`/tmp/sim_frame_${e}.jpg`;return new Promise(o=>{let i=(0,dt.spawn)("xcrun",["simctl","io",t,"screenshot",r],{stdio:["ignore","ignore","ignore"]});i.on("close",async s=>{if(s!==0){o(null);return}try{await new Promise((a,c)=>{let l=(0,dt.spawn)("sips",["-s","format","jpeg",r,"--out",n],{stdio:["ignore","ignore","ignore"]});l.on("close",d=>d===0?a():c(new Error(`sips exited ${d}`))),l.on("error",d=>c(d))}),o(await(0,Wo.readFile)(n))}catch{try{o(await(0,Wo.readFile)(r))}catch{o(null)}}}),i.on("error",()=>o(null))})}function fn(t,e){return new Promise((r,n)=>{let o=(0,dt.spawn)(Ho,[...e,"--udid",t],{timeout:15e3}),i="";o.stderr.on("data",s=>{i+=s.toString("utf8")}),o.on("close",s=>{s!==0?n(new Error(i||`idb exited ${s}`)):r()}),o.on("error",s=>n(s))})}var gn=class{sessions=new Map;pendingSubscriptions=new Set;pendingUdids=new Map;pendingDaemonBootedUdids=new Set;bootedUdidsByAgent=new Map;ws=null;daemonId;installProc=new Map;cancelledInstalls=new Set;constructor(e){this.daemonId=e}updateWs(e){this.ws=e}async start(e){if(this.sessions.has(e)){console.warn("[daemon] simulator.start: session already exists",{agentId:e});return}let{checks:r,udid:n}=await Uo(e);if(this.sendSimHealth(e,r),r.find(u=>u.status==="fail")){if(this.bootedUdidsByAgent.has(e)){let u=this.bootedUdidsByAgent.get(e);this.pendingDaemonBootedUdids.delete(u),this.bootedUdidsByAgent.delete(e)}return}if(!n){this.sendError(e,"SPAWN_FAILED","No booted iOS simulator found");return}let i=[...this.sessions.values()].find(u=>u.udid===n);if(i){this.sendError(e,"DUPLICATE_SIMULATOR",`Simulator already attached as agent ${i.agentId}`,{existingAgentId:i.agentId,udid:n});return}let s=this.pendingUdids.get(n);if(s&&s!==e){this.sendError(e,"DUPLICATE_SIMULATOR",`Simulator already being attached as agent ${s}`,{existingAgentId:s,udid:n});return}this.pendingUdids.set(n,e);let a=this.pendingSubscriptions.has(e);this.pendingSubscriptions.delete(e);let c=await Ga(n);c.width!=null&&c.height!=null&&console.log("[daemon] simulator.metadata",{agentId:e,udid:n,logicalWidth:c.width,logicalHeight:c.height});let l=this.pendingDaemonBootedUdids.has(n);l&&(this.pendingDaemonBootedUdids.delete(n),this.bootedUdidsByAgent.delete(e));let d={agentId:e,udid:n,frameInterval:null,capturing:!1,subscribed:a,logicalWidth:c.width,logicalHeight:c.height,lastDescribeAt:Date.now(),daemonBooted:l};if(this.sessions.set(e,d),this.pendingUdids.delete(n),d.frameInterval=setInterval(async()=>{if(!(!d.subscribed||d.capturing)&&!(!this.ws||this.ws.bufferedAmount>256*1024)){d.capturing=!0;try{Date.now()-d.lastDescribeAt>=5e3&&(d.lastDescribeAt=Date.now(),Ga(n).then(p=>{p.width!=null&&p.height!=null&&(p.width!==d.logicalWidth||p.height!==d.logicalHeight)&&(console.log("[daemon] simulator.metadata.update",{agentId:e,udid:n,from:{logicalWidth:d.logicalWidth,logicalHeight:d.logicalHeight},to:p}),d.logicalWidth=p.width,d.logicalHeight=p.height)}).catch(()=>{}));let u=await Yu(n,e);if(u&&this.ws&&this.ws.readyState===b.OPEN){let p=d.logicalWidth??0,f=d.logicalHeight??0,h=Ku(e,p,f);this.ws.send(Buffer.concat([h,u]),{binary:!0})}}catch(u){console.error("[daemon] simulator.capture.error",{agentId:e,error:String(u)})}finally{d.capturing=!1}}},200),this.ws&&this.ws.readyState===b.OPEN){let u=(0,Ha.randomUUID)();this.ws.send(JSON.stringify({type:"session_started",agentId:e,sessionId:u})),this.ws.send(JSON.stringify({type:"agent_spawned",agentId:e,agentKey:"sim_ios",daemonId:this.daemonId}))}console.log("[daemon] simulator.started",{agentId:e,udid:n})}stop(e){let r=this.installProc.get(e);r&&(console.log("[daemon] simulator.install.cancelled",{agentId:e}),this.cancelledInstalls.add(e),r.kill("SIGTERM"),this.installProc.delete(e));let n=this.sessions.get(e);if(!n){for(let[s,a]of this.pendingUdids)if(a===e){this.pendingUdids.delete(s);break}return}n.frameInterval&&clearInterval(n.frameInterval);let o=n.udid,i=n.daemonBooted;this.sessions.delete(e),this.pendingUdids.delete(o),this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"exit",agentId:e,exitCode:0,signal:null})),console.log("[daemon] simulator.stop",{agentId:e,udid:o,daemonBooted:i}),i&&(0,dt.spawn)("xcrun",["simctl","shutdown",o],{stdio:"ignore"}).on("error",s=>console.warn("[daemon] simulator.shutdown.error",{udid:o,err:String(s)}))}stopAll(){for(let e of[...this.installProc.keys()])this.stop(e);for(let e of[...this.sessions.keys()])this.stop(e)}subscribe(e){let r=this.sessions.get(e);r&&(r.subscribed=!0)}unsubscribe(e){let r=this.sessions.get(e);r&&(r.subscribed=!1)}async handle(e){let r=this.sessions.get(e.agentId);if(e.type==="sim_subscribe"){r?this.subscribe(e.agentId):this.pendingSubscriptions.add(e.agentId);return}if(e.type==="sim_unsubscribe"){this.pendingSubscriptions.delete(e.agentId),r&&this.unsubscribe(e.agentId);return}if(e.type==="sim_healthcheck"){let{checks:n}=await Uo(e.agentId);this.sendSimHealth(e.agentId,n);return}if(e.type==="sim_install_run"){await this.handleSimInstallRun(e.agentId);return}if(e.type==="sim_install_cancel"){this.handleSimInstallCancel(e.agentId);return}if(!r){console.warn("[daemon] simulator.handle: no session",{agentId:e.agentId,type:e.type});return}try{switch(e.type){case"sim_tap":{await fn(r.udid,["ui","tap",String(e.x),String(e.y)]);break}case"sim_swipe":{await fn(r.udid,["ui","swipe",String(e.x1),String(e.y1),String(e.x2),String(e.y2),"--duration",String(e.duration??.5)]);break}case"sim_key":{await fn(r.udid,["ui","text",e.key]);break}case"sim_button":{console.log("[daemon] simulator.button.start",{agentId:e.agentId,button:e.button,udid:r.udid}),await fn(r.udid,["ui","button",e.button]),console.log("[daemon] simulator.button.done",{agentId:e.agentId,button:e.button});break}case"sim_get_source":{let n=await new Promise((o,i)=>{let s=(0,dt.spawn)(Ho,["ui","describe-all","--udid",r.udid],{timeout:15e3}),a="",c="";s.stdout.on("data",l=>{a+=l.toString("utf8")}),s.stderr.on("data",l=>{c+=l.toString("utf8")}),s.on("close",l=>{l!==0?i(new Error(c||`idb exited ${l}`)):o(a)}),s.on("error",l=>i(l))});this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"sim_source",agentId:e.agentId,source:n}));break}}}catch(n){console.error("[daemon] simulator.handle.error",{agentId:e.agentId,type:e.type,error:String(n)})}}sendError(e,r,n,o){this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"error",code:r,message:n,agentId:e,...o}))}sendSimHealth(e,r){this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"sim_health",agentId:e,checks:r}))}resolveSimInstallScript(){let e=process.env.BRIDGE_SIM_INSTALL_SCRIPT;if(e)return e;let r=hn.default.join(Go.default.homedir(),".bridge/install-sim-prereqs.sh");if(Gt.default.existsSync(r))return r;let n=hn.default.join(__dirname,"../../../scripts/install-sim-prereqs.sh");return Gt.default.existsSync(n)?n:null}async handleSimInstallRun(e){if(this.installProc.has(e)){this.sendInstallProgress(e,{step:"error",error:"already installing"});return}this.cancelledInstalls.delete(e);let r=this.resolveSimInstallScript();if(!r){this.sendInstallProgress(e,{step:"error",error:"install script not found"});return}try{Gt.default.accessSync(r,Gt.default.constants.F_OK|Gt.default.constants.X_OK)}catch{this.sendInstallProgress(e,{step:"error",error:`install script not found at ${r}`});return}let n=(0,dt.spawn)("bash",["-lc",r],{timeout:6e5});this.installProc.set(e,n);let o="pre_check",i="",s="";n.stdout?.on("data",a=>{i+=a.toString("utf8");let c;for(;(c=i.indexOf(`
|
|
275
275
|
`))!==-1;){let l=i.slice(0,c);if(i=i.slice(c+1),!!l)if(l.startsWith("STEP:"))o=l.slice(5).trim(),this.sendInstallProgress(e,{step:o});else if(l.startsWith("BOOTED_UDID:")){let d=l.slice(12).trim();this.pendingDaemonBootedUdids.add(d),this.bootedUdidsByAgent.set(e,d)}else this.sendInstallProgress(e,{stream:"stdout",line:l})}}),n.stderr?.on("data",a=>{s+=a.toString("utf8");let c;for(;(c=s.indexOf(`
|
|
276
|
-
`))!==-1;){let l=s.slice(0,c);s=s.slice(c+1),l&&this.sendInstallProgress(e,{stream:"stderr",line:l})}}),n.on("close",a=>{if(this.installProc.delete(e),a!==0){let l=this.bootedUdidsByAgent.get(e);l&&(this.pendingDaemonBootedUdids.delete(l),this.bootedUdidsByAgent.delete(e))}if(i){let l=i;i="",l.startsWith("STEP:")?(o=l.slice(5).trim(),this.sendInstallProgress(e,{step:o})):this.sendInstallProgress(e,{stream:"stdout",line:l})}if(s){let l=s;s="",this.sendInstallProgress(e,{stream:"stderr",line:l})}let c=this.cancelledInstalls.has(e);this.cancelledInstalls.delete(e),!c&&(a===0?this.sendInstallProgress(e,{step:"done",exitCode:0}):this.sendInstallProgress(e,{step:"error",exitCode:a??void 0,error:`install script exited with code ${a}`}))}),n.on("error",a=>{this.installProc.delete(e);let c=this.bootedUdidsByAgent.get(e);c&&(this.pendingDaemonBootedUdids.delete(c),this.bootedUdidsByAgent.delete(e));let l=this.cancelledInstalls.has(e);this.cancelledInstalls.delete(e),!l&&this.sendInstallProgress(e,{step:"error",error:String(a)})})}handleSimInstallCancel(e){let r=this.installProc.get(e);if(!r)return;this.cancelledInstalls.add(e);let n=this.bootedUdidsByAgent.get(e);n&&(this.pendingDaemonBootedUdids.delete(n),this.bootedUdidsByAgent.delete(e)),r.kill("SIGTERM"),this.installProc.delete(e),this.sendInstallProgress(e,{step:"error",error:"cancelled by user"})}sendInstallProgress(e,r){this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"sim_install_progress",agentId:e,...r}))}};Tt();oe();var tc=E(require("path")),Zu="0.17.
|
|
276
|
+
`))!==-1;){let l=s.slice(0,c);s=s.slice(c+1),l&&this.sendInstallProgress(e,{stream:"stderr",line:l})}}),n.on("close",a=>{if(this.installProc.delete(e),a!==0){let l=this.bootedUdidsByAgent.get(e);l&&(this.pendingDaemonBootedUdids.delete(l),this.bootedUdidsByAgent.delete(e))}if(i){let l=i;i="",l.startsWith("STEP:")?(o=l.slice(5).trim(),this.sendInstallProgress(e,{step:o})):this.sendInstallProgress(e,{stream:"stdout",line:l})}if(s){let l=s;s="",this.sendInstallProgress(e,{stream:"stderr",line:l})}let c=this.cancelledInstalls.has(e);this.cancelledInstalls.delete(e),!c&&(a===0?this.sendInstallProgress(e,{step:"done",exitCode:0}):this.sendInstallProgress(e,{step:"error",exitCode:a??void 0,error:`install script exited with code ${a}`}))}),n.on("error",a=>{this.installProc.delete(e);let c=this.bootedUdidsByAgent.get(e);c&&(this.pendingDaemonBootedUdids.delete(c),this.bootedUdidsByAgent.delete(e));let l=this.cancelledInstalls.has(e);this.cancelledInstalls.delete(e),!l&&this.sendInstallProgress(e,{step:"error",error:String(a)})})}handleSimInstallCancel(e){let r=this.installProc.get(e);if(!r)return;this.cancelledInstalls.add(e);let n=this.bootedUdidsByAgent.get(e);n&&(this.pendingDaemonBootedUdids.delete(n),this.bootedUdidsByAgent.delete(e)),r.kill("SIGTERM"),this.installProc.delete(e),this.sendInstallProgress(e,{step:"error",error:"cancelled by user"})}sendInstallProgress(e,r){this.ws&&this.ws.readyState===b.OPEN&&this.ws.send(JSON.stringify({type:"sim_install_progress",agentId:e,...r}))}};Tt();oe();var tc=E(require("path")),Zu="0.17.1",ec;function ie(){return Zu}function ue(){if(ec)return ec;if(process.pkg!==void 0)return process.execPath;let t=[...process.env.npm_config_global_prefix?[tc.default.join(process.env.npm_config_global_prefix,"lib","node_modules","bridge-agent","dist","index.js")]:[],...process.argv[1]?[process.argv[1]]:[],process.execPath];for(let e of t)try{return require("node:fs").realpathSync(e)}catch{}return process.execPath}var Yo=require("fs"),Ko=E(require("path")),nc=E(require("os"));var rc=require("node:fs"),kn=class{cache=new Map;get(e,r){let n=this.cache.get(e);if(n&&n.mtimeMs===r.mtimeMs&&n.size===r.size)return n.value}set(e,r,n){this.cache.set(e,{mtimeMs:r.mtimeMs,size:r.size,value:n})}invalidate(e){this.cache.delete(e)}clear(){this.cache.clear()}prune(e){for(let r of this.cache.keys())e.has(r)||this.cache.delete(r)}prunePrefix(e,r){for(let n of this.cache.keys())n.startsWith(e)&&!r.has(n)&&this.cache.delete(n)}get size(){return this.cache.size}},se=new kn,om=new kn;async function Ne(t){try{let e=await rc.promises.stat(t);return{mtimeMs:e.mtimeMs,size:e.size}}catch{return null}}function pt(){return new Promise(t=>setImmediate(t))}var ep=2e5,tp="ctx:";async function rp(t){let e=Ko.default.join(nc.default.homedir(),".claude","projects");try{let r=await Yo.promises.readdir(e,{withFileTypes:!0});for(let n of r){if(!n.isDirectory())continue;let o=Ko.default.join(e,n.name,`${t}.jsonl`);if(await Ne(o))return o}}catch{}}async function np(t,e){let r=await Ne(t);if(!r)return null;let n=tp+t,o=se.get(n,r);if(o!==void 0)return o;await pt();try{let s=(await Yo.promises.readFile(t,"utf-8")).trim().split(`
|
|
277
277
|
`);for(let a=s.length-1;a>=0;a--){let c=s[a]?.trim();if(c)try{let l=JSON.parse(c),d=l.message?.usage??l.usage;if(!d||typeof d!="object")continue;let u=d,p=(u.input_tokens??0)+(u.cache_creation_input_tokens??0)+(u.cache_read_input_tokens??0);if(p===0)continue;let h={usedPct:Math.min(100,Math.round(p/ep*100)),usedTokens:p};return se.set(n,r,h),h}catch{continue}}}catch{}return null}function zo(t,e,r){let n,o=-1,i=!0,s=async()=>{if(i)try{if(n||(n=await rp(e)),!n)return;let l=await np(n,o);if(!l||l.usedTokens===o)return;o=l.usedTokens,i&&r(t,l.usedPct,l.usedTokens)}catch{}},a=setTimeout(()=>{s()},5e3),c=setInterval(()=>{s()},6e4);return()=>{i=!1,clearTimeout(a),clearInterval(c)}}var vr=E(require("node:fs")),Jt=E(require("node:path")),ic=E(require("node:os")),sc=Jt.default.join(ic.default.homedir(),".claude","projects"),op=30,Sr=65536,ip=120;function ac(t){return t.replace(/[\/.]/g,"-")}async function cc(t){let e=ac(t),r=Jt.default.join(sc,e),n;try{n=await vr.default.promises.readdir(r,{withFileTypes:!0})}catch{return[]}let o=[];for(let a of n)if(!(!a.isFile()||!a.name.endsWith(".jsonl")))try{let c=await vr.default.promises.stat(Jt.default.join(r,a.name));o.push({name:a.name,mtimeMs:c.mtimeMs,mtime:c.mtime,size:c.size})}catch{}o.sort((a,c)=>c.mtimeMs-a.mtimeMs);let i=o.slice(0,op),s=[];for(let a of i){let c=a.name.replace(/\.jsonl$/,""),l=await sp(Jt.default.join(r,a.name),a.size);s.push({sessionId:c,cwd:t,title:l??null,lastActivity:a.mtime.toISOString()})}return s}function En(t,e){let r=[`"${e}":"`,`"${e}": "`],n;for(let o of r){let i=0;for(;;){let s=t.indexOf(o,i);if(s<0)break;let a=s+o.length,c=a,l=!1;for(;c<t.length;){let u=t[c];if(l){l=!1,c++;continue}if(u==="\\"){l=!0,c++;continue}if(u==='"')break;c++}n=t.slice(a,c).replace(/\\(["\\/bfnrt])/g,"$1").replace(/\\u[0-9a-fA-F]{4}/g,""),i=c+1}}return n}async function sp(t,e){try{if(e===0)return null;let r=Buffer.alloc(Sr),n=await vr.default.promises.open(t,"r");try{let o=Math.max(0,e-Sr),{bytesRead:i}=await n.read(r,0,Sr,o),s=r.toString("utf-8",0,i),a="";if(e>Sr){let{bytesRead:d}=await n.read(r,0,Sr,0);a=r.toString("utf-8",0,d)}else a=s;let c=En(s,"customTitle")??En(a,"customTitle")??En(s,"aiTitle")??En(a,"aiTitle");if(c&&c.trim())return c.trim();let l=a.split(`
|
|
278
278
|
`).slice(0,20);for(let d of l){let u=d.trim();if(u)try{let p=JSON.parse(u),f=ap(p);if(f)return f}catch{}}return null}finally{await n.close()}}catch{return null}}function ap(t){if(t.role==="user"&&t.content&&typeof t.content=="string"){let e=t.content.trim();if(e)return Xo(e)}if(t.type==="user"&&t.message&&typeof t.message=="object"&&t.message!==null){let e=t.message;if(e.role==="user"&&"content"in e){let r=oc(e.content);if(r)return r}}if(t.messages&&Array.isArray(t.messages)){for(let e of t.messages)if(e&&typeof e=="object"&&"role"in e&&e.role==="user"&&"content"in e){let r=oc(e.content);if(r)return r}}return null}function oc(t){if(typeof t=="string"){let e=t.trim();return e?Xo(e):null}if(Array.isArray(t)){let e=[];for(let n of t)n&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"&&e.push(n.text);let r=e.join(" ").trim();return r?Xo(r):null}return null}function Xo(t,e=80){return t.length>e?t.slice(0,e)+"\u2026":t}async function lc(t,e,r){let n=r.trim();if(!n||n.length>ip)throw new Error("invalid title");let o=ac(t),i=Jt.default.join(sc,o,`${e}.jsonl`),s=JSON.stringify({type:"custom-title",customTitle:n,sessionId:e})+`
|
|
279
279
|
`;await vr.default.promises.appendFile(i,s,"utf8")}var kr=require("fs"),In=E(require("path")),fc=E(require("os"));oe();var dc=300*60*1e3,Qo={free:10,pro:40,max_5x:200,max_20x:200};function Er(){let t=ne();try{let{statSync:e,readFileSync:r}=require("fs");if(!e(t,{throwIfNoEntry:!1}))return"pro";let o=JSON.parse(r(t,"utf-8")).claudeTier;if(typeof o=="string"&&o in Qo)return o}catch{}return"pro"}function cp(t){if(!Array.isArray(t))return!1;for(let e of t)if(e&&typeof e=="object"&&e.type==="tool_result")return!0;return!1}var uc="quota:";async function pc(){let t=In.default.join(fc.default.homedir(),".claude","projects"),r=Date.now()-dc,n=1/0,o=0,i=0,s=0,a=!1,c=new Set,l=new Set;try{let u=await kr.promises.readdir(t,{withFileTypes:!0});for(let p of u){if(!p.isDirectory())continue;let f=In.default.join(t,p.name),h;try{h=(await kr.promises.readdir(f,{withFileTypes:!0})).filter(v=>v.isFile()&&v.name.endsWith(".jsonl")).map(v=>v.name)}catch{continue}for(let y of h){let v=In.default.join(f,y),x=await Ne(v);if(!x)continue;await pt();let P=uc+v;c.add(P);let C=se.get(P,x);if(C!==void 0){for(let m of C.events)m.epoch>=r&&(o++,m.epoch<n&&(n=m.epoch));continue}let N;try{if(x.size>20*1024*1024){let S=Math.max(0,x.size-10485760),_=await kr.promises.open(v,"r");try{let w=Buffer.alloc(x.size-S);await _.read(w,0,w.length,S);let R=w.toString("utf-8"),k=R.indexOf(`
|