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.
Files changed (2) hide show
  1. package/dist/index.js +2 -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.0",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(`
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(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bridge-agent",
3
- "version": "0.17.0",
3
+ "version": "0.17.1",
4
4
  "description": "Bridge local agent — connects your AI tools to Jerico",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",