typebulb 0.60.9 → 0.61.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/dist/agents/claude/client.js +2 -2
- package/dist/agents/codex/client.js +2 -2
- package/dist/agents/pi/client.js +2 -2
- package/dist/index.js +180 -180
- package/package.json +1 -1
package/SKILL.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: typebulb
|
|
3
3
|
description: "Author and run Typebulb bulbs — single-file markdown apps (TypeScript/TSX) that run locally via `npx typebulb` (full power: filesystem, database, `server.ts`, `tb.ai`) or render live inline in your coding agent's session through Typebulb's agent mirror (sandboxed, client-only). A bulb can be a visual widget (chart, simulation, diagram, calculator, UI), a full-stack tool with a Node backend, or an AI app that calls models at runtime. Covers the bulb format, the `tb.*` API, trust, and the local run/inline workflow. Use when the user wants a bulb, a quick local tool (visual, backend-backed, or AI-powered), or something visual rendered inline in the conversation."
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.61.1
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
> Generated from typebulb v0.
|
|
7
|
+
> Generated from typebulb v0.61.1. `npx typebulb agent` prints the running version alongside the path to its packaged SKILL.md: if that version is newer than this one, replace this file with that one.
|
|
8
8
|
|
|
9
9
|
# typebulb
|
|
10
10
|
|
|
@@ -2205,8 +2205,8 @@ ${a||this.currentRow()?.pending?"New conversation \u2014 not saved yet":`Session
|
|
|
2205
2205
|
|
|
2206
2206
|
`),user:""}}stickToBottomNextRender(){this.#r=!0}#a(s,a){s.segments=[...s.segments??[s.text],a],s.text=s.segments.join(`
|
|
2207
2207
|
|
|
2208
|
-
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",d=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(d.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),d.turnCopy.setText(b.prose),d.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&d.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),d.turnView.setText(b.prose,b.user),this.#d(d,s.text),this.#p(),s.live)for(let v of s.tools)w5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let d=iEe(a);d.some(p=>p.kind==="bulb")&&(s.body=d.map(p=>{if(p.kind==="md")return p.text;let b=new sie(p.source,`inline-${this.#t++}`);return this.inlineBulbs.push(b),b}))}#p(){let s=this.inlineBulbs.map(p=>p.name),a=XSt(s),d=VSt(s);this.#n=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(d[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#m(s){uEe(this.expandedInlineBulbs,s),this.#p(),this.update()}applyToolResult(s){let a=this.#w(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#b(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#b(s){let a=[];for(let d of s)if(d.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,d.text):a.push({id:++this.#e,role:"user",text:d.text,thinking:"",tools:[]})}else if(d.type==="assistant")a.push({id:++this.#e,role:"assistant",text:d.text,thinking:d.thinking,tools:d.tools.map(p=>({...p,isError:!1}))});else if(d.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===d.id);p&&(p.result=d.content,p.isError=d.isError,p.digest=d.digest)}return a}#w(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=IF(s,50))}view(){return yt({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():yt({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let D of this.messages)D.role==="user"||s.length===0?(D.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[D]})):s[s.length-1].msgs.push(D);let d=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!d,v=s.flatMap((D,P)=>this.renderTurn(D.msgs,D.idx,b&&P===s.length-1));v.unshift(this.#v());let w=d?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(D=>D.role==="assistant")?.turnView,B=!!T&&!!this.#x(I,T,!0);return d&&v.push(this.#C(d,w)),p?v.push(this.#y(p,w,T,!B)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#A()},w,T,!B)):this.liveTurnView.reset()),v}#A(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(d=>d.result===void 0)?.name}}#v(){return yt({class:"masthead",key:"masthead"},Wee({class:"masthead-logo light",src:d5n,alt:"typebulb"}),Wee({class:"masthead-logo dark",src:p5n,alt:"typebulb"}),yt({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#C(s,a){return yt({class:["bubble","user",bC(a)],key:`echo-${s.length}`},this.#g(`md-echo-${s.length}`,rEe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,d,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=d??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,B=!s.text.trim()&&!T,D=w&&(T?`${oie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return yt({class:["bubble","assistant","draft",bC(a)],key:b},p?v.view(!0):null,I?Kye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Wye(B?Jn({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#S(s.thinking)):null,s.text.trim()?this.#I(b,s.text):null,D?yt({class:"draft-wait shimmer-text shimmer-slow"},D):null)}#I(s,a){let d=iEe(a);return d.some(p=>p.kind==="bulb")?d.map((p,b)=>p.kind==="md"?p.text.trim()?this.#g(`${s}-md-${b}`,tD(p.text)):null:this.#T(p.source,b)):this.#g(s,tD(a))}#k(s,a){return{onScroll:d=>{let p=d.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:IF(p,50)})},onMounted:d=>{a?.(d);let p=this.#i.get(s);d.scrollTop=p&&!p.stuck?p.top:d.scrollHeight}}}#S(s){return i6({key:`think-${s.length}`,...this.#k(-1)},s)}#T(s,a){let d=CH(s),p=s.split(`
|
|
2209
|
-
`).length;return yt({class:"md",key:`draft-bulb-${a}`},yt({class:"embed bulb-streaming"},yt({class:"bulb-streaming-head"},Jn("\u{1F4A1} "),Jn({class:"shimmer-text shimmer-slow"},`${d?`${d} \u2014 `:""}writing\u2026`),Jn({class:"bulb-streaming-count"},`${p} lines`)),yt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#k(a,b=>{b.innerHTML=eD.render(IH(s))})})))}renderTurn(s,a,d){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#x(s,I,d);return I.raw(d)?this.#M(s,a,T,I,d):I.summary?this.#B(a,p,b,I,d):this.#D(s,a,p,T,v,I,d)}#x(s,a,d){return a.raw(d)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(d=>d.role==="fork"?this.forkStub(d,a):this.bubble(d,a))}#M(s,a,d,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===d?p:void 0,b):this.bubble(v,a,void 0,!0,v===d?p:void 0,!0,b))}#D(s,a,d,p,b,v,w){let I=d.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(d[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,d,p,b){return a.flatMap(v=>v.role==="assistant"?v===d?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,d){return yt({class:["bubble","assistant",bC(a)],key:`no-prose-${a}`},d.view(!1),yt({class:"no-prose"},k5n(s)))}#N(s,a,d,p,b,v,w){let I=d.has(p);return yt({class:["bubble","assistant",bC(a)],key:s},v??null,yt({class:"turn-summary",onClick:()=>{uEe(d,p),this.update()}},cEe(I),Jn({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,d,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?yt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[m5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,d?.view(p),v)}bubble(s,a,d=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return yt({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?bC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?Kye({class:"thinking"},Wye("thinking"),i6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#E(d))}#R(s){let a=this.parent.children.find(d=>d.id===s);return yt({class:"agent-head"},Jn({class:"glyph-img"},"\u{1F916}"),Jn({class:"agent-kind"},a?.kind??"agent"),a?Dk({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:d=>{d.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):Jn({class:"agent-name"},s.slice(0,8)))}#E(s){return s?yt({class:"bubble-controls"},s.view()):null}#O(s,a,d,p){return yt({class:["bubble","assistant",bC(a)],key:`summary-${s.id}`},p.view(!1),this.#g(`md-summary-${s.id}-${d.length}`,tD(d)),this.#E(p.copy))}#P(s){let d=[...s.text.matchAll(h5n)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return d.length?yt({class:"paste-thumbs"},d.map(p=>Wee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let d=await tb.server.composerPasteRead(s);this.#c.set(s,d?.ok?`data:${d.mime};base64,${d.base64}`:"failed"),d?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((d,p)=>typeof d=="string"?d.trim()?[this.#g(`md-${s.id}-${p}`,tD(d))]:[]:this.#$(d));if(!s.text)return null;let a=s.role==="user"&&!s.agent;return this.#g(`md-${s.id}`,a?rEe(s):tD(s.text))}#$(s){if(!this.#n.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),d=yt({class:"md",key:`fold-${s.key}`},yt({class:"bulb-fold",onClick:()=>this.#m(s.key)},cEe(a),Jn({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),Jn({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[d,s.view()]:[d]}#g(s,a){return yt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),d=A5n(s.input),p=rTt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=d?B6t(d,this.parent.cwd):b5n(g5n(s.input)),w=b?()=>this.parent.openChild(b.id):d?()=>{tb.server.openFile(d)}:void 0;return yt({class:["tool",s.isError?"err":""]},yt({class:"tool-head"},yt({class:"tool-label"},Jn({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},oie(s.name)),v?w?Dk({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:d,onClick:I=>{I.preventDefault(),w()}},v):Jn({class:"tool-sum"},v):null),s.result===void 0?Jn({class:"tool-run"},"\u2026"):null),s.result!==void 0?yt({class:["tool-digest",a?"open":""],onClick:()=>{uEe(this.openTools,s.id),this.update()}},cEe(a),(p?y5n(p):s.digest)||"(no output)"):null,a?yt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||nTt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=rTt(s);if(a)return yt({class:"todo-list"},a.map(b=>yt({class:["todo",b.status??""]},Jn({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),Jn({class:"todo-text"},b.content??""))));let d=nTt(s);if(d.length)return yt({class:"tool-in"},d.map(tTt));let p=v5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?yt({class:"tool-in"},b.map(([v,w])=>yt({class:"tool-field"},Jn({class:"tool-key"},`${v}:`),typeof w=="string"&&iTt(w)?tTt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return yt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?yt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var uie=class extends Ia{ready=!1;cwd="";sessionId=null;sessionPicker=new Zre;tokenPill=new eie;bulbsPill=new tie;diffPill=new rie;childrenPill=new iie;messageList=new cie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#t=!1;#n=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#n||(this.#n=!0,M6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Vye(this.cwd),a=this.sessionPicker.currentPreview(),d=rte(a,40);document.title=d&&s?`${d} \u2014 ${s}`:d||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#t)return;this.#t=!0;let s=async()=>{try{let{events:a,cursor:d,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=d;for(let W of a)this.apply(W);let T=p!==this.working;this.working=p;let B=Array.isArray(I)?I:[],D=B.join(`
|
|
2208
|
+
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent,authored:s.authored})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",d=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(d.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),d.turnCopy.setText(b.prose),d.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&d.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),d.turnView.setText(b.prose,b.user),this.#d(d,s.text),this.#p(),s.live)for(let v of s.tools)w5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let d=iEe(a);d.some(p=>p.kind==="bulb")&&(s.body=d.map(p=>{if(p.kind==="md")return p.text;let b=new sie(p.source,`inline-${this.#t++}`);return this.inlineBulbs.push(b),b}))}#p(){let s=this.inlineBulbs.map(p=>p.name),a=XSt(s),d=VSt(s);this.#n=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(d[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#m(s){uEe(this.expandedInlineBulbs,s),this.#p(),this.update()}applyToolResult(s){let a=this.#w(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#b(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#b(s){let a=[];for(let d of s)if(d.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,d.text):a.push({id:++this.#e,role:"user",text:d.text,thinking:"",tools:[]})}else if(d.type==="assistant")a.push({id:++this.#e,role:"assistant",text:d.text,thinking:d.thinking,tools:d.tools.map(p=>({...p,isError:!1}))});else if(d.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===d.id);p&&(p.result=d.content,p.isError=d.isError,p.digest=d.digest)}return a}#w(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=IF(s,50))}view(){return yt({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():yt({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let D of this.messages)D.role==="user"||s.length===0?(D.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[D]})):s[s.length-1].msgs.push(D);let d=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!d,v=s.flatMap((D,P)=>this.renderTurn(D.msgs,D.idx,b&&P===s.length-1));v.unshift(this.#v());let w=d?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(D=>D.role==="assistant")?.turnView,B=!!T&&!!this.#x(I,T,!0);return d&&v.push(this.#C(d,w)),p?v.push(this.#y(p,w,T,!B)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#A()},w,T,!B)):this.liveTurnView.reset()),v}#A(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(d=>d.result===void 0)?.name}}#v(){return yt({class:"masthead",key:"masthead"},Wee({class:"masthead-logo light",src:d5n,alt:"typebulb"}),Wee({class:"masthead-logo dark",src:p5n,alt:"typebulb"}),yt({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#C(s,a){return yt({class:["bubble","user",bC(a)],key:`echo-${s.length}`},this.#g(`md-echo-${s.length}`,rEe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,d,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=d??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,B=!s.text.trim()&&!T,D=w&&(T?`${oie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return yt({class:["bubble","assistant","draft",bC(a)],key:b},p?v.view(!0):null,I?Kye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Wye(B?Jn({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#S(s.thinking)):null,s.text.trim()?this.#I(b,s.text):null,D?yt({class:"draft-wait shimmer-text shimmer-slow"},D):null)}#I(s,a){let d=iEe(a);return d.some(p=>p.kind==="bulb")?d.map((p,b)=>p.kind==="md"?p.text.trim()?this.#g(`${s}-md-${b}`,tD(p.text)):null:this.#T(p.source,b)):this.#g(s,tD(a))}#k(s,a){return{onScroll:d=>{let p=d.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:IF(p,50)})},onMounted:d=>{a?.(d);let p=this.#i.get(s);d.scrollTop=p&&!p.stuck?p.top:d.scrollHeight}}}#S(s){return i6({key:`think-${s.length}`,...this.#k(-1)},s)}#T(s,a){let d=CH(s),p=s.split(`
|
|
2209
|
+
`).length;return yt({class:"md",key:`draft-bulb-${a}`},yt({class:"embed bulb-streaming"},yt({class:"bulb-streaming-head"},Jn("\u{1F4A1} "),Jn({class:"shimmer-text shimmer-slow"},`${d?`${d} \u2014 `:""}writing\u2026`),Jn({class:"bulb-streaming-count"},`${p} lines`)),yt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#k(a,b=>{b.innerHTML=eD.render(IH(s))})})))}renderTurn(s,a,d){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#x(s,I,d);return I.raw(d)?this.#M(s,a,T,I,d):I.summary?this.#B(a,p,b,I,d):this.#D(s,a,p,T,v,I,d)}#x(s,a,d){return a.raw(d)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(d=>d.role==="fork"?this.forkStub(d,a):this.bubble(d,a))}#M(s,a,d,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===d?p:void 0,b):this.bubble(v,a,void 0,!0,v===d?p:void 0,!0,b))}#D(s,a,d,p,b,v,w){let I=d.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(d[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,d,p,b){return a.flatMap(v=>v.role==="assistant"?v===d?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,d){return yt({class:["bubble","assistant",bC(a)],key:`no-prose-${a}`},d.view(!1),yt({class:"no-prose"},k5n(s)))}#N(s,a,d,p,b,v,w){let I=d.has(p);return yt({class:["bubble","assistant",bC(a)],key:s},v??null,yt({class:"turn-summary",onClick:()=>{uEe(d,p),this.update()}},cEe(I),Jn({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,d,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?yt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[m5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,d?.view(p),v)}bubble(s,a,d=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return yt({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?bC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?Kye({class:"thinking"},Wye("thinking"),i6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#E(d))}#R(s){let a=this.parent.children.find(d=>d.id===s);return yt({class:"agent-head"},Jn({class:"glyph-img"},"\u{1F916}"),Jn({class:"agent-kind"},a?.kind??"agent"),a?Dk({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:d=>{d.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):Jn({class:"agent-name"},s.slice(0,8)))}#E(s){return s?yt({class:"bubble-controls"},s.view()):null}#O(s,a,d,p){return yt({class:["bubble","assistant",bC(a)],key:`summary-${s.id}`},p.view(!1),this.#g(`md-summary-${s.id}-${d.length}`,tD(d)),this.#E(p.copy))}#P(s){let d=[...s.text.matchAll(h5n)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return d.length?yt({class:"paste-thumbs"},d.map(p=>Wee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let d=await tb.server.composerPasteRead(s);this.#c.set(s,d?.ok?`data:${d.mime};base64,${d.base64}`:"failed"),d?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((d,p)=>typeof d=="string"?d.trim()?[this.#g(`md-${s.id}-${p}`,tD(d))]:[]:this.#$(d));if(!s.text)return null;let a=s.role==="user"&&!s.agent&&!s.authored;return this.#g(`md-${s.id}`,a?rEe(s):tD(s.text))}#$(s){if(!this.#n.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),d=yt({class:"md",key:`fold-${s.key}`},yt({class:"bulb-fold",onClick:()=>this.#m(s.key)},cEe(a),Jn({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),Jn({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[d,s.view()]:[d]}#g(s,a){return yt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),d=A5n(s.input),p=rTt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=d?B6t(d,this.parent.cwd):b5n(g5n(s.input)),w=b?()=>this.parent.openChild(b.id):d?()=>{tb.server.openFile(d)}:void 0;return yt({class:["tool",s.isError?"err":""]},yt({class:"tool-head"},yt({class:"tool-label"},Jn({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},oie(s.name)),v?w?Dk({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:d,onClick:I=>{I.preventDefault(),w()}},v):Jn({class:"tool-sum"},v):null),s.result===void 0?Jn({class:"tool-run"},"\u2026"):null),s.result!==void 0?yt({class:["tool-digest",a?"open":""],onClick:()=>{uEe(this.openTools,s.id),this.update()}},cEe(a),(p?y5n(p):s.digest)||"(no output)"):null,a?yt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||nTt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=rTt(s);if(a)return yt({class:"todo-list"},a.map(b=>yt({class:["todo",b.status??""]},Jn({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),Jn({class:"todo-text"},b.content??""))));let d=nTt(s);if(d.length)return yt({class:"tool-in"},d.map(tTt));let p=v5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?yt({class:"tool-in"},b.map(([v,w])=>yt({class:"tool-field"},Jn({class:"tool-key"},`${v}:`),typeof w=="string"&&iTt(w)?tTt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return yt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?yt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var uie=class extends Ia{ready=!1;cwd="";sessionId=null;sessionPicker=new Zre;tokenPill=new eie;bulbsPill=new tie;diffPill=new rie;childrenPill=new iie;messageList=new cie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#t=!1;#n=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#n||(this.#n=!0,M6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Vye(this.cwd),a=this.sessionPicker.currentPreview(),d=rte(a,40);document.title=d&&s?`${d} \u2014 ${s}`:d||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#t)return;this.#t=!0;let s=async()=>{try{let{events:a,cursor:d,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=d;for(let W of a)this.apply(W);let T=p!==this.working;this.working=p;let B=Array.isArray(I)?I:[],D=B.join(`
|
|
2210
2210
|
`)!==this.busy.join(`
|
|
2211
2211
|
`);this.busy=B;let P=b!==this.latestModel;this.latestModel=b??null;let F=this.childrenPill.syncFromPoll(v??null),U=this.composer&&w?this.composer.syncFromPoll(w):!1;(a.length||T||P||F||U||D)&&this.update(),(a.length||U)&&this.messageList.scrollSoon(),this.#o?.()}catch(a){console.error("[mirror] poll failed",a)}setTimeout(s,600)};s()}apply(s){switch(s.type){case"cleared":this.messageList.clear(),this.tokens={in:0,out:0,cached:0,cacheCreate:0},this.cost=0;break;case"session":s.sessionId!==this.sessionId&&this.childrenPill.reset(),this.sessionId=s.sessionId,s.sessionId&&!this.sessionPicker.currentRow()?this.refreshSessions():this.updateTitle();break;case"user":this.messageList.applyUser(s);break;case"assistant":this.messageList.applyAssistant(s);break;case"tool_result":this.messageList.applyToolResult(s);break;case"fork":this.messageList.applyFork(s);break;case"usage":this.tokens={in:s.in,out:s.out,cached:s.cached,cacheCreate:s.cacheCreate},this.cost+=s.cost??0;break}}view(){return yt({class:"app"},yt({class:"chat"},this.diffPill.viewing?this.diffPill.docView():this.messageList.view(),this.#c(),...this.#s.map(s=>s()),this.statusbar()),this.composer?.enabled?this.composer.view():null)}#c(){let s=this.#i;return!this.ready||this.sessionId!==null||!s?null:yt({class:"cwd-hint"},yt({class:"cwd-hint-head"},`No sessions for ${this.cwd}`),yt(`${s.count} session${s.count===1?"":"s"} exist for `,Jn({class:"cwd-hint-dir"},s.dir)," \u2014 this mirror was likely launched from a subfolder. Relaunch it from the project root."))}statusbar(){return yt({class:"statusbar"},yt({class:["statusbar-actions",this.diffPill.viewing?"doc-open":""]},this.diffPill.view(),...this.pills.map(s=>s.view()),this.tokenPill.view(),this.childrenPill.view(),this.sessionPicker.view(),this.bulbsPill.view()))}};var x5n=[[0,"Low"],[1,"Med"],[2,"High"]],E5n=1,aie=o=>o?.message??String(o),C5n=()=>I6t({viewBox:"0 0 24 24",width:"15",height:"15",class:"anthropic-glyph",fill:"currentColor"},C6t({d:"M13.827 3.52h3.603L24 20h-3.603l-6.57-16.48zm-7.258 0h3.767L16.906 20h-3.674l-1.343-3.461H5.017l-1.344 3.46H0L6.57 3.522zm4.132 9.959L8.453 7.687 6.205 13.48H10.7z"})),sTt=o=>o===!0?"ok":o===!1?"bad":"warn",lie=class extends n2{models=[];hasKey=!0;loaded=!1;current={active:!1,managed:!1,model:null,port:null,provider:null,routedModel:null,caching:"unknown",reasoning:null,externalBaseUrl:null};busy=!1;err=null;enteringKey=!1;keyDraft="";probes={};probing=null;openDiag=null;infoOpen=!1;ticking=!1;keepOpenSelector=".model-wrap";filterId="model-filter";listSelector="#model-list";filterNoun="model";search(){return Promise.resolve([])}modeToggle(){return null}onActivate(s){let a=this.rows()[s];a&&(a.kind==="default"?this.clear():a.kind==="unlock"?this.beginKeyEntry():this.set(a.id))}onAttached(){this.refresh()}async refresh(){try{let[s,a]=await Promise.all([tb.server.listSwitchModels(),tb.server.switchState()]);this.models=s.models,this.hasKey=s.hasKey,this.current=a,this.err=s.error??null}catch(s){this.err=aie(s),console.error("[mirror] switcher refresh failed",s)}finally{this.loaded=!0,this.update()}}async tickState(){if(!(this.ticking||this.enteringKey)){this.ticking=!0;try{let s=await tb.server.switchState(),a=s.active!==this.current.active||s.model!==this.current.model||s.caching!==this.current.caching||s.routedModel!==this.current.routedModel||s.externalBaseUrl!==this.current.externalBaseUrl||s.provider!==this.current.provider||s.reasoning!==this.current.reasoning;this.current=s,a&&this.update()}catch{}finally{this.ticking=!1}}}rows(){let s=[];if(!this.hasKey)s.push({kind:"unlock"});else{let a=this.filter.trim().toLowerCase(),d=null;for(let p of this.models){if(a&&!p.label.toLowerCase().includes(a)&&!p.id.toLowerCase().includes(a))continue;let b={kind:"model",id:p.id,label:p.label,active:this.current.active&&this.current.model===p.id};b.active?d=b:s.push(b)}d&&s.push(d)}return s.push({kind:"default",active:!this.current.active&&!this.current.externalBaseUrl}),s}activeIndex(){let s=this.rows(),a=s.findIndex(d=>d.active);return a<0?Math.max(0,s.length-1):a}async show(){this.beginOpen(),this.refreshList(this.activeIndex()),this.focusFilter(),await this.refresh(),this.refreshList(this.activeIndex()),this.armClose()}onClosed(){super.onClosed(),this.enteringKey=!1,this.keyDraft="",this.openDiag=null,this.infoOpen=!1,this.err=null}async probe(s){if(!this.probing){this.probing=s,this.update();try{this.probes[s]=await tb.server.probeModel({model:s})}catch(a){this.probes[s]={ok:!1,error:aie(a)}}this.probing=null,this.update()}}showDiag(s){this.openDiag=s,this.update()}closeDiag(){this.openDiag=null,this.update(),this.focusFilter()}label(s){return s?this.models.find(a=>a.id===s)?.label||s.split("/").pop()||s:"Anthropic"}async runBusy(s,a){this.busy=!0,this.err=null,this.update();try{let d=await s();if(d?.ok===!1)return this.err=d.error||a,this.busy=!1,this.update(),!1}catch(d){return this.err=aie(d),this.busy=!1,this.update(),!1}return this.busy=!1,!0}async set(s){await this.runBusy(()=>tb.server.setSwitchModel({model:s}),"failed to set model")&&(await this.refresh(),this.close())}async clear(){await this.runBusy(()=>tb.server.clearSwitchModel(),"failed to revert")&&(await this.refresh(),this.close())}get reasoningSel(){return this.current.reasoning??E5n}set reasoningSel(s){this.setReasoning(s)}async setReasoning(s){if(this.current.reasoning!==s){this.current={...this.current,reasoning:s},this.update();try{let a=await tb.server.setReasoning({level:s});a?.ok===!1&&(this.err=a.error||"failed to set reasoning",this.update())}catch(a){this.err=aie(a),this.update()}}}beginKeyEntry(){this.enteringKey=!0,this.keyDraft="",this.update(),setTimeout(()=>document.getElementById("or-key-input")?.focus())}cancelKeyEntry(){this.enteringKey=!1,this.keyDraft="",this.update(),this.focusFilter()}async saveKey(){let s=this.keyDraft.trim();s&&await this.runBusy(()=>tb.server.saveOpenRouterKey({key:s}),"failed to save key")&&(this.enteringKey=!1,this.keyDraft="",await this.refresh(),this.refreshList(this.activeIndex()))}get overridden(){return this.current.active}get uncached(){return this.current.active&&this.current.caching==="uncached"}watchdogView(){return this.uncached?yt({class:["model-banner","warn"]},Jn({class:"model-banner-text"},`${this.label(this.current.model)} was served uncached via OpenRouter \u2014 the full context is re-billed each turn. Probe the model to pin a provider that caches, or pick a different one.`)):null}head(){return this.current.active?yt({class:"model-head"},Ao({class:"model-info-toggle",onClick:s=>{s.stopPropagation(),this.infoOpen=!0,this.update()}},"Routing info"),yt({class:"reasoning-ctl",title:"Reasoning sets the route\u2019s base thinking effort."},Jn({class:"reasoning-label"},"reasoning"),this.reasoningSelect())):this.current.externalBaseUrl?yt({class:"model-head"},Jn({class:["model-route","warn"]},"Custom base URL set elsewhere \u2014 \u201CAnthropic (native)\u201D clears it")):null}reasoningSelect(){return E6t({target:this,prop:()=>this.reasoningSel,attrs:{class:"reasoning-select",onClick:s=>s.stopPropagation()},options:x5n.map(([s,a])=>({value:s,label:a}))})}infoView(){let s=this.label(this.current.model),a=()=>{this.infoOpen=!1,this.update()};return yt({class:"picker model-picker diag-mode",tabIndex:0,onMounted:d=>d.focus(),onKeyDown:d=>{d.key==="Escape"&&(d.stopPropagation(),a())}},yt({class:"diag-head"},Jn({class:"diag-name"},"Routing"),yt({class:"diag-head-acts"},Ao({class:"diag-back",title:"Back to the model list",onClick:d=>{d.stopPropagation(),a()}},"\u2190 models"))),yt({class:"diag-body"},yt({class:"diag-line"},`You are currently routing to ${s} via OpenRouter, not your Anthropic subscription.`),yt({class:"diag-line"},"The route is shared by every Claude Code conversation scoped to this project."),yt({class:"diag-line"},"Switching to or from Anthropic toggles the proxy, so for existing conversations you\u2019ll need to:"),yt({class:["diag-line","diag-bullet"]},"\u2022 Relaunch the Claude CLI"),yt({class:["diag-line","diag-bullet"]},"\u2022 or, in the VS Code extension, run \u201CDeveloper: Restart Extension Host\u201D (Cmd/Ctrl+Shift+P).")))}view(){let s=this.current.active,a=this.uncached,d=!s&&!!this.current.externalBaseUrl,p=this.label(this.current.model),b=a?`${p} via OpenRouter, uncached \u2014 full context re-billed each turn. Click to switch or revert.`:s?`claude \u2192 ${this.current.model}: its Anthropic API is proxied to OpenRouter. Click to switch or revert.`:d?`Custom ANTHROPIC_BASE_URL set outside this tool (${this.current.externalBaseUrl}). Click to manage.`:"Anthropic (native) \u2014 click to proxy claude\u2019s Anthropic API to an OpenRouter model.",v=s?p:d?"custom route":C5n();return yt({class:"model-wrap pop-center"},Ao({class:["pill",s||d?"on":"glyph",a?"warn":""],"data-tip":b,ariaLabel:s||d?void 0:"Anthropic (native)",onClick:w=>{w.stopPropagation(),this.open?this.close():this.show()}},v),this.open?this.popup():null)}popup(){if(this.enteringKey)return this.keyView();if(this.infoOpen)return this.infoView();if(this.openDiag)return this.diagView(this.openDiag);let s=this.rows(),a=this.loaded&&this.hasKey&&!this.models.length;return yt({class:"picker model-picker"},this.head(),yt({id:"model-list",class:"picker-list",onScroll:()=>this.onListScroll()},s.map((d,p)=>this.row(d,p)),a?yt({class:"picker-empty"},this.err?`Couldn't load models: ${this.err}`:"No OpenRouter models in the catalog right now."):null),this.err&&!a?yt({class:"model-err"},`\u2717 ${this.err}`):null,this.hasKey&&this.models.length?this.filterBox(this.models.length,"model"):null)}row(s,a){let d=()=>{this.highlighted!==a&&(this.highlighted=a,this.update())},p=["picker-row",a===this.highlighted?"active":""];if(s.kind==="unlock")return yt({class:p,onMouseEnter:d,onClick:()=>this.onActivate(a)},yt({class:"picker-row-main"},Jn({class:"picker-dot"}),Jn({class:"picker-preview"},"+ Add OpenRouter key to unlock models\u2026")));if(s.kind==="default")return yt({class:[...p,s.active?"current":"","model-row","model-default-row"],title:"Your normal claude (subscription / API) \u2014 clears the override",onMouseEnter:d,onClick:()=>this.onActivate(a)},yt({class:"picker-row-main"},Jn({class:"picker-dot"}),Jn({class:"picker-preview"},"Anthropic (native)"),yt({class:"model-trailing"},s.active?this.activeBadge():null)));let b=s.id;return yt({class:[...p,s.active?"current":"","model-row"],title:b,onMouseEnter:d,onClick:()=>this.onActivate(a)},yt({class:"picker-row-main"},Jn({class:"picker-dot"}),Jn({class:"picker-preview"},s.label),yt({class:"model-trailing"},s.active?this.activeBadge():null,this.statusButton(b))))}activeBadge(){return Jn({class:["model-btn","model-active"],title:"Active \u2014 bare claude routes here now"},"active")}statusButton(s){if(this.probing===s)return Jn({class:["model-btn","model-status","probing"]},"probing\u2026");let a=this.probes[s];if(!a)return Ao({class:["model-btn","model-status","probe"],title:"Check if it\u2019s callable and which provider caches \u2014 pins the caching one.",onClick:p=>{p.stopPropagation(),this.probe(s)}},"probe");let d=this.badge(a);return Ao({class:["model-btn","model-status",d.cls],title:`${d.title} \xB7 click for details`,onClick:p=>{p.stopPropagation(),this.showDiag(s)}},d.text)}badge(s){if(!s.ok||s.callable===!1)return{text:"error",cls:"bad",title:s.error||"unavailable"};let a=s.provider?` on ${s.provider}`:"",d=s.cache?.works,p=sTt(d);return d===!0?{text:"cached",cls:p,title:`caching confirmed${a} \u2014 ${s.cache?.note||""}`}:d===!1?{text:"uncached",cls:p,title:`no caching${a} \u2014 ${s.cache?.note||""}`}:{text:"cache?",cls:p,title:`${s.cache?.note||"caching unconfirmed"}${a}`}}diagView(s){return yt({class:"picker model-picker diag-mode",tabIndex:0,onMounted:a=>a.focus(),onKeyDown:a=>{a.key==="Escape"&&(a.stopPropagation(),this.closeDiag())}},yt({class:"diag-head"},Jn({class:"diag-name"},this.label(s)),yt({class:"diag-head-acts"},Ao({class:"diag-back",title:"Re-run the probe",disabled:this.probing===s,onClick:a=>{a.stopPropagation(),this.probe(s)}},this.probing===s?"probing\u2026":"probe again"),Ao({class:"diag-back",title:"Back to the model list",onClick:a=>{a.stopPropagation(),this.closeDiag()}},"\u2190 models"))),yt({class:"diag-body"},...this.diagLines(s)))}diagLines(s){let a=this.probes[s];if(!a)return[yt({class:["diag-line","muted"]},"Not probed yet \u2014 close this and hit probe.")];let d=[];if(!a.ok||a.callable===!1)d.push(yt({class:["diag-line","bad"]},`\u2717 Not callable${a.status?` (HTTP ${a.status})`:""}: ${a.error||"unknown error"}`)),a.restriction&&d.push(yt({class:["diag-line","warn"]},`\u26A0 ${a.restriction}`));else{d.push(yt({class:["diag-line","ok"]},`\u2713 Callable${a.ms?` \xB7 ${a.ms}ms`:""}${a.sample?` \xB7 replied \u201C${a.sample}\u201D`:""}`)),a.provider&&d.push(yt({class:["diag-line","muted"]},`Served by ${a.provider} this probe \u2014 the proxy will pin CC's turns to it when caching is confirmed.`));let p=a.cache;if(p){let b=sTt(p.works),v=p.works===!0?"\u2713 Caching works":p.works===!1?"\u2717 No caching":"~ Caching unconfirmed",w=a.provider?` on ${a.provider}`:"";d.push(yt({class:["diag-line",b]},`${v}${w} \u2014 ${p.note}`)),p.works!==!0&&d.push(yt({class:["diag-line","muted"]},"Without prompt caching every turn re-bills the whole context \u2014 costly over a long session."))}}return d.push(yt({class:["diag-line","muted","small"]},"Caching on OpenRouter is per-provider; the proxy pins the provider a probe confirms so CC keeps caching. A probe makes two small test calls.")),d}keyView(){return yt({class:"picker model-picker key-entry",tabIndex:0,onKeyDown:s=>{s.key==="Escape"&&(s.stopPropagation(),this.cancelKeyEntry())}},yt({class:"key-entry-head"},"Paste your OpenRouter API key"),Xee({target:this,prop:()=>this.keyDraft,id:"or-key-input",attrs:{class:"bulb-filter",placeholder:"sk-or-\u2026",ariaLabel:"OpenRouter API key",onKeyDown:s=>{s.key==="Enter"?(s.preventDefault(),this.saveKey()):s.key==="Escape"&&(s.stopPropagation(),this.cancelKeyEntry())}}}),this.err?yt({class:"model-err"},`\u2717 ${this.err}`):null,yt({class:"key-entry-acts"},Ao({class:"pill",onClick:s=>{s.stopPropagation(),this.cancelKeyEntry()}},"Cancel"),Ao({class:["pill","on"],onClick:s=>{s.stopPropagation(),this.saveKey()}},this.busy?"Saving\u2026":"Save")),yt({class:"key-entry-note"},"Written to .env in this project (gitignored). Used only via OpenRouter."))}};document.title="Claude Mirror";var aEe=new lie;new v6t({root:new uie({title:"Claude Mirror",pills:[aEe],overlays:[()=>aEe.watchdogView()],onPollTick:()=>{aEe.tickState()}}),id:"app"});
|
|
2212
2212
|
/*! Bundled license information:
|
|
@@ -2205,8 +2205,8 @@ ${a||this.currentRow()?.pending?"New conversation \u2014 not saved yet":`Session
|
|
|
2205
2205
|
|
|
2206
2206
|
`),user:""}}stickToBottomNextRender(){this.#r=!0}#a(s,a){s.segments=[...s.segments??[s.text],a],s.text=s.segments.join(`
|
|
2207
2207
|
|
|
2208
|
-
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",d=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(d.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),d.turnCopy.setText(b.prose),d.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&d.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),d.turnView.setText(b.prose,b.user),this.#d(d,s.text),this.#p(),s.live)for(let v of s.tools)s5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let d=Zxe(a);d.some(p=>p.kind==="bulb")&&(s.body=d.map(p=>{if(p.kind==="md")return p.text;let b=new rie(p.source,`inline-${this.#t++}`);return this.inlineBulbs.push(b),b}))}#p(){let s=this.inlineBulbs.map(p=>p.name),a=HSt(s),d=qSt(s);this.#n=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(d[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#m(s){rEe(this.expandedInlineBulbs,s),this.#p(),this.update()}applyToolResult(s){let a=this.#w(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#b(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#b(s){let a=[];for(let d of s)if(d.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,d.text):a.push({id:++this.#e,role:"user",text:d.text,thinking:"",tools:[]})}else if(d.type==="assistant")a.push({id:++this.#e,role:"assistant",text:d.text,thinking:d.thinking,tools:d.tools.map(p=>({...p,isError:!1}))});else if(d.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===d.id);p&&(p.result=d.content,p.isError=d.isError,p.digest=d.digest)}return a}#w(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=IF(s,50))}view(){return Zt({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():Zt({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let B of this.messages)B.role==="user"||s.length===0?(B.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[B]})):s[s.length-1].msgs.push(B);let d=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!d,v=s.flatMap((B,P)=>this.renderTurn(B.msgs,B.idx,b&&P===s.length-1));v.unshift(this.#v());let w=d?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(B=>B.role==="assistant")?.turnView,D=!!T&&!!this.#x(I,T,!0);return d&&v.push(this.#C(d,w)),p?v.push(this.#y(p,w,T,!D)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#A()},w,T,!D)):this.liveTurnView.reset()),v}#A(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(d=>d.result===void 0)?.name}}#v(){return Zt({class:"masthead",key:"masthead"},Wee({class:"masthead-logo light",src:e5n,alt:"typebulb"}),Wee({class:"masthead-logo dark",src:t5n,alt:"typebulb"}),Zt({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#C(s,a){return Zt({class:["bubble","user",bC(a)],key:`echo-${s.length}`},this.#g(`md-echo-${s.length}`,Vxe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,d,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=d??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,D=!s.text.trim()&&!T,B=w&&(T?`${iie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return Zt({class:["bubble","assistant","draft",bC(a)],key:b},p?v.view(!0):null,I?Gye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Qye(D?cr({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#S(s.thinking)):null,s.text.trim()?this.#I(b,s.text):null,B?Zt({class:"draft-wait shimmer-text shimmer-slow"},B):null)}#I(s,a){let d=Zxe(a);return d.some(p=>p.kind==="bulb")?d.map((p,b)=>p.kind==="md"?p.text.trim()?this.#g(`${s}-md-${b}`,tD(p.text)):null:this.#T(p.source,b)):this.#g(s,tD(a))}#k(s,a){return{onScroll:d=>{let p=d.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:IF(p,50)})},onMounted:d=>{a?.(d);let p=this.#i.get(s);d.scrollTop=p&&!p.stuck?p.top:d.scrollHeight}}}#S(s){return i6({key:`think-${s.length}`,...this.#k(-1)},s)}#T(s,a){let d=CH(s),p=s.split(`
|
|
2209
|
-
`).length;return Zt({class:"md",key:`draft-bulb-${a}`},Zt({class:"embed bulb-streaming"},Zt({class:"bulb-streaming-head"},cr("\u{1F4A1} "),cr({class:"shimmer-text shimmer-slow"},`${d?`${d} \u2014 `:""}writing\u2026`),cr({class:"bulb-streaming-count"},`${p} lines`)),Zt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#k(a,b=>{b.innerHTML=eD.render(IH(s))})})))}renderTurn(s,a,d){let p=s.filter(D=>D.role==="user"||D.text||D.body),b=p.find(D=>D.role==="assistant"&&(!!D.text||!!D.body)),v=[...p].reverse().find(D=>D.role==="assistant"&&(!!D.text||!!D.body)),w=[...s].reverse().find(D=>D.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#x(s,I,d);return I.raw(d)?this.#M(s,a,T,I,d):I.summary?this.#B(a,p,b,I,d):this.#D(s,a,p,T,v,I,d)}#x(s,a,d){return a.raw(d)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(d=>d.role==="fork"?this.forkStub(d,a):this.bubble(d,a))}#M(s,a,d,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===d?p:void 0,b):this.bubble(v,a,void 0,!0,v===d?p:void 0,!0,b))}#D(s,a,d,p,b,v,w){let I=d.map(T=>{let D=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,D??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(d[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,d,p,b){return a.flatMap(v=>v.role==="assistant"?v===d?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,d){return Zt({class:["bubble","assistant",bC(a)],key:`no-prose-${a}`},d.view(!1),Zt({class:"no-prose"},a5n(s)))}#N(s,a,d,p,b,v,w){let I=d.has(p);return Zt({class:["bubble","assistant",bC(a)],key:s},v??null,Zt({class:"turn-summary",onClick:()=>{rEe(d,p),this.update()}},nEe(I),cr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,d,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?Zt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[i5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,d?.view(p),v)}bubble(s,a,d=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return Zt({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?bC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?Gye({class:"thinking"},Qye("thinking"),i6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#E(d))}#R(s){let a=this.parent.children.find(d=>d.id===s);return Zt({class:"agent-head"},cr({class:"glyph-img"},"\u{1F916}"),cr({class:"agent-kind"},a?.kind??"agent"),a?D7({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:d=>{d.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):cr({class:"agent-name"},s.slice(0,8)))}#E(s){return s?Zt({class:"bubble-controls"},s.view()):null}#O(s,a,d,p){return Zt({class:["bubble","assistant",bC(a)],key:`summary-${s.id}`},p.view(!1),this.#g(`md-summary-${s.id}-${d.length}`,tD(d)),this.#E(p.copy))}#P(s){let d=[...s.text.matchAll(Zvn)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return d.length?Zt({class:"paste-thumbs"},d.map(p=>Wee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let d=await tb.server.composerPasteRead(s);this.#c.set(s,d?.ok?`data:${d.mime};base64,${d.base64}`:"failed"),d?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((d,p)=>typeof d=="string"?d.trim()?[this.#g(`md-${s.id}-${p}`,tD(d))]:[]:this.#$(d));if(!s.text)return null;let a=s.role==="user"&&!s.agent;return this.#g(`md-${s.id}`,a?Vxe(s):tD(s.text))}#$(s){if(!this.#n.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),d=Zt({class:"md",key:`fold-${s.key}`},Zt({class:"bulb-fold",onClick:()=>this.#m(s.key)},nEe(a),cr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),cr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[d,s.view()]:[d]}#g(s,a){return Zt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),d=o5n(s.input),p=zSt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=d?k6t(d,this.parent.cwd):r5n(n5n(s.input)),w=b?()=>this.parent.openChild(b.id):d?()=>{tb.server.openFile(d)}:void 0;return Zt({class:["tool",s.isError?"err":""]},Zt({class:"tool-head"},Zt({class:"tool-label"},cr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},iie(s.name)),v?w?D7({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:d,onClick:I=>{I.preventDefault(),w()}},v):cr({class:"tool-sum"},v):null),s.result===void 0?cr({class:"tool-run"},"\u2026"):null),s.result!==void 0?Zt({class:["tool-digest",a?"open":""],onClick:()=>{rEe(this.openTools,s.id),this.update()}},nEe(a),(p?u5n(p):s.digest)||"(no output)"):null,a?Zt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||USt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=zSt(s);if(a)return Zt({class:"todo-list"},a.map(b=>Zt({class:["todo",b.status??""]},cr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),cr({class:"todo-text"},b.content??""))));let d=USt(s);if(d.length)return Zt({class:"tool-in"},d.map(JSt));let p=c5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?Zt({class:"tool-in"},b.map(([v,w])=>Zt({class:"tool-field"},cr({class:"tool-key"},`${v}:`),typeof w=="string"&&KSt(w)?JSt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return Zt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?Zt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var oie=class extends Wu{ready=!1;cwd="";sessionId=null;sessionPicker=new Xre;tokenPill=new Vre;bulbsPill=new Zre;diffPill=new tie;childrenPill=new nie;messageList=new sie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#t=!1;#n=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#n||(this.#n=!0,v6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=zye(this.cwd),a=this.sessionPicker.currentPreview(),d=tte(a,40);document.title=d&&s?`${d} \u2014 ${s}`:d||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#t)return;this.#t=!0;let s=async()=>{try{let{events:a,cursor:d,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=d;for(let W of a)this.apply(W);let T=p!==this.working;this.working=p;let D=Array.isArray(I)?I:[],B=D.join(`
|
|
2208
|
+
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent,authored:s.authored})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",d=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(d.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),d.turnCopy.setText(b.prose),d.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&d.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),d.turnView.setText(b.prose,b.user),this.#d(d,s.text),this.#p(),s.live)for(let v of s.tools)s5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let d=Zxe(a);d.some(p=>p.kind==="bulb")&&(s.body=d.map(p=>{if(p.kind==="md")return p.text;let b=new rie(p.source,`inline-${this.#t++}`);return this.inlineBulbs.push(b),b}))}#p(){let s=this.inlineBulbs.map(p=>p.name),a=HSt(s),d=qSt(s);this.#n=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(d[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#m(s){rEe(this.expandedInlineBulbs,s),this.#p(),this.update()}applyToolResult(s){let a=this.#w(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#b(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#b(s){let a=[];for(let d of s)if(d.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,d.text):a.push({id:++this.#e,role:"user",text:d.text,thinking:"",tools:[]})}else if(d.type==="assistant")a.push({id:++this.#e,role:"assistant",text:d.text,thinking:d.thinking,tools:d.tools.map(p=>({...p,isError:!1}))});else if(d.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===d.id);p&&(p.result=d.content,p.isError=d.isError,p.digest=d.digest)}return a}#w(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=IF(s,50))}view(){return Zt({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():Zt({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let B of this.messages)B.role==="user"||s.length===0?(B.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[B]})):s[s.length-1].msgs.push(B);let d=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!d,v=s.flatMap((B,P)=>this.renderTurn(B.msgs,B.idx,b&&P===s.length-1));v.unshift(this.#v());let w=d?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(B=>B.role==="assistant")?.turnView,D=!!T&&!!this.#x(I,T,!0);return d&&v.push(this.#C(d,w)),p?v.push(this.#y(p,w,T,!D)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#A()},w,T,!D)):this.liveTurnView.reset()),v}#A(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(d=>d.result===void 0)?.name}}#v(){return Zt({class:"masthead",key:"masthead"},Wee({class:"masthead-logo light",src:e5n,alt:"typebulb"}),Wee({class:"masthead-logo dark",src:t5n,alt:"typebulb"}),Zt({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#C(s,a){return Zt({class:["bubble","user",bC(a)],key:`echo-${s.length}`},this.#g(`md-echo-${s.length}`,Vxe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,d,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=d??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,D=!s.text.trim()&&!T,B=w&&(T?`${iie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return Zt({class:["bubble","assistant","draft",bC(a)],key:b},p?v.view(!0):null,I?Gye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Qye(D?cr({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#S(s.thinking)):null,s.text.trim()?this.#I(b,s.text):null,B?Zt({class:"draft-wait shimmer-text shimmer-slow"},B):null)}#I(s,a){let d=Zxe(a);return d.some(p=>p.kind==="bulb")?d.map((p,b)=>p.kind==="md"?p.text.trim()?this.#g(`${s}-md-${b}`,tD(p.text)):null:this.#T(p.source,b)):this.#g(s,tD(a))}#k(s,a){return{onScroll:d=>{let p=d.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:IF(p,50)})},onMounted:d=>{a?.(d);let p=this.#i.get(s);d.scrollTop=p&&!p.stuck?p.top:d.scrollHeight}}}#S(s){return i6({key:`think-${s.length}`,...this.#k(-1)},s)}#T(s,a){let d=CH(s),p=s.split(`
|
|
2209
|
+
`).length;return Zt({class:"md",key:`draft-bulb-${a}`},Zt({class:"embed bulb-streaming"},Zt({class:"bulb-streaming-head"},cr("\u{1F4A1} "),cr({class:"shimmer-text shimmer-slow"},`${d?`${d} \u2014 `:""}writing\u2026`),cr({class:"bulb-streaming-count"},`${p} lines`)),Zt({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#k(a,b=>{b.innerHTML=eD.render(IH(s))})})))}renderTurn(s,a,d){let p=s.filter(D=>D.role==="user"||D.text||D.body),b=p.find(D=>D.role==="assistant"&&(!!D.text||!!D.body)),v=[...p].reverse().find(D=>D.role==="assistant"&&(!!D.text||!!D.body)),w=[...s].reverse().find(D=>D.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#x(s,I,d);return I.raw(d)?this.#M(s,a,T,I,d):I.summary?this.#B(a,p,b,I,d):this.#D(s,a,p,T,v,I,d)}#x(s,a,d){return a.raw(d)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(d=>d.role==="fork"?this.forkStub(d,a):this.bubble(d,a))}#M(s,a,d,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===d?p:void 0,b):this.bubble(v,a,void 0,!0,v===d?p:void 0,!0,b))}#D(s,a,d,p,b,v,w){let I=d.map(T=>{let D=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,D??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(d[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,d,p,b){return a.flatMap(v=>v.role==="assistant"?v===d?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,d){return Zt({class:["bubble","assistant",bC(a)],key:`no-prose-${a}`},d.view(!1),Zt({class:"no-prose"},a5n(s)))}#N(s,a,d,p,b,v,w){let I=d.has(p);return Zt({class:["bubble","assistant",bC(a)],key:s},v??null,Zt({class:"turn-summary",onClick:()=>{rEe(d,p),this.update()}},nEe(I),cr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,d,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?Zt({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[i5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,d?.view(p),v)}bubble(s,a,d=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return Zt({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?bC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?Gye({class:"thinking"},Qye("thinking"),i6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#E(d))}#R(s){let a=this.parent.children.find(d=>d.id===s);return Zt({class:"agent-head"},cr({class:"glyph-img"},"\u{1F916}"),cr({class:"agent-kind"},a?.kind??"agent"),a?D7({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:d=>{d.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):cr({class:"agent-name"},s.slice(0,8)))}#E(s){return s?Zt({class:"bubble-controls"},s.view()):null}#O(s,a,d,p){return Zt({class:["bubble","assistant",bC(a)],key:`summary-${s.id}`},p.view(!1),this.#g(`md-summary-${s.id}-${d.length}`,tD(d)),this.#E(p.copy))}#P(s){let d=[...s.text.matchAll(Zvn)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return d.length?Zt({class:"paste-thumbs"},d.map(p=>Wee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let d=await tb.server.composerPasteRead(s);this.#c.set(s,d?.ok?`data:${d.mime};base64,${d.base64}`:"failed"),d?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((d,p)=>typeof d=="string"?d.trim()?[this.#g(`md-${s.id}-${p}`,tD(d))]:[]:this.#$(d));if(!s.text)return null;let a=s.role==="user"&&!s.agent&&!s.authored;return this.#g(`md-${s.id}`,a?Vxe(s):tD(s.text))}#$(s){if(!this.#n.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),d=Zt({class:"md",key:`fold-${s.key}`},Zt({class:"bulb-fold",onClick:()=>this.#m(s.key)},nEe(a),cr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),cr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[d,s.view()]:[d]}#g(s,a){return Zt({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),d=o5n(s.input),p=zSt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=d?k6t(d,this.parent.cwd):r5n(n5n(s.input)),w=b?()=>this.parent.openChild(b.id):d?()=>{tb.server.openFile(d)}:void 0;return Zt({class:["tool",s.isError?"err":""]},Zt({class:"tool-head"},Zt({class:"tool-label"},cr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},iie(s.name)),v?w?D7({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:d,onClick:I=>{I.preventDefault(),w()}},v):cr({class:"tool-sum"},v):null),s.result===void 0?cr({class:"tool-run"},"\u2026"):null),s.result!==void 0?Zt({class:["tool-digest",a?"open":""],onClick:()=>{rEe(this.openTools,s.id),this.update()}},nEe(a),(p?u5n(p):s.digest)||"(no output)"):null,a?Zt({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||USt(s).length&&s.result.trim()===s.digest))?i6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=zSt(s);if(a)return Zt({class:"todo-list"},a.map(b=>Zt({class:["todo",b.status??""]},cr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),cr({class:"todo-text"},b.content??""))));let d=USt(s);if(d.length)return Zt({class:"tool-in"},d.map(JSt));let p=c5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?Zt({class:"tool-in"},b.map(([v,w])=>Zt({class:"tool-field"},cr({class:"tool-key"},`${v}:`),typeof w=="string"&&KSt(w)?JSt(w):i6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return Zt({class:"diff"},...p.flatMap((b,v)=>[p.length>1?Zt({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?i6({class:"diff-old"},String(b.old)):null,b.new?i6({class:"diff-new"},String(b.new)):null]))}};var oie=class extends Wu{ready=!1;cwd="";sessionId=null;sessionPicker=new Xre;tokenPill=new Vre;bulbsPill=new Zre;diffPill=new tie;childrenPill=new nie;messageList=new sie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#t=!1;#n=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#n||(this.#n=!0,v6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=zye(this.cwd),a=this.sessionPicker.currentPreview(),d=tte(a,40);document.title=d&&s?`${d} \u2014 ${s}`:d||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#t)return;this.#t=!0;let s=async()=>{try{let{events:a,cursor:d,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=d;for(let W of a)this.apply(W);let T=p!==this.working;this.working=p;let D=Array.isArray(I)?I:[],B=D.join(`
|
|
2210
2210
|
`)!==this.busy.join(`
|
|
2211
2211
|
`);this.busy=D;let P=b!==this.latestModel;this.latestModel=b??null;let F=this.childrenPill.syncFromPoll(v??null),U=this.composer&&w?this.composer.syncFromPoll(w):!1;(a.length||T||P||F||U||B)&&this.update(),(a.length||U)&&this.messageList.scrollSoon(),this.#o?.()}catch(a){console.error("[mirror] poll failed",a)}setTimeout(s,600)};s()}apply(s){switch(s.type){case"cleared":this.messageList.clear(),this.tokens={in:0,out:0,cached:0,cacheCreate:0},this.cost=0;break;case"session":s.sessionId!==this.sessionId&&this.childrenPill.reset(),this.sessionId=s.sessionId,s.sessionId&&!this.sessionPicker.currentRow()?this.refreshSessions():this.updateTitle();break;case"user":this.messageList.applyUser(s);break;case"assistant":this.messageList.applyAssistant(s);break;case"tool_result":this.messageList.applyToolResult(s);break;case"fork":this.messageList.applyFork(s);break;case"usage":this.tokens={in:s.in,out:s.out,cached:s.cached,cacheCreate:s.cacheCreate},this.cost+=s.cost??0;break}}view(){return Zt({class:"app"},Zt({class:"chat"},this.diffPill.viewing?this.diffPill.docView():this.messageList.view(),this.#c(),...this.#s.map(s=>s()),this.statusbar()),this.composer?.enabled?this.composer.view():null)}#c(){let s=this.#i;return!this.ready||this.sessionId!==null||!s?null:Zt({class:"cwd-hint"},Zt({class:"cwd-hint-head"},`No sessions for ${this.cwd}`),Zt(`${s.count} session${s.count===1?"":"s"} exist for `,cr({class:"cwd-hint-dir"},s.dir)," \u2014 this mirror was likely launched from a subfolder. Relaunch it from the project root."))}statusbar(){return Zt({class:"statusbar"},Zt({class:["statusbar-actions",this.diffPill.viewing?"doc-open":""]},this.diffPill.view(),...this.pills.map(s=>s.view()),this.tokenPill.view(),this.childrenPill.view(),this.sessionPicker.view(),this.bulbsPill.view()))}};var cie=class extends Wu{get parent(){return this.ctx.parent}view(){let s=this.parent.latestModel;return s?cr({class:"model-wrap"},cr({class:"token","data-tip":`Model: ${s}`},s)):cr({class:"model-wrap"})}};document.title="Codex Mirror";new h6t({root:new oie({title:"Codex Mirror",pills:[new cie]}),id:"app"});
|
|
2212
2212
|
/*! Bundled license information:
|
package/dist/agents/pi/client.js
CHANGED
|
@@ -2205,8 +2205,8 @@ ${a||this.currentRow()?.pending?"New conversation \u2014 not saved yet":`Session
|
|
|
2205
2205
|
|
|
2206
2206
|
`),user:""}}stickToBottomNextRender(){this.#r=!0}#a(s,a){s.segments=[...s.segments??[s.text],a],s.text=s.segments.join(`
|
|
2207
2207
|
|
|
2208
|
-
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",h=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(h.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),h.turnCopy.setText(b.prose),h.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&h.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),h.turnView.setText(b.prose,b.user),this.#d(h,s.text),this.#b(),s.live)for(let v of s.tools)b5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let h=iEe(a);h.some(p=>p.kind==="bulb")&&(s.body=h.map(p=>{if(p.kind==="md")return p.text;let b=new oie(p.source,`inline-${this.#n++}`);return this.inlineBulbs.push(b),b}))}#b(){let s=this.inlineBulbs.map(p=>p.name),a=KSt(s),h=WSt(s);this.#t=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(h[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#A(s){uEe(this.expandedInlineBulbs,s),this.#b(),this.update()}applyToolResult(s){let a=this.#p(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#g(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#g(s){let a=[];for(let h of s)if(h.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,h.text):a.push({id:++this.#e,role:"user",text:h.text,thinking:"",tools:[]})}else if(h.type==="assistant")a.push({id:++this.#e,role:"assistant",text:h.text,thinking:h.thinking,tools:h.tools.map(p=>({...p,isError:!1}))});else if(h.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===h.id);p&&(p.result=h.content,p.isError=h.isError,p.digest=h.digest)}return a}#p(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=DF(s,50))}view(){return $t({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():$t({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let D of this.messages)D.role==="user"||s.length===0?(D.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[D]})):s[s.length-1].msgs.push(D);let h=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!h,v=s.flatMap((D,P)=>this.renderTurn(D.msgs,D.idx,b&&P===s.length-1));v.unshift(this.#m());let w=h?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(D=>D.role==="assistant")?.turnView,B=!!T&&!!this.#S(I,T,!0);return h&&v.push(this.#k(h,w)),p?v.push(this.#y(p,w,T,!B)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#v()},w,T,!B)):this.liveTurnView.reset()),v}#v(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(h=>h.result===void 0)?.name}}#m(){return $t({class:"masthead",key:"masthead"},Zee({class:"masthead-logo light",src:f5n,alt:"typebulb"}),Zee({class:"masthead-logo dark",src:h5n,alt:"typebulb"}),$t({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#k(s,a){return $t({class:["bubble","user",mC(a)],key:`echo-${s.length}`},this.#w(`md-echo-${s.length}`,rEe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,h,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=h??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,B=!s.text.trim()&&!T,D=w&&(T?`${cie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return $t({class:["bubble","assistant","draft",mC(a)],key:b},p?v.view(!0):null,I?zye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Kye(B?nr({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#C(s.thinking)):null,s.text.trim()?this.#x(b,s.text):null,D?$t({class:"draft-wait shimmer-text shimmer-slow"},D):null)}#x(s,a){let h=iEe(a);return h.some(p=>p.kind==="bulb")?h.map((p,b)=>p.kind==="md"?p.text.trim()?this.#w(`${s}-md-${b}`,sD(p.text)):null:this.#I(p.source,b)):this.#w(s,sD(a))}#E(s,a){return{onScroll:h=>{let p=h.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:DF(p,50)})},onMounted:h=>{a?.(h);let p=this.#i.get(s);h.scrollTop=p&&!p.stuck?p.top:h.scrollHeight}}}#C(s){return s6({key:`think-${s.length}`,...this.#E(-1)},s)}#I(s,a){let h=_H(s),p=s.split(`
|
|
2209
|
-
`).length;return $t({class:"md",key:`draft-bulb-${a}`},$t({class:"embed bulb-streaming"},$t({class:"bulb-streaming-head"},nr("\u{1F4A1} "),nr({class:"shimmer-text shimmer-slow"},`${h?`${h} \u2014 `:""}writing\u2026`),nr({class:"bulb-streaming-count"},`${p} lines`)),$t({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#E(a,b=>{b.innerHTML=iD.render(MH(s))})})))}renderTurn(s,a,h){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#S(s,I,h);return I.raw(h)?this.#M(s,a,T,I,h):I.summary?this.#B(a,p,b,I,h):this.#D(s,a,p,T,v,I,h)}#S(s,a,h){return a.raw(h)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(h=>h.role==="fork"?this.forkStub(h,a):this.bubble(h,a))}#M(s,a,h,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===h?p:void 0,b):this.bubble(v,a,void 0,!0,v===h?p:void 0,!0,b))}#D(s,a,h,p,b,v,w){let I=h.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(h[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,h,p,b){return a.flatMap(v=>v.role==="assistant"?v===h?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,h){return $t({class:["bubble","assistant",mC(a)],key:`no-prose-${a}`},h.view(!1),$t({class:"no-prose"},v5n(s)))}#N(s,a,h,p,b,v,w){let I=h.has(p);return $t({class:["bubble","assistant",mC(a)],key:s},v??null,$t({class:"turn-summary",onClick:()=>{uEe(h,p),this.update()}},cEe(I),nr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,h,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?$t({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[g5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,h?.view(p),v)}bubble(s,a,h=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return $t({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?mC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?zye({class:"thinking"},Kye("thinking"),s6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#T(h))}#R(s){let a=this.parent.children.find(h=>h.id===s);return $t({class:"agent-head"},nr({class:"glyph-img"},"\u{1F916}"),nr({class:"agent-kind"},a?.kind??"agent"),a?Bk({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:h=>{h.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):nr({class:"agent-name"},s.slice(0,8)))}#T(s){return s?$t({class:"bubble-controls"},s.view()):null}#O(s,a,h,p){return $t({class:["bubble","assistant",mC(a)],key:`summary-${s.id}`},p.view(!1),this.#w(`md-summary-${s.id}-${h.length}`,sD(h)),this.#T(p.copy))}#P(s){let h=[...s.text.matchAll(l5n)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return h.length?$t({class:"paste-thumbs"},h.map(p=>Zee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let h=await tb.server.composerPasteRead(s);this.#c.set(s,h?.ok?`data:${h.mime};base64,${h.base64}`:"failed"),h?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((h,p)=>typeof h=="string"?h.trim()?[this.#w(`md-${s.id}-${p}`,sD(h))]:[]:this.#$(h));if(!s.text)return null;let a=s.role==="user"&&!s.agent;return this.#w(`md-${s.id}`,a?rEe(s):sD(s.text))}#$(s){if(!this.#t.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),h=$t({class:"md",key:`fold-${s.key}`},$t({class:"bulb-fold",onClick:()=>this.#A(s.key)},cEe(a),nr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),nr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[h,s.view()]:[h]}#w(s,a){return $t({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),h=m5n(s.input),p=eTt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=h?_6t(h,this.parent.cwd):p5n(d5n(s.input)),w=b?()=>this.parent.openChild(b.id):h?()=>{tb.server.openFile(h)}:void 0;return $t({class:["tool",s.isError?"err":""]},$t({class:"tool-head"},$t({class:"tool-label"},nr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},cie(s.name)),v?w?Bk({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:h,onClick:I=>{I.preventDefault(),w()}},v):nr({class:"tool-sum"},v):null),s.result===void 0?nr({class:"tool-run"},"\u2026"):null),s.result!==void 0?$t({class:["tool-digest",a?"open":""],onClick:()=>{uEe(this.openTools,s.id),this.update()}},cEe(a),(p?A5n(p):s.digest)||"(no output)"):null,a?$t({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||ZSt(s).length&&s.result.trim()===s.digest))?s6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=eTt(s);if(a)return $t({class:"todo-list"},a.map(b=>$t({class:["todo",b.status??""]},nr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),nr({class:"todo-text"},b.content??""))));let h=ZSt(s);if(h.length)return $t({class:"tool-in"},h.map(VSt));let p=w5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?$t({class:"tool-in"},b.map(([v,w])=>$t({class:"tool-field"},nr({class:"tool-key"},`${v}:`),typeof w=="string"&&tTt(w)?VSt(w):s6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return $t({class:"diff"},...p.flatMap((b,v)=>[p.length>1?$t({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?s6({class:"diff-old"},String(b.old)):null,b.new?s6({class:"diff-new"},String(b.new)):null]))}};var aie=class extends wu{ready=!1;cwd="";sessionId=null;sessionPicker=new eie;tokenPill=new tie;bulbsPill=new nie;diffPill=new iie;childrenPill=new sie;messageList=new uie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#n=!1;#t=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#t||(this.#t=!0,S6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Vye(this.cwd),a=this.sessionPicker.currentPreview(),h=hM(a,40);document.title=h&&s?`${h} \u2014 ${s}`:h||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#n)return;this.#n=!0;let s=async()=>{try{let{events:a,cursor:h,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=h;for(let K of a)this.apply(K);let T=p!==this.working;this.working=p;let B=Array.isArray(I)?I:[],D=B.join(`
|
|
2208
|
+
`)}applyUser(s){let a=this.messages[this.messages.length-1];if(a&&a.role==="user"&&!s.agent&&!a.agent){this.#a(a,s.text),a.copy?a.copy.setText(a.text):a.text&&(a.copy=this.#u(a.text));return}this.#l({id:++this.#e,role:"user",text:s.text,thinking:"",tools:[],agent:s.agent,authored:s.authored})}applyAssistant(s){let a=this.messages[this.messages.length-1]?.role!=="assistant",h=this.#l({id:++this.#e,role:"assistant",text:s.text,thinking:s.thinking,tools:s.tools.map(v=>({...v,isError:!1}))}),p=this.messages[this.messages.length-2],b=this.#h();if(h.turnCopy=p?.role==="assistant"&&p.turnCopy||this.#u(""),h.turnCopy.setText(b.prose),h.turnView=p?.role==="assistant"&&p.turnView||this.#f(),a&&h.turnView.adoptLiveOverride(this.liveTurnView.takeOverride()),h.turnView.setText(b.prose,b.user),this.#d(h,s.text),this.#b(),s.live)for(let v of s.tools)b5n.has(v.name)&&this.openTools.add(v.id)}#d(s,a){let h=iEe(a);h.some(p=>p.kind==="bulb")&&(s.body=h.map(p=>{if(p.kind==="md")return p.text;let b=new oie(p.source,`inline-${this.#n++}`);return this.inlineBulbs.push(b),b}))}#b(){let s=this.inlineBulbs.map(p=>p.name),a=KSt(s),h=WSt(s);this.#t=new Set(this.inlineBulbs.filter((p,b)=>a[b])),this.inlineBulbs.forEach((p,b)=>{p.setChainPosition(h[b]),p.setMounted(!a[b]||this.expandedInlineBulbs.has(p.key))})}#A(s){uEe(this.expandedInlineBulbs,s),this.#b(),this.update()}applyToolResult(s){let a=this.#p(s.id);a&&(a.result=s.content,a.isError=s.isError,a.digest=s.digest)}applyFork(s){let a=this.#g(s.events);this.#l({id:++this.#e,role:"fork",text:"",thinking:"",tools:[],fork:{count:s.count,sub:a}})}#g(s){let a=[];for(let h of s)if(h.type==="user"){let p=a[a.length-1];p&&p.role==="user"?this.#a(p,h.text):a.push({id:++this.#e,role:"user",text:h.text,thinking:"",tools:[]})}else if(h.type==="assistant")a.push({id:++this.#e,role:"assistant",text:h.text,thinking:h.thinking,tools:h.tools.map(p=>({...p,isError:!1}))});else if(h.type==="tool_result"){let p=a.flatMap(b=>b.tools).find(b=>b.id===h.id);p&&(p.result=h.content,p.isError=h.isError,p.digest=h.digest)}return a}#p(s){return this.messages.flatMap(a=>a.tools).find(a=>a.id===s)}scrollSoon(){requestAnimationFrame(()=>{this.scrollEl&&this.#r&&(this.scrollEl.scrollTop=this.scrollEl.scrollHeight)})}onScroll(){let s=this.scrollEl;s&&(this.#r=DF(s,50))}view(){return $t({class:"messages",onScroll:()=>this.onScroll(),onMounted:s=>{this.scrollEl=s}},this.parent.ready?this.renderMessages():$t({class:"note"},"Connecting\u2026"))}renderMessages(){let s=[],a=-1;for(let D of this.messages)D.role==="user"||s.length===0?(D.role==="user"&&a++,s.push({idx:Math.max(0,a),msgs:[D]})):s[s.length-1].msgs.push(D);let h=this.parent.echo,p=this.parent.draft,b=this.parent.working&&!h,v=s.flatMap((D,P)=>this.renderTurn(D.msgs,D.idx,b&&P===s.length-1));v.unshift(this.#m());let w=h?a+1:Math.max(0,a),I=b?s[s.length-1]?.msgs??[]:[],T=[...I].reverse().find(D=>D.role==="assistant")?.turnView,B=!!T&&!!this.#S(I,T,!0);return h&&v.push(this.#k(h,w)),p?v.push(this.#y(p,w,T,!B)):(this.#i.clear(),this.#o=void 0,this.parent.working?v.push(this.#y({text:"",thinking:"",tool:this.#v()},w,T,!B)):this.liveTurnView.reset()),v}#v(){for(let s=this.messages.length-1;s>=0;s--){let a=this.messages[s];if(a.role==="assistant")return a.tools.find(h=>h.result===void 0)?.name}}#m(){return $t({class:"masthead",key:"masthead"},Zee({class:"masthead-logo light",src:f5n,alt:"typebulb"}),Zee({class:"masthead-logo dark",src:h5n,alt:"typebulb"}),$t({class:"masthead-tagline"},"run and publish bulbs \u{1F4A1} your agent\u2019s session live here, bulbs rendered inline"))}#k(s,a){return $t({class:["bubble","user",mC(a)],key:`echo-${s.length}`},this.#w(`md-echo-${s.length}`,rEe({id:-1,role:"user",text:s,thinking:"",tools:[]})))}#y(s,a,h,p=!0){let b=`draft-${s.text.length}-${s.thinking.length}`;s.text.length<this.#s&&this.#i.clear(),this.#s=s.text.length;let v=h??this.liveTurnView,w=v.raw(!0),I=w&&!!s.thinking,T=w?s.tool:void 0,B=!s.text.trim()&&!T,D=w&&(T?`${cie(T)}\u2026`:s.text.trim()||I?null:"working\u2026");return $t({class:["bubble","assistant","draft",mC(a)],key:b},p?v.view(!0):null,I?zye({class:"thinking",open:this.#o??!0,onToggle:P=>{this.#o=P.currentTarget.open}},Kye(B?nr({class:"shimmer-text shimmer-slow"},"thinking\u2026"):"thinking"),this.#C(s.thinking)):null,s.text.trim()?this.#x(b,s.text):null,D?$t({class:"draft-wait shimmer-text shimmer-slow"},D):null)}#x(s,a){let h=iEe(a);return h.some(p=>p.kind==="bulb")?h.map((p,b)=>p.kind==="md"?p.text.trim()?this.#w(`${s}-md-${b}`,sD(p.text)):null:this.#I(p.source,b)):this.#w(s,sD(a))}#E(s,a){return{onScroll:h=>{let p=h.currentTarget;this.#i.set(s,{top:p.scrollTop,stuck:DF(p,50)})},onMounted:h=>{a?.(h);let p=this.#i.get(s);h.scrollTop=p&&!p.stuck?p.top:h.scrollHeight}}}#C(s){return s6({key:`think-${s.length}`,...this.#E(-1)},s)}#I(s,a){let h=_H(s),p=s.split(`
|
|
2209
|
+
`).length;return $t({class:"md",key:`draft-bulb-${a}`},$t({class:"embed bulb-streaming"},$t({class:"bulb-streaming-head"},nr("\u{1F4A1} "),nr({class:"shimmer-text shimmer-slow"},`${h?`${h} \u2014 `:""}writing\u2026`),nr({class:"bulb-streaming-count"},`${p} lines`)),$t({class:["bulb-code","md"],key:`bulb-code-${s.length}`,...this.#E(a,b=>{b.innerHTML=iD.render(MH(s))})})))}renderTurn(s,a,h){let p=s.filter(B=>B.role==="user"||B.text||B.body),b=p.find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),v=[...p].reverse().find(B=>B.role==="assistant"&&(!!B.text||!!B.body)),w=[...s].reverse().find(B=>B.role==="assistant"),I=(v??w)?.turnView;if(!I)return this.#_(s,a);let T=this.#S(s,I,h);return I.raw(h)?this.#M(s,a,T,I,h):I.summary?this.#B(a,p,b,I,h):this.#D(s,a,p,T,v,I,h)}#S(s,a,h){return a.raw(h)?s.find(p=>p.role!=="user"):s.find(p=>p.role==="assistant"&&(!!p.text||!!p.body))}#_(s,a){return s.map(h=>h.role==="fork"?this.forkStub(h,a):this.bubble(h,a))}#M(s,a,h,p,b){return s.map(v=>v.role==="fork"?this.forkStub(v,a,v===h?p:void 0,b):this.bubble(v,a,void 0,!0,v===h?p:void 0,!0,b))}#D(s,a,h,p,b,v,w){let I=h.map(T=>{let B=T.role==="user"?T.copy:T===b?T.turnCopy:void 0;return this.bubble(T,a,B??null,!0,T===p?v:void 0,!1,w)});return p||w||I.splice(h[0]?.role==="user"?1:0,0,this.#L(s,a,v)),I}#B(s,a,h,p,b){return a.flatMap(v=>v.role==="assistant"?v===h?[this.#O(v,s,p.summary,p)]:[]:[this.bubble(v,s,v.copy??null,!0,void 0,!1,b)])}#L(s,a,h){return $t({class:["bubble","assistant",mC(a)],key:`no-prose-${a}`},h.view(!1),$t({class:"no-prose"},v5n(s)))}#N(s,a,h,p,b,v,w){let I=h.has(p);return $t({class:["bubble","assistant",mC(a)],key:s},v??null,$t({class:"turn-summary",onClick:()=>{uEe(h,p),this.update()}},cEe(I),nr({class:"turn-summary-text"},b)),w??null)}forkStub(s,a,h,p=!1){let b=s.fork,v=this.expandedForks.has(s.id)?$t({class:"fork-body"},b.sub.map(I=>this.bubble(I,a,void 0,!1))):void 0,w=[g5n(),` ${b.count} message${b.count===1?"":"s"} on an abandoned branch`];return this.#N(`fork-${s.id}`,a,this.expandedForks,s.id,w,h?.view(p),v)}bubble(s,a,h=s.copy,p=!0,b,v=!0,w=!1){let I=s.role==="assistant"&&!s.text&&!s.thinking&&s.tools.length>0;return $t({class:["bubble",s.role,s.agent?"agent":"",I?"tools-only":"",p?mC(a):""],key:s.id},b?b.view(w):null,s.agent?this.#R(s.agent.from):null,v&&s.thinking?zye({class:"thinking"},Kye("thinking"),s6(s.thinking)):null,this.#F(s),s.role==="user"?this.#P(s):null,v?s.tools.map(T=>this.tool(T)):null,this.#T(h))}#R(s){let a=this.parent.children.find(h=>h.id===s);return $t({class:"agent-head"},nr({class:"glyph-img"},"\u{1F916}"),nr({class:"agent-kind"},a?.kind??"agent"),a?Bk({class:"agent-name",title:`Open this ${a.kind?`${a.kind} `:""}agent's transcript`,onClick:h=>{h.preventDefault(),this.parent.openChild(a.id)}},a.label||a.kind||"agent"):nr({class:"agent-name"},s.slice(0,8)))}#T(s){return s?$t({class:"bubble-controls"},s.view()):null}#O(s,a,h,p){return $t({class:["bubble","assistant",mC(a)],key:`summary-${s.id}`},p.view(!1),this.#w(`md-summary-${s.id}-${h.length}`,sD(h)),this.#T(p.copy))}#P(s){let h=[...s.text.matchAll(l5n)].map(p=>p[1]).map(p=>this.#j(p)).filter(p=>!!p);return h.length?$t({class:"paste-thumbs"},h.map(p=>Zee({class:"paste-thumb",src:p,alt:"pasted image"}))):null}#j(s){let a=this.#c.get(s);if(!(a==="pending"||a==="failed")){if(a)return a;this.#c.set(s,"pending"),(async()=>{try{let h=await tb.server.composerPasteRead(s);this.#c.set(s,h?.ok?`data:${h.mime};base64,${h.base64}`:"failed"),h?.ok&&(this.update(),this.scrollSoon())}catch{this.#c.set(s,"failed")}})()}}#F(s){if(s.body)return s.body.flatMap((h,p)=>typeof h=="string"?h.trim()?[this.#w(`md-${s.id}-${p}`,sD(h))]:[]:this.#$(h));if(!s.text)return null;let a=s.role==="user"&&!s.agent&&!s.authored;return this.#w(`md-${s.id}`,a?rEe(s):sD(s.text))}#$(s){if(!this.#t.has(s))return[s.view()];let a=this.expandedInlineBulbs.has(s.key),h=$t({class:"md",key:`fold-${s.key}`},$t({class:"bulb-fold",onClick:()=>this.#A(s.key)},cEe(a),nr({class:"bulb-fold-text"},`${s.name??"bulb"} \u2014 Version ${s.chainPosition}`),nr({class:"bulb-fold-app"},"\u{1F4A1}")));return a?[h,s.view()]:[h]}#w(s,a){return $t({class:"md",key:s,onMounted:a})}tool(s){let a=this.openTools.has(s.id),h=m5n(s.input),p=eTt(s),b=this.parent.children.find(I=>I.spawnId===s.id),v=h?_6t(h,this.parent.cwd):p5n(d5n(s.input)),w=b?()=>this.parent.openChild(b.id):h?()=>{tb.server.openFile(h)}:void 0;return $t({class:["tool",s.isError?"err":""]},$t({class:"tool-head"},$t({class:"tool-label"},nr({class:"tool-name",...s.name.startsWith("mcp__")?{title:s.name}:{}},cie(s.name)),v?w?Bk({class:"tool-sum link",title:b?`Open this ${b.kind?`${b.kind} `:""}agent's transcript`:h,onClick:I=>{I.preventDefault(),w()}},v):nr({class:"tool-sum"},v):null),s.result===void 0?nr({class:"tool-run"},"\u2026"):null),s.result!==void 0?$t({class:["tool-digest",a?"open":""],onClick:()=>{uEe(this.openTools,s.id),this.update()}},cEe(a),(p?A5n(p):s.digest)||"(no output)"):null,a?$t({class:"tool-card"},this.toolBody(s),s.result!==void 0&&(s.isError||!(p||ZSt(s).length&&s.result.trim()===s.digest))?s6({class:"tool-out"},s.result.slice(0,4e3)):null):null)}toolBody(s){let a=eTt(s);if(a)return $t({class:"todo-list"},a.map(b=>$t({class:["todo",b.status??""]},nr({class:"todo-icon"},b.status==="completed"?"\u2714":b.status==="in_progress"?"\u25FC":"\u25FB"),nr({class:"todo-text"},b.content??""))));let h=ZSt(s);if(h.length)return $t({class:"tool-in"},h.map(VSt));let p=w5n(s);if(!p){let b=Object.entries(s.input??{});return b.length?$t({class:"tool-in"},b.map(([v,w])=>$t({class:"tool-field"},nr({class:"tool-key"},`${v}:`),typeof w=="string"&&tTt(w)?VSt(w):s6({class:"tool-val"},typeof w=="string"?w:JSON.stringify(w,null,2))))):null}return $t({class:"diff"},...p.flatMap((b,v)=>[p.length>1?$t({class:"diff-step"},`edit ${v+1}/${p.length}`):null,b.old?s6({class:"diff-old"},String(b.old)):null,b.new?s6({class:"diff-new"},String(b.new)):null]))}};var aie=class extends wu{ready=!1;cwd="";sessionId=null;sessionPicker=new eie;tokenPill=new tie;bulbsPill=new nie;diffPill=new iie;childrenPill=new sie;messageList=new uie;tokens={in:0,out:0,cached:0,cacheCreate:0};cost=0;stats=null;working=!1;latestModel=null;driverModel=null;busy=[];ownPid=0;pills;composer;draft=null;echo=null;#e=0;#n=!1;#t=!1;#r;#i=null;#s;#o;constructor(s){super(),this.pills=s.pills,this.composer=s.composer,this.#r=s.title,this.#s=s.overlays??[],this.#o=s.onPollTick}onAttached(){this.#t||(this.#t=!0,S6t(),document.addEventListener("keydown",s=>{s.key!=="Escape"||!this.childrenPill.viewing||this.childrenPill.open||this.childrenPill.closeChild()}),this.init())}closePopups(s){this.sessionPicker!==s&&this.sessionPicker.close(),this.bulbsPill!==s&&this.bulbsPill.close(),this.diffPill!==s&&this.diffPill.close(),this.childrenPill!==s&&this.childrenPill.close();for(let a of this.pills)a!==s&&a.close?.()}get children(){return this.childrenPill.children}openChild(s){this.childrenPill.openChild(s)}async init(){let s=await tb.server.info();this.cwd=s.cwd,this.ownPid=s.pid??0,this.#i=s.elsewhere??null,this.composer&&(this.composer.enabled=!!s.composer),this.childrenPill.enabled=!!s.children,this.childrenPill.refresh(),this.ready=!0,document.getElementById("boot")?.remove(),this.updateTitle(),this.update(),this.pump()}updateTitle(){let s=Vye(this.cwd),a=this.sessionPicker.currentPreview(),h=hM(a,40);document.title=h&&s?`${h} \u2014 ${s}`:h||(s?`${this.#r} \u2014 ${s}`:this.#r)}refreshSessions(){this.sessionPicker.loadSessions().then(()=>this.update()).catch(()=>{})}pump(){if(this.#n)return;this.#n=!0;let s=async()=>{try{let{events:a,cursor:h,working:p,latestModel:b,child:v,composer:w,busy:I}=await tb.server.poll(this.#e);this.#e=h;for(let K of a)this.apply(K);let T=p!==this.working;this.working=p;let B=Array.isArray(I)?I:[],D=B.join(`
|
|
2210
2210
|
`)!==this.busy.join(`
|
|
2211
2211
|
`);this.busy=B;let P=b!==this.latestModel;this.latestModel=b??null;let j=this.childrenPill.syncFromPoll(v??null),U=this.composer&&w?this.composer.syncFromPoll(w):!1;(a.length||T||P||j||U||D)&&this.update(),(a.length||U)&&this.messageList.scrollSoon(),this.#o?.()}catch(a){console.error("[mirror] poll failed",a)}setTimeout(s,600)};s()}apply(s){switch(s.type){case"cleared":this.messageList.clear(),this.tokens={in:0,out:0,cached:0,cacheCreate:0},this.cost=0;break;case"session":s.sessionId!==this.sessionId&&this.childrenPill.reset(),this.sessionId=s.sessionId,s.sessionId&&!this.sessionPicker.currentRow()?this.refreshSessions():this.updateTitle();break;case"user":this.messageList.applyUser(s);break;case"assistant":this.messageList.applyAssistant(s);break;case"tool_result":this.messageList.applyToolResult(s);break;case"fork":this.messageList.applyFork(s);break;case"usage":this.tokens={in:s.in,out:s.out,cached:s.cached,cacheCreate:s.cacheCreate},this.cost+=s.cost??0;break}}view(){return $t({class:"app"},$t({class:"chat"},this.diffPill.viewing?this.diffPill.docView():this.messageList.view(),this.#c(),...this.#s.map(s=>s()),this.statusbar()),this.composer?.enabled?this.composer.view():null)}#c(){let s=this.#i;return!this.ready||this.sessionId!==null||!s?null:$t({class:"cwd-hint"},$t({class:"cwd-hint-head"},`No sessions for ${this.cwd}`),$t(`${s.count} session${s.count===1?"":"s"} exist for `,nr({class:"cwd-hint-dir"},s.dir)," \u2014 this mirror was likely launched from a subfolder. Relaunch it from the project root."))}statusbar(){return $t({class:"statusbar"},$t({class:["statusbar-actions",this.diffPill.viewing?"doc-open":""]},this.diffPill.view(),...this.pills.map(s=>s.view()),this.tokenPill.view(),this.childrenPill.view(),this.sessionPicker.view(),this.bulbsPill.view()))}};function aEe(o,s,a){let h=o.map(p=>({item:p,rank:s(p)})).filter(p=>p.rank>=0);return h.sort((p,b)=>p.rank-b.rank),(a?h.slice(0,a):h).map(p=>p.item)}var lie=class extends wu{enabled=!1;streaming=!1;foreign=!1;driverError;sendError;input="";status=null;localNotice=null;dlg=null;dlgInput="";dlgFilter="";dlgIndex=0;queue=null;recipes;harnessCommands=[];slashQuery=null;slashIndex=0;composerHeight=90;files=[];atQuery=null;atIndex=0;atStart=0;#e=!1;#n=0;#t="";#r=null;constructor(s=[]){super(),this.recipes=s}get parent(){return this.ctx.parent}onAttached(){this.#i()}async#i(){try{let s=await tb.server.composerFiles();Array.isArray(s)&&(this.files=s,this.update())}catch{}}syncFromPoll(s){let a=s.streaming!==this.streaming||s.foreign!==this.foreign||s.error!==this.driverError;this.streaming=s.streaming,this.foreign=s.foreign,this.driverError=s.error;let h=this.parent,p=s.draft??null;(p?.text!==h.draft?.text||p?.thinking!==h.draft?.thinking||p?.tool!==h.draft?.tool)&&(h.draft=p,a=!0);let b=s.echo??null;b!==h.echo&&(h.echo=b,a=!0);let v=s.stats??null;(v?.cost!==h.stats?.cost||v?.contextTokens!==h.stats?.contextTokens||v?.contextPercent!==h.stats?.contextPercent)&&(h.stats=v,a=!0);let w=s.model??null;w!==h.driverModel&&(h.driverModel=w,a=!0),this.localNotice&&Date.now()>=this.localNotice.until&&(this.localNotice=null,a=!0),((s.status?.text??null)!==(this.status?.text??null)||s.status?.kind!==this.status?.kind)&&(this.status=s.status??null,a=!0);let I=s.queue??null;this.#s(I)!==this.#s(this.queue)&&(this.queue=I,a=!0);let T=s.dialog??null;return this.dlg&&!this.dlg.local&&(!T||T.id!==this.dlg.req.id)&&(this.dlg=null,a=!0),T&&!this.dlg&&T.id!==this.#r&&(this.#f(T),a=!0),a}#s(s){return s?JSON.stringify(s):""}async send(s=!1){let a=this.input.trim();if(!(!a||this.#e||this.foreign)){if(a.startsWith("!"))return this.runBash(a.slice(1).trim());this.atQuery=null,await this.#o("send failed \u2014 mirror unreachable",async()=>{let h=await tb.server.composerSend(a,{followUp:s});h?.ok?(this.input="",this.streaming=!0):this.sendError=h?.error??"send failed"})}}async#o(s,a){this.#e=!0,this.sendError=void 0,this.update();try{await a()}catch{this.sendError=s}finally{this.#e=!1,this.update(),this.#p()}}async stopTurn(){let s=this.queue,a=s?[...s.steering,...s.followUp]:[];try{await tb.server.composerStop()}catch{}a.length&&(this.input=a.join(`
|
|
2212
2212
|
`)+(this.input?`
|