typebulb 0.61.6 → 0.61.7
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/README.md +1 -1
- package/SKILL.md +3 -3
- package/dist/agents/claude/client.js +107 -107
- package/dist/agents/claude/styles.css +11 -2
- package/dist/agents/codex/client.js +107 -107
- package/dist/agents/codex/styles.css +11 -2
- package/dist/agents/pi/client.js +155 -155
- package/dist/agents/pi/styles.css +11 -2
- package/dist/index.js +6 -6
- package/package.json +1 -1
|
@@ -1896,11 +1896,17 @@ a.agent-name:hover { text-decoration: underline; }
|
|
|
1896
1896
|
.child-status-edited .child-status-label { display: block; margin-bottom: .2rem; }
|
|
1897
1897
|
.child-status-edited .cs-file { overflow-wrap: anywhere; }
|
|
1898
1898
|
.child-status-edited a { cursor: pointer; color: var(--accent); }
|
|
1899
|
-
/*
|
|
1899
|
+
/* A path stays muted with the list and lights on hover, like the agents menu's status link. */
|
|
1900
|
+
.child-status-edited .cs-file a { color: inherit; }
|
|
1901
|
+
.child-status-edited .cs-file a:hover { color: var(--accent); text-decoration: underline; }
|
|
1902
|
+
/* Under the table, centred: a failed call's retry, then the view's actions. */
|
|
1900
1903
|
.child-status-foot { display: flex; flex-direction: column; align-items: center; gap: .6rem; padding: 1rem 0 1.75rem; }
|
|
1901
|
-
|
|
1904
|
+
/* Baseline, not the default stretch: a shimmering item has its own line-height (.shimmer-text), and
|
|
1905
|
+
top-aligned boxes of different line-heights put their text at different heights. */
|
|
1906
|
+
.child-status-actions { display: flex; align-items: baseline; gap: 1.4rem; }
|
|
1902
1907
|
.child-status-actions a { cursor: pointer; color: var(--accent); }
|
|
1903
1908
|
.child-status-actions a:hover { text-decoration: underline; }
|
|
1909
|
+
.child-status-actions .current { color: var(--muted); }
|
|
1904
1910
|
.child-status-note { color: var(--muted); font-size: .9rem; font-style: italic; }
|
|
1905
1911
|
/* Every working text in this view is centred, like the status line under the table. */
|
|
1906
1912
|
.child-status-pending { text-align: center; color: var(--muted); padding: .3rem 0; }
|
|
@@ -1938,6 +1944,9 @@ a.agent-name:hover { text-decoration: underline; }
|
|
|
1938
1944
|
farther apart than the row gap, from the slack in their min-width boxes; the margin matches that. */
|
|
1939
1945
|
.children-status-link { flex: none; margin-left: 1.2rem; color: var(--muted); cursor: pointer; }
|
|
1940
1946
|
.children-status-link:hover { color: var(--accent); text-decoration: underline; }
|
|
1947
|
+
/* Its tip opens beside the link, on one line no taller than the row: the list scrolls, so a tip
|
|
1948
|
+
above the top row is clipped. */
|
|
1949
|
+
.children-status-link[data-tip]::after { top: 50%; bottom: auto; right: calc(100% + .5rem); transform: translateY(-50%); max-width: 27rem; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
1941
1950
|
/* Judged and waiting to be opened: the mirror's "something new here" green, on the link and on the
|
|
1942
1951
|
pill, so it is seen with the menu closed. A failed judgement reads as an error and retries on click. */
|
|
1943
1952
|
.children-status-link.ready, .children-pill.status-ready { color: var(--fold-marker); }
|
package/dist/index.js
CHANGED
|
@@ -294,7 +294,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
294
294
|
};
|
|
295
295
|
})();`});var ee=k(()=>{Si();_l();Cp();Np();gu();Ig();Ug();Jg();Wg();Hg();Yg();ki()});function Te(n){return n.length>5e4?n.slice(0,5e4)+`
|
|
296
296
|
\u2026[${n.length-5e4} more characters truncated]`:n}function Ne(n){let e=n.replace(bT,"").split(`
|
|
297
|
-
`).map(i=>i.trim()).filter(Boolean),t=e[0];if(!t)return"";let r=t.length>300?t.slice(0,300).trimEnd()+"\u2026":t,s=e.length-1;return s>0?`${r} (+${s} line${s===1?"":"s"})`:r}var Se,bT,To,ys=k(()=>{"use strict";Se=(n,e,t=e+"s")=>`${n} ${n===1?e:t}`;bT=/\u001b\[[0-9;]*m/g;To=(n,e)=>``});import{closeSync as Gg,existsSync as wT,fstatSync as vT,openSync as Xg,readdirSync as ST,readSync as Qg,statSync as kT}from"fs";import{join as xT}from"path";function xu(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=Buffer.alloc(e),s=Qg(t,r,0,e,0);return{text:r.subarray(0,s).toString("utf8"),bytes:s}}finally{Gg(t)}}function Oo(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=vT(t).size,s=Math.min(e,r),i=Buffer.alloc(s),o=Qg(t,i,0,s,r-s);return{text:i.subarray(0,o).toString("utf8"),partial:r>s}}finally{Gg(t)}}function Po(n){if(!wT(n))return[];let e;try{e=ST(n)}catch{return[]}let t=[];for(let r of e){if(!r.endsWith(".jsonl"))continue;let s=xT(n,r);try{let i=kT(s);i.isFile()&&t.push({sessionId:r.slice(0,-6),file:s,mtime:i.mtimeMs})}catch{}}return t}var Co=k(()=>{"use strict"});var Bt,_o=k(()=>{"use strict";Bt=class{ensureHarnessSupport(){}forRead(){return this}}});import{openSync as ET,readSync as AT,closeSync as TT,statSync as ny,readdirSync as ry,readFileSync as sy,existsSync as OT}from"fs";import{join as cn}from"path";import{homedir as PT}from"os";function CT(n){return n.replace(/[^a-zA-Z0-9]/g,"-")}function RT(n,e,t){let r=cn(Eu(n,e),t,_T),s;try{s=ry(r)}catch{return[]}let i=zT(n,t),o=[];for(let a of s){if(!a.endsWith(".jsonl"))continue;let l=cn(r,a),c;try{c=ny(l)}catch{continue}let f=a.slice(0,-6),d={};try{d=JSON.parse(sy(cn(r,`${f}.meta.json`),"utf8"))}catch{}let u=$T(l,c.size,c.mtimeMs);o.push({id:f.startsWith("agent-")?f.slice(6):f,file:l,mtime:c.mtimeMs,started:c.birthtimeMs||void 0,tokens:u.tokens,running:!!u.running&&(i===void 0||c.mtimeMs>=i),label:d.description??"",kind:d.agentType===IT?void 0:d.agentType,model:d.model,spawnId:d.toolUseId,parentId:d.parentAgentId,depth:d.spawnDepth??1,stopped:!!d.stoppedByUser})}return o}function $T(n,e,t){let r=Zg.get(n);if(r&&r.size===e&&r.mtime===t)return{tokens:r.tokens,running:r.running};let s={};for(let i of NT){let o=Oo(n,i);if(!o)break;let a=o.text.split(`
|
|
297
|
+
`).map(i=>i.trim()).filter(Boolean),t=e[0];if(!t)return"";let r=t.length>300?t.slice(0,300).trimEnd()+"\u2026":t,s=e.length-1;return s>0?`${r} (+${s} line${s===1?"":"s"})`:r}var Se,bT,To,ys=k(()=>{"use strict";Se=(n,e,t=e+"s")=>`${n} ${n===1?e:t}`;bT=/\u001b\[[0-9;]*m/g;To=(n,e)=>``});import{closeSync as Gg,existsSync as wT,fstatSync as vT,openSync as Xg,readdirSync as ST,readSync as Qg,statSync as kT}from"fs";import{join as xT}from"path";function xu(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=Buffer.alloc(e),s=Qg(t,r,0,e,0);return{text:r.subarray(0,s).toString("utf8"),bytes:s}}finally{Gg(t)}}function Oo(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=vT(t).size,s=Math.min(e,r),i=Buffer.alloc(s),o=Qg(t,i,0,s,r-s);return{text:i.subarray(0,o).toString("utf8"),partial:r>s}}finally{Gg(t)}}function Po(n){if(!wT(n))return[];let e;try{e=ST(n)}catch{return[]}let t=[];for(let r of e){if(!r.endsWith(".jsonl"))continue;let s=xT(n,r);try{let i=kT(s);i.isFile()&&t.push({sessionId:r.slice(0,-6),file:s,mtime:i.mtimeMs})}catch{}}return t}var Co=k(()=>{"use strict"});var Bt,_o=k(()=>{"use strict";Bt=class{ensureHarnessSupport(){}childBriefs=!0;forRead(){return this}}});import{openSync as ET,readSync as AT,closeSync as TT,statSync as ny,readdirSync as ry,readFileSync as sy,existsSync as OT}from"fs";import{join as cn}from"path";import{homedir as PT}from"os";function CT(n){return n.replace(/[^a-zA-Z0-9]/g,"-")}function RT(n,e,t){let r=cn(Eu(n,e),t,_T),s;try{s=ry(r)}catch{return[]}let i=zT(n,t),o=[];for(let a of s){if(!a.endsWith(".jsonl"))continue;let l=cn(r,a),c;try{c=ny(l)}catch{continue}let f=a.slice(0,-6),d={};try{d=JSON.parse(sy(cn(r,`${f}.meta.json`),"utf8"))}catch{}let u=$T(l,c.size,c.mtimeMs);o.push({id:f.startsWith("agent-")?f.slice(6):f,file:l,mtime:c.mtimeMs,started:c.birthtimeMs||void 0,tokens:u.tokens,running:!!u.running&&(i===void 0||c.mtimeMs>=i),label:d.description??"",kind:d.agentType===IT?void 0:d.agentType,model:d.model,spawnId:d.toolUseId,parentId:d.parentAgentId,depth:d.spawnDepth??1,stopped:!!d.stoppedByUser})}return o}function $T(n,e,t){let r=Zg.get(n);if(r&&r.size===e&&r.mtime===t)return{tokens:r.tokens,running:r.running};let s={};for(let i of NT){let o=Oo(n,i);if(!o)break;let a=o.text.split(`
|
|
298
298
|
`);o.partial&&a.shift();let l=[];for(let f of a)if(f.trim())try{l.push(JSON.parse(f))}catch{}if(!l.length&&o.partial)continue;let c;for(let f=l.length-1;f>=0&&!c;f--)l[f]?.type==="assistant"&&(c=l[f].message?.usage);s={tokens:c&&(c.input_tokens??0)+(c.output_tokens??0)+(c.cache_read_input_tokens??0)+(c.cache_creation_input_tokens??0),running:iy(l)};break}return Zg.set(n,{size:e,mtime:t,...s}),s}function iy(n){let e;for(let i of n)(i.type==="user"||i.type==="assistant")&&(e=i);if(!e)return!1;if(e.type==="user"){try{let i=e.message?.content,o=typeof i=="string"?i:Array.isArray(i)?i.filter(l=>l&&l.type==="text").map(l=>l.text??"").join(""):"";if(!(Array.isArray(i)&&i.some(l=>l&&l.type==="tool_result"))&&o.trim()&&jt(o)==="")return!1}catch{}return!0}let r=(Array.isArray(e.message?.content)?e.message.content:[]).filter(i=>i.type==="tool_use").map(i=>i.id);if(r.length===0)return!e.message?.stop_reason||e.message.stop_reason==="tool_use";let s=new Set;for(let i of n){let o=i.message?.content;if(Array.isArray(o))for(let a of o)a.type==="tool_result"&&a.tool_use_id&&s.add(a.tool_use_id)}return r.some(i=>i&&!s.has(i))}function Io(n){let e=n?.type==="image"?n.source:void 0;return e?.type==="base64"&&e.data?To(e.data,e.media_type):""}function Au(n){return typeof n=="string"?Te(n):Array.isArray(n)?n.map(e=>{if(typeof e=="string")return Te(e);let t=e;return typeof t?.text=="string"?Te(t.text):t?.content!=null?Au(t.content):Io(t)}).join(`
|
|
299
299
|
`):n==null?"":Te(JSON.stringify(n))}function LT(n){let e=n.trim();return!!e&&oy.some(t=>t.test(e))}function MT(n){let e=n.trim();return e?oy.some(t=>{let r=t.exec(e);return!!r&&r.index===0}):!0}function BT(n){return n.replace(DT,"")}function jT(n){let e=/^<command-name>([\s\S]*?)<\/command-name>/.exec(n)?.[1]?.trim();if(!e)return;let t=/<command-args>([\s\S]*?)<\/command-args>/.exec(n)?.[1]?.trim();return t?`${e} ${t}`:e}function jt(n){let e=BT(n).trim();return e?jT(e)??(LT(e)?"":e):""}function No(n){let e=FT.exec(n.trim());if(e)return{from:e[1],body:qT(e[2].replace(UT,""))}}function qT(n){let e=n.split(`
|
|
300
300
|
`).filter(r=>r.trim()).map(r=>r.length-r.trimStart().length),t=e.length?Math.min(...e):0;return t?n.split(`
|
|
@@ -313,8 +313,8 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
313
313
|
`);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:kO(i,o),model:xO(t.text,r)}}catch{return{cwd:"",subagent:!1}}}function kO(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 xO(n,e){for(let t of n.slice(e+1).split(`
|
|
314
314
|
`))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 QT,ws,_u,nO,iO,oO,aO,lO,hO,bO,Mo,dy,Qn,vO,Ru=k(()=>{"use strict";ys();_o();Co();QT=["<permissions instructions>","<apps_instructions>","<plugins_instructions>","<skills_instructions>","<recommended_plugins>","<environment_context>","<node_repl_review_evidence>","# AGENTS.md instructions for "];ws=n=>!!n&&typeof n=="object"&&!Array.isArray(n),_u=n=>n==="shell_command"||n==="exec_command",nO=new Set(["max_output_tokens","yield_time_ms","timeout_ms"]);iO=/^(Get-Content|gc|cat|type|nl|bat|sed|head|tail)$/i,oO=/^-(Path|LiteralPath)$/i,aO=/^-(Encoding|TotalCount|Head|Tail|ReadCount|Delimiter)$/i,lO=/^(sed -n|head|tail|Select-Object|select)(\s|$)/i;hO={n:`
|
|
315
315
|
`,t:" ",r:"\r",b:"\b",f:"\f",v:"\v",0:"\0"};bO=n=>n?n.replace(/\r?\n$/,"").split(`
|
|
316
|
-
`).length:0;Mo=n=>{let e=XT(n);return process.platform==="win32"?e.toLowerCase():e},dy=12e4,Qn=class n extends Bt{constructor(t=Cu(ly(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";#t=0;#l;#n=!1;#i;#h=0;#s=new Map;#d=new Map;#o=new Map;#c=new Map;detectsSelf(){return!!process.env.CODEX_THREAD_ID}forRead(){return new n(this.root)}callerSessionId(t){let r=process.env.CODEX_THREAD_ID;return r?this.listSessionFiles(t).find(s=>s.sessionId.endsWith(r))?.sessionId:void 0}detectsInstalled(){return GT(Cu(ly(),".codex"))}sessionsDir(t){return this.root}listSessionFiles(t){let r=Mo(t),s=[];for(let i of this.#u()){let o=0,a=0;try{let f=Lo(i);if(!f.isFile())continue;o=f.size,a=f.mtimeMs}catch{continue}let l=this.#s.get(i);if(l===void 0){if(l=fy(i),l===void 0)continue;this.#s.set(i,l)}if(l.subagent||Mo(l.cwd)!==r)continue;let c=ay(i,".jsonl");this.#o.set(c,i),s.push({sessionId:c,file:i,mtime:this.#e(i,o,a)})}return s}listChildren(t,r){let s=Mo(t),i=new Map,o,a;for(let f of this.#u()){let d=0,u=0,p;try{let v=Lo(f);if(!v.isFile())continue;d=v.size,u=v.mtimeMs,p=v.birthtimeMs||void 0}catch{continue}let m=this.#s.get(f);if(m===void 0){if(m=fy(f),m===void 0)continue;this.#s.set(f,m)}if(ay(f,".jsonl")===r&&(o=m.id,a=m.model),!m.spawn||Mo(m.cwd)!==s)continue;let{running:h,tokens:y}=this.#r(f,d,u);i.set(m.spawn.id,{file:f,mtime:this.#e(f,d,u),started:p,running:h,tokens:y,spawn:m.spawn,model:m.model})}if(!o)return[];let l=(f,d=new Set)=>{if(f.parent===o)return!0;if(d.has(f.id))return!1;d.add(f.id);let u=i.get(f.parent);return u?l(u.spawn,d):!1},c=[];for(let{file:f,mtime:d,started:u,running:p,tokens:m,spawn:h,model:y}of i.values())l(h)&&c.push({id:h.id,file:f,mtime:d,started:u,tokens:m,label:h.path.split("/").filter(Boolean).pop()??h.path,kind:h.role||void 0,model:y&&y!==a?y:void 0,parentId:i.has(h.parent)?h.parent:void 0,depth:h.depth,stopped:!1,running:p});return c}sessionsWorking(t){let r=new Set,s=Date.now();for(let{sessionId:i,file:o,mtime:a}of this.listSessionFiles(t)){if(s-a>=dy)continue;let l;try{let c=Lo(o);l=this.#r(o,c.size,c.mtimeMs)}catch{continue}l.running&&r.add(i)}return r}#e(t,r,s){return Math.max(s,this.#r(t,r,s).ms??0)}#r(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,...SO(t)};return this.#d.set(t,o),o}#u(){let t=[],r=s=>{try{return VT(s).map(i=>Cu(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.#a(t),t.ord=String(this.#t++),t.parent=this.#l,this.#l=t.ord),t.ord}#a(t){let r=t.payload;if(t.type==="session_meta"){if(++this.#h===1){let s=typeof r?.source=="object"?r.source?.subagent?.thread_spawn:void 0;this.#i=s?.agent_path,this.#n=!!s}}else this.#h=0,this.#n&&r?.type==="agent_message"&&r.recipient===this.#i&&(this.#n=!1);t.inherited=this.#n}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=Xn(i.content,!0).trim();a&&s.push({type:"user",text:a})}else if(i.role==="assistant"){let a=Xn(i.content,!1);a&&s.push({type:"assistant",text:a,thinking:"",tools:[],live:o()})}return{events:s}}if(i.type==="reasoning"){let a=Xn(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"?tO(i.name??"",i.input):{name:i.name??"",input:wO(i.arguments)};return l&&this.#c.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.#c.get(a);return this.#c.delete(a),s.push({type:"tool_result",id:a,...gO(eO(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;return a?{events:s,usage:gy(a)}:{events:s}}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.#o.get(t);if(!r)return;let s;try{let i=Lo(r);s=this.#e(r,i.size,i.mtimeMs)}catch{return}return Date.now()-s<dy}readPreview(t){for(let r of(xu(t,256*1024)?.text??"").split(`
|
|
317
|
-
`))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"?Xn(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"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),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 Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(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 xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.
|
|
316
|
+
`).length:0;Mo=n=>{let e=XT(n);return process.platform==="win32"?e.toLowerCase():e},dy=12e4,Qn=class n extends Bt{constructor(t=Cu(ly(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";childBriefs=!1;#t=0;#l;#n=!1;#i;#h=0;#s=new Map;#d=new Map;#o=new Map;#c=new Map;detectsSelf(){return!!process.env.CODEX_THREAD_ID}forRead(){return new n(this.root)}callerSessionId(t){let r=process.env.CODEX_THREAD_ID;return r?this.listSessionFiles(t).find(s=>s.sessionId.endsWith(r))?.sessionId:void 0}detectsInstalled(){return GT(Cu(ly(),".codex"))}sessionsDir(t){return this.root}listSessionFiles(t){let r=Mo(t),s=[];for(let i of this.#u()){let o=0,a=0;try{let f=Lo(i);if(!f.isFile())continue;o=f.size,a=f.mtimeMs}catch{continue}let l=this.#s.get(i);if(l===void 0){if(l=fy(i),l===void 0)continue;this.#s.set(i,l)}if(l.subagent||Mo(l.cwd)!==r)continue;let c=ay(i,".jsonl");this.#o.set(c,i),s.push({sessionId:c,file:i,mtime:this.#e(i,o,a)})}return s}listChildren(t,r){let s=Mo(t),i=new Map,o,a;for(let f of this.#u()){let d=0,u=0,p;try{let v=Lo(f);if(!v.isFile())continue;d=v.size,u=v.mtimeMs,p=v.birthtimeMs||void 0}catch{continue}let m=this.#s.get(f);if(m===void 0){if(m=fy(f),m===void 0)continue;this.#s.set(f,m)}if(ay(f,".jsonl")===r&&(o=m.id,a=m.model),!m.spawn||Mo(m.cwd)!==s)continue;let{running:h,tokens:y}=this.#r(f,d,u);i.set(m.spawn.id,{file:f,mtime:this.#e(f,d,u),started:p,running:h,tokens:y,spawn:m.spawn,model:m.model})}if(!o)return[];let l=(f,d=new Set)=>{if(f.parent===o)return!0;if(d.has(f.id))return!1;d.add(f.id);let u=i.get(f.parent);return u?l(u.spawn,d):!1},c=[];for(let{file:f,mtime:d,started:u,running:p,tokens:m,spawn:h,model:y}of i.values())l(h)&&c.push({id:h.id,file:f,mtime:d,started:u,tokens:m,label:h.path.split("/").filter(Boolean).pop()??h.path,kind:h.role||void 0,model:y&&y!==a?y:void 0,parentId:i.has(h.parent)?h.parent:void 0,depth:h.depth,stopped:!1,running:p});return c}sessionsWorking(t){let r=new Set,s=Date.now();for(let{sessionId:i,file:o,mtime:a}of this.listSessionFiles(t)){if(s-a>=dy)continue;let l;try{let c=Lo(o);l=this.#r(o,c.size,c.mtimeMs)}catch{continue}l.running&&r.add(i)}return r}#e(t,r,s){return Math.max(s,this.#r(t,r,s).ms??0)}#r(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,...SO(t)};return this.#d.set(t,o),o}#u(){let t=[],r=s=>{try{return VT(s).map(i=>Cu(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.#a(t),t.ord=String(this.#t++),t.parent=this.#l,this.#l=t.ord),t.ord}#a(t){let r=t.payload;if(t.type==="session_meta"){if(++this.#h===1){let s=typeof r?.source=="object"?r.source?.subagent?.thread_spawn:void 0;this.#i=s?.agent_path,this.#n=!!s}}else this.#h=0,this.#n&&r?.type==="agent_message"&&r.recipient===this.#i&&(this.#n=!1);t.inherited=this.#n}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=Xn(i.content,!0).trim();a&&s.push({type:"user",text:a})}else if(i.role==="assistant"){let a=Xn(i.content,!1);a&&s.push({type:"assistant",text:a,thinking:"",tools:[],live:o()})}return{events:s}}if(i.type==="reasoning"){let a=Xn(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"?tO(i.name??"",i.input):{name:i.name??"",input:wO(i.arguments)};return l&&this.#c.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.#c.get(a);return this.#c.delete(a),s.push({type:"tool_result",id:a,...gO(eO(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;return a?{events:s,usage:gy(a)}:{events:s}}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.#o.get(t);if(!r)return;let s;try{let i=Lo(r);s=this.#e(r,i.size,i.mtimeMs)}catch{return}return Date.now()-s<dy}readPreview(t){for(let r of(xu(t,256*1024)?.text??"").split(`
|
|
317
|
+
`))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"?Xn(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"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),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 Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(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 xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.7"});var Py={};wi(Py,{agentViewerCommand:()=>By,bulbServerCommand:()=>Dy,clearServerLog:()=>Bu,findProjectViewer:()=>zo,isAlive:()=>er,isMirror:()=>ye,isProjectBulb:()=>Ju,isProjectMirror:()=>rr,launchAgentViewer:()=>Hu,launchBulbServer:()=>xs,listBulbServers:()=>Z,probePageCount:()=>Ku,readServerLog:()=>Ve,readWaitCursor:()=>Ho,recordDenial:()=>qu,registerServer:()=>Uu,relayOpen:()=>Wu,runMarker:()=>ju,serverLogPath:()=>nr,serversForBulb:()=>hn,sliceRunLog:()=>Fu,startServerLog:()=>ks,stopBulbServer:()=>tr,stopServer:()=>Ft,stopServersForBulb:()=>Yo,typebulbBinPath:()=>sr,unregisterServer:()=>pn,writeWaitCursor:()=>Ss});import{spawn as Cy}from"child_process";import{readdir as DO,readFile as Iy,writeFile as Ny,unlink as $u,mkdir as BO}from"fs/promises";import{mkdirSync as $y,writeFileSync as Ko,appendFileSync as jO,readFileSync as Lu}from"fs";import*as Oe from"path";import{fileURLToPath as FO}from"url";function Mu(n){return Oe.join(ht(),`${n}.json`)}function nr(n){return Oe.join(ht(),`${n}.log`)}function Du(n){return Oe.join(ht(),`${n}.wait.json`)}function Ly(n){try{let e=JSON.parse(Lu(Du(n),"utf8"));return e.cursors&&typeof e.cursors=="object"?e.cursors:{}}catch{return{}}}function Ho(n,e=""){let t=Ly(n)[e];return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Ss(n,e,t=""){try{$y(ht(),{recursive:!0});let r=Ly(n);r[t]=e,Ko(Du(n),JSON.stringify({cursors:r}))}catch{}}function ks(n){let e=nr(n);try{$y(ht(),{recursive:!0}),Ko(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(jO(e,l),s+=l.length,s>2*_y){let c=Lu(e),f=c.subarray(Math.max(0,c.length-_y));Ko(e,f),s=f.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 Bu(n){try{Ko(nr(n),"")}catch{}}function Ve(n,e=0){try{let t=Lu(nr(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 ju(n){return`\u2500\u2500 run ${n} \u2500\u2500 ${new Date().toTimeString().slice(0,8)}`}function qO(n){let e=UO.exec(n);return e?Number(e[1]):void 0}function Fu(n,e){let t=n.split(`
|
|
318
318
|
`),r=[];if(t.forEach((o,a)=>{let l=qO(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(`
|
|
319
319
|
`)}function er(n){try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}async function Uu(n){try{await BO(ht(),{recursive:!0}),await Ny(Mu(n.pid),JSON.stringify({version:Le,...n}))}catch{pt()}}async function qu(n,e){let t=Mu(n);try{let r=JSON.parse(await Iy(t,"utf8"));if(r.denied===e)return;r.denied=e,await Ny(t,JSON.stringify(r))}catch{}}async function pn(n){await $u(Mu(n)).catch(()=>{}),await $u(nr(n)).catch(()=>{}),await $u(Du(n)).catch(()=>{})}function ye(n){return n.agent!=null}function rr(n,e){return ye(n)&&n.cwd!=null&&re(n.cwd)===re(e)}function Ju(n,e){return!ye(n)&&wy(n.file,e)}async function Z(n){let e;try{e=await DO(ht())}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(Oe.join(ht(),s),"utf8"))}catch{await pn(i);return}o&&typeof o.pid=="number"&&er(o.pid)?t.push(o):await pn(i)})),(n?t.filter(s=>Ju(s,n)):t).sort((s,i)=>s.startedAt-i.startedAt)}async function zo(n,e){return(await Z()).find(t=>rr(t,n)&&(e?t.agent===e:!0))}async function Wu(n,e){let t=new URL(n).port,r=(await Z()).filter(a=>String(a.port)!==t),s=r.filter(a=>rr(a,e)),i=r.filter(a=>Ju(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:f}=await l.json();if(c)return{where:"editor",via:a.agent?"the agent mirror":`${Oe.basename(a.file)}'s page`};ye(a)&&(o+=f??0)}catch{}return o>0?{where:"external"}:void 0}async function tr(n){try{process.kill(n,"SIGTERM")}catch{}await pn(n)}async function Ku(n){try{let e=await fetch(`${n.url}/__pages`,{signal:AbortSignal.timeout(JO)});if(!e.ok)return;let{pages:t}=await e.json();return typeof t=="number"?t:void 0}catch{return}}async function Ft(n,e=ye(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(Ry)});if(!t.ok)throw new Error(`/__stop ${t.status}`);let{closed:r=0,stuck:s=0}=await t.json(),i=Date.now()+Ry;for(;er(n.pid)&&Date.now()<i;)await My(100);return er(n.pid)?(await tr(n.pid),"killed"):(await pn(n.pid),{closed:r,stuck:s})}catch{return await tr(n.pid),"killed"}}function hn(n,e){let t=re(e);return n.filter(r=>!ye(r)&&r.pid!==process.pid&&re(r.file)===t)}async function Yo(n,e){let t=hn(await Z(),n);for(let r of t)await Ft(r,e!==void 0&&r.port===e?"keep":"close");return t}function WO(n,e,t){(process.platform==="win32"?Cy("cmd",["/c","start","","/b",n,...e],{cwd:t,stdio:"ignore",windowsHide:!0}):Cy(n,e,{cwd:t,detached:!0,stdio:"ignore"})).unref()}function sr(){return Oe.join(Oe.dirname(FO(import.meta.url)),"index.js")}function Dy(n,e={}){return{command:process.execPath,args:[sr(),...e.trust?["--trust"]:[],...e.mode?["--mode",e.mode]:[],n,...e.open===!1?["--no-open"]:[]]}}function By(n){return{command:process.execPath,args:[sr(),`agent:${n}`,"--no-open"]}}async function jy(n,e,t,r){let s=await n();if(s)return s;WO(e.command,e.args,t);let i=Date.now()+2e4;for(;Date.now()<i;){await My(150);let o=await n();if(o)return o}throw new Error(`Launched ${r} but it did not register within 20s.`)}async function xs(n,e={}){let t=e.cwd??process.cwd(),r=Oe.resolve(t,n),s=await Zn({kind:"bulb",file:r},t),[i]=await Yo(r,s),o={...e,mode:e.mode??i?.mode};return jy(async()=>hn(await Z(),r)[0],Dy(n,o),t,Oe.basename(n))}async function Hu(n,e=process.cwd()){return jy(()=>zo(e,n),By(n),e,`the ${n} mirror`)}var _y,UO,Ry,JO,My,$e=k(()=>{"use strict";Ye();fn();Wo();_y=1e6;UO=/^── run (\d+) ── /;Ry=6e3,JO=500;My=n=>new Promise(e=>setTimeout(e,n))});function ir(n){return{...xp(n),server:n.files.get("server.ts")??""}}function Vo(n){return!!n.server&&!n.code}var Es=k(()=>{"use strict";ee();ee()});function Go(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 zu(n){return Yn(Go(n)??"bulb")||"bulb"}var Yu=k(()=>{"use strict";ee()});import{readdirSync as KO,readFileSync as HO,statSync as zO}from"fs";import{join as Fy,basename as YO}from"path";function qy(n,e,t){if(e>8)return t;let r;try{r=KO(n,{withFileTypes:!0})}catch{return t}for(let s of r)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;qy(Fy(n,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(Fy(n,s.name));return t}function VO(n,e){let t,r=!1;try{let s=HO(n,"utf8");t=Go(s.slice(0,1024));let i=We(s);r=!!i&&Vo(ir(i))}catch{}return{mtime:e,name:t??YO(n).replace(/\.bulb\.md$/,""),serverOnly:r}}function Xo(n){let e=new Map,t=qy(n,0,[]).map(r=>{let s=0;try{s=zO(r).mtimeMs}catch{}let i=s?Uy.get(r):void 0,o=i?.mtime===s?i:VO(r,s);return s&&e.set(r,o),{path:r,...o}});return Uy=e,t}var Uy,Jy=k(()=>{"use strict";ee();Es();Yu();Uy=new Map});function or(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 Qo=k(()=>{"use strict"});import{readFile as GO}from"fs/promises";async function Vu(n){try{let e=We(await GO(n,"utf-8"));return e?or(ir(e)):void 0}catch{return}}var Wy=k(()=>{"use strict";Es();Qo()});function Gu(n){let e=n.split(""),t=(i,o)=>{for(let a=i;a<o&&a<e.length;a++)e[a]!==`
|
|
320
320
|
`&&(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]!==`
|
|
@@ -2084,12 +2084,12 @@ ${n.log}`,ef=2e5,O_=n=>n.length<=ef?n:n.slice(0,ef/3)+`
|
|
|
2084
2084
|
`).filter(a=>/\b\d+\s+(passed|failed)\b/i.test(a)).at(-1)??"").trim().replace(/^tests?:?\s+/i,""),i=t.isError||/\b[1-9]\d*\s+failed\b/i.test(s)?"red":/\bpassed\b/i.test(s)?"green":"unknown",o=t.at!==void 0&&t.doneAt!==void 0?t.doneAt-t.at:void 0;return{n:n[e].n,state:i,line:ei(s,90),ms:o}}}function q_(n,e,t){let r=n.flatMap(u=>u.tools),s=[],i=[],o;for(let u of n)if(u.role!=="fork"){if(u.role==="user"){o===void 0&&!u.agent?o=u.at:u.at&&i.push(u.at);continue}u.at&&s.push(u.at);for(let p of u.tools)p.at&&s.push(p.at),p.doneAt&&s.push(p.doneAt)}let a=o??e[0]?.tool.at??t,l=[];for(let u of i){let p=-1/0;for(let h of s)h<=u&&h>p&&(p=h);let m=r.some(h=>h.at!==void 0&&h.at<u&&(h.doneAt??1/0)>u);p>-1/0&&!m&&u-p>=N_&&l.push([p,u])}let c=u=>l.reduce((p,[m,h])=>p+Math.max(0,Math.min(u,h)-m),0),f=u=>Math.max(0,u-a-c(u)),d=[];e.forEach((u,p)=>{let m=e[p-1]?.tool,h=p===0?a:m?.doneAt??m?.at??a;d.push(Math.min(t,Math.max(d[p-1]??a,h)))}),e.forEach((u,p)=>{let m=d[p],h=d[p+1]??t,y=m,v=!0;for(let[O,P]of l){if(P<=m||O>=h)continue;let E=v&&p>0?e[p-1]:u;O>y&&E.parts.push({from:f(y),to:f(O)}),y=Math.max(y,P),v=!1}h>y&&u.parts.push({from:f(y),to:f(h)})});for(let u of e)u.wall=u.parts.reduce((p,m)=>p+m.to-m.from,0);return{span:f(t),idle:c(t),wakes:i.filter(u=>u>a&&u<t).map(f)}}function J_(n){let e=[],t=n.filter(o=>o.tool.isError);t.length&&e.push(`${t.length} of ${n.length} steps failed.`);let r=new Map;for(let o of t){let a=Ka(o.tool,60);r.set(a,[...r.get(a)??[],o.n])}for(let[o,a]of r)a.length>1&&e.push(`${o} failed ${a.length} times (steps ${a.join(", ")}).`);let s=n.slice(-20).filter(o=>o.tool.isError).length;s>=4&&e.push(`${s} of the last 20 steps failed.`);for(let o of n)o.wall>=I_&&e.push(`Step ${o.n} (${Ka(o.tool,60)}) took ${lt(o.wall)}.`);let i=n.reduce((o,a)=>o+a.wall,0);return i&&e.push(`${lt(i)} in all over ${n.length} steps.`),e.join(`
|
|
2085
2085
|
`)}function Nw(n,e,t){let r=[n.brief,...n.followups].map(i=>e.get(i));if(r.some(i=>!i))return;let s={subtasks:r.flatMap(i=>i.subtasks),log:n.log,facts:n.facts,finished:t};return{key:W_(JSON.stringify(s)),payload:s,steps:n.steps.length,followups:n.followups.length}}function W_(n){let e=3735928559,t=1103547991;for(let r=0;r<n.length;r++){let s=n.charCodeAt(r);e=Math.imul(e^s,2654435761),t=Math.imul(t^s,1597334677)}return e=Math.imul(e^e>>>16,2246822507)^Math.imul(t^t>>>13,3266489909),t=Math.imul(t^t>>>16,2246822507)^Math.imul(e^e>>>13,3266489909),(4294967296*(2097151&t)+(e>>>0)).toString(36)}function uf(n,e,t,r){let s=[],i=0;[n.brief,...n.followups].forEach((o,a)=>{let l=e.get(o);a>0&&s.push({kind:"group",request:l?.request??"",idx:a});for(let c of l?.subtasks??[]){i++;let f=n.brief+`
|
|
2086
2086
|
`+c,d=t?.rows.find(p=>p.id===i);d?.status==="done"&&!r.has(f)&&r.set(f,d),d=r.get(f)??d;let u=d?.steps??[];s.push({kind:"row",num:i,title:c,status:d?.status??"",did:d?.did??"",note:d?.note??"",steps:u,cite:d?.evidence?.length?d.evidence:u,ms:0,spans:[]})}});for(let o of t?.offBrief??[])s.push({kind:"row",title:o.what,status:"off",did:"",note:o.note,steps:o.steps,cite:o.steps,ms:0,spans:[]});return K_(s,n),s}function K_(n,e){let t=n.filter(o=>o.kind==="row"),r=e.steps.map(o=>t.find(a=>B_(o.n,a.steps))),s=r.find(Boolean);if(!s)return;let i=s;for(let o=0;o<r.length;o++)r[o]=i=r[o]??i;e.steps.forEach((o,a)=>{let l=r[a];l.ms+=o.wall;for(let c of o.parts){let f=l.spans.at(-1);f&&Math.abs(f.to-c.from)<1e3?f.to=Math.max(f.to,c.to):l.spans.push({...c})}})}function $w(n,e,t,r){let s=n.tests,i=e&&e.followups===n.followups.length,o=n.followups.length?t.get(n.followups.at(-1))?.request:void 0;return[["Now",i?e.data.now:o?`Working on the latest follow-up: ${o}`:r?"\u2026":""],["Tests",s?`${s.state}${s.line?`, ${s.line}`:""}${s.ms!==void 0?`, took ${lt(s.ms)}`:""} (step ${s.n})`:"",s?`tests-${s.state}`:void 0],["Needs a decision",i?e.data.decision:"","warn"]].filter(([,l])=>l)}function Lw(n,e){let t=new Map,r=o=>{let a=o.trim().replace(/^["']|["']$/g,"").replace(/\\/g,"/").replace(/^\/([a-zA-Z])\//,"$1:/"),l=Cw(a,e).replace(/^\.\//,"");return!l||/^([a-zA-Z]:)?\//.test(l)?void 0:l},s=(o,a={})=>{let l=r(o);if(!l)return;let c=t.get(l)??{path:l};c.deleted=a.deleted,a.from&&(c.from=a.from),t.set(l,c)},i=(o,a)=>{let l=r(o),c=l?t.get(l):void 0;l&&t.delete(l),s(a,{from:c?.from??l})};for(let{tool:o}of n.steps){if(o.isError)continue;let a=o.input??{},l=!1;for(let[d,u]of Object.entries(a)){if(d==="command"||d==="cmd"||typeof u!="string"||!/^(---|\+\+\+) /m.test(u))continue;let p;for(let m of u.split(`
|
|
2087
|
-
`)){let h=/^(---|\+\+\+) (?:[ab]\/)?(.+?)\s*$/.exec(m);if(h?.[1]==="---"){p=h[2];continue}if(h?.[1]==="+++"){l=!0,h[2]==="/dev/null"?p&&p!=="/dev/null"&&s(p,{deleted:!0}):s(h[2]);continue}let y=/^\*\*\* Move to: (.+?)\s*$/.exec(m);y&&p&&i(p,y[1])}}let c=fe(a.file_path)??fe(a.filePath)??fe(a.path);!l&&c&&H_.some(d=>d in a)&&s(c);let f=fe(a.command)??fe(a.cmd);if(f)for(let d of z_(f))d.to?i(d.from,d.to):s(d.from,{deleted:!0})}return[...t.values()]}function z_(n){let e=[];for(let t of n.split(/&&|\|\||[;|\n]/)){let r=t.trim().match(/"[^"]*"|'[^']*'|\S+/g)??[],s=r.indexOf("git"),i=r[s+1];if(s<0||i!=="rm"&&i!=="mv"||r.includes("--cached"))continue;let o=r.slice(s+2).filter(l=>!l.startsWith("-")).map(l=>l.replace(/^["']|["']$/g,""));if(i==="rm"){for(let l of o)e.push({from:l});continue}let a=o.pop();if(a)for(let l of o)e.push({from:l,to:o.length>1?`${a.replace(/\/+$/,"")}/${of(l)}`:a})}return e}function Mw(n){let{d:e}=n,t=n.working?`running, step ${e.steps.length}${V_(e,n.now)}`:`finished after ${e.steps.length} steps`,r=[`Sub-agent "${n.name}": ${t}, ${lt(e.span)} active${e.lastAt?`, as of ${j_(e.lastAt)}`:""}.`];r.push("",`Request: ${e.brief?n.plans.get(e.brief)?.request??"(not summarized yet)":F_}`);for(let s of n.lines){if(s.kind==="group"){r.push("",`Follow-up: ${s.request}`);continue}let i=s.ms?` (${lt(s.ms)})`:"";r.push(`- ${s.title}: ${D_(s.status||"pending")}.${s.did?` ${s.did}`:""}${i}`),s.note&&r.push(` Note: ${s.note}`)}n.facts.length&&r.push("");for(let[s,i]of n.facts)r.push(`${s}: ${i}`);return
|
|
2087
|
+
`)){let h=/^(---|\+\+\+) (?:[ab]\/)?(.+?)\s*$/.exec(m);if(h?.[1]==="---"){p=h[2];continue}if(h?.[1]==="+++"){l=!0,h[2]==="/dev/null"?p&&p!=="/dev/null"&&s(p,{deleted:!0}):s(h[2]);continue}let y=/^\*\*\* Move to: (.+?)\s*$/.exec(m);y&&p&&i(p,y[1])}}let c=fe(a.file_path)??fe(a.filePath)??fe(a.path);!l&&c&&H_.some(d=>d in a)&&s(c);let f=fe(a.command)??fe(a.cmd);if(f)for(let d of z_(f))d.to?i(d.from,d.to):s(d.from,{deleted:!0})}return[...t.values()]}function z_(n){let e=[];for(let t of n.split(/&&|\|\||[;|\n]/)){let r=t.trim().match(/"[^"]*"|'[^']*'|\S+/g)??[],s=r.indexOf("git"),i=r[s+1];if(s<0||i!=="rm"&&i!=="mv"||r.includes("--cached"))continue;let o=r.slice(s+2).filter(l=>!l.startsWith("-")).map(l=>l.replace(/^["']|["']$/g,""));if(i==="rm"){for(let l of o)e.push({from:l});continue}let a=o.pop();if(a)for(let l of o)e.push({from:l,to:o.length>1?`${a.replace(/\/+$/,"")}/${of(l)}`:a})}return e}function Mw(n){let{d:e}=n,t=n.working?`running, step ${e.steps.length}${V_(e,n.now)}`:`finished after ${e.steps.length} steps`,r=[`Sub-agent "${n.name}": ${t}, ${lt(e.span)} active${e.lastAt?`, as of ${j_(e.lastAt)}`:""}.`];r.push("",`Request: ${e.brief?n.plans.get(e.brief)?.request??"(not summarized yet)":F_}`);for(let s of n.lines){if(s.kind==="group"){r.push("",`Follow-up: ${s.request||"(not summarized yet)"}`);continue}let i=s.ms?` (${lt(s.ms)})`:"";r.push(`- ${s.title}: ${D_(s.status||"pending")}.${s.did?` ${s.did}`:""}${i}`),s.note&&r.push(` Note: ${s.note}`)}n.edited.length&&r.push("","Edited:",...n.edited.map(Y_)),n.facts.length&&r.push("");for(let[s,i]of n.facts)r.push(`${s}: ${i}`);return r.join(`
|
|
2088
2088
|
`)}function V_(n,e){let t=[...n.steps].reverse().find(r=>r.tool.result===void 0&&r.tool.at);return t?`, waiting ${lt(e-t.tool.at)} on ${Ka(t.tool,60)}`:n.lastAt?`, last activity ${lt(e-n.lastAt)} ago`:""}function Dw(n){let e=n??{},t=r=>Array.isArray(r)?r.filter(Array.isArray).map(s=>[Number(s[0]),s[1]===void 0?void 0:Number(s[1])]).filter(s=>s[0]>0):[];return{now:String(e.now??""),decision:String(e.decision??""),rows:(Array.isArray(e.rows)?e.rows:[]).map(r=>({id:Number(r.id),status:String(r.status??""),did:String(r.did??""),note:String(r.note??""),steps:t(r.steps),evidence:t(r.evidence)})),offBrief:(Array.isArray(e.offBrief)?e.offBrief:[]).map(r=>({what:String(r.what??""),note:String(r.note??""),steps:t(r.steps)}))}}function Bw(n){let e=n;return{request:String(e?.request??""),subtasks:Array.isArray(e?.subtasks)?e.subtasks.map(t=>String(t).replace(/[.\s]+$/,"")):[]}}var R_,I_,N_,_w,$_,ei,Zs,L_,M_,Ka,D_,B_,j_,F_,H_,Y_,jw=k(()=>{"use strict";cf();R_=30,I_=3*6e4,N_=6e4,_w=new Set(["Read","Grep","Glob"]),$_=/\b(vitest|jest|pytest|mocha|playwright test|go test|cargo test|dotnet test|(?:npm|pnpm|yarn|bun)(?: run)? test)\b/,ei=(n,e)=>(n=n.replace(/\s+/g," ").trim(),n.length>e?n.slice(0,e)+"\u2026":n),Zs=(n,e)=>n.length<=e?n:n.slice(0,e/2)+`
|
|
2089
2089
|
[\u2026]
|
|
2090
2090
|
`+n.slice(-e/2),L_=n=>n.split(`
|
|
2091
2091
|
`).find(e=>e.trim())??"",M_=n=>n.replace(/^(\s*(cd\s+\S+|export\s+PATH=\S+)\s*(;|&&)\s*)+/,""),Ka=(n,e)=>`${lf(n.name)}: ${ei(M_(af(n.input)),e)}`,D_=n=>n==="off"?"off brief":n.replace("_"," "),B_=(n,e)=>e.some(([t,r])=>n>=t&&n<=(r??t)),j_=n=>new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),F_="No readable brief on record, so no subtasks to judge.";H_=["content","diff","new_string","new_source","edits"];Y_=n=>n.deleted?`${n.path} (deleted)`:n.from?`${n.path} (moved from ${n.from})`:n.path});import{readFileSync as G_,writeFileSync as X_,mkdirSync as Q_}from"fs";import{join as Fw}from"path";import{createHash as Z_}from"crypto";function Uw(n,e){if(!n.listChildren)return[];let t=n.callerSessionId?.(e),r=Qs(n.listSessionFiles(e),i=>i.mtime).sort((i,o)=>+(o.sessionId===t)-+(i.sessionId===t)),s=[];for(let i of r){let o=n.listChildren(e,i.sessionId);if(!o.length)continue;let a=Wa(n,i.sessionId,e,i.file);s.push({sessionId:i.sessionId,children:o.map(l=>({...l,state:Xs(l,a)}))})}return s}function qw(n,e){let t=e.trim().toLowerCase();for(let r of n){let s=r.children.filter(o=>o.id.toLowerCase()===t);if(s.length)return s;let i=r.children.filter(o=>o.id.toLowerCase().startsWith(t)||Cn(o).toLowerCase().includes(t));if(i.length)return i}return[]}async function df(n,e){let t=Iw(Rw(Pw(n,e.file,"child"))),r=Fw(ze(),"cache","child-status",`${eR(e.file)}.json`),s={plans:{},frozen:{}};try{s={...s,...JSON.parse(G_(r,"utf8"))}}catch{}let i=new Map(Object.entries(s.plans)),o=new Map(Object.entries(s.frozen)),a,l=!1,c=m=>{a??=m.error,l||=!!m.setup},f=[t.brief,...t.followups].filter(m=>m&&!i.has(m));for(let[m,h]of await Promise.all(f.map(async y=>[y,await Gs("plan",y)])))h.ok?i.set(m,Bw(h.data)):c(h);let d=s.status,u=t.brief?Nw(t,i,e.state!=="running"):void 0,p=!!u&&d?.key!==u.key;if(u&&p){let m=await Gs("status",u.payload);m.ok?d={key:u.key,data:Dw(m.data),steps:u.steps,followups:u.followups,at:Date.now()}:c(m)}uf(t,i,d?.data,o);try{Q_(Fw(r,".."),{recursive:!0}),X_(r,JSON.stringify({plans:Object.fromEntries(i),frozen:Object.fromEntries(o),status:d}))}catch{}return{d:t,plans:i,frozen:o,judged:d,error:a,setup:l,cached:!f.length&&!p}}async function Jw(n,e,t){let{d:r,plans:s,frozen:i,judged:o,error:a}=await df(n,t);return{text:Mw({d:r,lines:uf(r,s,o?.data,i),facts:$w(r,o,s,!1),edited:Lw(r,e),plans:s,name:Cn(t),working:t.state==="running",now:Date.now()}),error:a}}var eR,ff=k(()=>{"use strict";Tn();nf();rf();Vs();sf();jw();eR=n=>Z_("sha1").update(n).digest("hex")});import{existsSync as Ww,openSync as tR,readSync as nR,closeSync as rR,statSync as ti,readdirSync as Kw,watchFile as sR,unwatchFile as Hw,mkdirSync as iR,writeFileSync as oR,readFileSync as pf,unlinkSync as aR,rmSync as lR}from"fs";import{stat as cR}from"fs/promises";import{dirname as uR,join as _n,resolve as zw}from"path";function hR(n){if(!Number.isInteger(n))return!0;try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}function Or(n){let e={cwd:V,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;function r(g,S){let w={offset:S,text:""},T;try{T=ti(g).size}catch{return w}if(T<=S)return w;let $;try{$=tR(g,"r")}catch{return w}try{let D=T-S,j=Buffer.alloc(D),F=0;for(;F<D;){let Q=nR($,j,F,D-F,S+F);if(!Q)break;F+=Q}return{offset:S+F,text:j.subarray(0,F).toString("utf8")}}finally{rR($)}}let s=new Set,i,o=0;function a(){if(e.file){for(let g of s)if(g.file===e.file)return g;return}return i}function l(g){let S={d:n.createDriver(e.cwd,g),file:g,id:`new:${++o}`,startedAt:Date.now()};return s.add(S),e.file||(i=S),S}function c(){let g=[...s].filter(w=>w.file);if(!g.length)return[];let S=new Map(n.listSessionFiles(e.cwd).map(w=>[w.file,w.sessionId]));return g.map(w=>{let T=S.get(w.file);return{rec:w,sessionId:T??w.id,pending:T===void 0}})}let f=()=>c().filter(g=>g.pending&&g.rec.prompt!==void 0);async function d(g){s.delete(g),i===g&&(i=void 0);try{await g.d.dispose()}catch(S){console.error("[composer] dispose:",Y(S))}}function u(){let g=a(),S=new Set(f().map(w=>w.rec));for(let w of[...s])w!==g&&(S.has(w)||w.d.streaming||w.d.queue||w.d.error||d(w))}function p(){for(let g of s)g.d.sessionFile&&g.file!==g.d.sessionFile&&(g.file=g.d.sessionFile);if(i&&!e.file&&i.file){let g=n.listSessionFiles(e.cwd).find(S=>S.file===i.file);g&&X(g)}i&&!e.file&&i.prompt!==void 0&&e.sessionId!==i.id&&(q(void 0,i.id),e.everAttached=!0)}let m=g=>_n(g,fR),h=(g,S)=>_n(m(g),`${S}.lock`);function y(g,S){try{let w=h(g,S);if(Date.now()-ti(w).mtimeMs>=Yw)return!1;try{let T=parseInt(pf(w,"utf8").trim(),10);if(T===process.pid||!hR(T))return!1}catch{}return!0}catch{return!1}}function v(g,S){if(S)try{iR(m(g),{recursive:!0}),oR(h(g,S),String(process.pid))}catch(w){console.error("[lock] claim failed:",Y(w))}}function O(g){try{lR(_n(g,".claude-bulb"),{recursive:!0,force:!0})}catch{}}function P(g){let S=m(g);if(!Ww(S))return;let w;try{w=Kw(S)}catch{return}let T=Date.now();for(let $ of w){if(!$.endsWith(".lock"))continue;let D=_n(S,$);try{let j=ti(D);T-j.mtimeMs>pR&&aR(D)}catch{}}}function E(g){try{return ti(g),!1}catch(S){return S.code==="ENOENT"}}function R(){let g=e;if(g.file&&!E(g.file)){v(g.cwd,g.sessionId);return}let S=I(g);S&&X(S)}function I(g){if(!g.everAttached)return L(g.cwd)??A(g.cwd,()=>!0)}function L(g){let S=m(g);if(!Ww(S))return;let w;try{w=Kw(S)}catch{return}let T;for(let D of w)if(D.endsWith(".lock"))try{let j=ti(_n(S,D));if(Date.now()-j.mtimeMs>=Yw||parseInt(pf(_n(S,D),"utf8").trim(),10)!==process.pid)continue;(!T||j.mtimeMs>T.mtime)&&(T={sessionId:D.slice(0,-5),mtime:j.mtimeMs})}catch{}if(!T)return;let $=n.listSessionFiles(g).find(D=>D.sessionId===T.sessionId);if(!(!$||E($.file)))return $}function A(g,S){return n.listSessionFiles(g).sort((w,T)=>T.mtime-w.mtime).find(w=>!y(g,w.sessionId)&&S(w))}function q(g,S){let w=e;if(w.file)try{Hw(w.file)}catch{}w.file=g,w.sessionId=S,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:S})}function X(g){let S=e;i=void 0,yi(),t=g.file,q(g.file,g.sessionId),S.everAttached=!0,v(S.cwd,g.sessionId),G(g.file)}function G(g){if(ge(),!!g){try{Hw(g)}catch{}sR(g,{interval:200},()=>ge())}}function U(){yi(),t=void 0,q(void 0,"")}function ge(){let g=e;if(!g.file)return;let S=r(g.file,g.offset);if(!S.text)return;g.offset=S.offset,g.partial+=S.text;let w,T;for(;(T=g.partial.indexOf(`
|
|
2092
|
-
`))>=0;){let F=g.partial.slice(0,T);if(g.partial=g.partial.slice(T+1),!F.trim())continue;let Q=n.parseEntry(F);if(!Q)continue;let ae=n.idOf(Q);ae&&(g.entries.set(ae,Q),!n.isSidechain(Q,g.thread)&&n.isLeafType(Q)&&(w=ae))}if(!w)return;let $=[],D=g.entries.get(w),j=!1;for(;D;){if($.push(D),n.idOf(D)===g.chainLastId){j=!0;break}let F=n.parentOf(D);D=F?g.entries.get(F):void 0}if(j)for(let F=$.length-2;F>=0;F--)ue($[F]);else{g.chainLastId!==void 0&&(g.buffer.push({type:"cleared"}),g.buffer.push({type:"session",sessionId:g.sessionId}),g.latest={in:0,out:0,cached:0,cacheCreate:0});let F=new Set($.map(ae=>n.idOf(ae))),Q=he(g.entries);for(let ae=$.length-1;ae>=0;ae--)ue($[ae]),Re(n.idOf($[ae]),Q,F)}g.chainLastId=w}function he(g){let S=new Map;for(let w of g.values()){let T=n.parentOf(w);if(!T)continue;let $=S.get(T);$?$.push(w):S.set(T,[w])}return S}function Re(g,S,w){if(!g)return;let T=S.get(g);if(!T)return;let $=T.filter(Q=>!n.isSidechain(Q,e.thread));if($.length<2)return;let D=$.filter(Q=>!w.has(n.idOf(Q)));if(!D.length)return;let j=[],F=0;for(let Q of D){let ae=ut(Q,S);j.push(...ae.events),F+=ae.count}F>0&&e.buffer.push({type:"fork",atId:g,count:F,events:j})}function ut(g,S){let w=[],T=[g];for(;T.length;){let j=T.pop();if(n.isSidechain(j,e.thread))continue;w.push(j);let F=S.get(n.idOf(j)??"");if(F)for(let Q of F)T.push(Q)}w.sort((j,F)=>(Date.parse(n.timestampOf(j)??"")||0)-(Date.parse(n.timestampOf(F)??"")||0));let $=[];for(let j of w)n.isRecoveryNoise(j)||$.push(...Ja(n,j,e.thread,e.sessionStartMs).events);return{count:$.reduce((j,F)=>j+(F.type==="user"||F.type==="assistant"?1:0),0),events:$}}function ue(g){if(!n.isSidechain(g,e.thread))try{let{events:S,usage:w,model:T,cost:$}=Ja(n,g,e.thread,e.sessionStartMs);for(let D of S)e.buffer.push(D);S.some(D=>D.type==="assistant")&&a()?.d.clearCompletedDraft(),S.some(D=>D.type==="user")&&a()?.d.clearEcho(),T&&(e.latestModel=T),w&&(e.latest=w),(w||$)&&e.buffer.push({type:"usage",...e.latest,cost:$})}catch(S){console.error("[mirror] skipped malformed entry:",Y(S))}}async function Ee(){return{cwd:e.cwd,pid:process.pid,composer:!!n.createDriver,children:!!n.listChildren,elsewhere:await Tt()}}async function Tt(){if(n.listSessionFiles(e.cwd).length)return;let g=await Pn();if(!g)return;let S=zw(g).toLowerCase();for(let w=zw(e.cwd);w.toLowerCase()!==S;){let T=uR(w);if(T===w)return;w=T;let $=n.listSessionFiles(w).length;if($)return{dir:w,count:$}}}Tt().then(g=>{g&&console.log(`No sessions for ${e.cwd} \u2014 ${g.count} exist for ${g.dir}. Launched from a subfolder? Relaunch from the project root.`)}).catch(()=>{});let b=new Ba;async function x(g,S){e.thread!=="child"&&b.accept(g,S)&&console.log(S)}function C(){return Wa(n,e.sessionId,e.cwd,e.file)}function N(){return n.chainWorking([...e.entries.values()])&&C()}function M(){!n.createDriver||a()||e.latestModel||N()||l(e.file)}async function K(g){let S=e;R(),p(),M(),u();let w=a();for(let j of s)j!==w&&j.d.dialog;let T=c().filter(j=>j.rec.d.streaming).map(j=>j.sessionId),$=N(),D=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:S.buffer.slice(g),cursor:S.buffer.length,working:!!w?.d.streaming||$,latestModel:S.latestModel,child:S.child?.id??null,composer:D,busy:T}}async function J(){R(),p();let g=a();if(g?.d.error&&!g.d.streaming&&(await d(g),g=void 0),!g){if(N())return{ok:!1,error:"the agent is mid-turn in a terminal \u2014 watch only"};g=l(e.file)}let S=g;return{ok:!0,d:S.d,markSent:w=>{S.prompt===void 0&&(S.prompt=w)}}}async function Ue(g,S){if(!n.createDriver)return{ok:!1,error:"not supported"};let w=String(g??"").trim();if(!w)return{ok:!1,error:"empty message"};let T=await J();if(!T.ok)return T;let $=await T.d.send(w,S);return $.ok&&T.markSent(w),$}async function z(g,S){let w=a();return w?w.d.respondUi(String(g??""),S??{}):{ok:!1,error:"no dialog pending"}}async function oe(g,S){if(!n.createDriver)return{ok:!1,error:"not supported"};if(!g||typeof g.type!="string")return{ok:!1,error:"bad command"};if(S?.spawn){let T=await J();return T.ok?T.d.rpc(g):T}let w=a();return!w||w.d.error?{ok:!1,error:"not running"}:w.d.rpc(g)}async function Ae(){let g=a();if(g)try{await g.d.stop()}catch(S){console.error("[composer] stop:",Y(S))}return{ok:!0}}async function $r(){return n.createDriver?(p(),!e.file&&i&&i.prompt===void 0&&!i.d.streaming&&!i.d.error?{ok:!0}:(i?.d.error&&await d(i),i=void 0,U(),l(void 0),u(),{ok:!0})):{ok:!1,error:"not supported"}}async function tn(){if(!n.createDriver)return[];let g=await et(["ls-files","--cached","--others","--exclude-standard"],e.cwd).catch(()=>null),S=g!==null?g.split(`
|
|
2092
|
+
`))>=0;){let F=g.partial.slice(0,T);if(g.partial=g.partial.slice(T+1),!F.trim())continue;let Q=n.parseEntry(F);if(!Q)continue;let ae=n.idOf(Q);ae&&(g.entries.set(ae,Q),!n.isSidechain(Q,g.thread)&&n.isLeafType(Q)&&(w=ae))}if(!w)return;let $=[],D=g.entries.get(w),j=!1;for(;D;){if($.push(D),n.idOf(D)===g.chainLastId){j=!0;break}let F=n.parentOf(D);D=F?g.entries.get(F):void 0}if(j)for(let F=$.length-2;F>=0;F--)ue($[F]);else{g.chainLastId!==void 0&&(g.buffer.push({type:"cleared"}),g.buffer.push({type:"session",sessionId:g.sessionId}),g.latest={in:0,out:0,cached:0,cacheCreate:0});let F=new Set($.map(ae=>n.idOf(ae))),Q=he(g.entries);for(let ae=$.length-1;ae>=0;ae--)ue($[ae]),Re(n.idOf($[ae]),Q,F)}g.chainLastId=w}function he(g){let S=new Map;for(let w of g.values()){let T=n.parentOf(w);if(!T)continue;let $=S.get(T);$?$.push(w):S.set(T,[w])}return S}function Re(g,S,w){if(!g)return;let T=S.get(g);if(!T)return;let $=T.filter(Q=>!n.isSidechain(Q,e.thread));if($.length<2)return;let D=$.filter(Q=>!w.has(n.idOf(Q)));if(!D.length)return;let j=[],F=0;for(let Q of D){let ae=ut(Q,S);j.push(...ae.events),F+=ae.count}F>0&&e.buffer.push({type:"fork",atId:g,count:F,events:j})}function ut(g,S){let w=[],T=[g];for(;T.length;){let j=T.pop();if(n.isSidechain(j,e.thread))continue;w.push(j);let F=S.get(n.idOf(j)??"");if(F)for(let Q of F)T.push(Q)}w.sort((j,F)=>(Date.parse(n.timestampOf(j)??"")||0)-(Date.parse(n.timestampOf(F)??"")||0));let $=[];for(let j of w)n.isRecoveryNoise(j)||$.push(...Ja(n,j,e.thread,e.sessionStartMs).events);return{count:$.reduce((j,F)=>j+(F.type==="user"||F.type==="assistant"?1:0),0),events:$}}function ue(g){if(!n.isSidechain(g,e.thread))try{let{events:S,usage:w,model:T,cost:$}=Ja(n,g,e.thread,e.sessionStartMs);for(let D of S)e.buffer.push(D);S.some(D=>D.type==="assistant")&&a()?.d.clearCompletedDraft(),S.some(D=>D.type==="user")&&a()?.d.clearEcho(),T&&(e.latestModel=T),w&&(e.latest=w),(w||$)&&e.buffer.push({type:"usage",...e.latest,cost:$})}catch(S){console.error("[mirror] skipped malformed entry:",Y(S))}}async function Ee(){return{cwd:e.cwd,pid:process.pid,composer:!!n.createDriver,children:!!n.listChildren,childStatus:!!n.listChildren&&n.childBriefs,elsewhere:await Tt()}}async function Tt(){if(n.listSessionFiles(e.cwd).length)return;let g=await Pn();if(!g)return;let S=zw(g).toLowerCase();for(let w=zw(e.cwd);w.toLowerCase()!==S;){let T=uR(w);if(T===w)return;w=T;let $=n.listSessionFiles(w).length;if($)return{dir:w,count:$}}}Tt().then(g=>{g&&console.log(`No sessions for ${e.cwd} \u2014 ${g.count} exist for ${g.dir}. Launched from a subfolder? Relaunch from the project root.`)}).catch(()=>{});let b=new Ba;async function x(g,S){e.thread!=="child"&&b.accept(g,S)&&console.log(S)}function C(){return Wa(n,e.sessionId,e.cwd,e.file)}function N(){return n.chainWorking([...e.entries.values()])&&C()}function M(){!n.createDriver||a()||e.latestModel||N()||l(e.file)}async function K(g){let S=e;R(),p(),M(),u();let w=a();for(let j of s)j!==w&&j.d.dialog;let T=c().filter(j=>j.rec.d.streaming).map(j=>j.sessionId),$=N(),D=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:S.buffer.slice(g),cursor:S.buffer.length,working:!!w?.d.streaming||$,latestModel:S.latestModel,child:S.child?.id??null,composer:D,busy:T}}async function J(){R(),p();let g=a();if(g?.d.error&&!g.d.streaming&&(await d(g),g=void 0),!g){if(N())return{ok:!1,error:"the agent is mid-turn in a terminal \u2014 watch only"};g=l(e.file)}let S=g;return{ok:!0,d:S.d,markSent:w=>{S.prompt===void 0&&(S.prompt=w)}}}async function Ue(g,S){if(!n.createDriver)return{ok:!1,error:"not supported"};let w=String(g??"").trim();if(!w)return{ok:!1,error:"empty message"};let T=await J();if(!T.ok)return T;let $=await T.d.send(w,S);return $.ok&&T.markSent(w),$}async function z(g,S){let w=a();return w?w.d.respondUi(String(g??""),S??{}):{ok:!1,error:"no dialog pending"}}async function oe(g,S){if(!n.createDriver)return{ok:!1,error:"not supported"};if(!g||typeof g.type!="string")return{ok:!1,error:"bad command"};if(S?.spawn){let T=await J();return T.ok?T.d.rpc(g):T}let w=a();return!w||w.d.error?{ok:!1,error:"not running"}:w.d.rpc(g)}async function Ae(){let g=a();if(g)try{await g.d.stop()}catch(S){console.error("[composer] stop:",Y(S))}return{ok:!0}}async function $r(){return n.createDriver?(p(),!e.file&&i&&i.prompt===void 0&&!i.d.streaming&&!i.d.error?{ok:!0}:(i?.d.error&&await d(i),i=void 0,U(),l(void 0),u(),{ok:!0})):{ok:!1,error:"not supported"}}async function tn(){if(!n.createDriver)return[];let g=await et(["ls-files","--cached","--others","--exclude-standard"],e.cwd).catch(()=>null),S=g!==null?g.split(`
|
|
2093
2093
|
`).filter(Boolean):await n.walkFiles?.(e.cwd)??[];return(await Promise.all(S.map(async T=>{try{return{f:T,m:(await cR(_n(e.cwd,T))).mtimeMs}}catch{return{f:T,m:0}}}))).sort((T,$)=>$.m-T.m).map(T=>T.f)}function Ot(){for(let g of[...s])d(g)}async function Sl(g){return n.createDriver?vw(e.cwd,g):{ok:!1,error:"not supported"}}async function kl(g){return Sw(e.cwd,String(g??""))}async function VS(g,S){return Ow(String(g??""),String(S??""))}async function GS(g,S){return Gs(g==="status"?"status":"plan",S)}async function XS(g){let S=n.listChildren?.(e.cwd,e.sessionId).find(T=>T.id===g);if(!S)return{ok:!1,error:"child not found"};let w=await df(n,{...S,state:Xs(S,C())});return{ok:!0,plans:Object.fromEntries(w.plans),frozen:Object.fromEntries(w.frozen),judged:w.judged,error:w.error,setup:w.setup,cached:w.cached}}async function QS(){let g=n.sessionsWorking?.(e.cwd),S=n.listSessionFiles(e.cwd).map(({sessionId:T,file:$,mtime:D})=>({sessionId:T,mtime:D,preview:n.readPreview($),working:g?.has(T)})),w=f().map(T=>({sessionId:T.sessionId,mtime:T.rec.startedAt,preview:T.rec.prompt??"",pending:!0}));return Qs([...S,...w],T=>T.mtime)}let ap=new Map;function lp(g,S){let w=ap.get(g);if(w&&w.mtime===S)return w.turns;let T=[],$="";try{$=pf(g,"utf8")}catch{return[]}for(let D of $.split(`
|
|
2094
2094
|
`)){if(!D.trim())continue;let j=n.parseEntry(D);if(!j)continue;let F=n.searchText(j);F&&T.push({text:F,lower:F.toLowerCase()})}return ap.set(g,{mtime:S,turns:T}),T}async function ZS(g){let S=g.toLowerCase(),w=[],T=0,$=n.sessionsWorking?.(e.cwd);for(let{sessionId:D,file:j,mtime:F}of n.listSessionFiles(e.cwd).sort((Q,ae)=>ae.mtime-Q.mtime)){let Q=zs(lp(j,F),S),ae=(n.listChildren?.(e.cwd,D)??[]).map(qe=>({c:qe,hit:zs(lp(qe.file,qe.mtime),S)})).filter(qe=>qe.hit.hitCount);if(!(!Q.hitCount&&!ae.length)){for(let{c:qe,hit:sk}of Qs(ae,ik=>ik.c.mtime))w.push({sessionId:D,mtime:qe.mtime,preview:Cn(qe),...sk,child:{id:qe.id,kind:qe.kind,depth:qe.depth}});if(w.push({sessionId:D,mtime:F,preview:n.readPreview(j),working:$?.has(D),...Q}),++T>=mR)break}}return w}async function ek(g){let S=e,w=n.listSessionFiles(S.cwd).find(T=>T.sessionId===g);if(!w){let T=f().find($=>$.sessionId===g)?.rec;return T?((i!==T||S.sessionId!==T.id)&&(i=T,yi(),t=void 0,q(void 0,T.id),S.everAttached=!0,u()),{ok:!0}):{ok:!1,error:"session not found"}}return w.file===S.file?{ok:!0}:(X(w),p(),u(),{ok:!0})}async function tk(){if(!n.listChildren||!e.sessionId)return[];let g=C();return n.listChildren(e.cwd,e.sessionId).map(S=>({...S,state:Xs(S,g)}))}async function nk(g){let S=e;if(!n.listChildren)return{ok:!1,error:"this harness has no child transcripts"};let w=n.listChildren(S.cwd,S.sessionId).find(T=>T.id===g);return w?(S.thread="child",S.child=w,q(w.file,S.sessionId),G(w.file),{ok:!0}):{ok:!1,error:"child not found"}}async function rk(){let g=t;return!yi()||!g?{ok:!0}:(q(g,e.sessionId),G(g),{ok:!0})}function yi(){let g=e;return g.thread==="main"?!1:(g.thread="main",g.child=void 0,!0)}return O(e.cwd),P(e.cwd),R(),{info:Ee,poll:K,logInlineStatus:x,listSessions:QS,searchSessions:ZS,attach:ek,listChildren:tk,openChild:nk,closeChild:rk,composerSend:Ue,composerStop:Ae,composerNew:$r,composerFiles:tn,composerUiRespond:z,composerRpc:oe,composerPaste:Sl,composerPasteRead:kl,summarizeTurn:VS,childStatus:GS,judgeChildStatus:XS,shutdownComposer:Ot}}var dR,fR,Yw,pR,mR,Ha=k(()=>{"use strict";Vt();mw();Hs();Xd();kw();nf();rf();ff();sf();Vs();dR=".typebulb",fR=`${dR}/locks`,Yw=5e3,pR=6e4;mR=50});import{existsSync as yf,mkdirSync as gR,readFileSync as Vw,writeFileSync as yR}from"fs";import{join as Rn,isAbsolute as bR}from"path";async function wf(n,e){let t=bR(n)?n:Rn(V,n);return yf(t)?(Qu(t,e),{ok:!0}):{ok:!1,error:"file not found"}}async function vf(n){let e=V,t=Xu(n),r=Rn(e,"typebulbs");gR(r,{recursive:!0});let s=zu(t),i=`${s}.bulb.md`;for(let c=2;yf(Rn(r,i))&&Vw(Rn(r,i),"utf8")!==t;c++)i=`${s}-${c}.bulb.md`;let o=Rn(r,i);yf(o)||yR(o,t);let a=Rn("typebulbs",i),l=await xs(a,{cwd:e,open:!1});return{ok:!0,file:a,pid:l.pid,url:l.url}}async function Sf(){return Z(V)}async function kf(n){let e=(await Z()).find(t=>t.pid===n);return e?{ok:!0,outcome:await Ft(e)}:(await tr(n),{ok:!0})}async function xf(){let n=await dn(V);return Xo(V).filter(e=>!e.serverOnly).map(e=>({...e,trusted:yn(e.path),lastRunAt:n(e.path)}))}async function Ef(n){let e=n.toLowerCase(),t=[];for(let r of Xo(V).filter(s=>!s.serverOnly).sort((s,i)=>i.mtime-s.mtime)){let s="";try{s=Vw(r.path,"utf8")}catch{continue}let i=[];for(let l of s.split(`
|
|
2095
2095
|
`)){let c=l.replace(/\s+/g," ").trim();c&&i.push({text:c,lower:c.toLowerCase()})}let{hitCount:o,snippet:a}=zs(i,e);o&&t.push({path:r.path,hitCount:o,snippet:a})}return t}async function Af(n,e){let t=V;e!=null&&ar(n,e);let r=await xs(n,{cwd:t,open:!1,trust:e});return{ok:!0,file:r.file,pid:r.pid,url:r.url,trust:!!r.trust}}async function Tf(n){return{cap:await Vu(n)}}async function Of(n,e){return ar(n,e),{ok:!0}}async function Pf(n,e){return Ve(n,e)}async function Cf(){return ni&&Date.now()-ni.fetchedAt<=vR?ni.samples:(hf??=SR().finally(()=>{hf=null}),hf)}async function SR(){try{let n=await fetch(`${wR}/api/scripts/u/samples?stubs`,{signal:AbortSignal.timeout(Xw)});if(!n.ok)throw new Error(`HTTP ${n.status}`);let e=await n.json(),t=i=>i.order??Number.MAX_SAFE_INTEGER,r=i=>Date.parse(i.createdAt??"")||0,s=e.filter(i=>i.slug!=="welcome").sort((i,o)=>t(i)-t(o)||r(o)-r(i)).map(i=>({slug:i.slug,name:i.name,description:Rl(i.config)}));return ni={samples:s,fetchedAt:Date.now()},s}catch{return ni?.samples??[]}}async function _f(n){return bf.test(n)?Zw(Gw,"samples",n,!0):{ok:!1,error:"bad slug"}}async function If(){let n=Rf();if(!n)return{bulbs:[]};let e=`${za()}
|
|
@@ -2548,7 +2548,7 @@ declare const tb: {${lN}${Dv}${Fv}${Uv}${Bv}${jv}
|
|
|
2548
2548
|
`);y=E.pop()??"";let R=!1;for(let I of E)I.trim()&&(m&&O&&I.startsWith(tt.disconnected)&&(R=!0),!(e.match&&!I.includes(e.match))&&(console.log(I),!s&&(h??=Date.now()+u,ye(t)&&(I.includes("] compile error")||I.includes("] runtime error"))&&(h=Math.min(h,Date.now()+p)))));if(R&&!h){console.error(`the last page of ${Ir(t)} closed while waiting \u2014 a bulb runs in its page, so nothing can log ${e.match?`'${e.match}'`:"anything"} now`),v=3;break}}if(h&&Date.now()>=h)break;if(!i&&!h&&Date.now()>=d){console.error(`timeout: no ${e.match?`line matching '${e.match}'`:"new output"} from ${Ir(t)} within ${o}s`),v=2;break}if(!er(t.pid)){h||(console.error(`server ${Ir(t)} (pid ${t.pid}) exited while waiting`),process.exit(3));break}await JN(400)}s||Ss(t.pid,f,a),process.exit(v)}function hS(n,e){if(e==="killed")return` \u2014 forced (${uS(n.version)?`its runtime ${n.version?`v${n.version} `:""}predates the stop route`:"it did not answer"}); a page it opened may still be open`;let t=[];return e.closed&&t.push(`closed ${e.closed} page${e.closed===1?"":"s"}`),e.stuck&&t.push(`${e.stuck} did not close`),t.length?` \u2014 ${t.join(", ")}`:""}async function mS(n){if(!n){await ep(await Z(process.cwd()),"Run `typebulb stop <file|pid>` to stop one.");return}let e=tp(await Z(),n,"stop",process.cwd(),kt()),t=await Ft(e);console.log(`Stopped ${Ir(e)} (pid ${e.pid}, ${e.url}).${hS(e,t)}`)}async function gS(n){let e=process.cwd(),t=n==="agent"?kt():void 0,r=n==="global"?await Z():n==="bulbs"?await Z(e):(await Z()).filter(o=>rr(o,e)&&(!t||o.agent===t)),s=n==="global"?"server":n==="agent"?"mirror":"bulb";if(!r.length){console.log(n==="global"?"No running bulb servers.":`No running ${s}s for this project.`);return}let i=await Promise.all(r.map(o=>Ft(o)));console.log(`Stopped ${r.length} ${s}${r.length===1?"":"s"}:`),r.forEach((o,a)=>console.log(` ${o.url} pid ${o.pid} ${Ir(o)}${hS(o,i[a])}`))}$e();Ye();fn();import*as hl from"path";import*as yS from"http";import{mkdir as WN,writeFile as KN}from"fs/promises";async function Nr(){let n=[];for await(let e of process.stdin)n.push(e);return Buffer.concat(n).toString("utf-8")}function di(n){return(n.charCodeAt(0)===65279?n.slice(1):n).replace(/\r\n/g,`
|
|
2549
2549
|
`).trimEnd()}function HN(n,e){return new Promise((t,r)=>{let s=new URL(n),i=yS.request({hostname:s.hostname,port:s.port,path:s.pathname+s.search,method:"POST",headers:{"Content-Type":"text/plain","Content-Length":Buffer.byteLength(e)}},o=>{let a="";o.setEncoding("utf8"),o.on("data",l=>{a+=l}),o.on("end",()=>t({status:o.statusCode??0,text:a}))});i.setTimeout(0),i.on("error",r),i.end(e)})}var zN=n=>{let e=Math.round((Date.now()-n)/6e4);return e<1?"moments ago":e<60?`${e}m ago`:`${Math.round(e/60)}h ago`};async function bS(n,e,t=0){e==="-"&&(e=di(await Nr()));let r=e!==void 0&&e.startsWith("tb:");r&&t<=0&&(t=Jf);let s=e!==void 0&&/^tb:(click|set)( |$)/.test(e),i=hl.resolve(n),o=hn(await Z(),i)[0];if(!o){let m=(await dn(process.cwd()))(i);console.error(m?`No running server for '${n}' \u2014 it last ran ${zN(m)}. Relaunching reuses the same URL (a stale tab is one reload from live): npx typebulb ${n}`:`No running server for '${n}'. Start it first: npx typebulb ${n}`),process.exit(1)}let a=async m=>{let h=[m>0?`reply=${m}`:"",s?"solo=1":"","open=1"].filter(Boolean).join("&"),y=await HN(`${o.url}/__send${h?`?${h}`:""}`,e??"");(y.status<200||y.status>=300)&&(console.error(`send failed: HTTP ${y.status} from ${o.url}/__send`),process.exit(1));try{return JSON.parse(y.text)}catch{return{}}},l={},c=Date.now();try{l=await a(t)}catch(m){console.error(`send failed: ${m instanceof Error?m.message:String(m)}`),process.exit(1)}let f=l.clients??0,d=`${f} page${f===1?"":"s"}`;if(l.refused&&(console.error(`Actuation needs exactly one connected page; ${d} are open on ${o.url} \u2014 the reset is \`typebulb stop ${n}\` then relaunch.`),process.exit(1)),f===0){let m=l.droppedMsAgo,h=l.opening==="none"?" and no agent mirror page is open to open one through":"",y=l.opening==="unreached"?` \u2014 the page was opened ${l.via?`in VS Code via ${l.via}`:"in your browser"} and never attached; is the browser it opened in still there?`:m!==void 0?` \u2014 a page disconnected ${Math.round(m/1e3)}s ago and hasn't reconnected${h}; reload it, or open ${o.url}`:` \u2014 no page has ever connected${h}; share ${o.url} and arm: typebulb wait ${n} --match "${tt.connected}"`;console.error(`No page connected after ${((Date.now()-c)/1e3).toFixed(1)}s, so nothing was delivered${y}`),process.exit(1)}l.opening==="editor"?console.error(`Opened in VS Code via ${l.via}.`):l.opening==="external"&&console.error("Opened in your browser, where the agent mirror is."),console.error(`Sent to ${d}.`);let u=l.results??[],p=l.errors??[];for(let m of p)console.error(`handler error: ${m}`);if(p.length&&process.exit(1),u.length>1&&(console.error(`${u.length} replies from ${d} \u2014 one reply owns stdout: at most one tb.onMessage handler, in one page, may return a value.`),process.exit(1)),u.length===1){if(e!==void 0&&/^tb:png( |$)/.test(e)){let h={};try{h=JSON.parse(u[0])}catch{}typeof h.png!="string"&&(console.error("tb:png replied with an unexpected shape \u2014 an older runtime? (`typebulb logs` lists server versions)"),process.exit(1));let y=by(i);await WN(hl.dirname(y),{recursive:!0}),await KN(y,Buffer.from(h.png,"base64"));let v=[h.via?`inside "${h.via}"`:"",h.backdrop?`backdrop ${h.backdrop}`:""].filter(Boolean);console.error(`canvas ${h.width}\xD7${h.height} \u2192 PNG${v.length?` (${v.join("; ")})`:""}`),console.log(y);return}let m;try{m=JSON.parse(u[0])}catch{m=void 0}console.log(typeof m=="string"?m:u[0])}else l.timedOut&&(r&&(console.error(`No reply to '${e}' within ${t/1e3}s \u2014 reload the page and retry.`),process.exit(1)),console.error(`(no reply within ${t/1e3}s \u2014 slow work needs a larger --wait=ms; a reply that NEVER comes is a done-promise that missed an exit, or a blocked main thread: tb:snapshot runs no page code, so its silence too means blocked)`))}Na();Jd();ee();import*as wS from"fs/promises";async function vS(n,e){let t=await wS.readFile(n,"utf-8"),r=Mn(t),s=le[e].path,i=r.files.get(s);i||(console.error(i===void 0?`No **${s}** block in ${n}`:`The **${s}** block in ${n} is empty`),process.exit(2)),process.stdout.write(i.endsWith(`
|
|
2550
2550
|
`)?i:i+`
|
|
2551
|
-
`)}ee();import*as fi from"fs/promises";async function xS(n,e){let t=await fi.readFile(n,"utf-8"),r=[];for(let{kind:i,source:o}of e){let a;try{a=o==="-"?await Nr():await fi.readFile(o,"utf-8")}catch(l){kS(`Cannot read ${i}'s source: ${l instanceof Error?l.message:String(l)}`)}r.push({kind:i,content:di(a),label:o==="-"?"stdin":o})}let s;try{s=YN(t,r)}catch(i){kS(`${n}: ${i instanceof Error?i.message:String(i)}`)}for(let i of s.upToDate)console.log(`${le[i].path}: already up to date`);if(s.written.length){await fi.writeFile(n,s.text);for(let i of s.written)console.log(i.action==="removed"?`${le[i.kind].path}: removed (${i.label} is empty)`:`${le[i.kind].path}: ${i.action} from ${i.label} (${i.chars.toLocaleString()} chars)`)}}function YN(n,e){let t=Mn(n),r=n,s=[],i=[];for(let{kind:o,content:a,label:l}of e){let c=le[o].path,f=t.files.get(c);if(!a){if(f===void 0){i.push(o);continue}r=SS(Pp(r,o),r,c),s.push({kind:o,action:"removed",chars:0,label:l});continue}if(f!==void 0&&di(f)===a){i.push(o);continue}r=SS(Lr(r,o,a),r,c),s.push({kind:o,action:f===void 0?"created":"replaced",chars:a.length,label:l})}return{text:r,written:s,upToDate:i}}function SS(n,e,t){if(n===e)throw new Error(`the **${t}** block's fence is unterminated; refusing to rewrite inside it`);return n}function kS(n){console.error(n),process.exit(1)}ot();ff();Vs();cf();async function ES(n,e){ke(e);let t=process.cwd(),r=nl(),s=kt(),i=(s?[s]:Object.keys(r)).map(a=>r[a]()).filter(a=>a.listChildren);if(!i.length){console.error(`Sub-agent status isn't supported for ${s} sessions.`),process.exitCode=1;return}let o=i.map(a=>({adapter:a,sessions:Uw(a,t)})).filter(a=>a.sessions.length);if(!o.length){console.log("No sub-agents in this project's sessions.");return}if(!n){let{sessions:a}=o[0];VN(a[0]);return}for(let{adapter:a,sessions:l}of o){let c=qw(l,n);if(!c.length)continue;if(c.length>1){console.error(`Several agents match "${n}"; name one by its id:`);for(let u of c)console.error(` ${AS(u)}`);process.exitCode=1;return}let{text:f,error:d}=await Jw(a,t,c[0]);console.log(f),d&&console.error(`
|
|
2551
|
+
`)}ee();import*as fi from"fs/promises";async function xS(n,e){let t=await fi.readFile(n,"utf-8"),r=[];for(let{kind:i,source:o}of e){let a;try{a=o==="-"?await Nr():await fi.readFile(o,"utf-8")}catch(l){kS(`Cannot read ${i}'s source: ${l instanceof Error?l.message:String(l)}`)}r.push({kind:i,content:di(a),label:o==="-"?"stdin":o})}let s;try{s=YN(t,r)}catch(i){kS(`${n}: ${i instanceof Error?i.message:String(i)}`)}for(let i of s.upToDate)console.log(`${le[i].path}: already up to date`);if(s.written.length){await fi.writeFile(n,s.text);for(let i of s.written)console.log(i.action==="removed"?`${le[i.kind].path}: removed (${i.label} is empty)`:`${le[i.kind].path}: ${i.action} from ${i.label} (${i.chars.toLocaleString()} chars)`)}}function YN(n,e){let t=Mn(n),r=n,s=[],i=[];for(let{kind:o,content:a,label:l}of e){let c=le[o].path,f=t.files.get(c);if(!a){if(f===void 0){i.push(o);continue}r=SS(Pp(r,o),r,c),s.push({kind:o,action:"removed",chars:0,label:l});continue}if(f!==void 0&&di(f)===a){i.push(o);continue}r=SS(Lr(r,o,a),r,c),s.push({kind:o,action:f===void 0?"created":"replaced",chars:a.length,label:l})}return{text:r,written:s,upToDate:i}}function SS(n,e,t){if(n===e)throw new Error(`the **${t}** block's fence is unterminated; refusing to rewrite inside it`);return n}function kS(n){console.error(n),process.exit(1)}ot();ff();Vs();cf();async function ES(n,e){ke(e);let t=process.cwd(),r=nl(),s=kt(),i=(s?[s]:Object.keys(r)).map(a=>r[a]()).filter(a=>a.listChildren&&a.childBriefs);if(!i.length){console.error(`Sub-agent status isn't supported for ${s} sessions.`),process.exitCode=1;return}let o=i.map(a=>({adapter:a,sessions:Uw(a,t)})).filter(a=>a.sessions.length);if(!o.length){console.log("No sub-agents in this project's sessions.");return}if(!n){let{sessions:a}=o[0];VN(a[0]);return}for(let{adapter:a,sessions:l}of o){let c=qw(l,n);if(!c.length)continue;if(c.length>1){console.error(`Several agents match "${n}"; name one by its id:`);for(let u of c)console.error(` ${AS(u)}`);process.exitCode=1;return}let{text:f,error:d}=await Jw(a,t,c[0]);console.log(f),d&&console.error(`
|
|
2552
2552
|
(partly unjudged: ${d})`);return}console.error(`No agent matches "${n}". Run \`typebulb status\` to list them.`),process.exitCode=1}function VN(n){let e=[...n.children].sort((t,r)=>t.mtime-r.mtime);console.log(`Sub-agents of session ${n.sessionId}:`);for(let t of e)console.log(` ${" ".repeat(Math.max(0,t.depth-1))}${AS(t)}`);console.log("\nRun `typebulb status <id>` for one agent's report.")}var AS=n=>{let e=n.started?lt((n.state==="running"?Date.now():n.mtime)-n.started):"";return`${n.id} ${n.state.padEnd(7)} ${e.padStart(6)} ${Cn(n)}`};ot();St();ee();Qo();import*as en from"fs/promises";import*as $n from"path";import{EventEmitter as y1}from"events";Ut();ee();import{Hono as t1}from"hono";import{serve as n1}from"@hono/node-server";import{streamSSE as r1}from"hono/streaming";import*as sp from"fs/promises";import s1 from"open";br();Us();yr();import*as np from"fs/promises";import*as pi from"path";var ml=class{async get(e){let t=Xe(e),r=pi.join(Fs,t+".bin"),s=pi.join(Fs,t+".json");try{let[i,o]=await Promise.all([np.readFile(r),np.readFile(s,"utf8")]),a=JSON.parse(o);return{body:i,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await te();let r=Xe(e),s=pi.join(Fs,r+".bin"),i=pi.join(Fs,r+".json"),o={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([Me(s,t.body),Me(i,JSON.stringify(o))])}};var TS=`
|
|
2553
2553
|
const CSS = '\\n' +
|
|
2554
2554
|
/* The agent mirror's token set, verbatim (agents/core/client/styles.css) \u2014 one system across CLI
|