typebulb 0.26.1 → 0.26.2
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.
|
@@ -1441,7 +1441,7 @@ ${aCt(b)}`};let v=uCt(d.code,{jsxImportSource:p.ts?.jsxImportSource});if(v.error
|
|
|
1441
1441
|
${a?"New conversation \u2014 not saved yet":`Session: ${s.sessionId}`}`;return $t({class:"sid-wrap"},uc({class:"pill",title:b,onClick:v=>{v.stopPropagation(),this.open?this.close():this.show()}},p),this.open?this.picker():null)}picker(){let s=this.rows();return $t({class:"picker"},$t({class:"picker-body"},s.length===0?this.emptyState("No sessions yet \u2014 start one in your terminal."):$t({id:"session-list",class:"picker-list",onScroll:()=>this.onListScroll()},s.map((a,d)=>this.pickerRow(a,d))),this.peekCard()),this.filterBox(this.sessions.length,"session"))}pickerRow(s,a){let d=s.sessionId===this.parent.sessionId,p=this.parent.busy.includes(s.sessionId);return $t({class:["picker-row",a===this.highlighted?"active":"",d?"current":""],onMouseEnter:()=>{this.highlighted!==a&&(this.highlighted=a,this.update())},onClick:()=>this.pick(s.sessionId)},$t({class:"picker-row-main"},Fr({class:"picker-dot"}),Fr({class:["picker-preview",p?"shimmer-text shimmer-slow":""]},s.preview||"(no preview)"),Jee(s.hitCount),Fr({class:["picker-time",this.#s(s)?"unseen":""],onMouseEnter:()=>this.#o(s),onMouseLeave:()=>this.#c(s)},zee(s.mtime))),Uee(s.snippet,this.filter.trim()))}#o(s){this.#t=`${s.sessionId}:${s.mtime}`,this.#u(s.sessionId,this.#t),this.update()}#c(s){this.#t===`${s.sessionId}:${s.mtime}`&&(this.#t=null,this.update())}async#u(s,a){if(this.#r.has(a))return;let d="";try{d=String((await tb.server.sessionPeek(s))?.text??"")}catch{}this.#r.set(a,d),this.#t===a&&this.update()}peekCard(){if(!this.#t)return null;let s=this.#r.get(this.#t);return s===void 0?$t({class:"picker-peek muted"},"\u2026"):s?$t({class:"picker-peek md",key:`peek:${this.#t}`,onMounted:a=>{a.innerHTML=ZM.render(s)}}):$t({class:"picker-peek muted"},"(no assistant text yet)")}onClosed(){super.onClosed(),this.#t=null}};var qre=class extends Ia{get parent(){return this.ctx.parent}view(){let s=this.parent.tokens,a=this.parent.stats,d=a?a.contextTokens??0:s.in+s.out+s.cached+s.cacheCreate,p=a?.cost??this.parent.cost,b=this.parent.working,v=[];if(d>0&&v.push(d6t(d)),a&&a.contextPercent!=null&&v.push(`${Math.round(a.contextPercent)}%`),p>0&&v.push(`$${p>=1?p.toFixed(2):p.toFixed(3)}`),!v.length&&!b)return Fr({class:"token-wrap"});let w=v.length?v.length===1&&d>0?`${v[0]} tokens`:v.join(" \xB7 "):"working\u2026";return Fr({class:"token-wrap"},Fr({class:["token",b?"busy shimmer shimmer-slow":""]},w))}};var mSt={"play_arrow.fill":'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M320-200v-560l440 280-440 280Z"/></svg>',"stop.fill":'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M240-240v-480h480v480H240Z"/></svg>',play_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m380-300 280-180-280-180v360ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',stop_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M320-320h320v-320H320v320ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',add_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',attach_file:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M720-330q0 104-73 177T470-80q-104 0-177-73t-73-177v-370q0-75 52.5-127.5T400-880q75 0 127.5 52.5T580-700v350q0 46-32 78t-78 32q-46 0-78-32t-32-78v-370h80v370q0 13 8.5 21.5T470-320q13 0 21.5-8.5T500-350v-350q-1-42-29.5-71T400-800q-42 0-71 29t-29 71v370q-1 71 49 120.5T470-160q70 0 119-49.5T640-330v-390h80v390Z"/></svg>'};var fvn={play:"play_arrow.fill",stop:"stop.fill",playCircle:"play_circle",stopCircle:"stop_circle",addCircle:"add_circle",attach:"attach_file"},hvn={caret:'<svg viewBox="0 0 16 16"><path d="M4 1.5 L13 8 L4 14.5 Z" fill="currentColor"/></svg>',fork:'<svg viewBox="0 0 16 16" fill="none"><path d="M4 2 V8 H12 V2 M8 8 V14" stroke="currentColor" stroke-width="1.8" stroke-linecap="square"/></svg>',diff:'<svg viewBox="4 2 8 12" fill="none"><path d="M5.25 6 H10.75 M8 3.25 V8.75" stroke="var(--diff-add)" stroke-width="1.8" stroke-linecap="round"/><path d="M5.25 12.5 H10.75" stroke="var(--err)" stroke-width="1.8" stroke-linecap="round"/></svg>'},dvn=o=>{let s=hvn[o]??mSt[fvn[o]??""]??"";return/<svg[^>]*\bfill=/.test(s)?s:s.replace("<svg ",'<svg fill="currentColor" ')},ek=(o,s="")=>Fr({class:["icon",...Array.isArray(s)?s:[s]],key:`icon-${o}`,onMounted:a=>{a.innerHTML=dvn(o)}},"");var pvn=()=>ek("play","btn-icon"),gvn=()=>ek("stop","btn-icon"),Jre=class extends v4{files=[];servers=[];keepOpenSelector=".servers-wrap";filterId="bulb-filter";listSelector=".bulb-list";filterNoun="name";launching=new Set;dismissedDenials=new Set;pendingLaunch;openLog;#e;spotlightPid;search(s){return tb.server.searchBulbs(s)}onActivate(s){let a=this.rows()[s];a&&(a.running?window.open(a.running.url,"_blank","noopener"):this.launch(a.path))}onAttached(){this.refresh(),setInterval(()=>this.refreshServers(),800),setInterval(()=>this.refreshFiles(),3e3),window.addEventListener("tb-breakout",s=>this.spotlight(s.detail?.pid))}spotlight(s){this.spotlightPid=s,this.show()}refresh(){return Promise.all([this.refreshServers(),this.refreshFiles()])}async refreshServers(){try{let s=await tb.server.listBreakouts(),a=s.length!==this.servers.length||s.some((d,p)=>d.pid!==this.servers[p]?.pid||d.denied!==this.servers[p]?.denied||d.predicted!==this.servers[p]?.predicted||d.trust!==this.servers[p]?.trust);this.servers=s,a&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] server list refresh failed",s)}}async refreshFiles(){try{let s=await tb.server.listBulbFiles(),a=s.length!==this.files.length||s.some((d,p)=>d.path!==this.files[p]?.path||d.mtime!==this.files[p]?.mtime);this.files=s,a&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] bulb list refresh failed",s)}}merged(){let s=new Map;for(let a of this.files)s.set(d3(a.path),{path:a.path,name:a.name,recent:a.mtime,trusted:a.trusted});for(let a of this.servers){if(a.pid===this.parent.ownPid)continue;let d=d3(a.file),p=Wee(a.file)||a.file,b=s.get(d)??{path:a.file,name:p,recent:0};b.running=a,b.recent=Math.max(b.recent,a.startedAt),s.set(d,b)}return[...s.values()]}rows(){let s=this.merged();if(this.searchActive){let a=new Map(this.results.map(d=>[d3(d.path),d]));s=s.flatMap(d=>{let p=a.get(d3(d.path));return p?[{...d,hitCount:p.hitCount,snippet:p.snippet}]:[]})}else{let a=this.filter.trim().toLowerCase();a&&(s=s.filter(d=>d.name.toLowerCase().includes(a)||d.path.toLowerCase().includes(a)))}return s.sort((a,d)=>a.recent-d.recent)}show(){this.beginOpen(),this.refresh(),this.refreshList(),this.armClose(),this.focusFilter()}onClosed(){super.onClosed(),this.closeLog(),this.spotlightPid=void 0}async launch(s){if(!this.files.find(d=>d3(d.path)===d3(s))?.trusted){let d;try{d=(await tb.server.predictTrustOf(s)).cap}catch(p){console.error("[mirror] predictTrustOf failed",p)}if(d){this.pendingLaunch={path:s,name:this.displayName(s),cap:d},this.update();return}}await this.doLaunch(s)}async doLaunch(s,a,d=!1){let p=d3(s);this.launching.add(p),this.update();let b;try{b=(await tb.server.launchBulb(s,a)).pid}catch(v){console.error("[mirror] launchBulb failed",v)}finally{this.launching.delete(p)}d&&b&&this.dismissedDenials.add(b),await this.refresh(),this.pinToBottom()}displayName(s){return this.files.find(d=>d3(d.path)===d3(s))?.name||Wee(s)||s}launchTrusted(){let s=this.pendingLaunch;this.pendingLaunch=void 0,s&&this.doLaunch(s.path,!0)}launchRestricted(){let s=this.pendingLaunch;this.pendingLaunch=void 0,s&&this.doLaunch(s.path,void 0,!0)}cancelLaunch(){this.pendingLaunch=void 0,this.update()}async stop(s){this.openLog?.pid===s&&this.closeLog(),this.dismissedDenials.delete(s);try{await tb.server.stopBreakout(s)}catch(a){console.error("[mirror] stopBreakout failed",a)}await this.refresh()}pendingDenial(){return this.servers.find(s=>s.denied&&s.pid!==this.parent.ownPid&&!this.dismissedDenials.has(s.pid))}async elevate(s){this.dismissedDenials.add(s.pid),this.openLog?.pid===s.pid&&this.closeLog();try{await tb.server.launchBulb(s.file,!0)}catch(a){console.error("[mirror] elevate failed",a)}await this.refresh()}dismissDenial(s){this.dismissedDenials.add(s),this.update()}async toggleTrust(s){let a=!(s.running?s.running.trust:s.trusted);try{await tb.server.setBulbTrust(s.path,a),s.running&&(this.openLog?.pid===s.running.pid&&this.closeLog(),await tb.server.launchBulb(s.path,a))}catch(d){console.error("[mirror] toggleTrust failed",d)}await this.refresh()}showLog(s,a){if(this.openLog?.pid===s.pid){this.closeLog();return}this.closeLog(),this.openLog={pid:s.pid,name:a,text:"",offset:0},this.update(),setTimeout(()=>document.getElementById("bulb-console")?.focus()),this.#n(),this.#e=setInterval(()=>this.#n(),700)}closeLog(){this.#e&&(clearInterval(this.#e),this.#e=void 0),this.openLog&&(this.openLog=void 0,this.update())}async#n(){let s=this.openLog;if(s)try{let{text:a,offset:d}=await tb.server.readBulbLog(s.pid,s.offset);if(this.openLog!==s)return;a?(s.text=(s.text+a).slice(-5e4),s.offset=d,this.update()):d!==s.offset&&(s.offset=d)}catch(a){console.error("[mirror] readBulbLog failed",a)}}view(){let s=this.servers.filter(b=>b.pid!==this.parent.ownPid).length;if(!(this.files.length>0)&&s===0)return $t({class:"servers-wrap"});let d=s>0?`${s} running`:"bulbs",p=this.pendingDenial();return $t({class:"servers-wrap"},uc({class:"pill",title:"Launch a project bulb \xB7 stop a running one",onClick:b=>{b.stopPropagation(),this.open?this.close():this.show()}},d),this.open?this.popup():null,this.pendingLaunch?this.launchModal(this.pendingLaunch):p?this.denialModal(p):null)}trustModal(s){let a=(d,p)=>{d.stopPropagation(),p(),this.open&&this.focusFilter()};return $t({class:"trust-back",tabIndex:0,onMounted:d=>d.focus(),onKeyDown:d=>{d.key==="Escape"&&a(d,s.onDismiss)},onClick:d=>a(d,s.onDismiss)},$t({class:"trust-modal",onClick:d=>d.stopPropagation()},$t({class:"trust-modal-h"},s.heading),$t({class:"trust-modal-b"},s.body),$t({class:"trust-modal-warn"},s.warn),$t({class:"trust-modal-acts"},uc({class:"trust-no",onClick:d=>a(d,s.onNo)},s.noLabel),uc({class:"trust-yes",onClick:d=>a(d,s.onYes)},s.yesLabel))))}launchModal(s){return this.trustModal({heading:`\u201C${s.name}\u201D will likely need access`,body:`It looks like it uses ${s.cap}, which is blocked unless you launch it Trusted. Launch Trusted to allow filesystem / AI / server.ts?`,warn:"Only trust bulbs you wrote or have read \u2014 be careful with anything off the internet.",noLabel:"Launch restricted",yesLabel:"Launch trusted",onNo:()=>this.launchRestricted(),onYes:()=>this.launchTrusted(),onDismiss:()=>this.cancelLaunch()})}denialModal(s){let a=Wee(s.file)||s.file,d=!s.predicted;return this.trustModal({heading:d?`\u201C${a}\u201D reached for access it didn't declare`:`\u201C${a}\u201D wants more access`,body:d?`It tried to use ${s.denied} at runtime, though nothing in its code obviously needed it. Relaunch it Trusted to allow filesystem / AI / server.ts?`:`It tried to use ${s.denied}, blocked while it's restricted. Relaunch it Trusted to allow filesystem / AI / server.ts?`,warn:d?"Code that reaches for capabilities it never visibly uses can be hiding something \u2014 only continue if you wrote this bulb or have read it.":"Only trust bulbs you wrote or have read \u2014 be careful with anything off the internet.",noLabel:"Keep restricted",yesLabel:"Trust & relaunch",onNo:()=>this.dismissDenial(s.pid),onYes:()=>this.elevate(s),onDismiss:()=>this.dismissDenial(s.pid)})}popup(){if(this.openLog)return this.consoleView(this.openLog);let s=this.rows(),a=this.spotlightPid,d=a!==void 0&&s.some(p=>p.running?.pid===a);return $t({class:"servers-pop"},s.length===0?this.emptyState("No bulbs in this project yet."):$t({class:"bulb-list",onScroll:()=>this.onListScroll()},s.map((p,b)=>this.row(p,b,d&&p.running?.pid!==a))),this.filterBox(this.merged().length,"bulb"))}consoleView(s){return $t({id:"bulb-console",class:"servers-pop log-mode",tabIndex:0,onKeyDown:a=>{a.key==="Escape"&&(a.stopPropagation(),this.closeLog())}},$t({class:"bulb-log-head"},Fr({class:"bulb-log-name"},`console \xB7 ${s.name}`),uc({class:"bulb-log-back",title:"Back to the bulb list",onClick:a=>{a.stopPropagation(),this.closeLog()}},"\u2190 bulbs")),r6({class:"bulb-log-body"},Fr({class:"bulb-log-text"},s.text||"(no output yet)")))}row(s,a,d=!1){let p=s.running,b=p&&this.openLog?.pid===p.pid,v=p?!!p.trust:!!s.trusted;return $t({class:["server-row",a===this.highlighted?"active":"",d?"dimmed":""],onMouseEnter:()=>{let w=p!==void 0&&p.pid===this.spotlightPid;w&&(this.spotlightPid=void 0),(this.highlighted!==a||w)&&(this.highlighted=a,this.update())}},p?uc({class:"server-stop",title:"Stop this server",ariaLabel:"Stop",onClick:w=>{w.stopPropagation(),this.stop(p.pid)}},gvn()):uc({class:["bulb-launch",this.launching.has(d3(s.path))?"launching shimmer":""],title:v?"Launch (trusted \u2014 remembered)":"Launch (restricted)",ariaLabel:"Launch",onClick:w=>{w.stopPropagation(),this.launch(s.path)}},pvn()),$t({class:"bulb-name-cell"},Fr({class:["server-name",p?"":"stopped"],title:`Open ${s.path}`,onClick:w=>{w.stopPropagation(),tb.server.openFile(s.path)}},s.name),Jee(s.hitCount)),p||v?this.trustToggle(s,v):Fr({class:"cell-empty"}),p?cM({class:["server-logs",b?"on":""],title:"Show this server\u2019s console",onClick:w=>{w.stopPropagation(),this.showLog(p,s.name)}},"logs"):Fr({class:"cell-empty"}),p?cM({class:"server-port",href:p.url,target:"_blank",rel:"noopener noreferrer",title:`Open ${p.url}`},`:${p.port}`):Fr({class:"bulb-time"},zee(s.recent)),Uee(s.snippet,this.filter.trim()))}trustToggle(s,a){return uc({class:["trust-toggle",a?"on":""],title:`${a?"Trusted":"Restricted"} \u2014 click to switch to ${a?"restricted":"trusted"}`+(s.running?" (stops + relaunches it)":""),onClick:d=>{d.stopPropagation(),this.toggleTrust(s)}},a?"trusted":"restricted")}};var Ure=class extends Ia{get parent(){return this.ctx.parent}view(){let s=this.parent.prose;return uc({class:["pill","glyph",s?"on":""],title:s?"Trace view":"Content view",onClick:()=>{this.parent.prose=!s,this.update()}},Fr({class:"glyph-img"},"\u{1F648}"))}};var bvn=4e5;function mvn(o,s){let a=o.split(`
|
|
1442
1442
|
`).map(v=>v.replace(/\r$/,""));if(a.length&&a[a.length-1]===""&&a.pop(),s)return a.map(v=>({kind:"add",text:v}));let d=[],p=!1,b=!1;for(let v of a){if(v.startsWith("@@")){b&&d.push({kind:"gap",text:"\u22EF"}),b=!0,p=!0;continue}if(!p){v.startsWith("Binary file")&&d.push({kind:"ctx",text:v});continue}v.startsWith("\\")||(v.startsWith("+")?d.push({kind:"add",text:v.slice(1)}):v.startsWith("-")?d.push({kind:"del",text:v.slice(1)}):d.push({kind:"ctx",text:v.slice(1)}))}return d}function wvn(o,s,a){let d=mvn(o,s),p=o.length>bvn?"txt":a.split(".").pop()??"",b=[],v=[];for(let P of d)(P.kind==="ctx"||P.kind==="del")&&b.push(P.text),(P.kind==="ctx"||P.kind==="add")&&v.push(P.text);let w=Qxe(b.join(`
|
|
1443
1443
|
`),p),I=Qxe(v.join(`
|
|
1444
|
-
`),p),T=0,B=0,D=[];for(let P of d){if(P.kind==="gap"){D.push('<div class="udiff-gap">\u22EF</div>');continue}let F=P.kind==="del"?w[T++]:(P.kind==="add"||T++,I[B++]);D.push(`<div class="udiff-line${P.kind==="add"?" udiff-add":P.kind==="del"?" udiff-del":""}">${F??""}</div>`)}return{kinds:d.map(P=>P.kind),bodyHtml:D.join("")}}var zre=class extends v4{files=[];repo=!0;root="";viewing;#e=0;keepOpenSelector=".gitdiff-wrap";filterId="gitdiff-filter";listSelector=".gitdiff-list";filterNoun="file";search(){return Promise.resolve([])}onActivate(s){let a=this.rows()[s];a&&this.openDiff(a)}onAttached(){this.refreshFiles(),setInterval(()=>this.refreshFiles(),3e3),setInterval(()=>{this.viewing&&this.refreshDiff()},1500)}rows(){let s=this.filter.trim().toLowerCase();return s?this.files.filter(a=>a.path.toLowerCase().includes(s)):this.files}async refreshFiles(){try{let{repo:s,root:a,files:d}=await tb.server.gitChangedFiles(),p=s!==this.repo||d.length!==this.files.length||d.some((b,v)=>{let w=this.files[v];return b.path!==w?.path||b.status!==w.status||b.add!==w.add||b.del!==w.del});this.repo=s,this.root=a,this.files=d,p&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] gitChangedFiles failed",s)}}#
|
|
1444
|
+
`),p),T=0,B=0,D=[];for(let P of d){if(P.kind==="gap"){D.push('<div class="udiff-gap">\u22EF</div>');continue}let F=P.kind==="del"?w[T++]:(P.kind==="add"||T++,I[B++]);D.push(`<div class="udiff-line${P.kind==="add"?" udiff-add":P.kind==="del"?" udiff-del":""}">${F??""}</div>`)}return{kinds:d.map(P=>P.kind),bodyHtml:D.join("")}}var zre=class extends v4{files=[];repo=!0;root="";viewing;#e=0;#n=!1;keepOpenSelector=".gitdiff-wrap";filterId="gitdiff-filter";listSelector=".gitdiff-list";filterNoun="file";search(){return Promise.resolve([])}onActivate(s){let a=this.rows()[s];a&&this.openDiff(a)}onAttached(){this.refreshFiles(),setInterval(()=>this.refreshFiles(),3e3),setInterval(()=>{this.viewing&&this.refreshDiff()},1500)}rows(){let s=this.filter.trim().toLowerCase();return s?this.files.filter(a=>a.path.toLowerCase().includes(s)):this.files}async refreshFiles(){try{let{repo:s,root:a,files:d}=await tb.server.gitChangedFiles(),p=s!==this.repo||d.length!==this.files.length||d.some((b,v)=>{let w=this.files[v];return b.path!==w?.path||b.status!==w.status||b.add!==w.add||b.del!==w.del});this.repo=s,this.root=a,this.files=d,p&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] gitChangedFiles failed",s)}}#t(s,a,d){this.viewing={path:s,status:a,text:d.text,truncated:!!d.truncated,...wvn(d.text,!!d.untracked,s)},this.#e++,this.update()}async openDiff(s){try{let a=await tb.server.gitDiff(s.path);if(!a.ok){console.error("[mirror] gitDiff failed:",a.error);return}this.#t(s.path,s.status,a),this.#n=!0,this.close()}catch(a){console.error("[mirror] gitDiff failed",a)}}async refreshDiff(){let s=this.viewing;if(s)try{let a=await tb.server.gitDiff(s.path);if(this.viewing!==s||!a.ok||a.text===s.text)return;this.#t(s.path,s.status,a)}catch(a){console.error("[mirror] gitDiff refresh failed",a)}}closeDoc(){this.viewing=void 0,this.update()}show(){this.beginOpen(),this.refreshFiles(),this.refreshList(),this.armClose(),this.focusFilter()}view(){let s=this.files.length;return!this.repo||s===0&&!this.viewing&&!this.open?$t({class:"gitdiff-wrap"}):$t({class:"gitdiff-wrap"},uc({class:["pill","glyph","gitdiff-pill",this.viewing||this.open?"on":""],title:`${s} changed file${s===1?"":"s"} \u2014 view a diff`,onClick:a=>{a.stopPropagation(),this.open?this.close():this.show()}},ek("diff"),Fr({class:"gitdiff-count"},String(s))),this.open?this.popup():null)}popup(){let s=this.rows();return $t({class:"servers-pop gitdiff-pop"},s.length===0?this.emptyState("No changes in the working tree."):$t({class:"gitdiff-list",onScroll:()=>this.onListScroll()},s.map((a,d)=>this.row(a,d))),this.filterRow())}filterRow(){let s=this.files.length;return qee({target:this,prop:()=>this.filter,id:this.filterId,placeholder:s?`Filter ${s} file${s===1?"":"s"}\u2026`:"Filter files\u2026",hasValue:!!this.filter,onKeyDown:a=>this.onFilterKey(a),onClear:()=>this.clearFilter()})}row(s,a){return $t({class:["gitdiff-row",a===this.highlighted?"active":"",this.viewing?.path===s.path?"viewing":""],onMouseEnter:()=>{this.highlighted!==a&&(this.highlighted=a,this.update())},onClick:d=>{d.stopPropagation(),this.openDiff(s)}},Fr({class:["gitdiff-status",`s-${s.status}`]},s.status),Fr({class:"gitdiff-path",title:s.path},s.path),s.add!==void 0||s.del!==void 0?Fr({class:"gitdiff-counts"},Fr({class:"count-add"},`+${s.add??0}`),Fr({class:"count-del"},`\u2212${s.del??0}`)):Fr({class:"gitdiff-counts"},Fr({class:"count-add"},"new")))}docView(){let s=this.viewing,a=s.kinds.filter(p=>p==="add").length,d=s.kinds.filter(p=>p==="del").length;return $t({class:"diff-doc",tabIndex:0,onMounted:p=>p.focus(),onKeyDown:p=>{p.key==="Escape"&&(p.stopPropagation(),this.closeDoc())}},$t({class:"diff-doc-head"},Fr({class:["gitdiff-status",`s-${s.status}`]},s.status),Fr({class:"diff-doc-path",title:`Open ${s.path}`,onClick:()=>tb.server.openFile(`${this.root}/${s.path}`)},s.path),Fr({class:"gitdiff-counts"},Fr({class:"count-add"},`+${a}`),Fr({class:"count-del"},`\u2212${d}`)),uc({class:"bulb-log-back",title:"Back to the conversation (Esc)",onClick:p=>{p.stopPropagation(),this.closeDoc()}},"\u2190 conversation")),$t({class:"diff-doc-scroll"},$t({class:"diff-doc-body"},s.kinds.length===0?$t({class:"diff-doc-empty"},"No changes."):$t({class:"diff-doc-code",key:`diff-code-${this.#e}`,onMounted:p=>{p.innerHTML=s.bodyHtml,this.#r(p)}},""),s.truncated?$t({class:"diff-doc-trunc"},"Diff truncated \u2014 file too large to show in full."):null),s.kinds.length?this.ruler(s.kinds):null))}#r(s){if(!this.#n)return;this.#n=!1;let a=s.querySelector(".udiff-add, .udiff-del"),d=s.closest(".diff-doc-body");a&&d&&(d.scrollTop=a.offsetTop-d.clientHeight/3)}ruler(s){let a=s.length,d=[];return s.forEach((p,b)=>{if(p!=="add"&&p!=="del")return;let v=d[d.length-1];v&&v.kind===p&&v.start+v.len===b?v.len++:d.push({kind:p,start:b,len:1})}),$t({class:"diff-ruler",title:"Jump to a change",onClick:p=>{let b=document.querySelector(".diff-doc-body"),v=p.currentTarget;if(!b)return;let w=(p.clientY-v.getBoundingClientRect().top)/v.clientHeight;b.scrollTop=w*b.scrollHeight-b.clientHeight/2}},d.map(p=>$t({class:["diff-ruler-mark",p.kind],style:{top:`${p.start/a*100}%`,height:`${p.len/a*100}%`}})))}};var Kre=class extends Ia{done=!1;#e;constructor(s){super(),this.#e=s}setText(s){this.#e=s}flash(){navigator.clipboard?.writeText(this.#e),this.done=!0,this.update(),setTimeout(()=>{this.done=!1,this.update()},600)}view(){return uc({class:["overlay-pill","copy",this.done?"done":""],onClick:s=>{s.stopPropagation(),this.flash()}},this.done?"copied":"copy")}};var Wre=class extends Ia{spread=!1;showingCode=!1;copied=!1;#e="";#n;#t;#r;#i;#s;#o;#c;#u=!1;#f=1;#h=!1;#l;#a="idle";constructor(s,a){super(),this.#n=s,this.#t=a,this.#r=wH(s);let d=vke(s);this.#i=d.length?d.join(" "):void 0}get name(){return this.#r}get key(){return this.#t}setChainPosition(s){this.#f=s}get chainPosition(){return this.#f}setMounted(s){s!==this.#u&&(this.#u=s,this.#d())}onAttached(){this.#d()}#d(){if(this.#u){if(this.#s||this.#h||this.#o)return;this.#h=!0,this.#l=new AbortController,fSt(this.#n,{signal:this.#l.signal,onError:s=>{this.#c=s,this.#p("runtime",s),this.update()},onReady:()=>this.#p(this.#i?"malformed":"ok",this.#i)}).then(s=>{this.#h=!1,this.#u&&(this.#s=s,this.update())}).catch(s=>{this.#h=!1,this.#o=s instanceof Error?s.message:String(s),this.#p("compile",this.#o),this.update()})}else{if(!this.#s&&!this.#h)return;this.#l?.abort(),this.#l=void 0,this.#s=void 0,this.#c=void 0,this.update()}}#p(s,a){let d=this.#r??this.#t,p=s==="ok"?"ok":s==="malformed"?`malformed: ${a}`:`${s} error: ${a}`;tb.server.logEmbedStatus(d,`[embed ${d} v${this.#f}] ${p}`).catch(()=>{})}dispose(){this.#l?.abort()}view(){let s=["embed","bulb-embed",this.spread?"spread":"fit",this.showingCode?"code-open":"",this.#o?"err":""],a=this.#r?`${this.#r} \u2014 `:"",d=this.#o?[`${a}could not render: ${this.#o}`]:this.#s?[this.#m(),$t({class:"bulb-frame",key:"frame",onMounted:p=>{this.#s&&p.replaceChildren(this.#s)}}),this.showingCode?this.#v():null,this.#c?$t({class:"bulb-err-strip",key:"err"},`\u26A0 ${a}${this.#c}`):null,this.#i?$t({class:"bulb-warn-strip",key:"warn"},`\u26A0 ${a}malformed: ${this.#i}`):null]:["compiling bulb\u2026"];return $t({class:"md",key:this.#t},$t({class:s},...d))}#m(){let s=this.#a==="done"?this.#e:"breakout \u2197";return $t({class:"bulb-controls",key:"controls"},this.#g("bulb-view",this.spread?"fit":"spread",this.spread?"Fit into the conversation column":"Spread to the full transcript width and height",()=>{this.spread=!this.spread,this.update()}),this.#g("bulb-toggle",this.showingCode?"run":"code",this.showingCode?"Back to the running bulb":"View this bulb's source",()=>{this.showingCode=!this.showingCode,this.update()}),this.#g(["bulb-copy",this.copied?"done":""],this.copied?"copied":"copy","Copy this bulb's full source",()=>this.#w()),uc({class:["overlay-pill","bulb-breakout",this.#a==="busy"?"launching shimmer":""],type:"button",disabled:this.#a!=="idle",title:"Save as a standalone .bulb.md and open it with typebulb",onClick:a=>{a.stopPropagation(),this.#A()}},s))}#g(s,a,d,p){let b=Array.isArray(s)?s:[s];return uc({class:["overlay-pill",...b],type:"button",title:d,onClick:v=>{v.stopPropagation(),p()}},a)}#w(){navigator.clipboard?.writeText(this.#n),this.copied=!0,this.update(),setTimeout(()=>{this.copied=!1,this.update()},1200)}async#A(){if(this.#a==="idle"){this.#a="busy",this.update();try{let{file:s,pid:a}=await tb.server.breakout(this.#n);this.#e=`launched ${s}`,window.dispatchEvent(new CustomEvent("tb-breakout",{detail:{pid:a}}))}catch(s){this.#e="breakout failed",console.error("[mirror] breakout failed",s)}this.#a="done",this.update(),setTimeout(()=>{this.#a="idle",this.update()},2500)}}#v(){return $t({class:["bulb-code","md"],key:"code",tabIndex:0,onKeyDown:s=>{if(!((s.ctrlKey||s.metaKey)&&(s.key==="a"||s.key==="A")))return;s.preventDefault();let a=getSelection();if(!a)return;let d=document.createRange();d.selectNodeContents(s.currentTarget),a.removeAllRanges(),a.addRange(d)},onMounted:s=>{s.innerHTML=ZM.render(AH(this.#n))}})}};function wSt(o){return o.map((s,a)=>!!s&&o[a+1]===s)}function ASt(o){let s=[];for(let a=0;a<o.length;a++)s[a]=a>0&&o[a]&&o[a]===o[a-1]?s[a-1]+1:1;return s}var vSt=".typebulb/paste",ySt={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp"};var Avn=new RegExp(`@${vSt.replace(/\./g,"\\.")}/([\\w-]+(?:\\.[\\w-]+)*\\.(?:${Object.keys(ySt).join("|")}))`,"gi"),vvn=new URL("typebulb.png",import.meta.url).href,yvn=new URL("typebulb-inv.png",import.meta.url).href;function kvn(o){return!o||typeof o!="object"?"":Qd(o.command)??Qd(o.file_path)??Qd(o.path)??Qd(o.pattern)??Qd(o.query)??Qd(o.url)??Qd(o.skill)??Qd(o.description)??""}function xvn(o){let s=o.indexOf(`
|
|
1445
1445
|
`);return s===-1?o:o.slice(0,s).trimEnd()+" \u2026"}var Jxe=o=>ek("caret",["caret-tri",o?"open":""]),Evn=()=>ek("fork","fork-icon");function CSt(o){return/^@@/m.test(o)&&/^[+-]/m.test(o)}function kSt(o){let s=[],a=!1;for(let d of o.split(`
|
|
1446
1446
|
`))d.startsWith("@@")?(a&&s.push($t({class:"udiff-gap"},"\u22EF")),a=!0):/^[+-]/.test(d)&&!d.startsWith("+++")&&!d.startsWith("---")&&s.push($t({class:["udiff-line",d.startsWith("+")?"udiff-add":"udiff-del"]},d.slice(1)));return $t({class:"udiff"},s)}var Cvn=new Set(["Read","Edit","Write","MultiEdit","NotebookEdit","Glob","Grep"]),Ivn=new Set(["Edit","Write","MultiEdit","NotebookEdit"]);function Svn(o,s){if(!(!Cvn.has(o)||!s||typeof s!="object"))return(Qd(s.file_path)??Qd(s.path))||void 0}function Tvn(o){let s=o.input??{};switch(o.name){case"Edit":return[{old:Qd(s.old_string),new:Qd(s.new_string)}];case"Write":return[{new:Qd(s.content)}];case"NotebookEdit":return[{new:Qd(s.new_source)}];case"MultiEdit":return Array.isArray(s.edits)?s.edits.map(a=>({old:a?.old_string,new:a?.new_string})):void 0;default:return}}function zxe(o){let s=/^mcp__(.+?)__(.+)$/.exec(o);return s?`${s[1][0].toUpperCase()}${s[1].slice(1)} [${s[2]}]`:o}function xSt(o){return Object.values(o.input??{}).filter(s=>typeof s=="string"&&CSt(s))}function ESt(o){return o.name==="TodoWrite"&&Array.isArray(o.input?.todos)?o.input.todos:void 0}function _vn(o){let s=o.filter(d=>d.status==="completed").length,a=o.find(d=>d.status==="in_progress");return`${s}/${o.length} done${a?` \xB7 \u25FC ${a.activeForm??a.content??""}`:""}`}function Mvn(o){let s=new Map;for(let p of o)for(let b of p.tools)s.set(zxe(b.name),(s.get(zxe(b.name))??0)+1);let a=[...s].map(([p,b])=>b>1?`${p} \xD7${b}`:p).join(", "),d=o.length;return`${d} step${d===1?"":"s"}${a?` \xB7 ${a}`:""}`}function Uxe(o,s){o.has(s)?o.delete(s):o.add(s)}var Yre=class extends Ia{messages=[];openTools=new Set;expandedTurns=new Set;expandedForks=new Set;expandedEmbeds=new Set;copyButtons=[];bulbEmbeds=[];scrollEl;#e=0;#n=0;#t=new Set;#r=!0;#i=new Map;#s=0;#o=!1;#c=new Map;get parent(){return this.ctx.parent}clear(){for(let s of this.bulbEmbeds)s.dispose();this.messages=[],this.expandedTurns.clear(),this.expandedForks.clear(),this.expandedEmbeds.clear(),this.#c.clear(),this.#t=new Set,this.copyButtons=[],this.bulbEmbeds=[]}#u(s){let a=new Kre(s);return this.copyButtons.push(a),a}#f(s){let a={...s,copy:s.text?this.#u(s.text):void 0};return this.messages.push(a),a}#h(){let s=[];for(let a=this.messages.length-1;a>=0;a--){let d=this.messages[a];if(d.role==="user")break;d.text&&s.unshift(d.text)}return s.join(`
|
|
1447
1447
|
|
package/dist/agents/pi/client.js
CHANGED
|
@@ -1441,7 +1441,7 @@ ${oCt(b)}`};let v=sCt(d.code,{jsxImportSource:p.ts?.jsxImportSource});if(v.error
|
|
|
1441
1441
|
${a?"New conversation \u2014 not saved yet":`Session: ${s.sessionId}`}`;return Zt({class:"sid-wrap"},Dc({class:"pill",title:b,onClick:v=>{v.stopPropagation(),this.open?this.close():this.show()}},p),this.open?this.picker():null)}picker(){let s=this.rows();return Zt({class:"picker"},Zt({class:"picker-body"},s.length===0?this.emptyState("No sessions yet \u2014 start one in your terminal."):Zt({id:"session-list",class:"picker-list",onScroll:()=>this.onListScroll()},s.map((a,d)=>this.pickerRow(a,d))),this.peekCard()),this.filterBox(this.sessions.length,"session"))}pickerRow(s,a){let d=s.sessionId===this.parent.sessionId,p=this.parent.busy.includes(s.sessionId);return Zt({class:["picker-row",a===this.highlighted?"active":"",d?"current":""],onMouseEnter:()=>{this.highlighted!==a&&(this.highlighted=a,this.update())},onClick:()=>this.pick(s.sessionId)},Zt({class:"picker-row-main"},ai({class:"picker-dot"}),ai({class:["picker-preview",p?"shimmer-text shimmer-slow":""]},s.preview||"(no preview)"),zee(s.hitCount),ai({class:["picker-time",this.#s(s)?"unseen":""],onMouseEnter:()=>this.#o(s),onMouseLeave:()=>this.#c(s)},Wee(s.mtime))),Kee(s.snippet,this.filter.trim()))}#o(s){this.#t=`${s.sessionId}:${s.mtime}`,this.#u(s.sessionId,this.#t),this.update()}#c(s){this.#t===`${s.sessionId}:${s.mtime}`&&(this.#t=null,this.update())}async#u(s,a){if(this.#r.has(a))return;let d="";try{d=String((await tb.server.sessionPeek(s))?.text??"")}catch{}this.#r.set(a,d),this.#t===a&&this.update()}peekCard(){if(!this.#t)return null;let s=this.#r.get(this.#t);return s===void 0?Zt({class:"picker-peek muted"},"\u2026"):s?Zt({class:"picker-peek md",key:`peek:${this.#t}`,onMounted:a=>{a.innerHTML=nD.render(s)}}):Zt({class:"picker-peek muted"},"(no assistant text yet)")}onClosed(){super.onClosed(),this.#t=null}};var Ure=class extends wu{get parent(){return this.ctx.parent}view(){let s=this.parent.tokens,a=this.parent.stats,d=a?a.contextTokens??0:s.in+s.out+s.cached+s.cacheCreate,p=a?.cost??this.parent.cost,b=this.parent.working,v=[];if(d>0&&v.push(Yee(d)),a&&a.contextPercent!=null&&v.push(`${Math.round(a.contextPercent)}%`),p>0&&v.push(`$${p>=1?p.toFixed(2):p.toFixed(3)}`),!v.length&&!b)return ai({class:"token-wrap"});let w=v.length?v.length===1&&d>0?`${v[0]} tokens`:v.join(" \xB7 "):"working\u2026";return ai({class:"token-wrap"},ai({class:["token",b?"busy shimmer shimmer-slow":""]},w))}};var pSt={"play_arrow.fill":'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M320-200v-560l440 280-440 280Z"/></svg>',"stop.fill":'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M240-240v-480h480v480H240Z"/></svg>',play_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m380-300 280-180-280-180v360ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',stop_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M320-320h320v-320H320v320ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',add_circle:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',attach_file:'<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M720-330q0 104-73 177T470-80q-104 0-177-73t-73-177v-370q0-75 52.5-127.5T400-880q75 0 127.5 52.5T580-700v350q0 46-32 78t-78 32q-46 0-78-32t-32-78v-370h80v370q0 13 8.5 21.5T470-320q13 0 21.5-8.5T500-350v-350q-1-42-29.5-71T400-800q-42 0-71 29t-29 71v370q-1 71 49 120.5T470-160q70 0 119-49.5T640-330v-390h80v390Z"/></svg>'};var avn={play:"play_arrow.fill",stop:"stop.fill",playCircle:"play_circle",stopCircle:"stop_circle",addCircle:"add_circle",attach:"attach_file"},lvn={caret:'<svg viewBox="0 0 16 16"><path d="M4 1.5 L13 8 L4 14.5 Z" fill="currentColor"/></svg>',fork:'<svg viewBox="0 0 16 16" fill="none"><path d="M4 2 V8 H12 V2 M8 8 V14" stroke="currentColor" stroke-width="1.8" stroke-linecap="square"/></svg>',diff:'<svg viewBox="4 2 8 12" fill="none"><path d="M5.25 6 H10.75 M8 3.25 V8.75" stroke="var(--diff-add)" stroke-width="1.8" stroke-linecap="round"/><path d="M5.25 12.5 H10.75" stroke="var(--err)" stroke-width="1.8" stroke-linecap="round"/></svg>'},fvn=o=>{let s=lvn[o]??pSt[avn[o]??""]??"";return/<svg[^>]*\bfill=/.test(s)?s:s.replace("<svg ",'<svg fill="currentColor" ')},Ob=(o,s="")=>ai({class:["icon",...Array.isArray(s)?s:[s]],key:`icon-${o}`,onMounted:a=>{a.innerHTML=fvn(o)}},"");var hvn=()=>Ob("play","btn-icon"),dvn=()=>Ob("stop","btn-icon"),zre=class extends M7{files=[];servers=[];keepOpenSelector=".servers-wrap";filterId="bulb-filter";listSelector=".bulb-list";filterNoun="name";launching=new Set;dismissedDenials=new Set;pendingLaunch;openLog;#e;spotlightPid;search(s){return tb.server.searchBulbs(s)}onActivate(s){let a=this.rows()[s];a&&(a.running?window.open(a.running.url,"_blank","noopener"):this.launch(a.path))}onAttached(){this.refresh(),setInterval(()=>this.refreshServers(),800),setInterval(()=>this.refreshFiles(),3e3),window.addEventListener("tb-breakout",s=>this.spotlight(s.detail?.pid))}spotlight(s){this.spotlightPid=s,this.show()}refresh(){return Promise.all([this.refreshServers(),this.refreshFiles()])}async refreshServers(){try{let s=await tb.server.listBreakouts(),a=s.length!==this.servers.length||s.some((d,p)=>d.pid!==this.servers[p]?.pid||d.denied!==this.servers[p]?.denied||d.predicted!==this.servers[p]?.predicted||d.trust!==this.servers[p]?.trust);this.servers=s,a&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] server list refresh failed",s)}}async refreshFiles(){try{let s=await tb.server.listBulbFiles(),a=s.length!==this.files.length||s.some((d,p)=>d.path!==this.files[p]?.path||d.mtime!==this.files[p]?.mtime);this.files=s,a&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] bulb list refresh failed",s)}}merged(){let s=new Map;for(let a of this.files)s.set(d3(a.path),{path:a.path,name:a.name,recent:a.mtime,trusted:a.trusted});for(let a of this.servers){if(a.pid===this.parent.ownPid)continue;let d=d3(a.file),p=Xee(a.file)||a.file,b=s.get(d)??{path:a.file,name:p,recent:0};b.running=a,b.recent=Math.max(b.recent,a.startedAt),s.set(d,b)}return[...s.values()]}rows(){let s=this.merged();if(this.searchActive){let a=new Map(this.results.map(d=>[d3(d.path),d]));s=s.flatMap(d=>{let p=a.get(d3(d.path));return p?[{...d,hitCount:p.hitCount,snippet:p.snippet}]:[]})}else{let a=this.filter.trim().toLowerCase();a&&(s=s.filter(d=>d.name.toLowerCase().includes(a)||d.path.toLowerCase().includes(a)))}return s.sort((a,d)=>a.recent-d.recent)}show(){this.beginOpen(),this.refresh(),this.refreshList(),this.armClose(),this.focusFilter()}onClosed(){super.onClosed(),this.closeLog(),this.spotlightPid=void 0}async launch(s){if(!this.files.find(d=>d3(d.path)===d3(s))?.trusted){let d;try{d=(await tb.server.predictTrustOf(s)).cap}catch(p){console.error("[mirror] predictTrustOf failed",p)}if(d){this.pendingLaunch={path:s,name:this.displayName(s),cap:d},this.update();return}}await this.doLaunch(s)}async doLaunch(s,a,d=!1){let p=d3(s);this.launching.add(p),this.update();let b;try{b=(await tb.server.launchBulb(s,a)).pid}catch(v){console.error("[mirror] launchBulb failed",v)}finally{this.launching.delete(p)}d&&b&&this.dismissedDenials.add(b),await this.refresh(),this.pinToBottom()}displayName(s){return this.files.find(d=>d3(d.path)===d3(s))?.name||Xee(s)||s}launchTrusted(){let s=this.pendingLaunch;this.pendingLaunch=void 0,s&&this.doLaunch(s.path,!0)}launchRestricted(){let s=this.pendingLaunch;this.pendingLaunch=void 0,s&&this.doLaunch(s.path,void 0,!0)}cancelLaunch(){this.pendingLaunch=void 0,this.update()}async stop(s){this.openLog?.pid===s&&this.closeLog(),this.dismissedDenials.delete(s);try{await tb.server.stopBreakout(s)}catch(a){console.error("[mirror] stopBreakout failed",a)}await this.refresh()}pendingDenial(){return this.servers.find(s=>s.denied&&s.pid!==this.parent.ownPid&&!this.dismissedDenials.has(s.pid))}async elevate(s){this.dismissedDenials.add(s.pid),this.openLog?.pid===s.pid&&this.closeLog();try{await tb.server.launchBulb(s.file,!0)}catch(a){console.error("[mirror] elevate failed",a)}await this.refresh()}dismissDenial(s){this.dismissedDenials.add(s),this.update()}async toggleTrust(s){let a=!(s.running?s.running.trust:s.trusted);try{await tb.server.setBulbTrust(s.path,a),s.running&&(this.openLog?.pid===s.running.pid&&this.closeLog(),await tb.server.launchBulb(s.path,a))}catch(d){console.error("[mirror] toggleTrust failed",d)}await this.refresh()}showLog(s,a){if(this.openLog?.pid===s.pid){this.closeLog();return}this.closeLog(),this.openLog={pid:s.pid,name:a,text:"",offset:0},this.update(),setTimeout(()=>document.getElementById("bulb-console")?.focus()),this.#n(),this.#e=setInterval(()=>this.#n(),700)}closeLog(){this.#e&&(clearInterval(this.#e),this.#e=void 0),this.openLog&&(this.openLog=void 0,this.update())}async#n(){let s=this.openLog;if(s)try{let{text:a,offset:d}=await tb.server.readBulbLog(s.pid,s.offset);if(this.openLog!==s)return;a?(s.text=(s.text+a).slice(-5e4),s.offset=d,this.update()):d!==s.offset&&(s.offset=d)}catch(a){console.error("[mirror] readBulbLog failed",a)}}view(){let s=this.servers.filter(b=>b.pid!==this.parent.ownPid).length;if(!(this.files.length>0)&&s===0)return Zt({class:"servers-wrap"});let d=s>0?`${s} running`:"bulbs",p=this.pendingDenial();return Zt({class:"servers-wrap"},Dc({class:"pill",title:"Launch a project bulb \xB7 stop a running one",onClick:b=>{b.stopPropagation(),this.open?this.close():this.show()}},d),this.open?this.popup():null,this.pendingLaunch?this.launchModal(this.pendingLaunch):p?this.denialModal(p):null)}trustModal(s){let a=(d,p)=>{d.stopPropagation(),p(),this.open&&this.focusFilter()};return Zt({class:"trust-back",tabIndex:0,onMounted:d=>d.focus(),onKeyDown:d=>{d.key==="Escape"&&a(d,s.onDismiss)},onClick:d=>a(d,s.onDismiss)},Zt({class:"trust-modal",onClick:d=>d.stopPropagation()},Zt({class:"trust-modal-h"},s.heading),Zt({class:"trust-modal-b"},s.body),Zt({class:"trust-modal-warn"},s.warn),Zt({class:"trust-modal-acts"},Dc({class:"trust-no",onClick:d=>a(d,s.onNo)},s.noLabel),Dc({class:"trust-yes",onClick:d=>a(d,s.onYes)},s.yesLabel))))}launchModal(s){return this.trustModal({heading:`\u201C${s.name}\u201D will likely need access`,body:`It looks like it uses ${s.cap}, which is blocked unless you launch it Trusted. Launch Trusted to allow filesystem / AI / server.ts?`,warn:"Only trust bulbs you wrote or have read \u2014 be careful with anything off the internet.",noLabel:"Launch restricted",yesLabel:"Launch trusted",onNo:()=>this.launchRestricted(),onYes:()=>this.launchTrusted(),onDismiss:()=>this.cancelLaunch()})}denialModal(s){let a=Xee(s.file)||s.file,d=!s.predicted;return this.trustModal({heading:d?`\u201C${a}\u201D reached for access it didn't declare`:`\u201C${a}\u201D wants more access`,body:d?`It tried to use ${s.denied} at runtime, though nothing in its code obviously needed it. Relaunch it Trusted to allow filesystem / AI / server.ts?`:`It tried to use ${s.denied}, blocked while it's restricted. Relaunch it Trusted to allow filesystem / AI / server.ts?`,warn:d?"Code that reaches for capabilities it never visibly uses can be hiding something \u2014 only continue if you wrote this bulb or have read it.":"Only trust bulbs you wrote or have read \u2014 be careful with anything off the internet.",noLabel:"Keep restricted",yesLabel:"Trust & relaunch",onNo:()=>this.dismissDenial(s.pid),onYes:()=>this.elevate(s),onDismiss:()=>this.dismissDenial(s.pid)})}popup(){if(this.openLog)return this.consoleView(this.openLog);let s=this.rows(),a=this.spotlightPid,d=a!==void 0&&s.some(p=>p.running?.pid===a);return Zt({class:"servers-pop"},s.length===0?this.emptyState("No bulbs in this project yet."):Zt({class:"bulb-list",onScroll:()=>this.onListScroll()},s.map((p,b)=>this.row(p,b,d&&p.running?.pid!==a))),this.filterBox(this.merged().length,"bulb"))}consoleView(s){return Zt({id:"bulb-console",class:"servers-pop log-mode",tabIndex:0,onKeyDown:a=>{a.key==="Escape"&&(a.stopPropagation(),this.closeLog())}},Zt({class:"bulb-log-head"},ai({class:"bulb-log-name"},`console \xB7 ${s.name}`),Dc({class:"bulb-log-back",title:"Back to the bulb list",onClick:a=>{a.stopPropagation(),this.closeLog()}},"\u2190 bulbs")),i6({class:"bulb-log-body"},ai({class:"bulb-log-text"},s.text||"(no output yet)")))}row(s,a,d=!1){let p=s.running,b=p&&this.openLog?.pid===p.pid,v=p?!!p.trust:!!s.trusted;return Zt({class:["server-row",a===this.highlighted?"active":"",d?"dimmed":""],onMouseEnter:()=>{let w=p!==void 0&&p.pid===this.spotlightPid;w&&(this.spotlightPid=void 0),(this.highlighted!==a||w)&&(this.highlighted=a,this.update())}},p?Dc({class:"server-stop",title:"Stop this server",ariaLabel:"Stop",onClick:w=>{w.stopPropagation(),this.stop(p.pid)}},dvn()):Dc({class:["bulb-launch",this.launching.has(d3(s.path))?"launching shimmer":""],title:v?"Launch (trusted \u2014 remembered)":"Launch (restricted)",ariaLabel:"Launch",onClick:w=>{w.stopPropagation(),this.launch(s.path)}},hvn()),Zt({class:"bulb-name-cell"},ai({class:["server-name",p?"":"stopped"],title:`Open ${s.path}`,onClick:w=>{w.stopPropagation(),tb.server.openFile(s.path)}},s.name),zee(s.hitCount)),p||v?this.trustToggle(s,v):ai({class:"cell-empty"}),p?uM({class:["server-logs",b?"on":""],title:"Show this server\u2019s console",onClick:w=>{w.stopPropagation(),this.showLog(p,s.name)}},"logs"):ai({class:"cell-empty"}),p?uM({class:"server-port",href:p.url,target:"_blank",rel:"noopener noreferrer",title:`Open ${p.url}`},`:${p.port}`):ai({class:"bulb-time"},Wee(s.recent)),Kee(s.snippet,this.filter.trim()))}trustToggle(s,a){return Dc({class:["trust-toggle",a?"on":""],title:`${a?"Trusted":"Restricted"} \u2014 click to switch to ${a?"restricted":"trusted"}`+(s.running?" (stops + relaunches it)":""),onClick:d=>{d.stopPropagation(),this.toggleTrust(s)}},a?"trusted":"restricted")}};var Kre=class extends wu{get parent(){return this.ctx.parent}view(){let s=this.parent.prose;return Dc({class:["pill","glyph",s?"on":""],title:s?"Trace view":"Content view",onClick:()=>{this.parent.prose=!s,this.update()}},ai({class:"glyph-img"},"\u{1F648}"))}};var pvn=4e5;function gvn(o,s){let a=o.split(`
|
|
1442
1442
|
`).map(v=>v.replace(/\r$/,""));if(a.length&&a[a.length-1]===""&&a.pop(),s)return a.map(v=>({kind:"add",text:v}));let d=[],p=!1,b=!1;for(let v of a){if(v.startsWith("@@")){b&&d.push({kind:"gap",text:"\u22EF"}),b=!0,p=!0;continue}if(!p){v.startsWith("Binary file")&&d.push({kind:"ctx",text:v});continue}v.startsWith("\\")||(v.startsWith("+")?d.push({kind:"add",text:v.slice(1)}):v.startsWith("-")?d.push({kind:"del",text:v.slice(1)}):d.push({kind:"ctx",text:v.slice(1)}))}return d}function bvn(o,s,a){let d=gvn(o,s),p=o.length>pvn?"txt":a.split(".").pop()??"",b=[],v=[];for(let P of d)(P.kind==="ctx"||P.kind==="del")&&b.push(P.text),(P.kind==="ctx"||P.kind==="add")&&v.push(P.text);let w=qxe(b.join(`
|
|
1443
1443
|
`),p),I=qxe(v.join(`
|
|
1444
|
-
`),p),T=0,B=0,D=[];for(let P of d){if(P.kind==="gap"){D.push('<div class="udiff-gap">\u22EF</div>');continue}let F=P.kind==="del"?w[T++]:(P.kind==="add"||T++,I[B++]);D.push(`<div class="udiff-line${P.kind==="add"?" udiff-add":P.kind==="del"?" udiff-del":""}">${F??""}</div>`)}return{kinds:d.map(P=>P.kind),bodyHtml:D.join("")}}var Wre=class extends M7{files=[];repo=!0;root="";viewing;#e=0;keepOpenSelector=".gitdiff-wrap";filterId="gitdiff-filter";listSelector=".gitdiff-list";filterNoun="file";search(){return Promise.resolve([])}onActivate(s){let a=this.rows()[s];a&&this.openDiff(a)}onAttached(){this.refreshFiles(),setInterval(()=>this.refreshFiles(),3e3),setInterval(()=>{this.viewing&&this.refreshDiff()},1500)}rows(){let s=this.filter.trim().toLowerCase();return s?this.files.filter(a=>a.path.toLowerCase().includes(s)):this.files}async refreshFiles(){try{let{repo:s,root:a,files:d}=await tb.server.gitChangedFiles(),p=s!==this.repo||d.length!==this.files.length||d.some((b,v)=>{let w=this.files[v];return b.path!==w?.path||b.status!==w.status||b.add!==w.add||b.del!==w.del});this.repo=s,this.root=a,this.files=d,p&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] gitChangedFiles failed",s)}}#
|
|
1444
|
+
`),p),T=0,B=0,D=[];for(let P of d){if(P.kind==="gap"){D.push('<div class="udiff-gap">\u22EF</div>');continue}let F=P.kind==="del"?w[T++]:(P.kind==="add"||T++,I[B++]);D.push(`<div class="udiff-line${P.kind==="add"?" udiff-add":P.kind==="del"?" udiff-del":""}">${F??""}</div>`)}return{kinds:d.map(P=>P.kind),bodyHtml:D.join("")}}var Wre=class extends M7{files=[];repo=!0;root="";viewing;#e=0;#n=!1;keepOpenSelector=".gitdiff-wrap";filterId="gitdiff-filter";listSelector=".gitdiff-list";filterNoun="file";search(){return Promise.resolve([])}onActivate(s){let a=this.rows()[s];a&&this.openDiff(a)}onAttached(){this.refreshFiles(),setInterval(()=>this.refreshFiles(),3e3),setInterval(()=>{this.viewing&&this.refreshDiff()},1500)}rows(){let s=this.filter.trim().toLowerCase();return s?this.files.filter(a=>a.path.toLowerCase().includes(s)):this.files}async refreshFiles(){try{let{repo:s,root:a,files:d}=await tb.server.gitChangedFiles(),p=s!==this.repo||d.length!==this.files.length||d.some((b,v)=>{let w=this.files[v];return b.path!==w?.path||b.status!==w.status||b.add!==w.add||b.del!==w.del});this.repo=s,this.root=a,this.files=d,p&&(this.update(),this.keepBottom())}catch(s){console.error("[mirror] gitChangedFiles failed",s)}}#t(s,a,d){this.viewing={path:s,status:a,text:d.text,truncated:!!d.truncated,...bvn(d.text,!!d.untracked,s)},this.#e++,this.update()}async openDiff(s){try{let a=await tb.server.gitDiff(s.path);if(!a.ok){console.error("[mirror] gitDiff failed:",a.error);return}this.#t(s.path,s.status,a),this.#n=!0,this.close()}catch(a){console.error("[mirror] gitDiff failed",a)}}async refreshDiff(){let s=this.viewing;if(s)try{let a=await tb.server.gitDiff(s.path);if(this.viewing!==s||!a.ok||a.text===s.text)return;this.#t(s.path,s.status,a)}catch(a){console.error("[mirror] gitDiff refresh failed",a)}}closeDoc(){this.viewing=void 0,this.update()}show(){this.beginOpen(),this.refreshFiles(),this.refreshList(),this.armClose(),this.focusFilter()}view(){let s=this.files.length;return!this.repo||s===0&&!this.viewing&&!this.open?Zt({class:"gitdiff-wrap"}):Zt({class:"gitdiff-wrap"},Dc({class:["pill","glyph","gitdiff-pill",this.viewing||this.open?"on":""],title:`${s} changed file${s===1?"":"s"} \u2014 view a diff`,onClick:a=>{a.stopPropagation(),this.open?this.close():this.show()}},Ob("diff"),ai({class:"gitdiff-count"},String(s))),this.open?this.popup():null)}popup(){let s=this.rows();return Zt({class:"servers-pop gitdiff-pop"},s.length===0?this.emptyState("No changes in the working tree."):Zt({class:"gitdiff-list",onScroll:()=>this.onListScroll()},s.map((a,d)=>this.row(a,d))),this.filterRow())}filterRow(){let s=this.files.length;return Uee({target:this,prop:()=>this.filter,id:this.filterId,placeholder:s?`Filter ${s} file${s===1?"":"s"}\u2026`:"Filter files\u2026",hasValue:!!this.filter,onKeyDown:a=>this.onFilterKey(a),onClear:()=>this.clearFilter()})}row(s,a){return Zt({class:["gitdiff-row",a===this.highlighted?"active":"",this.viewing?.path===s.path?"viewing":""],onMouseEnter:()=>{this.highlighted!==a&&(this.highlighted=a,this.update())},onClick:d=>{d.stopPropagation(),this.openDiff(s)}},ai({class:["gitdiff-status",`s-${s.status}`]},s.status),ai({class:"gitdiff-path",title:s.path},s.path),s.add!==void 0||s.del!==void 0?ai({class:"gitdiff-counts"},ai({class:"count-add"},`+${s.add??0}`),ai({class:"count-del"},`\u2212${s.del??0}`)):ai({class:"gitdiff-counts"},ai({class:"count-add"},"new")))}docView(){let s=this.viewing,a=s.kinds.filter(p=>p==="add").length,d=s.kinds.filter(p=>p==="del").length;return Zt({class:"diff-doc",tabIndex:0,onMounted:p=>p.focus(),onKeyDown:p=>{p.key==="Escape"&&(p.stopPropagation(),this.closeDoc())}},Zt({class:"diff-doc-head"},ai({class:["gitdiff-status",`s-${s.status}`]},s.status),ai({class:"diff-doc-path",title:`Open ${s.path}`,onClick:()=>tb.server.openFile(`${this.root}/${s.path}`)},s.path),ai({class:"gitdiff-counts"},ai({class:"count-add"},`+${a}`),ai({class:"count-del"},`\u2212${d}`)),Dc({class:"bulb-log-back",title:"Back to the conversation (Esc)",onClick:p=>{p.stopPropagation(),this.closeDoc()}},"\u2190 conversation")),Zt({class:"diff-doc-scroll"},Zt({class:"diff-doc-body"},s.kinds.length===0?Zt({class:"diff-doc-empty"},"No changes."):Zt({class:"diff-doc-code",key:`diff-code-${this.#e}`,onMounted:p=>{p.innerHTML=s.bodyHtml,this.#r(p)}},""),s.truncated?Zt({class:"diff-doc-trunc"},"Diff truncated \u2014 file too large to show in full."):null),s.kinds.length?this.ruler(s.kinds):null))}#r(s){if(!this.#n)return;this.#n=!1;let a=s.querySelector(".udiff-add, .udiff-del"),d=s.closest(".diff-doc-body");a&&d&&(d.scrollTop=a.offsetTop-d.clientHeight/3)}ruler(s){let a=s.length,d=[];return s.forEach((p,b)=>{if(p!=="add"&&p!=="del")return;let v=d[d.length-1];v&&v.kind===p&&v.start+v.len===b?v.len++:d.push({kind:p,start:b,len:1})}),Zt({class:"diff-ruler",title:"Jump to a change",onClick:p=>{let b=document.querySelector(".diff-doc-body"),v=p.currentTarget;if(!b)return;let w=(p.clientY-v.getBoundingClientRect().top)/v.clientHeight;b.scrollTop=w*b.scrollHeight-b.clientHeight/2}},d.map(p=>Zt({class:["diff-ruler-mark",p.kind],style:{top:`${p.start/a*100}%`,height:`${p.len/a*100}%`}})))}};var Yre=class extends wu{done=!1;#e;constructor(s){super(),this.#e=s}setText(s){this.#e=s}flash(){navigator.clipboard?.writeText(this.#e),this.done=!0,this.update(),setTimeout(()=>{this.done=!1,this.update()},600)}view(){return Dc({class:["overlay-pill","copy",this.done?"done":""],onClick:s=>{s.stopPropagation(),this.flash()}},this.done?"copied":"copy")}};var Xre=class extends wu{spread=!1;showingCode=!1;copied=!1;#e="";#n;#t;#r;#i;#s;#o;#c;#u=!1;#h=1;#g=!1;#a;#l="idle";constructor(s,a){super(),this.#n=s,this.#t=a,this.#r=kH(s);let d=yke(s);this.#i=d.length?d.join(" "):void 0}get name(){return this.#r}get key(){return this.#t}setChainPosition(s){this.#h=s}get chainPosition(){return this.#h}setMounted(s){s!==this.#u&&(this.#u=s,this.#d())}onAttached(){this.#d()}#d(){if(this.#u){if(this.#s||this.#g||this.#o)return;this.#g=!0,this.#a=new AbortController,uSt(this.#n,{signal:this.#a.signal,onError:s=>{this.#c=s,this.#p("runtime",s),this.update()},onReady:()=>this.#p(this.#i?"malformed":"ok",this.#i)}).then(s=>{this.#g=!1,this.#u&&(this.#s=s,this.update())}).catch(s=>{this.#g=!1,this.#o=s instanceof Error?s.message:String(s),this.#p("compile",this.#o),this.update()})}else{if(!this.#s&&!this.#g)return;this.#a?.abort(),this.#a=void 0,this.#s=void 0,this.#c=void 0,this.update()}}#p(s,a){let d=this.#r??this.#t,p=s==="ok"?"ok":s==="malformed"?`malformed: ${a}`:`${s} error: ${a}`;tb.server.logEmbedStatus(d,`[embed ${d} v${this.#h}] ${p}`).catch(()=>{})}dispose(){this.#a?.abort()}view(){let s=["embed","bulb-embed",this.spread?"spread":"fit",this.showingCode?"code-open":"",this.#o?"err":""],a=this.#r?`${this.#r} \u2014 `:"",d=this.#o?[`${a}could not render: ${this.#o}`]:this.#s?[this.#w(),Zt({class:"bulb-frame",key:"frame",onMounted:p=>{this.#s&&p.replaceChildren(this.#s)}}),this.showingCode?this.#A():null,this.#c?Zt({class:"bulb-err-strip",key:"err"},`\u26A0 ${a}${this.#c}`):null,this.#i?Zt({class:"bulb-warn-strip",key:"warn"},`\u26A0 ${a}malformed: ${this.#i}`):null]:["compiling bulb\u2026"];return Zt({class:"md",key:this.#t},Zt({class:s},...d))}#w(){let s=this.#l==="done"?this.#e:"breakout \u2197";return Zt({class:"bulb-controls",key:"controls"},this.#b("bulb-view",this.spread?"fit":"spread",this.spread?"Fit into the conversation column":"Spread to the full transcript width and height",()=>{this.spread=!this.spread,this.update()}),this.#b("bulb-toggle",this.showingCode?"run":"code",this.showingCode?"Back to the running bulb":"View this bulb's source",()=>{this.showingCode=!this.showingCode,this.update()}),this.#b(["bulb-copy",this.copied?"done":""],this.copied?"copied":"copy","Copy this bulb's full source",()=>this.#m()),Dc({class:["overlay-pill","bulb-breakout",this.#l==="busy"?"launching shimmer":""],type:"button",disabled:this.#l!=="idle",title:"Save as a standalone .bulb.md and open it with typebulb",onClick:a=>{a.stopPropagation(),this.#f()}},s))}#b(s,a,d,p){let b=Array.isArray(s)?s:[s];return Dc({class:["overlay-pill",...b],type:"button",title:d,onClick:v=>{v.stopPropagation(),p()}},a)}#m(){navigator.clipboard?.writeText(this.#n),this.copied=!0,this.update(),setTimeout(()=>{this.copied=!1,this.update()},1200)}async#f(){if(this.#l==="idle"){this.#l="busy",this.update();try{let{file:s,pid:a}=await tb.server.breakout(this.#n);this.#e=`launched ${s}`,window.dispatchEvent(new CustomEvent("tb-breakout",{detail:{pid:a}}))}catch(s){this.#e="breakout failed",console.error("[mirror] breakout failed",s)}this.#l="done",this.update(),setTimeout(()=>{this.#l="idle",this.update()},2500)}}#A(){return Zt({class:["bulb-code","md"],key:"code",tabIndex:0,onKeyDown:s=>{if(!((s.ctrlKey||s.metaKey)&&(s.key==="a"||s.key==="A")))return;s.preventDefault();let a=getSelection();if(!a)return;let d=document.createRange();d.selectNodeContents(s.currentTarget),a.removeAllRanges(),a.addRange(d)},onMounted:s=>{s.innerHTML=nD.render(xH(this.#n))}})}};function gSt(o){return o.map((s,a)=>!!s&&o[a+1]===s)}function bSt(o){let s=[];for(let a=0;a<o.length;a++)s[a]=a>0&&o[a]&&o[a]===o[a-1]?s[a-1]+1:1;return s}var mSt=".typebulb/paste",wSt={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp"};var mvn=new RegExp(`@${mSt.replace(/\./g,"\\.")}/([\\w-]+(?:\\.[\\w-]+)*\\.(?:${Object.keys(wSt).join("|")}))`,"gi"),wvn=new URL("typebulb.png",import.meta.url).href,Avn=new URL("typebulb-inv.png",import.meta.url).href;function vvn(o){return!o||typeof o!="object"?"":Qd(o.command)??Qd(o.file_path)??Qd(o.path)??Qd(o.pattern)??Qd(o.query)??Qd(o.url)??Qd(o.skill)??Qd(o.description)??""}function yvn(o){let s=o.indexOf(`
|
|
1445
1445
|
`);return s===-1?o:o.slice(0,s).trimEnd()+" \u2026"}var Uxe=o=>Ob("caret",["caret-tri",o?"open":""]),kvn=()=>Ob("fork","fork-icon");function kSt(o){return/^@@/m.test(o)&&/^[+-]/m.test(o)}function ASt(o){let s=[],a=!1;for(let d of o.split(`
|
|
1446
1446
|
`))d.startsWith("@@")?(a&&s.push(Zt({class:"udiff-gap"},"\u22EF")),a=!0):/^[+-]/.test(d)&&!d.startsWith("+++")&&!d.startsWith("---")&&s.push(Zt({class:["udiff-line",d.startsWith("+")?"udiff-add":"udiff-del"]},d.slice(1)));return Zt({class:"udiff"},s)}var xvn=new Set(["Read","Edit","Write","MultiEdit","NotebookEdit","Glob","Grep"]),Evn=new Set(["Edit","Write","MultiEdit","NotebookEdit"]);function Cvn(o,s){if(!(!xvn.has(o)||!s||typeof s!="object"))return(Qd(s.file_path)??Qd(s.path))||void 0}function Ivn(o){let s=o.input??{};switch(o.name){case"Edit":return[{old:Qd(s.old_string),new:Qd(s.new_string)}];case"Write":return[{new:Qd(s.content)}];case"NotebookEdit":return[{new:Qd(s.new_source)}];case"MultiEdit":return Array.isArray(s.edits)?s.edits.map(a=>({old:a?.old_string,new:a?.new_string})):void 0;default:return}}function Kxe(o){let s=/^mcp__(.+?)__(.+)$/.exec(o);return s?`${s[1][0].toUpperCase()}${s[1].slice(1)} [${s[2]}]`:o}function vSt(o){return Object.values(o.input??{}).filter(s=>typeof s=="string"&&kSt(s))}function ySt(o){return o.name==="TodoWrite"&&Array.isArray(o.input?.todos)?o.input.todos:void 0}function Svn(o){let s=o.filter(d=>d.status==="completed").length,a=o.find(d=>d.status==="in_progress");return`${s}/${o.length} done${a?` \xB7 \u25FC ${a.activeForm??a.content??""}`:""}`}function Tvn(o){let s=new Map;for(let p of o)for(let b of p.tools)s.set(Kxe(b.name),(s.get(Kxe(b.name))??0)+1);let a=[...s].map(([p,b])=>b>1?`${p} \xD7${b}`:p).join(", "),d=o.length;return`${d} step${d===1?"":"s"}${a?` \xB7 ${a}`:""}`}function zxe(o,s){o.has(s)?o.delete(s):o.add(s)}var Vre=class extends wu{messages=[];openTools=new Set;expandedTurns=new Set;expandedForks=new Set;expandedEmbeds=new Set;copyButtons=[];bulbEmbeds=[];scrollEl;#e=0;#n=0;#t=new Set;#r=!0;#i=new Map;#s=0;#o=!1;#c=new Map;get parent(){return this.ctx.parent}clear(){for(let s of this.bulbEmbeds)s.dispose();this.messages=[],this.expandedTurns.clear(),this.expandedForks.clear(),this.expandedEmbeds.clear(),this.#c.clear(),this.#t=new Set,this.copyButtons=[],this.bulbEmbeds=[]}#u(s){let a=new Yre(s);return this.copyButtons.push(a),a}#h(s){let a={...s,copy:s.text?this.#u(s.text):void 0};return this.messages.push(a),a}#g(){let s=[];for(let a=this.messages.length-1;a>=0;a--){let d=this.messages[a];if(d.role==="user")break;d.text&&s.unshift(d.text)}return s.join(`
|
|
1447
1447
|
|
|
@@ -2217,7 +2217,7 @@ var Patcher = class _Patcher {
|
|
|
2217
2217
|
|
|
2218
2218
|
// cli/agents/pi/server/piPatcherExtension.ts
|
|
2219
2219
|
var DESCRIPTION = true ? "Apply unified diffs to files \u2014 tolerant of form, strict about intent. Repairs sloppy AI-generated diffs (mangled headers, whitespace drift, missing prefixes; line numbers can be wrong or absent \u2014 hunks anchor by fuzzy-matched context lines) and applies all hunks atomically when the intent is unambiguous; fails with a precise, typed error when it isn't. Use for multi-hunk edits in one step, or when exact string-replacement editing fails on whitespace or invisible characters." : "Apply unified diffs to files.";
|
|
2220
|
-
var BUILD_TAG = true ? "matchu-patchu-pi 0.2.0, built 2026-07-15
|
|
2220
|
+
var BUILD_TAG = true ? "matchu-patchu-pi 0.2.0, built 2026-07-15 10:42:56" : "matchu-patchu-pi dev";
|
|
2221
2221
|
var errorBlocks = (errors) => {
|
|
2222
2222
|
const parts = [`Patch failed with ${errors.length} error(s):`];
|
|
2223
2223
|
for (const e of errors) parts.push("", e.toString());
|
package/dist/index.js
CHANGED
|
@@ -1874,5 +1874,5 @@ ${mT}
|
|
|
1874
1874
|
`);let a=0,c=Promise.resolve();jt({target:r,onChange:()=>{let l=++a;c=c.then(async()=>{if(l===a)try{console.log("Re-running..."),await o()}catch(d){console.error("Error:",d)}})}})}}import{Console as wT}from"node:console";Pe();async function xg(r,e,t,n){ET();try{let f=mr(await W(),r)[0];f&&(Si(f.pid,Te(f.pid).offset),console.error(`note: 'call' boots a fresh server.ts instance; the running server (${f.url}) is not contacted \u2014 state shared with it must live on disk.`))}catch{}let s=_e(t),{bulb:i,config:o}=await we(r);i.server||Bn("This bulb has no **server.ts** block; nothing to call."),ft(s,r,i.server);let a;try{a=await vn(i.server,r,n,o.dependencies)}catch(f){Bn(f instanceof Error?f.message:String(f))}let c=io(a,e.fn);if(!c){let f=[...Object.keys(a).filter(p=>typeof a[p]=="function"),...Object.keys(so)];Bn(`Function '${e.fn}' not found. Available: ${f.length?f.join(", "):"(none)"}.`)}let l=await vT(e);if(oo(c)){try{for await(let f of c(...l))await kg(JSON.stringify(f,Eg)+`
|
|
1875
1875
|
`)}catch(f){Bn(f instanceof Error?f.stack??f.message:String(f))}return Sg(0)}let d;try{d=await c(...l)}catch(f){Bn(f instanceof Error?f.stack??f.message:String(f))}let u=xT(d);u!==void 0&&await kg(u+`
|
|
1876
1876
|
`),Sg(0)}function Sg(r){process.exitCode=r,setTimeout(()=>process.exit(r),2e3).unref?.()}async function vT(r){if(r.hasArgsFlag){let e=r.argsJson??"";return e==="-"&&(e=await AT()),kT(e)}return ST(r.positional)}function ST(r){return r.map(e=>{try{return JSON.parse(e)}catch{return e}})}function kT(r){let e;try{e=JSON.parse(r)}catch(t){throw new Error(`--args must be a JSON array: ${t instanceof Error?t.message:String(t)}`)}if(!Array.isArray(e))throw new Error(`--args must be a JSON array, got ${e===null?"null":typeof e}`);return e}function xT(r){if(r!==void 0)return JSON.stringify(r,Eg,2)}function Eg(r,e){return typeof e=="bigint"?e.toString():e}function Bn(r){process.stderr.write(r+`
|
|
1877
|
-
`),process.exit(1)}function ET(){let r=new wT(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function kg(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function AT(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var Pl="0.26.
|
|
1877
|
+
`),process.exit(1)}function ET(){let r=new wT(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function kg(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function AT(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var Pl="0.26.2";function Ag(r,e){r||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
|
|
1878
1878
|
${e}`),process.exit(1))}async function TT(){let r=Ul(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${Pl}`),process.exit(0)),r.help&&(Jl(),process.exit(0)),Hh(),r.subcommand==="logs"){await tg(r.file||void 0,{follow:r.follow,clear:r.clear,run:r.run,lines:r.lines});return}if(r.subcommand==="wait"){await rg(r.file||void 0,{match:r.match,timeoutSec:r.timeoutSec});return}if(r.subcommand==="stop"){r.stopScope?await sg(r.stopScope):await ng(r.file||void 0);return}if(r.subcommand==="send"){await og(r.file,r.sendMessage,r.sendWaitMs??0);return}if(r.subcommand==="skill"){await Xh(Pl);return}if(r.subcommand==="models"){await zh(r.mode);return}if(r.subcommand==="agent"){await(r.agentTarget?bg(r):Gh(Pl));return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await Kh(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let c=await $p(process.cwd());c||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=c}else e=Ft.resolve(r.file);await Tg.access(e).then(()=>!0,()=>!1)||(Er().includes(r.file)&&(console.error(`To open the ${r.file} agent mirror, run: npx typebulb agent:${r.file}`),process.exit(1)),console.error(`File not found: ${e}`),process.exit(1)),e.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1));let n=r.file&&r.file!=="."?r.file:Ft.relative(process.cwd(),e)||Ft.basename(e),s=`npx typebulb --trust ${n.includes(" ")?`"${n}"`:n}`;if(r.subcommand==="predict"){await Jh(e,s);return}let i=!r.noTrust&&_t(e);i&&!r.trust&&console.error("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||i;let o;try{o=await we(e)}catch{}let a;if(r.local){o&&!(r.local.name in(o.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),o&&r.subcommand!=="call"&&(!o.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{a=await Fl(r.local)}catch(c){console.error(c instanceof Error?c.message:String(c)),process.exit(1)}console.error(`replace: ${a.name} \u2192 ${Ft.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await Uh(e,a);return}if(r.subcommand==="call"){Ag(r.trust,s),await xg(e,{fn:r.fn,positional:r.callArgs,argsJson:r.argsJson,hasArgsFlag:r.hasArgsFlag},r.mode,a);return}if(o&&o.bulb.server&&(Us(o.bulb)||r.server)){Ag(r.trust,s),await vg(e,r.watch,r.mode,a);return}await mg(e,r,s,a)}TT().catch(r=>{console.error("Error:",r.message),process.exit(1)});
|
package/package.json
CHANGED