typebulb 0.60.3 → 0.60.5
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/SKILL.md +2 -2
- package/dist/agents/claude/client.js +18 -18
- package/dist/agents/codex/client.js +17 -17
- package/dist/agents/pi/client.js +18 -18
- package/dist/index.js +9 -9
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -311,8 +311,8 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
311
311
|
`);if(r<0)return t.bytes>=65536?{cwd:"",subagent:!1}:void 0;try{let s=JSON.parse(t.text.slice(0,r)),i=s?.type==="session_meta"?s.payload:void 0;if(typeof i?.cwd!="string")return{cwd:"",subagent:!1};let o=typeof i.source=="object"?i.source?.subagent:void 0;return{cwd:i.cwd,subagent:!!o,id:i.id,spawn:FT(i,o),model:UT(t.text,r)}}catch{return{cwd:"",subagent:!1}}}function FT(n,e){let t=e?.thread_spawn;if(!t)return;let r=t.parent_thread_id??n.parent_thread_id;if(!(!n.id||!r))return{id:n.id,parent:r,path:t.agent_path??"",role:t.agent_role??void 0,depth:t.depth??1}}function UT(n,e){for(let t of n.slice(e+1).split(`
|
|
312
312
|
`))if(t.trim())try{let r=JSON.parse(t);if(r.type==="turn_context"&&typeof r.payload?.model=="string")return r.payload.model}catch{}}var mT,ys,vu,wT,kT,xT,ET,AT,RT,LT,Ao,Lg,zn,DT,Su=S(()=>{"use strict";ms();bo();mT=["<permissions instructions>","<apps_instructions>","<plugins_instructions>","<skills_instructions>","<recommended_plugins>","<environment_context>","<node_repl_review_evidence>","# AGENTS.md instructions for "];ys=n=>!!n&&typeof n=="object"&&!Array.isArray(n),vu=n=>n==="shell_command"||n==="exec_command",wT=new Set(["max_output_tokens","yield_time_ms","timeout_ms"]);kT=/^(Get-Content|gc|cat|type|nl|bat|sed|head|tail)$/i,xT=/^-(Path|LiteralPath)$/i,ET=/^-(Encoding|TotalCount|Head|Tail|ReadCount|Delimiter)$/i,AT=/^(sed -n|head|tail|Select-Object|select)(\s|$)/i;RT={n:`
|
|
313
313
|
`,t:" ",r:"\r",b:"\b",f:"\f",v:"\v",0:"\0"};LT=n=>n?n.replace(/\r?\n$/,"").split(`
|
|
314
|
-
`).length:0;Ao=n=>{let e=hT(n);return process.platform==="win32"?e.toLowerCase():e},Lg=12e4,zn=class extends $t{constructor(t=wu(Ig(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";#
|
|
315
|
-
`))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Vn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Vn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}};DT=[64*1024,1024*1024]});import{realpathSync as qT}from"fs";import{createHash as JT}from"crypto";import{join as Po,resolve as WT}from"path";import{homedir as KT}from"os";function Mt(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Po(n,".."):Po(KT(),".typebulb")}function ut(){Wg||(Wg=!0,console.error(`${Mt()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function dt(){return process.env.TYPEBULB_SERVERS_DIR||Po(Mt(),"servers")}function Kg(n){let e=se(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Po(Mt(),"canvas",`${t}-${bs(n)}.png`)}function bs(n){return JT("sha1").update(se(n)).digest("hex").slice(0,8)}function se(n){let e=WT(n),t=e;try{t=qT.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function Hg(n,e){let t=se(n),r=se(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var Wg,nt=S(()=>{"use strict";Wg=!1});import*as zg from"net";import{mkdir as HT,readFile as YT,writeFile as Gg}from"fs/promises";import{existsSync as VT}from"fs";import{join as Xg}from"path";function ey(){return Xg(Mt(),"blocks")}function ku(n){return Xg(ey(),`${n}.json`)}function Co(n){return new Promise(e=>{let t=zg.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function QT(n){for(let e=n;e<65535;e++)if(await Co(e))return e;throw new Error(`No free port found above ${n}`)}async function xu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),ty)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function _o(n){try{let e=JSON.parse(await YT(ku(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function Ro(n,e){try{return await Gg(ku(n),JSON.stringify(e,null,2)),!0}catch{return ut(),!1}}async function ZT(n){let e=se(n);try{await HT(ey(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Zg;o++)t.push(Qg+o*an);let r=await Promise.all(t.map(async o=>({base:o,block:await _o(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await Gg(ku(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await _o(o))?.cwd===e)return o;l.code!=="EEXIST"&&ut();continue}if(!VT(a.cwd))return await Ro(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>Yg(o.block)-Yg(a.block))[0];if(i)return await Ro(i.base,s)?i.base:void 0}function Yg(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function eP(n,e){let t=await _o(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Vg(t),a=o.has(0)?GT:0;for(;a>Oo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await Ro(n,t),a}let r=se(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Vg(t);for(s=Oo;s<an&&i.has(s);)s++;if(s>=an){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:Oo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await Ro(n,t),s}function Vg(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Gn(n,e){let t=await ZT(e);return t===void 0?void 0:t+await eP(t,n)}async function ln(n){let e=se(n);for(let t=0;t<Zg;t++){let r=await _o(Qg+t*an);if(r?.cwd===e)return s=>r.slots[se(s)]?.usedAt??0}return()=>0}async function Io(n){if(n.explicit!==void 0)return await Co(n.explicit)||await xu(n.explicit),n.target.kind==="bulb"&&await Gn(n.target,n.cwd),{port:n.explicit};let e=await Gn(n.target,n.cwd);if(e!==void 0){let r=e-e%an,s=Date.now()+XT;do{if(await Co(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=Oo;i<an;i++){let o=r+i;if(o!==e&&await Co(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await QT(zT),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Qg,an,Zg,zT,Oo,GT,XT,cn=S(()=>{"use strict";nt();Qg=20100,an=100,Zg=19,zT=23e3,Oo=1,GT=an-1,XT=3e3});var Le,No=S(()=>{"use strict";Le="0.60.
|
|
314
|
+
`).length:0;Ao=n=>{let e=hT(n);return process.platform==="win32"?e.toLowerCase():e},Lg=12e4,zn=class extends $t{constructor(t=wu(Ig(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";#e=0;#l;#t=!1;#i;#m=0;#s=new Map;#d=new Map;#a=new Map;#u=new Map;detectsSelf(){return!!process.env.CODEX_THREAD_ID}detectsInstalled(){return pT(wu(Ig(),".codex"))}sessionsDir(t){return this.root}listSessionFiles(t){let r=Ao(t),s=[];for(let i of this.#o()){let o=0,a=0;try{let d=Eo(i);if(!d.isFile())continue;o=d.size,a=d.mtimeMs}catch{continue}let l=this.#s.get(i);if(l===void 0){if(l=Mg(i),l===void 0)continue;this.#s.set(i,l)}if(l.subagent||Ao(l.cwd)!==r)continue;let c=Rg(i,".jsonl");this.#a.set(c,i),s.push({sessionId:c,file:i,mtime:this.#r(i,o,a)})}return s}listChildren(t,r){let s=Ao(t),i=new Map,o,a;for(let d of this.#o()){let u=0,f=0;try{let g=Eo(d);if(!g.isFile())continue;u=g.size,f=g.mtimeMs}catch{continue}let p=this.#s.get(d);if(p===void 0){if(p=Mg(d),p===void 0)continue;this.#s.set(d,p)}Rg(d,".jsonl")===r&&(o=p.id,a=p.model),!(!p.spawn||Ao(p.cwd)!==s)&&i.set(p.spawn.id,{file:d,mtime:this.#r(d,u,f),running:this.#n(d,u,f),spawn:p.spawn,model:p.model})}if(!o)return[];let l=(d,u=new Set)=>{if(d.parent===o)return!0;if(u.has(d.id))return!1;u.add(d.id);let f=i.get(d.parent);return f?l(f.spawn,u):!1},c=[];for(let{file:d,mtime:u,running:f,spawn:p,model:g}of i.values())l(p)&&c.push({id:p.id,file:d,mtime:u,label:p.path.split("/").filter(Boolean).pop()??p.path,kind:p.role||"agent",model:g&&g!==a?g:void 0,parentId:i.has(p.parent)?p.parent:void 0,depth:p.depth,stopped:!1,running:f});return c}#n(t,r,s){return this.#c(t,r,s).running}sessionsWorking(t){let r=new Set,s=Date.now();for(let{sessionId:i,file:o,mtime:a}of this.listSessionFiles(t)){if(s-a>=Lg)continue;let l;try{let c=Eo(o);l=this.#c(o,c.size,c.mtimeMs)}catch{continue}l.running&&r.add(i)}return r}#r(t,r,s){return Math.max(s,this.#c(t,r,s).ms??0)}#c(t,r,s){let i=this.#d.get(t);if(i&&i.size===r&&i.mtime===s)return i;let o={size:r,mtime:s,...jT(t)};return this.#d.set(t,o),o}#o(){let t=[],r=s=>{try{return fT(s).map(i=>wu(s,i))}catch{return[]}};for(let s of r(this.root))for(let i of r(s))for(let o of r(i))for(let a of r(o))a.endsWith(".jsonl")&&t.push(a);return t}parseEntry(t){let r;try{r=JSON.parse(t)}catch{return null}return!r||typeof r.type!="string"?null:r}idOf(t){return t.ord===void 0&&(this.#h(t),t.ord=String(this.#e++),t.parent=this.#l,this.#l=t.ord),t.ord}#h(t){let r=t.payload;if(t.type==="session_meta"){if(++this.#m===1){let s=typeof r?.source=="object"?r.source?.subagent?.thread_spawn:void 0;this.#i=s?.agent_path,this.#t=!!s}}else this.#m=0,this.#t&&r?.type==="agent_message"&&r.recipient===this.#i&&(this.#t=!1);t.inherited=this.#t}parentOf(t){return t.parent}timestampOf(t){return t.timestamp}isSidechain(t,r){return r==="child"&&!!t.inherited}isLeafType(t){return!0}isRecoveryNoise(t){return!1}apply(t,r){let s=[],i=t.payload;if(!i)return{events:s};let o=()=>{let a=Date.parse(t.timestamp??"");return!isNaN(a)&&a>=r};if(t.type==="response_item"){if(i.type==="message"){if(i.role==="user"){let a=Vn(i.content,!0).trim();a&&s.push({type:"user",text:a})}else if(i.role==="assistant"){let a=Vn(i.content,!1);a&&s.push({type:"assistant",text:a,thinking:"",tools:[],live:o()})}return{events:s}}if(i.type==="reasoning"){let a=Vn(i.summary,!1);return a&&s.push({type:"assistant",text:"",thinking:a,tools:[],live:o()}),{events:s}}if(i.type==="custom_tool_call"||i.type==="function_call"){let a=i.call_id??"",{pending:l,...c}=i.type==="custom_tool_call"?bT(i.name??"",i.input):{name:i.name??"",input:MT(i.arguments)};return l&&this.#u.set(a,l),s.push({type:"assistant",text:"",thinking:"",tools:[{id:a,...c}],live:o()}),{events:s}}if(i.type==="custom_tool_call_output"||i.type==="function_call_output"){let a=i.call_id??"",l=this.#u.get(a);return this.#u.delete(a),s.push({type:"tool_result",id:a,...NT(yT(i.output),l)}),{events:s}}return{events:s}}if(t.type==="event_msg"){if(i.type==="token_count"){let a=i.info?.last_token_usage;if(!a)return{events:s};let l={in:Math.max(0,(a.input_tokens??0)-(a.cached_input_tokens??0)),out:a.output_tokens??0,cached:a.cached_input_tokens??0,cacheCreate:a.cache_write_input_tokens??0};return{events:s,usage:l}}return{events:s}}return t.type==="turn_context"?{events:s,model:i.model}:{events:s}}chainWorking(t){let r=!1;for(let s of t){if(s.type!=="event_msg")continue;let i=s.payload?.type;i==="task_started"?r=!0:(i==="task_complete"||i==="turn_aborted")&&(r=!1)}return r}sessionAlive(t){let r=this.#a.get(t);if(!r)return;let s;try{let i=Eo(r);s=this.#r(r,i.size,i.mtimeMs)}catch{return}return Date.now()-s<Lg}readPreview(t){for(let r of(Jg(t,256*1024)?.text??"").split(`
|
|
315
|
+
`))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Vn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Vn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}};DT=[64*1024,1024*1024]});import{realpathSync as qT}from"fs";import{createHash as JT}from"crypto";import{join as Po,resolve as WT}from"path";import{homedir as KT}from"os";function Mt(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Po(n,".."):Po(KT(),".typebulb")}function ut(){Wg||(Wg=!0,console.error(`${Mt()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function dt(){return process.env.TYPEBULB_SERVERS_DIR||Po(Mt(),"servers")}function Kg(n){let e=se(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Po(Mt(),"canvas",`${t}-${bs(n)}.png`)}function bs(n){return JT("sha1").update(se(n)).digest("hex").slice(0,8)}function se(n){let e=WT(n),t=e;try{t=qT.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function Hg(n,e){let t=se(n),r=se(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var Wg,nt=S(()=>{"use strict";Wg=!1});import*as zg from"net";import{mkdir as HT,readFile as YT,writeFile as Gg}from"fs/promises";import{existsSync as VT}from"fs";import{join as Xg}from"path";function ey(){return Xg(Mt(),"blocks")}function ku(n){return Xg(ey(),`${n}.json`)}function Co(n){return new Promise(e=>{let t=zg.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function QT(n){for(let e=n;e<65535;e++)if(await Co(e))return e;throw new Error(`No free port found above ${n}`)}async function xu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),ty)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function _o(n){try{let e=JSON.parse(await YT(ku(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function Ro(n,e){try{return await Gg(ku(n),JSON.stringify(e,null,2)),!0}catch{return ut(),!1}}async function ZT(n){let e=se(n);try{await HT(ey(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Zg;o++)t.push(Qg+o*an);let r=await Promise.all(t.map(async o=>({base:o,block:await _o(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await Gg(ku(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await _o(o))?.cwd===e)return o;l.code!=="EEXIST"&&ut();continue}if(!VT(a.cwd))return await Ro(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>Yg(o.block)-Yg(a.block))[0];if(i)return await Ro(i.base,s)?i.base:void 0}function Yg(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function eP(n,e){let t=await _o(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Vg(t),a=o.has(0)?GT:0;for(;a>Oo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await Ro(n,t),a}let r=se(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Vg(t);for(s=Oo;s<an&&i.has(s);)s++;if(s>=an){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:Oo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await Ro(n,t),s}function Vg(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Gn(n,e){let t=await ZT(e);return t===void 0?void 0:t+await eP(t,n)}async function ln(n){let e=se(n);for(let t=0;t<Zg;t++){let r=await _o(Qg+t*an);if(r?.cwd===e)return s=>r.slots[se(s)]?.usedAt??0}return()=>0}async function Io(n){if(n.explicit!==void 0)return await Co(n.explicit)||await xu(n.explicit),n.target.kind==="bulb"&&await Gn(n.target,n.cwd),{port:n.explicit};let e=await Gn(n.target,n.cwd);if(e!==void 0){let r=e-e%an,s=Date.now()+XT;do{if(await Co(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=Oo;i<an;i++){let o=r+i;if(o!==e&&await Co(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await QT(zT),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Qg,an,Zg,zT,Oo,GT,XT,cn=S(()=>{"use strict";nt();Qg=20100,an=100,Zg=19,zT=23e3,Oo=1,GT=an-1,XT=3e3});var Le,No=S(()=>{"use strict";Le="0.60.5"});var ty={};ci(ty,{agentViewerCommand:()=>dy,bulbServerCommand:()=>uy,clearServerLog:()=>Ou,findProjectViewer:()=>Mo,isAlive:()=>Xn,isMirror:()=>me,isProjectBulb:()=>Nu,isProjectMirror:()=>er,launchAgentViewer:()=>Mu,launchBulbServer:()=>Ss,listBulbServers:()=>Q,probePageCount:()=>Lu,readServerLog:()=>Ye,readWaitCursor:()=>Lo,recordDenial:()=>Iu,registerServer:()=>Ru,relayOpen:()=>$u,runMarker:()=>Cu,serverLogPath:()=>Zn,serversForBulb:()=>dn,sliceRunLog:()=>_u,startServerLog:()=>vs,stopBulbServer:()=>Qn,stopServer:()=>Bt,stopServersForBulb:()=>Bo,typebulbBinPath:()=>tr,unregisterServer:()=>un,writeWaitCursor:()=>ws});import{spawn as ny}from"child_process";import{readdir as tP,readFile as iy,writeFile as oy,unlink as Eu,mkdir as nP}from"fs/promises";import{mkdirSync as ay,writeFileSync as $o,appendFileSync as rP,readFileSync as Au}from"fs";import*as Te from"path";import{fileURLToPath as sP}from"url";function Tu(n){return Te.join(dt(),`${n}.json`)}function Zn(n){return Te.join(dt(),`${n}.log`)}function Pu(n){return Te.join(dt(),`${n}.wait.json`)}function ly(n){try{let e=JSON.parse(Au(Pu(n),"utf8"));return e.cursors&&typeof e.cursors=="object"?e.cursors:{}}catch{return{}}}function Lo(n,e=""){let t=ly(n)[e];return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function ws(n,e,t=""){try{ay(dt(),{recursive:!0});let r=ly(n);r[t]=e,$o(Pu(n),JSON.stringify({cursors:r}))}catch{}}function vs(n){let e=Zn(n);try{ay(dt(),{recursive:!0}),$o(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),r=process.stderr.write.bind(process.stderr),s=0,i=!1,o=a=>{if(!i)try{let l=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(rP(e,l),s+=l.length,s>2*ry){let c=Au(e),d=c.subarray(Math.max(0,c.length-ry));$o(e,d),s=d.length}}catch{i=!0}};return process.stdout.write=((a,...l)=>(o(a),t(a,...l))),process.stderr.write=((a,...l)=>(o(a),r(a,...l))),()=>{process.stdout.write=t,process.stderr.write=r}}function Ou(n){try{$o(Zn(n),"")}catch{}}function Ye(n,e=0){try{let t=Au(Zn(n)),r=e>=0&&e<=t.length?e:0;return{text:t.subarray(r).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function Cu(n){return`\u2500\u2500 run ${n} \u2500\u2500 ${new Date().toTimeString().slice(0,8)}`}function oP(n){let e=iP.exec(n);return e?Number(e[1]):void 0}function _u(n,e){let t=n.split(`
|
|
316
316
|
`),r=[];if(t.forEach((o,a)=>{let l=oP(o);l!==void 0&&r.push({id:l,idx:a})}),!r.length)return e==="latest"?n:"";let s=e==="latest"?r[r.length-1]:r.find(o=>o.id===e);if(!s)return"";let i=r.find(o=>o.idx>s.idx);return t.slice(s.idx,i?i.idx:t.length).join(`
|
|
317
317
|
`)}function Xn(n){try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}async function Ru(n){try{await nP(dt(),{recursive:!0}),await oy(Tu(n.pid),JSON.stringify({version:Le,...n}))}catch{ut()}}async function Iu(n,e){let t=Tu(n);try{let r=JSON.parse(await iy(t,"utf8"));if(r.denied===e)return;r.denied=e,await oy(t,JSON.stringify(r))}catch{}}async function un(n){await Eu(Tu(n)).catch(()=>{}),await Eu(Zn(n)).catch(()=>{}),await Eu(Pu(n)).catch(()=>{})}function me(n){return n.agent!=null}function er(n,e){return me(n)&&n.cwd!=null&&se(n.cwd)===se(e)}function Nu(n,e){return!me(n)&&Hg(n.file,e)}async function Q(n){let e;try{e=await tP(dt())}catch{return[]}let t=[];return await Promise.all(e.map(async s=>{if(!/^\d+\.json$/.test(s))return;let i=parseInt(s,10),o;try{o=JSON.parse(await iy(Te.join(dt(),s),"utf8"))}catch{await un(i);return}o&&typeof o.pid=="number"&&Xn(o.pid)?t.push(o):await un(i)})),(n?t.filter(s=>Nu(s,n)):t).sort((s,i)=>s.startedAt-i.startedAt)}async function Mo(n,e){return(await Q()).find(t=>er(t,n)&&(e?t.agent===e:!0))}async function $u(n,e){let t=new URL(n).port,r=(await Q()).filter(a=>String(a.port)!==t),s=r.filter(a=>er(a,e)),i=r.filter(a=>Nu(a,e)),o=0;for(let a of[...s,...i])try{let l=await fetch(`${a.url}/__open`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:n}),signal:AbortSignal.timeout(2e3)});if(!l.ok)continue;let{opened:c,pages:d}=await l.json();if(c)return{where:"editor",via:a.agent?"the agent mirror":`${Te.basename(a.file)}'s page`};me(a)&&(o+=d??0)}catch{}return o>0?{where:"external"}:void 0}async function Qn(n){try{process.kill(n,"SIGTERM")}catch{}await un(n)}async function Lu(n){try{let e=await fetch(`${n.url}/__pages`,{signal:AbortSignal.timeout(aP)});if(!e.ok)return;let{pages:t}=await e.json();return typeof t=="number"?t:void 0}catch{return}}async function Bt(n,e=me(n)?"keep":"close"){try{let t=await fetch(`${n.url}/__stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pages:e}),signal:AbortSignal.timeout(sy)});if(!t.ok)throw new Error(`/__stop ${t.status}`);let{closed:r=0,stuck:s=0}=await t.json(),i=Date.now()+sy;for(;Xn(n.pid)&&Date.now()<i;)await cy(100);return Xn(n.pid)?(await Qn(n.pid),"killed"):(await un(n.pid),{closed:r,stuck:s})}catch{return await Qn(n.pid),"killed"}}function dn(n,e){let t=se(e);return n.filter(r=>!me(r)&&r.pid!==process.pid&&se(r.file)===t)}async function Bo(n,e){let t=dn(await Q(),n);for(let r of t)await Bt(r,e!==void 0&&r.port===e?"keep":"close");return t}function lP(n,e,t){(process.platform==="win32"?ny("cmd",["/c","start","","/b",n,...e],{cwd:t,stdio:"ignore",windowsHide:!0}):ny(n,e,{cwd:t,detached:!0,stdio:"ignore"})).unref()}function tr(){return Te.join(Te.dirname(sP(import.meta.url)),"index.js")}function uy(n,e={}){return{command:process.execPath,args:[tr(),...e.trust?["--trust"]:[],...e.mode?["--mode",e.mode]:[],n,...e.open===!1?["--no-open"]:[]]}}function dy(n){return{command:process.execPath,args:[tr(),`agent:${n}`,"--no-open"]}}async function fy(n,e,t,r){let s=await n();if(s)return s;lP(e.command,e.args,t);let i=Date.now()+2e4;for(;Date.now()<i;){await cy(150);let o=await n();if(o)return o}throw new Error(`Launched ${r} but it did not register within 20s.`)}async function Ss(n,e={}){let t=e.cwd??process.cwd(),r=Te.resolve(t,n),s=await Gn({kind:"bulb",file:r},t),[i]=await Bo(r,s),o={...e,mode:e.mode??i?.mode};return fy(async()=>dn(await Q(),r)[0],uy(n,o),t,Te.basename(n))}async function Mu(n,e=process.cwd()){return fy(()=>Mo(e,n),dy(n),e,`the ${n} mirror`)}var ry,iP,sy,aP,cy,$e=S(()=>{"use strict";nt();cn();No();ry=1e6;iP=/^── run (\d+) ── /;sy=6e3,aP=500;cy=n=>new Promise(e=>setTimeout(e,n))});function nr(n){return{...tp(n),server:n.files.get("server.ts")??""}}function Do(n){return!!n.server&&!n.code}var ks=S(()=>{"use strict";ee();ee()});function jo(n){let e=/^---[^\n]*\n([\s\S]*?)\n---/.exec(n),t=e?/^\s*name:\s*(.+?)\s*$/m.exec(e[1]):null;return t?t[1].replace(/^["']|["']$/g,""):void 0}function Bu(n){return Kn(jo(n)??"bulb")||"bulb"}var Du=S(()=>{"use strict";ee()});import{readdirSync as cP,readFileSync as uP,statSync as dP}from"fs";import{join as py,basename as fP}from"path";function my(n,e,t){if(e>8)return t;let r;try{r=cP(n,{withFileTypes:!0})}catch{return t}for(let s of r)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;my(py(n,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(py(n,s.name));return t}function pP(n,e){let t,r=!1;try{let s=uP(n,"utf8");t=jo(s.slice(0,1024));let i=We(s);r=!!i&&Do(nr(i))}catch{}return{mtime:e,name:t??fP(n).replace(/\.bulb\.md$/,""),serverOnly:r}}function Fo(n){let e=new Map,t=my(n,0,[]).map(r=>{let s=0;try{s=dP(r).mtimeMs}catch{}let i=s?hy.get(r):void 0,o=i?.mtime===s?i:pP(r,s);return s&&e.set(r,o),{path:r,...o}});return hy=e,t}var hy,gy=S(()=>{"use strict";ee();ks();Du();hy=new Map});function rr(n){if(n.server.trim())return"server-side code (server.ts)";let e=n.code;if(/\btb\s*\.\s*fs\b/.test(e)||e.includes("/__fs"))return"the filesystem";if(/\btb\s*\.\s*ai\b/.test(e)||e.includes("/__ai")||n.infer.trim()||/\btb\s*\.\s*infer\b/.test(e))return"AI (your API keys)";if(/\btb\s*\.\s*server\s*\.\s*\w/.test(e)||e.includes("/__api"))return"server-side code (server.ts)"}var Uo=S(()=>{"use strict"});import{readFile as hP}from"fs/promises";async function ju(n){try{let e=We(await hP(n,"utf-8"));return e?rr(nr(e)):void 0}catch{return}}var yy=S(()=>{"use strict";ks();Uo()});function Fu(n){let e=n.split(""),t=(i,o)=>{for(let a=i;a<o&&a<e.length;a++)e[a]!==`
|
|
318
318
|
`&&(e[a]=" ")},r=0,s="";for(;r<n.length;){let i=n[r],o=n[r+1];if(i==="/"&&o==="/"){let a=r;for(;a<n.length&&n[a]!==`
|
|
@@ -2003,16 +2003,16 @@ export default function (pi) {
|
|
|
2003
2003
|
} catch (e) { logErr("load", e && e.message); }
|
|
2004
2004
|
}
|
|
2005
2005
|
`});function z(n){return n?.message??String(n)}var G,Ht=S(()=>{"use strict";G=process.cwd()});import{spawn as Tb}from"child_process";import{StringDecoder as iC}from"string_decoder";function dC(n,e){let t=new iC("utf8"),r="";n.on("data",s=>{r+=typeof s=="string"?s:t.write(s);let i;for(;(i=r.indexOf(`
|
|
2006
|
-
`))>=0;){let o=r.slice(0,i);r=r.slice(i+1),o.endsWith("\r")&&(o=o.slice(0,-1)),o&&e(o)}})}var oC,Pb,Ob,Ld,Cb,aC,lC,cC,_b,uC,Ea,Aa,Rb,Ib=S(()=>{"use strict";Ht();oC=3e4,Pb=18e4,Ob="starting pi\u2026",Ld=5e3,Cb=2e3,aC=2e3,lC=12e4,cC=8e3,_b=15e3,uC=new Set(["get_state","get_commands","get_available_models","set_model","set_thinking_level","cycle_thinking_level","get_session_stats","compact","set_auto_compaction","get_fork_messages","fork","clone","set_session_name","export_html","bash","abort_bash"]),Ea=new Set;process.on("exit",()=>{for(let n of Ea)try{n.kill()}catch{}});Aa=class{#
|
|
2007
|
-
`)}catch{}await Promise.race([this.#x,Rb(Cb)])}try{e.stdin?.end()}catch{}if(await Promise.race([this.#x,Rb(Cb)]),e.exitCode===null&&!e.killed)if(process.platform==="win32"&&e.pid)try{Tb("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"})}catch{}else try{e.kill("SIGKILL")}catch{}Ea.delete(e),this.#
|
|
2008
|
-
`)}catch{}}#P(){let e=this.#
|
|
2009
|
-
`),tool:e?.kind==="tool"?e.name:void 0}}#A(e){let t=Array.isArray(e?.content)?e.content:[];this.#
|
|
2010
|
-
`)}catch(l){clearTimeout(a),this.#
|
|
2006
|
+
`))>=0;){let o=r.slice(0,i);r=r.slice(i+1),o.endsWith("\r")&&(o=o.slice(0,-1)),o&&e(o)}})}var oC,Pb,Ob,Ld,Cb,aC,lC,cC,_b,uC,Ea,Aa,Rb,Ib=S(()=>{"use strict";Ht();oC=3e4,Pb=18e4,Ob="starting pi\u2026",Ld=5e3,Cb=2e3,aC=2e3,lC=12e4,cC=8e3,_b=15e3,uC=new Set(["get_state","get_commands","get_available_models","set_model","set_thinking_level","cycle_thinking_level","get_session_stats","compact","set_auto_compaction","get_fork_messages","fork","clone","set_session_name","export_html","bash","abort_bash"]),Ea=new Set;process.on("exit",()=>{for(let n of Ea)try{n.kill()}catch{}});Aa=class{#e;#l=!1;#t=0;#i=!1;#m=0;#s=!1;#d=null;#a=[];#u=null;#n=null;#r=null;#c=new Map;#o=[];#h=null;#k=null;#w=null;#g;#y;#v="";#_=1;#f=new Map;#x;#S;constructor(e,t,r=(s,i)=>Tb(s,{cwd:i,shell:!0,stdio:["pipe","pipe","pipe"],env:{...process.env,TYPEBULB_MIRROR:"1"}})){if(this.#x=new Promise(o=>{this.#S=o}),t?.includes('"')){this.#y="session path contains a quote \u2014 cannot drive it",this.#S();return}let s=t?`pi --mode rpc --session "${t}"`:"pi --mode rpc",i;try{i=r(s,e)}catch(o){this.#y=`could not start pi: ${z(o)}`,this.#S();return}this.#e=i,this.#g=t,this.#i=!0,this.#m=Date.now()+Pb,this.#n={text:Ob,kind:"info"},Ea.add(i),i.stdout&&dC(i.stdout,o=>this.#I(o)),i.stderr&&i.stderr.on("data",o=>{this.#v=(this.#v+o.toString()).slice(-aC)}),i.on("error",o=>this.#O(`could not start pi: ${o.message}`)),i.on("exit",o=>{this.#e===i&&this.#O(o?`pi exited (code ${o})${this.#v.trim()?`: ${this.#v.trim()}`:""}`:"pi exited"),Ea.delete(i),this.#S()}),this.#p({type:"get_state"}).then(o=>{let a=o.data?.sessionFile;typeof a=="string"&&a&&(this.#g=a);let l=o.data?.model;l&&typeof l.id=="string"&&l.id&&(this.#w=l.id)}).catch(()=>{}).finally(()=>this.#R())}#R(){this.#i&&(this.#i=!1,this.#n?.text===Ob&&(this.#n=null),this.#r&&(this.#r.until=Date.now()+_b),!this.#l&&Date.now()<this.#t&&(this.#t=Date.now()+Ld),this.#T())}get streaming(){return this.#l||Date.now()<this.#t}get draft(){return this.#d}get echo(){return this.#u}get queue(){return this.#h}get stats(){return this.#k}get model(){return this.#w}get sessionFile(){return this.#g}get error(){return this.#y}get status(){if(this.#n)return this.#n;if(this.#r){if(Date.now()<this.#r.until)return{text:this.#r.text,kind:this.#r.kind};this.#r=null}return this.#c.size?{text:[...this.#c.values()].join(" \xB7 "),kind:"info"}:null}get dialog(){let e=Date.now();for(;this.#o.length;){let t=this.#o[0];if(e<t.until)return t.req;this.#o.shift(),t.ownTimeout||this.#E({type:"extension_ui_response",id:t.req.id,cancelled:!0})}return null}notice(e,t){this.#b(e,t)}respondUi(e,t){let r=this.#o.findIndex(o=>o.req.id===e);if(r<0)return{ok:!1,error:"dialog expired or already answered"};let[s]=this.#o.splice(r,1),i={type:"extension_ui_response",id:e};return t.cancelled?i.cancelled=!0:s.req.method==="confirm"?i.confirmed=!!t.confirmed:i.value=t.value??"",this.#E(i),{ok:!0}}async rpc(e){if(!uC.has(e.type))return{ok:!1,error:`command not allowed: ${e.type}`};try{let t=await this.#p(e);if(t.success&&e.type==="set_model"){let r=t.data?.id;typeof r=="string"&&r&&(this.#w=r)}if(t.success&&(e.type==="fork"||e.type==="clone")){try{let s=(await this.#p({type:"get_state"})).data?.sessionFile;typeof s=="string"&&s&&(this.#g=s)}catch{}return{ok:!0,data:{...t.data??{},sessionFile:this.#g}}}return t.success?{ok:!0,data:t.data}:{ok:!1,error:t.error??`pi rejected ${e.type}`}}catch(t){return{ok:!1,error:z(t)}}}async send(e,t){let r=this.streaming,s=e.trimStart().startsWith("/"),i=r?s?{type:"prompt",message:e,streamingBehavior:t?.followUp?"followUp":"steer"}:{type:t?.followUp?"follow_up":"steer",message:e}:{type:"prompt",message:e},o=l=>{r||(this.#t=l,s||(this.#u=e))};if(this.#i)return this.#p(i).catch(()=>{}),o(this.#m+Ld),{ok:!0};let a;try{a=await this.#p(i)}catch(l){return{ok:!1,error:z(l)}}return a.success&&o(Date.now()+Ld),a.success?{ok:!0}:{ok:!1,error:a.error??"pi rejected the message"}}async stop(){if(this.#e){if(this.#i){this.#E({type:"abort"}),this.#t=0;return}try{await this.#p({type:"abort"})}catch{}}}clearCompletedDraft(){this.#s||(this.#d=null)}clearEcho(){this.#u=null}async dispose(){let e=this.#e;if(e){if(this.#e=void 0,this.#i=!1,this.#l){try{e.stdin?.write(JSON.stringify({type:"abort"})+`
|
|
2007
|
+
`)}catch{}await Promise.race([this.#x,Rb(Cb)])}try{e.stdin?.end()}catch{}if(await Promise.race([this.#x,Rb(Cb)]),e.exitCode===null&&!e.killed)if(process.platform==="win32"&&e.pid)try{Tb("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"})}catch{}else try{e.kill("SIGKILL")}catch{}Ea.delete(e),this.#o=[],this.#C("pi was shut down")}}#E(e){try{this.#e?.stdin?.write(JSON.stringify(e)+`
|
|
2008
|
+
`)}catch{}}#P(){let e=this.#a[this.#a.length-1];this.#d={text:this.#a.filter(t=>t?.kind==="text").map(t=>t.text).join(""),thinking:this.#a.filter(t=>t?.kind==="thinking").map(t=>t.text).join(`
|
|
2009
|
+
`),tool:e?.kind==="tool"?e.name:void 0}}#A(e){let t=Array.isArray(e?.content)?e.content:[];this.#a=t.map(r=>({kind:r.type==="thinking"?"thinking":r.type==="toolCall"?"tool":"text",text:(r.type==="thinking"?r.thinking:r.text)??"",name:r.name})),this.#P()}#b(e,t){let r=e.length>200?e.slice(0,200)+"\u2026":e;r&&(this.#r={text:r,kind:t,until:Date.now()+(t==="info"?cC:_b)})}#T(){this.#p({type:"get_session_stats"}).then(e=>{if(!e.success||!e.data)return;let t=e.data;this.#k={cost:typeof t.cost=="number"?t.cost:0,contextTokens:typeof t.contextUsage?.tokens=="number"?t.contextUsage.tokens:null,contextPercent:typeof t.contextUsage?.percent=="number"?t.contextUsage.percent:null}}).catch(()=>{})}#p(e){let t=this.#e;if(!t?.stdin?.writable)return Promise.reject(new Error(this.#y??"pi is not running"));let r=this.#i?Pb:oC,s=`tb-${this.#_++}`;return new Promise((i,o)=>{let a=setTimeout(()=>{this.#f.delete(s),o(new Error(`pi did not respond (${Math.round(r/1e3)}s)`))},r);a.unref?.(),this.#f.set(s,{resolve:i,timer:a});try{t.stdin.write(JSON.stringify({id:s,...e})+`
|
|
2010
|
+
`)}catch(l){clearTimeout(a),this.#f.delete(s),o(new Error(z(l)))}})}#I(e){let t;try{t=JSON.parse(e)}catch{return}switch(t.type){case"response":{let r=t,s=r.id?this.#f.get(r.id):void 0;s&&(this.#f.delete(r.id),clearTimeout(s.timer),s.resolve(r));return}case"agent_start":this.#l=!0,this.#t=0;return;case"agent_end":this.#l=!1,this.#t=0,this.#s=!1,this.#n=null,this.#h=null,this.#T();return;case"message_start":{let r=t.message;if(r?.role!=="assistant")return;this.#s=!0,this.#A(r);return}case"message_update":{if(!this.#s)return;if(t.message){this.#A(t.message);return}let r=t.assistantMessageEvent;if(!r||typeof r.contentIndex!="number")return;let s=r.type.startsWith("thinking")?"thinking":r.type.startsWith("toolcall")?"tool":"text",i=this.#a[r.contentIndex]??={kind:s,text:""};i.kind=s,typeof r.delta=="string"&&s!=="tool"&&(i.text+=r.delta),typeof r.content=="string"&&(i.text=r.content),r.toolCall?.name&&(i.name=r.toolCall.name),this.#P();return}case"message_end":if(!this.#s)return;t.message&&this.#A(t.message),this.#s=!1;return;case"auto_retry_start":this.#n={text:`retrying after a transient error (attempt ${Number(t.attempt)||1}/${Number(t.maxAttempts)||"?"})\u2026`,kind:"warning"};return;case"auto_retry_end":this.#n=null,t.success===!1&&this.#b(`retries exhausted: ${String(t.finalError??"unknown error")}`,"error");return;case"compaction_start":this.#n={text:"compacting context\u2026",kind:"info"};return;case"compaction_end":{this.#n=null;let r=t.result;typeof t.errorMessage=="string"&&t.errorMessage?this.#b(`compaction failed: ${t.errorMessage}`,"error"):r?.tokensBefore&&this.#b(`compacted: ~${Math.round(r.tokensBefore/1e3)}k \u2192 ~${Math.round((r.estimatedTokensAfter??0)/1e3)}k tokens`,"info"),this.#T();return}case"queue_update":{let r=Array.isArray(t.steering)?t.steering.map(String):[],s=Array.isArray(t.followUp)?t.followUp.map(String):[];this.#h=r.length||s.length?{steering:r,followUp:s}:null;return}case"extension_ui_request":{let r=String(t.method??"");if(r==="select"||r==="confirm"||r==="input"||r==="editor"){let s=typeof t.timeout=="number"&&t.timeout>0?t.timeout:void 0;this.#o.push({req:{id:String(t.id??""),method:r,title:typeof t.title=="string"?t.title:void 0,message:typeof t.message=="string"?t.message:void 0,options:Array.isArray(t.options)?t.options.map(String):void 0,placeholder:typeof t.placeholder=="string"?t.placeholder:void 0,prefill:typeof t.prefill=="string"?t.prefill:void 0},until:Date.now()+(s??lC),ownTimeout:s!==void 0})}else if(r==="notify"){let s=t.notifyType==="warning"?"warning":t.notifyType==="error"?"error":"info";this.#b(String(t.message??""),s),console.log(`[composer] pi extension: ${String(t.message??"")}`)}else if(r==="setStatus"){let s=String(t.statusKey??"");typeof t.statusText=="string"&&t.statusText?this.#c.set(s,t.statusText):this.#c.delete(s)}return}default:return}}#O(e){this.#y=e,this.#i=!1,this.#l=!1,this.#t=0,this.#s=!1,this.#d=null,this.#a=[],this.#u=null,this.#n=null,this.#r=null,this.#c.clear(),this.#o=[],this.#h=null,this.#k=null,this.#w=null,this.#e=void 0,this.#C(e)}#C(e){for(let[,t]of this.#f)clearTimeout(t.timer),t.resolve({type:"response",success:!1,error:e});this.#f.clear()}},Rb=n=>new Promise(e=>{setTimeout(e,n).unref?.()})});import{existsSync as Nb,readFileSync as fC,realpathSync as pC}from"fs";import{join as xn,dirname as Bb,resolve as hC}from"path";import{homedir as $b}from"os";function gC(n,e){let t=xn(n,".pi");if(mC.some(s=>Nb(xn(t,s))))return!0;let r=xn(e,".agents","skills");for(let s=n;;){let i=xn(s,".agents","skills");if(i!==r&&Nb(i))return!0;let o=Bb(s);if(o===s)return!1;s=o}}function yC(n,e){for(let t=e;;){if(n[t]===!0||n[t]===!1)return!0;let r=Bb(t);if(r===t)return!1;t=r}}function Db(n,e){try{let t=e?.agentDir??xn($b(),".pi","agent"),r=Lb(e?.home??process.env.HOME??$b()),s=Lb(hC(n));if(!gC(s,r))return null;let i=Mb(xn(t,"settings.json")).defaultProjectTrust;return i==="always"||i==="never"||yC(Mb(xn(t,"trust.json")),s)?null:"pi has no trust decision for this project \u2014 running untrusted; run `pi` once in a terminal to grant it"}catch{return null}}var mC,Lb,Mb,jb=S(()=>{"use strict";mC=["settings.json","extensions","skills","prompts","themes","SYSTEM.md","APPEND_SYSTEM.md"],Lb=n=>{try{return pC(n)}catch{return n}},Mb=n=>{try{return JSON.parse(fC(n,"utf8"))}catch{return{}}}});import{statSync as bC,openSync as wC,readSync as vC,closeSync as SC,existsSync as Ub}from"fs";import{join as Ta}from"path";import{homedir as Md}from"os";import{execFile as kC}from"child_process";async function EC(n){let e=Ta(Md(),".pi","agent","bin",process.platform==="win32"?"fd.exe":"fd");for(let t of["fd","fdfind",...Ub(e)?[e]:[]]){let r=await new Promise(s=>{kC(t,["--base-directory",n,"--type","f","--follow","--hidden","--exclude",".git"],{maxBuffer:67108864},(i,o)=>s(i?null:o))});if(r!==null)return r.split(`
|
|
2011
2011
|
`).filter(Boolean).map(s=>s.replace(/\\/g,"/"))}return null}function AC(n){return`--${n.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`}function Fb(n){return n.type==="message"?TC(n.message?.role):n.type==="custom_message"?n.display!==!1:!1}var xC,TC,Er,Bd=S(()=>{"use strict";ms();du();bo();Ab();Ib();jb();xC=Ta(Md(),".pi","agent","sessions");TC=n=>n==="user"||n==="assistant"||n==="toolResult"||n==="bashExecution";Er=class extends $t{displayName="Pi Mirror";detectsSelf(){return process.env.PI_CODING_AGENT==="true"}detectsInstalled(){return Ub(Ta(Md(),".pi","agent"))}ensureHarnessSupport(){Eb()}createDriver(e,t){let r=new Aa(e,t),s=Db(e);return s&&r.notice(s,"warning"),r}walkFiles(e){return EC(e)}sessionsDir(e){return Ta(xC,AC(e))}listSessionFiles(e){return yo(this.sessionsDir(e))}parseEntry(e){let t;try{t=JSON.parse(e)}catch{return null}return!t||t.type==="session"||!t.id?null:t}idOf(e){return e.id}parentOf(e){return e.parentId??void 0}timestampOf(e){return e.timestamp}isSidechain(e){return!1}isLeafType(e){return Fb(e)}isRecoveryNoise(e){return!1}apply(e,t){let r=[];if(e.type==="custom_message"){if(e.display===!1)return{events:r};let i=this.contentText(e.content).trim();return i&&r.push({type:"user",text:i}),{events:r}}if(e.type!=="message"||!e.message)return{events:r};let s=e.message;if(s.role==="user"){let i=this.contentText(s.content).trim();return i&&r.push({type:"user",text:i}),{events:r}}if(s.role==="toolResult"){let i=this.contentText(s.content);return r.push({type:"tool_result",id:s.toolCallId??"",content:i,isError:!!s.isError,digest:Ne(i)}),{events:r}}if(s.role==="bashExecution")return s.command&&!s.excludeFromContext&&r.push({type:"user",text:`$ ${s.command}`}),{events:r};if(s.role==="assistant"){let i=Array.isArray(s.content)?s.content:[],o=i.filter(f=>f.type==="text").map(f=>f.text??"").join(""),a=i.filter(f=>f.type==="thinking").map(f=>f.thinking??"").join(`
|
|
2012
2012
|
`),l=i.filter(f=>f.type==="toolCall").map(f=>({id:f.id??"",name:f.name??"",input:f.arguments??{}}));if(o||a||l.length){let f=Date.parse(e.timestamp??""),p=!isNaN(f)&&f>=t;r.push({type:"assistant",text:o,thinking:a,tools:l,live:p})}let c=s.usage,d=c?(c.input??0)+(c.output??0)+(c.cacheRead??0)+(c.cacheWrite??0):0,u=c&&d>0&&s.stopReason!=="aborted"&&s.stopReason!=="error"?{in:c.input??0,out:c.output??0,cached:c.cacheRead??0,cacheCreate:c.cacheWrite??0}:void 0;return{events:r,usage:u,model:s.model,cost:c?.cost?.total}}return{events:r}}chainWorking(e){let t;for(let a of e)Fb(a)&&(t=a);if(!t||t.type==="custom_message")return!1;let r=t.message.role;if(r==="user"||r==="toolResult"||r==="bashExecution")return!0;if(r!=="assistant")return!1;let i=(Array.isArray(t.message.content)?t.message.content:[]).filter(a=>a.type==="toolCall").map(a=>a.id);if(!i.length)return!1;let o=new Set;for(let a of e)a.type==="message"&&a.message?.role==="toolResult"&&a.message.toolCallId&&o.add(a.message.toolCallId);return i.some(a=>a&&!o.has(a))}sessionAlive(){}readPreview(e){let t;try{t=wC(e,"r")}catch{return""}try{let s=65536;try{s=bC(e).size}catch{}let i=(u,f)=>{let p=Buffer.alloc(f),g=vC(t,p,0,f,u);return p.subarray(0,g).toString("utf8")},o=i(0,Math.min(65536,s)),a=s>65536?i(s-65536,65536):"",l=u=>{let f="";for(let p of u.split(`
|
|
2013
2013
|
`))if(p.includes('"session_info"'))try{let g=JSON.parse(p);g?.type==="session_info"&&typeof g.name=="string"&&g.name&&(f=g.name)}catch{}return f},c="";for(let u of o.split(`
|
|
2014
2014
|
`))if(!(c||!u.includes('"type"')))try{let f=JSON.parse(u);f?.type==="message"&&f.message?.role==="user"&&(c=this.contentText(f.message.content).replace(/\s+/g," ").trim())}catch{}let d=l(a)||l(o)||c;return d?d.slice(0,200):""}finally{SC(t)}}searchText(e){if(e?.type!=="message")return"";let t=e.message?.role;if(t!=="user"&&t!=="assistant")return"";let r=e.message?.content,s="";return typeof r=="string"?s=r:Array.isArray(r)&&(s=r.filter(i=>i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(" ")),s.replace(/\s+/g," ").trim()}contentText(e){return typeof e=="string"?Ae(e):Array.isArray(e)?e.map(t=>typeof t?.text=="string"?Ae(t.text):t?.type==="image"&&t.data?go(t.data,t.mimeType):"").filter(Boolean).join(`
|
|
2015
|
-
`):""}}});var Pa,qb=S(()=>{"use strict";Pa=class{#
|
|
2015
|
+
`):""}}});var Pa,qb=S(()=>{"use strict";Pa=class{#e=new Map;accept(e,t){return this.#e.get(e)===t?!1:(this.#e.set(e,t),!0)}}});import{execFile as PC}from"child_process";import{promisify as OC}from"util";import{readFile as CC}from"fs/promises";import{resolve as Jb,sep as _C}from"path";async function Qe(n,e){let{stdout:t}=await RC("git",n,{cwd:e,maxBuffer:67108864});return t}async function En(){if(Oa)return Oa;try{Oa=(await Qe(["rev-parse","--show-toplevel"],G)).trim()}catch{}return Oa}function IC(n,e){let t=e===" "?n:e;return t==="?"?"U":t}async function jd(){let n=await En();if(!n)return{repo:!1,root:"",files:[]};try{let e=await Qe(["status","--porcelain","-z"],n),t=[],r=e.split("\0");for(let s=0;s<r.length;s++){let i=r[s];i.length<4||((i[0]==="R"||i[0]==="C")&&s++,t.push({path:i.slice(3),status:IC(i[0],i[1])}))}try{let s=await Qe(["diff","--numstat","-z","HEAD"],n),i=new Map,o=s.split("\0");for(let a=0;a<o.length;a++){let l=/^(\d+|-)\t(\d+|-)\t(.*)$/.exec(o[a]);if(!l)continue;let c=l[3]||o[a+=2];c&&i.set(c,{add:+l[1]||0,del:+l[2]||0,binary:l[1]==="-"})}for(let a of t){let l=i.get(a.path);l&&(l.binary?a.binary=!0:(a.add=l.add,a.del=l.del))}}catch{}return t.sort((s,i)=>s.path.localeCompare(i.path)),{repo:!0,root:n,files:t}}catch(e){return{repo:!1,root:"",files:[],error:z(e)}}}async function Fd(n){let e=await En();if(!e)return{ok:!1,error:"not a git repository"};try{if((await Qe(["status","--porcelain","-z","--",n],e)).startsWith("??")){let s=Jb(e,n);if(!s.startsWith(Jb(e)+_C))return{ok:!1,error:"outside repository"};let i=await CC(s);return i.includes(0)?Dd("Binary file (not shown)",!1):Dd(i.toString("utf8"),!0)}let r;try{r=await Qe(["diff","--no-color","--unified=999999","HEAD","--",n],e)}catch{r=await Qe(["diff","--no-color","--unified=999999","--",n],e)}return Dd(r,!1)}catch(t){return{ok:!1,error:z(t)}}}var RC,Wb,Oa,Dd,Ws=S(()=>{"use strict";Ht();RC=OC(PC),Wb=2e6;Dd=(n,e)=>({ok:!0,text:n.slice(0,Wb),untracked:e,truncated:n.length>Wb})});function Ks(n,e){let t=0,r="";for(let s of n){let i=s.lower.indexOf(e);if(!(i<0)&&(t++,!r)){let o=Math.max(0,i-110),a=Math.min(s.text.length,i+e.length+110);r=(o>0?"\u2026":"")+s.text.slice(o,a)+(a<s.text.length?"\u2026":"")}}return{hitCount:t,snippet:r}}var Ud=S(()=>{"use strict"});function Kb(){return NC.map(([n,e])=>ht(n,e)).filter(n=>typeof n!="string")}function Hb(){return Kb().length>0}async function Ca(n,e,t=0){let r=AbortSignal.timeout(e);for(let s of Kb()){try{let i=await Ft(s,{messages:[{role:"user",content:n}],effort:t,webSearch:!1,signal:r});if(i.ok){let o=(await rd(i,s.protocol)).trim();if(o)return o}}catch{}if(r.aborted)return}}var NC,qd=S(()=>{"use strict";Dt();kr();NC=[["openrouter","openai/gpt-5.6-luna"],["openai","gpt-5.6-luna"]]});var _a,Ra,Yb=S(()=>{"use strict";_a=".typebulb/paste",Ra={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp"}});import{existsSync as $C,mkdirSync as LC,writeFileSync as MC,readFileSync as BC}from"fs";import{join as Ia}from"path";function Vb(){let n=new Date,e=t=>String(t).padStart(2,"0");return`${n.getFullYear()}${e(n.getMonth()+1)}${e(n.getDate())}-${e(n.getHours())}${e(n.getMinutes())}${e(n.getSeconds())}`}function FC(n){return n.trim().toLowerCase().replace(/\.[a-z0-9]{1,4}$/,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60)}async function UC(n){let e=await Ca(`Reply with ONLY a short kebab-case filename (2-5 words, lowercase, no extension) describing this text:
|
|
2016
2016
|
|
|
2017
2017
|
${n.slice(0,jC)}`,DC);return e&&FC(e)||void 0}async function zb(n,e){if(!e||e.kind!=="image"&&e.kind!=="text")return{ok:!1,error:"bad paste kind"};if(typeof e.data!="string"||!e.data)return{ok:!1,error:"empty paste"};let t=Ia(n,_a);try{LC(t,{recursive:!0})}catch(a){return{ok:!1,error:z(a)}}let r,s,i;if(e.kind==="image"){if(r=`img-${Vb()}`,s=Object.keys(Ra).find(a=>Ra[a]===e.mime)??"png",i=Buffer.from(e.data,"base64"),!i.length)return{ok:!1,error:"empty image data"}}else r=await UC(e.data)??`paste-${Vb()}`,s="md",i=e.data;let o=`${r}.${s}`;for(let a=2;$C(Ia(t,o));a++)o=`${r}-${a}.${s}`;try{MC(Ia(t,o),i)}catch(a){return{ok:!1,error:z(a)}}return{ok:!0,path:`${_a}/${o}`}}function Gb(n,e){if(!/^[\w-]+(\.[\w-]+)*$/.test(e))return{ok:!1,error:"bad name"};let t=e.slice(e.lastIndexOf(".")+1).toLowerCase(),r=Ra[t];if(!r)return{ok:!1,error:"not an image"};try{return{ok:!0,mime:r,base64:BC(Ia(n,_a,e)).toString("base64")}}catch{return{ok:!1,error:"not found"}}}var DC,jC,Xb=S(()=>{"use strict";qd();Ht();Yb();DC=4e3,jC=4e3});async function ew(n,e=""){let t=n.trim();if(!t)return{ok:!1,error:"nothing to summarize"};if(!Hb())return{ok:!1,error:"Summary needs OPENROUTER_API_KEY or OPENAI_API_KEY in this project\u2019s .env.",setup:!0};let r=e.trim()?Zb+`CONTEXT \u2014 the user message this reply answers. It is context only: never summarize it, and never report it as the reply's content.
|
|
2018
2018
|
`+JC(e.trim())+`
|
|
@@ -2039,7 +2039,7 @@ Reply with the summary alone.
|
|
|
2039
2039
|
|
|
2040
2040
|
`+n.slice(n.length-t)}});function WC(n,...e){return n.slice().sort((t,r)=>{for(let{key:s,desc:i}of e){let o=s(t),a=s(r);if(o!==a)return o==null?i?-1:1:a==null||o<a?i?1:-1:i?-1:1}return 0})}var Na,nw=S(()=>{"use strict";Na=(n,e)=>WC(n,{key:e,desc:!0})});import{existsSync as rw,openSync as KC,readSync as HC,closeSync as YC,statSync as Ar,readdirSync as sw,watchFile as VC,unwatchFile as iw,mkdirSync as zC,writeFileSync as GC,readFileSync as $a,unlinkSync as XC,rmSync as QC}from"fs";import{stat as ZC}from"fs/promises";import{dirname as e_,join as An,resolve as ow}from"path";function s_(n){if(!Number.isInteger(n))return!0;try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}function Tr(n){let e={cwd:G,sessionId:"",sessionStartMs:Date.now(),buffer:[],partial:"",offset:0,latest:{in:0,out:0,cached:0,cacheCreate:0},latestModel:null,everAttached:!1,entries:new Map,thread:"main"},t=new Set,r,s=0,i="";function o(m){t.clear(),r=m,s=0,i=""}function a(){if(!r||!n.settlesSpawns)return;let m=l(r,s);if(!m.text)return;s=m.offset,i+=m.text;let v;for(;(v=i.indexOf(`
|
|
2041
2041
|
`))>=0;){let w=i.slice(0,v);if(i=i.slice(v+1),!w.trim())continue;let A=n.parseEntry(w);if(A)for(let _ of n.settlesSpawns(A))t.add(_)}}function l(m,v){let w={offset:v,text:""},A;try{A=Ar(m).size}catch{return w}if(A<=v)return w;let _;try{_=KC(m,"r")}catch{return w}try{let B=A-v,D=Buffer.alloc(B),j=0;for(;j<B;){let V=HC(_,D,j,B-j,v+j);if(!V)break;j+=V}return{offset:v+j,text:D.subarray(0,j).toString("utf8")}}finally{YC(_)}}let c=new Set,d,u=0;function f(){if(e.file){for(let m of c)if(m.file===e.file)return m;return}return d}function p(m){let v={d:n.createDriver(e.cwd,m),file:m,id:`new:${++u}`,startedAt:Date.now()};return c.add(v),e.file||(d=v),v}function g(){let m=[...c].filter(w=>w.file);if(!m.length)return[];let v=new Map(n.listSessionFiles(e.cwd).map(w=>[w.file,w.sessionId]));return m.map(w=>{let A=v.get(w.file);return{rec:w,sessionId:A??w.id,pending:A===void 0}})}let h=()=>g().filter(m=>m.pending&&m.rec.prompt!==void 0);async function y(m){c.delete(m),d===m&&(d=void 0);try{await m.d.dispose()}catch(v){console.error("[composer] dispose:",z(v))}}function E(){let m=f(),v=new Set(h().map(w=>w.rec));for(let w of[...c])w!==m&&(v.has(w)||w.d.streaming||w.d.queue||w.d.error||y(w))}function P(){for(let m of c)m.d.sessionFile&&m.file!==m.d.sessionFile&&(m.file=m.d.sessionFile);if(d&&!e.file&&d.file){let m=n.listSessionFiles(e.cwd).find(v=>v.file===d.file);m&&be(m)}d&&!e.file&&d.prompt!==void 0&&e.sessionId!==d.id&&(te(void 0,d.id),e.everAttached=!0)}let O=m=>An(m,n_),x=(m,v)=>An(O(m),`${v}.lock`);function N(m,v){try{let w=x(m,v);if(Date.now()-Ar(w).mtimeMs>=aw)return!1;try{let A=parseInt($a(w,"utf8").trim(),10);if(A===process.pid||!s_(A))return!1}catch{}return!0}catch{return!1}}function I(m,v){if(v)try{zC(O(m),{recursive:!0}),GC(x(m,v),String(process.pid))}catch(w){console.error("[lock] claim failed:",z(w))}}function L(m){try{QC(An(m,".claude-bulb"),{recursive:!0,force:!0})}catch{}}function T(m){let v=O(m);if(!rw(v))return;let w;try{w=sw(v)}catch{return}let A=Date.now();for(let _ of w){if(!_.endsWith(".lock"))continue;let B=An(v,_);try{let D=Ar(B);A-D.mtimeMs>r_&&XC(B)}catch{}}}function K(m){try{return Ar(m),!1}catch(v){return v.code==="ENOENT"}}function X(){let m=e;if(m.file&&!K(m.file)){I(m.cwd,m.sessionId);return}let v=Z(m);v&&be(v)}function Z(m){if(!m.everAttached)return U(m.cwd)??ye(m.cwd,()=>!0)}function U(m){let v=O(m);if(!rw(v))return;let w;try{w=sw(v)}catch{return}let A;for(let B of w)if(B.endsWith(".lock"))try{let D=Ar(An(v,B));if(Date.now()-D.mtimeMs>=aw||parseInt($a(An(v,B),"utf8").trim(),10)!==process.pid)continue;(!A||D.mtimeMs>A.mtime)&&(A={sessionId:B.slice(0,-5),mtime:D.mtimeMs})}catch{}if(!A)return;let _=n.listSessionFiles(m).find(B=>B.sessionId===A.sessionId);if(!(!_||K(_.file)))return _}function ye(m,v){return n.listSessionFiles(m).sort((w,A)=>A.mtime-w.mtime).find(w=>!N(m,w.sessionId)&&v(w))}function te(m,v){let w=e;if(w.file)try{iw(w.file)}catch{}w.file=m,w.sessionId=v,w.partial="",w.offset=0,w.latest={in:0,out:0,cached:0,cacheCreate:0},w.latestModel=null,w.entries=new Map,w.chainLastId=void 0,w.buffer.push({type:"cleared"}),w.buffer.push({type:"session",sessionId:v})}function be(m){let v=e;d=void 0,ai(),o(m.file),te(m.file,m.sessionId),v.everAttached=!0,I(v.cwd,m.sessionId),qe(m.file)}function qe(m){if(we(),!!m){try{iw(m)}catch{}VC(m,{interval:200},()=>we())}}function pe(){ai(),o(void 0),te(void 0,"")}function we(){let m=e;if(!m.file)return;let v=l(m.file,m.offset);if(!v.text)return;m.offset=v.offset,m.partial+=v.text;let w,A;for(;(A=m.partial.indexOf(`
|
|
2042
|
-
`))>=0;){let j=m.partial.slice(0,A);if(m.partial=m.partial.slice(A+1),!j.trim())continue;let V=n.parseEntry(j);if(!V)continue;let le=n.idOf(V);le&&(m.entries.set(le,V),!n.isSidechain(V,m.thread)&&n.isLeafType(V)&&(w=le))}if(!w)return;let _=[],B=m.entries.get(w),D=!1;for(;B;){if(_.push(B),n.idOf(B)===m.chainLastId){D=!0;break}let j=n.parentOf(B);B=j?m.entries.get(j):void 0}if(D)for(let j=_.length-2;j>=0;j--)C(_[j]);else{m.chainLastId!==void 0&&(m.buffer.push({type:"cleared"}),m.buffer.push({type:"session",sessionId:m.sessionId}),m.latest={in:0,out:0,cached:0,cacheCreate:0});let j=new Set(_.map(le=>n.idOf(le))),V=Qt(m.entries);for(let le=_.length-1;le>=0;le--)C(_[le]),b(n.idOf(_[le]),V,j)}m.chainLastId=w}function Qt(m){let v=new Map;for(let w of m.values()){let A=n.parentOf(w);if(!A)continue;let _=v.get(A);_?_.push(w):v.set(A,[w])}return v}function b(m,v,w){if(!m)return;let A=v.get(m);if(!A)return;let _=A.filter(V=>!n.isSidechain(V,e.thread));if(_.length<2)return;let B=_.filter(V=>!w.has(n.idOf(V)));if(!B.length)return;let D=[],j=0;for(let V of B){let le=k(V,v);D.push(...le.events),j+=le.count}j>0&&e.buffer.push({type:"fork",atId:m,count:j,events:D})}function k(m,v){let w=[],A=[m];for(;A.length;){let D=A.pop();if(n.isSidechain(D,e.thread))continue;w.push(D);let j=v.get(n.idOf(D)??"");if(j)for(let V of j)A.push(V)}w.sort((D,j)=>(Date.parse(n.timestampOf(D)??"")||0)-(Date.parse(n.timestampOf(j)??"")||0));let _=[];for(let D of w)n.isRecoveryNoise(D)||_.push(...n.apply(D,e.sessionStartMs).events);return{count:_.reduce((D,j)=>D+(j.type==="user"||j.type==="assistant"?1:0),0),events:_}}function C(m){try{let{events:v,usage:w,model:A,cost:_}=n.apply(m,e.sessionStartMs);for(let B of v)e.buffer.push(B);v.some(B=>B.type==="assistant")&&f()?.d.clearCompletedDraft(),v.some(B=>B.type==="user")&&f()?.d.clearEcho(),A&&(e.latestModel=A),w&&(e.latest=w),(w||_)&&e.buffer.push({type:"usage",...e.latest,cost:_})}catch(v){console.error("[mirror] skipped malformed entry:",z(v))}}async function $(){return{cwd:e.cwd,pid:process.pid,composer:!!n.createDriver,children:!!n.listChildren,elsewhere:await M()}}async function M(){if(n.listSessionFiles(e.cwd).length)return;let m=await En();if(!m)return;let v=ow(m).toLowerCase();for(let w=ow(e.cwd);w.toLowerCase()!==v;){let A=e_(w);if(A===w)return;w=A;let _=n.listSessionFiles(w).length;if(_)return{dir:w,count:_}}}M().then(m=>{m&&console.log(`No sessions for ${e.cwd} \u2014 ${m.count} exist for ${m.dir}. Launched from a subfolder? Relaunch from the project root.`)}).catch(()=>{});let J=new Pa;async function W(m,v){e.thread!=="child"&&J.accept(m,v)&&console.log(v)}function _e(){let m=n.sessionAlive(e.sessionId,e.cwd);if(m!==void 0)return m;if(!e.file)return!1;try{return Date.now()-Ar(e.file).mtimeMs<1e4}catch{return!1}}function H(){return n.chainWorking([...e.entries.values()])&&_e()}function ae(){!n.createDriver||f()||e.latestModel||H()||p(e.file)}async function Ee(m){let v=e;X(),P(),ae(),E();let w=f();for(let D of c)D!==w&&D.d.dialog;let A=g().filter(D=>D.rec.d.streaming).map(D=>D.sessionId),_=H(),B=n.createDriver?{streaming:!!w?.d.streaming,foreign:!w&&_,draft:w?.d.draft??null,echo:w?.d.echo??null,status:w?.d.status??null,dialog:w?.d.dialog??null,queue:w?.d.queue??null,stats:w?.d.stats??null,model:w?.d.model??null,error:w?.d.error}:void 0;return{events:v.buffer.slice(m),cursor:v.buffer.length,working:!!w?.d.streaming||_,latestModel:v.latestModel,child:v.child?.id??null,composer:B,busy:A}}async function Rn(){X(),P();let m=f();if(m?.d.error&&!m.d.streaming&&(await y(m),m=void 0),!m){if(H())return{ok:!1,error:"the agent is mid-turn in a terminal \u2014 watch only"};m=p(e.file)}let v=m;return{ok:!0,d:v.d,markSent:w=>{v.prompt===void 0&&(v.prompt=w)}}}async function Zt(m,v){if(!n.createDriver)return{ok:!1,error:"not supported"};let w=String(m??"").trim();if(!w)return{ok:!1,error:"empty message"};let A=await Rn();if(!A.ok)return A;let _=await A.d.send(w,v);return _.ok&&A.markSent(w),_}async function xt(m,v){let w=f();return w?w.d.respondUi(String(m??""),v??{}):{ok:!1,error:"no dialog pending"}}async function cl(m,v){if(!n.createDriver)return{ok:!1,error:"not supported"};if(!m||typeof m.type!="string")return{ok:!1,error:"bad command"};if(v?.spawn){let A=await Rn();return A.ok?A.d.rpc(m):A}let w=f();return!w||w.d.error?{ok:!1,error:"not running"}:w.d.rpc(m)}async function ul(){let m=f();if(m)try{await m.d.stop()}catch(v){console.error("[composer] stop:",z(v))}return{ok:!0}}async function aS(){return n.createDriver?(P(),!e.file&&d&&d.prompt===void 0&&!d.d.streaming&&!d.d.error?{ok:!0}:(d?.d.error&&await y(d),d=void 0,pe(),p(void 0),E(),{ok:!0})):{ok:!1,error:"not supported"}}async function lS(){if(!n.createDriver)return[];let m=await Qe(["ls-files","--cached","--others","--exclude-standard"],e.cwd).catch(()=>null),v=m!==null?m.split(`
|
|
2042
|
+
`))>=0;){let j=m.partial.slice(0,A);if(m.partial=m.partial.slice(A+1),!j.trim())continue;let V=n.parseEntry(j);if(!V)continue;let le=n.idOf(V);le&&(m.entries.set(le,V),!n.isSidechain(V,m.thread)&&n.isLeafType(V)&&(w=le))}if(!w)return;let _=[],B=m.entries.get(w),D=!1;for(;B;){if(_.push(B),n.idOf(B)===m.chainLastId){D=!0;break}let j=n.parentOf(B);B=j?m.entries.get(j):void 0}if(D)for(let j=_.length-2;j>=0;j--)C(_[j]);else{m.chainLastId!==void 0&&(m.buffer.push({type:"cleared"}),m.buffer.push({type:"session",sessionId:m.sessionId}),m.latest={in:0,out:0,cached:0,cacheCreate:0});let j=new Set(_.map(le=>n.idOf(le))),V=Qt(m.entries);for(let le=_.length-1;le>=0;le--)C(_[le]),b(n.idOf(_[le]),V,j)}m.chainLastId=w}function Qt(m){let v=new Map;for(let w of m.values()){let A=n.parentOf(w);if(!A)continue;let _=v.get(A);_?_.push(w):v.set(A,[w])}return v}function b(m,v,w){if(!m)return;let A=v.get(m);if(!A)return;let _=A.filter(V=>!n.isSidechain(V,e.thread));if(_.length<2)return;let B=_.filter(V=>!w.has(n.idOf(V)));if(!B.length)return;let D=[],j=0;for(let V of B){let le=k(V,v);D.push(...le.events),j+=le.count}j>0&&e.buffer.push({type:"fork",atId:m,count:j,events:D})}function k(m,v){let w=[],A=[m];for(;A.length;){let D=A.pop();if(n.isSidechain(D,e.thread))continue;w.push(D);let j=v.get(n.idOf(D)??"");if(j)for(let V of j)A.push(V)}w.sort((D,j)=>(Date.parse(n.timestampOf(D)??"")||0)-(Date.parse(n.timestampOf(j)??"")||0));let _=[];for(let D of w)n.isRecoveryNoise(D)||_.push(...n.apply(D,e.sessionStartMs).events);return{count:_.reduce((D,j)=>D+(j.type==="user"||j.type==="assistant"?1:0),0),events:_}}function C(m){if(!n.isSidechain(m,e.thread))try{let{events:v,usage:w,model:A,cost:_}=n.apply(m,e.sessionStartMs);for(let B of v)e.buffer.push(B);v.some(B=>B.type==="assistant")&&f()?.d.clearCompletedDraft(),v.some(B=>B.type==="user")&&f()?.d.clearEcho(),A&&(e.latestModel=A),w&&(e.latest=w),(w||_)&&e.buffer.push({type:"usage",...e.latest,cost:_})}catch(v){console.error("[mirror] skipped malformed entry:",z(v))}}async function $(){return{cwd:e.cwd,pid:process.pid,composer:!!n.createDriver,children:!!n.listChildren,elsewhere:await M()}}async function M(){if(n.listSessionFiles(e.cwd).length)return;let m=await En();if(!m)return;let v=ow(m).toLowerCase();for(let w=ow(e.cwd);w.toLowerCase()!==v;){let A=e_(w);if(A===w)return;w=A;let _=n.listSessionFiles(w).length;if(_)return{dir:w,count:_}}}M().then(m=>{m&&console.log(`No sessions for ${e.cwd} \u2014 ${m.count} exist for ${m.dir}. Launched from a subfolder? Relaunch from the project root.`)}).catch(()=>{});let J=new Pa;async function W(m,v){e.thread!=="child"&&J.accept(m,v)&&console.log(v)}function _e(){let m=n.sessionAlive(e.sessionId,e.cwd);if(m!==void 0)return m;if(!e.file)return!1;try{return Date.now()-Ar(e.file).mtimeMs<1e4}catch{return!1}}function H(){return n.chainWorking([...e.entries.values()])&&_e()}function ae(){!n.createDriver||f()||e.latestModel||H()||p(e.file)}async function Ee(m){let v=e;X(),P(),ae(),E();let w=f();for(let D of c)D!==w&&D.d.dialog;let A=g().filter(D=>D.rec.d.streaming).map(D=>D.sessionId),_=H(),B=n.createDriver?{streaming:!!w?.d.streaming,foreign:!w&&_,draft:w?.d.draft??null,echo:w?.d.echo??null,status:w?.d.status??null,dialog:w?.d.dialog??null,queue:w?.d.queue??null,stats:w?.d.stats??null,model:w?.d.model??null,error:w?.d.error}:void 0;return{events:v.buffer.slice(m),cursor:v.buffer.length,working:!!w?.d.streaming||_,latestModel:v.latestModel,child:v.child?.id??null,composer:B,busy:A}}async function Rn(){X(),P();let m=f();if(m?.d.error&&!m.d.streaming&&(await y(m),m=void 0),!m){if(H())return{ok:!1,error:"the agent is mid-turn in a terminal \u2014 watch only"};m=p(e.file)}let v=m;return{ok:!0,d:v.d,markSent:w=>{v.prompt===void 0&&(v.prompt=w)}}}async function Zt(m,v){if(!n.createDriver)return{ok:!1,error:"not supported"};let w=String(m??"").trim();if(!w)return{ok:!1,error:"empty message"};let A=await Rn();if(!A.ok)return A;let _=await A.d.send(w,v);return _.ok&&A.markSent(w),_}async function xt(m,v){let w=f();return w?w.d.respondUi(String(m??""),v??{}):{ok:!1,error:"no dialog pending"}}async function cl(m,v){if(!n.createDriver)return{ok:!1,error:"not supported"};if(!m||typeof m.type!="string")return{ok:!1,error:"bad command"};if(v?.spawn){let A=await Rn();return A.ok?A.d.rpc(m):A}let w=f();return!w||w.d.error?{ok:!1,error:"not running"}:w.d.rpc(m)}async function ul(){let m=f();if(m)try{await m.d.stop()}catch(v){console.error("[composer] stop:",z(v))}return{ok:!0}}async function aS(){return n.createDriver?(P(),!e.file&&d&&d.prompt===void 0&&!d.d.streaming&&!d.d.error?{ok:!0}:(d?.d.error&&await y(d),d=void 0,pe(),p(void 0),E(),{ok:!0})):{ok:!1,error:"not supported"}}async function lS(){if(!n.createDriver)return[];let m=await Qe(["ls-files","--cached","--others","--exclude-standard"],e.cwd).catch(()=>null),v=m!==null?m.split(`
|
|
2043
2043
|
`).filter(Boolean):await n.walkFiles?.(e.cwd)??[];return(await Promise.all(v.map(async A=>{try{return{f:A,m:(await ZC(An(e.cwd,A))).mtimeMs}}catch{return{f:A,m:0}}}))).sort((A,_)=>_.m-A.m).map(A=>A.f)}function cS(){for(let m of[...c])y(m)}async function uS(m){return n.createDriver?zb(e.cwd,m):{ok:!1,error:"not supported"}}async function dS(m){return Gb(e.cwd,String(m??""))}async function fS(m,v){return ew(String(m??""),String(v??""))}async function pS(){let m=n.sessionsWorking?.(e.cwd),v=n.listSessionFiles(e.cwd).map(({sessionId:A,file:_,mtime:B})=>({sessionId:A,mtime:B,preview:n.readPreview(_),working:m?.has(A)})),w=h().map(A=>({sessionId:A.sessionId,mtime:A.rec.startedAt,preview:A.rec.prompt??"",pending:!0}));return Na([...v,...w],A=>A.mtime)}let Bf=new Map;function Df(m,v){let w=Bf.get(m);if(w&&w.mtime===v)return w.turns;let A=[],_="";try{_=$a(m,"utf8")}catch{return[]}for(let B of _.split(`
|
|
2044
2044
|
`)){if(!B.trim())continue;let D=n.parseEntry(B);if(!D)continue;let j=n.searchText(D);j&&A.push({text:j,lower:j.toLowerCase()})}return Bf.set(m,{mtime:v,turns:A}),A}async function hS(m){let v=m.toLowerCase(),w=[],A=0,_=n.sessionsWorking?.(e.cwd);for(let{sessionId:B,file:D,mtime:j}of n.listSessionFiles(e.cwd).sort((V,le)=>le.mtime-V.mtime)){let V=Ks(Df(D,j),v),le=(n.listChildren?.(e.cwd,B)??[]).map(Re=>({c:Re,hit:Ks(Df(Re.file,Re.mtime),v)})).filter(Re=>Re.hit.hitCount);if(!(!V.hitCount&&!le.length)){for(let{c:Re,hit:xS}of Na(le,ES=>ES.c.mtime))w.push({sessionId:B,mtime:Re.mtime,preview:Re.label||Re.kind,...xS,child:{id:Re.id,kind:Re.kind,depth:Re.depth}});if(w.push({sessionId:B,mtime:j,preview:n.readPreview(D),working:_?.has(B),...V}),++A>=i_)break}}return w}let jf=800,Ff=new Map;function mS(m,v){let w=Ff.get(m);if(w&&w.mtime===v)return w.text;let A="";try{A=$a(m,"utf8")}catch{return""}let _="";for(let D of A.split(`
|
|
2045
2045
|
`)){if(!D.trim())continue;let j=n.parseEntry(D);if(j)for(let V of n.apply(j,e.sessionStartMs).events)V.type==="assistant"&&V.text.trim()&&(_=V.text.trim())}let B=_.length>jf?_.slice(0,jf).trimEnd()+"\u2026":_;return Ff.set(m,{mtime:v,text:B}),B}async function gS(m){let v=n.listSessionFiles(e.cwd).find(w=>w.sessionId===m);return{text:v?mS(v.file,v.mtime):""}}async function yS(m){let v=e,w=n.listSessionFiles(v.cwd).find(A=>A.sessionId===m);if(!w){let A=h().find(_=>_.sessionId===m)?.rec;return A?((d!==A||v.sessionId!==A.id)&&(d=A,ai(),o(void 0),te(void 0,A.id),v.everAttached=!0,E()),{ok:!0}):{ok:!1,error:"session not found"}}return w.file===v.file?{ok:!0}:(be(w),P(),E(),{ok:!0})}async function bS(){if(!n.listChildren||!e.sessionId)return[];a();let m=_e(),v=n.listChildren(e.cwd,e.sessionId),w=new Map(v.map(_=>[_.id,_])),A=(_,B=new Set)=>{if(_.stopped||wS(_))return!0;if(!_.parentId||B.has(_.id))return!1;B.add(_.id);let D=w.get(_.parentId);return D?A(D,B):!1};return Na(v,_=>_.mtime).map(_=>({..._,state:vS(_,m,A(_))}))}function wS(m){return!!m.spawnId&&t.has(m.spawnId)||t.has(m.id)}function vS(m,v,w){return m.stopped?"stopped":m.running!==void 0?m.running&&v?"running":"done":w?"done":v?"running":"done"}async function SS(m){let v=e;if(!n.listChildren)return{ok:!1,error:"this harness has no child transcripts"};let w=n.listChildren(v.cwd,v.sessionId).find(A=>A.id===m);return w?(v.thread="child",v.child=w,te(w.file,v.sessionId),qe(w.file),{ok:!0}):{ok:!1,error:"child not found"}}async function kS(){let m=r;return!ai()||!m?{ok:!0}:(te(m,e.sessionId),qe(m),{ok:!0})}function ai(){let m=e;return m.thread==="main"?!1:(m.thread="main",m.child=void 0,!0)}return L(e.cwd),T(e.cwd),X(),{info:$,poll:Ee,logInlineStatus:W,listSessions:pS,searchSessions:hS,sessionPeek:gS,attach:yS,listChildren:bS,openChild:SS,closeChild:kS,composerSend:Zt,composerStop:ul,composerNew:aS,composerFiles:lS,composerUiRespond:xt,composerRpc:cl,composerPaste:uS,composerPasteRead:dS,summarizeTurn:fS,shutdownComposer:cS}}var t_,n_,aw,r_,i_,La=S(()=>{"use strict";Ht();qb();Ws();Ud();Xb();tw();nw();t_=".typebulb",n_=`${t_}/locks`,aw=5e3,r_=6e4;i_=50});import{existsSync as Hd,mkdirSync as o_,readFileSync as lw,writeFileSync as a_}from"fs";import{join as Tn,isAbsolute as l_}from"path";async function Vd(n,e){let t=l_(n)?n:Tn(G,n);return Hd(t)?(qu(t,e),{ok:!0}):{ok:!1,error:"file not found"}}async function zd(n){let e=G,t=Uu(n),r=Tn(e,"typebulbs");o_(r,{recursive:!0});let s=Bu(t),i=`${s}.bulb.md`;for(let c=2;Hd(Tn(r,i))&&lw(Tn(r,i),"utf8")!==t;c++)i=`${s}-${c}.bulb.md`;let o=Tn(r,i);Hd(o)||a_(o,t);let a=Tn("typebulbs",i),l=await Ss(a,{cwd:e,open:!1});return{ok:!0,file:a,pid:l.pid,url:l.url}}async function Gd(){return Q(G)}async function Xd(n){let e=(await Q()).find(t=>t.pid===n);return e?{ok:!0,outcome:await Bt(e)}:(await Qn(n),{ok:!0})}async function Qd(){let n=await ln(G);return Fo(G).filter(e=>!e.serverOnly).map(e=>({...e,trusted:hn(e.path),lastRunAt:n(e.path)}))}async function Zd(n){let e=n.toLowerCase(),t=[];for(let r of Fo(G).filter(s=>!s.serverOnly).sort((s,i)=>i.mtime-s.mtime)){let s="";try{s=lw(r.path,"utf8")}catch{continue}let i=[];for(let l of s.split(`
|