typebulb 0.61.5 → 0.61.6
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/styles.css +2 -0
- package/dist/agents/codex/styles.css +2 -0
- package/dist/agents/pi/styles.css +2 -0
- package/dist/index.js +1 -1
- 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.61.
|
|
4
|
+
version: 0.61.6
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
> Generated from typebulb v0.61.
|
|
7
|
+
> Generated from typebulb v0.61.6. `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
|
|
|
@@ -384,6 +384,8 @@ body {
|
|
|
384
384
|
padding: .3rem .55rem;
|
|
385
385
|
background: var(--panel);
|
|
386
386
|
color: var(--fg);
|
|
387
|
+
/* A shimmering host paints its text transparent (.shimmer-text), and the tip would inherit that. */
|
|
388
|
+
-webkit-text-fill-color: var(--fg);
|
|
387
389
|
border: 1px solid var(--border);
|
|
388
390
|
border-radius: 8px;
|
|
389
391
|
box-shadow: 0 8px 30px rgba(0, 0, 0, .45);
|
|
@@ -384,6 +384,8 @@ body {
|
|
|
384
384
|
padding: .3rem .55rem;
|
|
385
385
|
background: var(--panel);
|
|
386
386
|
color: var(--fg);
|
|
387
|
+
/* A shimmering host paints its text transparent (.shimmer-text), and the tip would inherit that. */
|
|
388
|
+
-webkit-text-fill-color: var(--fg);
|
|
387
389
|
border: 1px solid var(--border);
|
|
388
390
|
border-radius: 8px;
|
|
389
391
|
box-shadow: 0 8px 30px rgba(0, 0, 0, .45);
|
|
@@ -384,6 +384,8 @@ body {
|
|
|
384
384
|
padding: .3rem .55rem;
|
|
385
385
|
background: var(--panel);
|
|
386
386
|
color: var(--fg);
|
|
387
|
+
/* A shimmering host paints its text transparent (.shimmer-text), and the tip would inherit that. */
|
|
388
|
+
-webkit-text-fill-color: var(--fg);
|
|
387
389
|
border: 1px solid var(--border);
|
|
388
390
|
border-radius: 8px;
|
|
389
391
|
box-shadow: 0 8px 30px rgba(0, 0, 0, .45);
|
package/dist/index.js
CHANGED
|
@@ -314,7 +314,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
314
314
|
`))if(t.trim())try{let r=JSON.parse(t);if(r.type==="turn_context"&&typeof r.payload?.model=="string")return r.payload.model}catch{}}var QT,ws,_u,nO,iO,oO,aO,lO,hO,bO,Mo,dy,Qn,vO,Ru=k(()=>{"use strict";ys();_o();Co();QT=["<permissions instructions>","<apps_instructions>","<plugins_instructions>","<skills_instructions>","<recommended_plugins>","<environment_context>","<node_repl_review_evidence>","# AGENTS.md instructions for "];ws=n=>!!n&&typeof n=="object"&&!Array.isArray(n),_u=n=>n==="shell_command"||n==="exec_command",nO=new Set(["max_output_tokens","yield_time_ms","timeout_ms"]);iO=/^(Get-Content|gc|cat|type|nl|bat|sed|head|tail)$/i,oO=/^-(Path|LiteralPath)$/i,aO=/^-(Encoding|TotalCount|Head|Tail|ReadCount|Delimiter)$/i,lO=/^(sed -n|head|tail|Select-Object|select)(\s|$)/i;hO={n:`
|
|
315
315
|
`,t:" ",r:"\r",b:"\b",f:"\f",v:"\v",0:"\0"};bO=n=>n?n.replace(/\r?\n$/,"").split(`
|
|
316
316
|
`).length:0;Mo=n=>{let e=XT(n);return process.platform==="win32"?e.toLowerCase():e},dy=12e4,Qn=class n extends Bt{constructor(t=Cu(ly(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";#t=0;#l;#n=!1;#i;#h=0;#s=new Map;#d=new Map;#o=new Map;#c=new Map;detectsSelf(){return!!process.env.CODEX_THREAD_ID}forRead(){return new n(this.root)}callerSessionId(t){let r=process.env.CODEX_THREAD_ID;return r?this.listSessionFiles(t).find(s=>s.sessionId.endsWith(r))?.sessionId:void 0}detectsInstalled(){return GT(Cu(ly(),".codex"))}sessionsDir(t){return this.root}listSessionFiles(t){let r=Mo(t),s=[];for(let i of this.#u()){let o=0,a=0;try{let f=Lo(i);if(!f.isFile())continue;o=f.size,a=f.mtimeMs}catch{continue}let l=this.#s.get(i);if(l===void 0){if(l=fy(i),l===void 0)continue;this.#s.set(i,l)}if(l.subagent||Mo(l.cwd)!==r)continue;let c=ay(i,".jsonl");this.#o.set(c,i),s.push({sessionId:c,file:i,mtime:this.#e(i,o,a)})}return s}listChildren(t,r){let s=Mo(t),i=new Map,o,a;for(let f of this.#u()){let d=0,u=0,p;try{let v=Lo(f);if(!v.isFile())continue;d=v.size,u=v.mtimeMs,p=v.birthtimeMs||void 0}catch{continue}let m=this.#s.get(f);if(m===void 0){if(m=fy(f),m===void 0)continue;this.#s.set(f,m)}if(ay(f,".jsonl")===r&&(o=m.id,a=m.model),!m.spawn||Mo(m.cwd)!==s)continue;let{running:h,tokens:y}=this.#r(f,d,u);i.set(m.spawn.id,{file:f,mtime:this.#e(f,d,u),started:p,running:h,tokens:y,spawn:m.spawn,model:m.model})}if(!o)return[];let l=(f,d=new Set)=>{if(f.parent===o)return!0;if(d.has(f.id))return!1;d.add(f.id);let u=i.get(f.parent);return u?l(u.spawn,d):!1},c=[];for(let{file:f,mtime:d,started:u,running:p,tokens:m,spawn:h,model:y}of i.values())l(h)&&c.push({id:h.id,file:f,mtime:d,started:u,tokens:m,label:h.path.split("/").filter(Boolean).pop()??h.path,kind:h.role||void 0,model:y&&y!==a?y:void 0,parentId:i.has(h.parent)?h.parent:void 0,depth:h.depth,stopped:!1,running:p});return c}sessionsWorking(t){let r=new Set,s=Date.now();for(let{sessionId:i,file:o,mtime:a}of this.listSessionFiles(t)){if(s-a>=dy)continue;let l;try{let c=Lo(o);l=this.#r(o,c.size,c.mtimeMs)}catch{continue}l.running&&r.add(i)}return r}#e(t,r,s){return Math.max(s,this.#r(t,r,s).ms??0)}#r(t,r,s){let i=this.#d.get(t);if(i&&i.size===r&&i.mtime===s)return i;let o={size:r,mtime:s,...SO(t)};return this.#d.set(t,o),o}#u(){let t=[],r=s=>{try{return VT(s).map(i=>Cu(s,i))}catch{return[]}};for(let s of r(this.root))for(let i of r(s))for(let o of r(i))for(let a of r(o))a.endsWith(".jsonl")&&t.push(a);return t}parseEntry(t){let r;try{r=JSON.parse(t)}catch{return null}return!r||typeof r.type!="string"?null:r}idOf(t){return t.ord===void 0&&(this.#a(t),t.ord=String(this.#t++),t.parent=this.#l,this.#l=t.ord),t.ord}#a(t){let r=t.payload;if(t.type==="session_meta"){if(++this.#h===1){let s=typeof r?.source=="object"?r.source?.subagent?.thread_spawn:void 0;this.#i=s?.agent_path,this.#n=!!s}}else this.#h=0,this.#n&&r?.type==="agent_message"&&r.recipient===this.#i&&(this.#n=!1);t.inherited=this.#n}parentOf(t){return t.parent}timestampOf(t){return t.timestamp}isSidechain(t,r){return r==="child"&&!!t.inherited}isLeafType(t){return!0}isRecoveryNoise(t){return!1}apply(t,r){let s=[],i=t.payload;if(!i)return{events:s};let o=()=>{let a=Date.parse(t.timestamp??"");return!isNaN(a)&&a>=r};if(t.type==="response_item"){if(i.type==="message"){if(i.role==="user"){let a=Xn(i.content,!0).trim();a&&s.push({type:"user",text:a})}else if(i.role==="assistant"){let a=Xn(i.content,!1);a&&s.push({type:"assistant",text:a,thinking:"",tools:[],live:o()})}return{events:s}}if(i.type==="reasoning"){let a=Xn(i.summary,!1);return a&&s.push({type:"assistant",text:"",thinking:a,tools:[],live:o()}),{events:s}}if(i.type==="custom_tool_call"||i.type==="function_call"){let a=i.call_id??"",{pending:l,...c}=i.type==="custom_tool_call"?tO(i.name??"",i.input):{name:i.name??"",input:wO(i.arguments)};return l&&this.#c.set(a,l),s.push({type:"assistant",text:"",thinking:"",tools:[{id:a,...c}],live:o()}),{events:s}}if(i.type==="custom_tool_call_output"||i.type==="function_call_output"){let a=i.call_id??"",l=this.#c.get(a);return this.#c.delete(a),s.push({type:"tool_result",id:a,...gO(eO(i.output),l)}),{events:s}}return{events:s}}if(t.type==="event_msg"){if(i.type==="token_count"){let a=i.info?.last_token_usage;return a?{events:s,usage:gy(a)}:{events:s}}return{events:s}}return t.type==="turn_context"?{events:s,model:i.model}:{events:s}}chainWorking(t){let r=!1;for(let s of t){if(s.type!=="event_msg")continue;let i=s.payload?.type;i==="task_started"?r=!0:(i==="task_complete"||i==="turn_aborted")&&(r=!1)}return r}sessionAlive(t){let r=this.#o.get(t);if(!r)return;let s;try{let i=Lo(r);s=this.#e(r,i.size,i.mtimeMs)}catch{return}return Date.now()-s<dy}readPreview(t){for(let r of(xu(t,256*1024)?.text??"").split(`
|
|
317
|
-
`))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Xn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.
|
|
317
|
+
`))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Xn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.6"});var Py={};wi(Py,{agentViewerCommand:()=>By,bulbServerCommand:()=>Dy,clearServerLog:()=>Bu,findProjectViewer:()=>zo,isAlive:()=>er,isMirror:()=>ye,isProjectBulb:()=>Ju,isProjectMirror:()=>rr,launchAgentViewer:()=>Hu,launchBulbServer:()=>xs,listBulbServers:()=>Z,probePageCount:()=>Ku,readServerLog:()=>Ve,readWaitCursor:()=>Ho,recordDenial:()=>qu,registerServer:()=>Uu,relayOpen:()=>Wu,runMarker:()=>ju,serverLogPath:()=>nr,serversForBulb:()=>hn,sliceRunLog:()=>Fu,startServerLog:()=>ks,stopBulbServer:()=>tr,stopServer:()=>Ft,stopServersForBulb:()=>Yo,typebulbBinPath:()=>sr,unregisterServer:()=>pn,writeWaitCursor:()=>Ss});import{spawn as Cy}from"child_process";import{readdir as DO,readFile as Iy,writeFile as Ny,unlink as $u,mkdir as BO}from"fs/promises";import{mkdirSync as $y,writeFileSync as Ko,appendFileSync as jO,readFileSync as Lu}from"fs";import*as Oe from"path";import{fileURLToPath as FO}from"url";function Mu(n){return Oe.join(ht(),`${n}.json`)}function nr(n){return Oe.join(ht(),`${n}.log`)}function Du(n){return Oe.join(ht(),`${n}.wait.json`)}function Ly(n){try{let e=JSON.parse(Lu(Du(n),"utf8"));return e.cursors&&typeof e.cursors=="object"?e.cursors:{}}catch{return{}}}function Ho(n,e=""){let t=Ly(n)[e];return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Ss(n,e,t=""){try{$y(ht(),{recursive:!0});let r=Ly(n);r[t]=e,Ko(Du(n),JSON.stringify({cursors:r}))}catch{}}function ks(n){let e=nr(n);try{$y(ht(),{recursive:!0}),Ko(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),r=process.stderr.write.bind(process.stderr),s=0,i=!1,o=a=>{if(!i)try{let l=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(jO(e,l),s+=l.length,s>2*_y){let c=Lu(e),f=c.subarray(Math.max(0,c.length-_y));Ko(e,f),s=f.length}}catch{i=!0}};return process.stdout.write=((a,...l)=>(o(a),t(a,...l))),process.stderr.write=((a,...l)=>(o(a),r(a,...l))),()=>{process.stdout.write=t,process.stderr.write=r}}function Bu(n){try{Ko(nr(n),"")}catch{}}function Ve(n,e=0){try{let t=Lu(nr(n)),r=e>=0&&e<=t.length?e:0;return{text:t.subarray(r).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function ju(n){return`\u2500\u2500 run ${n} \u2500\u2500 ${new Date().toTimeString().slice(0,8)}`}function qO(n){let e=UO.exec(n);return e?Number(e[1]):void 0}function Fu(n,e){let t=n.split(`
|
|
318
318
|
`),r=[];if(t.forEach((o,a)=>{let l=qO(o);l!==void 0&&r.push({id:l,idx:a})}),!r.length)return e==="latest"?n:"";let s=e==="latest"?r[r.length-1]:r.find(o=>o.id===e);if(!s)return"";let i=r.find(o=>o.idx>s.idx);return t.slice(s.idx,i?i.idx:t.length).join(`
|
|
319
319
|
`)}function er(n){try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}async function Uu(n){try{await BO(ht(),{recursive:!0}),await Ny(Mu(n.pid),JSON.stringify({version:Le,...n}))}catch{pt()}}async function qu(n,e){let t=Mu(n);try{let r=JSON.parse(await Iy(t,"utf8"));if(r.denied===e)return;r.denied=e,await Ny(t,JSON.stringify(r))}catch{}}async function pn(n){await $u(Mu(n)).catch(()=>{}),await $u(nr(n)).catch(()=>{}),await $u(Du(n)).catch(()=>{})}function ye(n){return n.agent!=null}function rr(n,e){return ye(n)&&n.cwd!=null&&re(n.cwd)===re(e)}function Ju(n,e){return!ye(n)&&wy(n.file,e)}async function Z(n){let e;try{e=await DO(ht())}catch{return[]}let t=[];return await Promise.all(e.map(async s=>{if(!/^\d+\.json$/.test(s))return;let i=parseInt(s,10),o;try{o=JSON.parse(await Iy(Oe.join(ht(),s),"utf8"))}catch{await pn(i);return}o&&typeof o.pid=="number"&&er(o.pid)?t.push(o):await pn(i)})),(n?t.filter(s=>Ju(s,n)):t).sort((s,i)=>s.startedAt-i.startedAt)}async function zo(n,e){return(await Z()).find(t=>rr(t,n)&&(e?t.agent===e:!0))}async function Wu(n,e){let t=new URL(n).port,r=(await Z()).filter(a=>String(a.port)!==t),s=r.filter(a=>rr(a,e)),i=r.filter(a=>Ju(a,e)),o=0;for(let a of[...s,...i])try{let l=await fetch(`${a.url}/__open`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:n}),signal:AbortSignal.timeout(2e3)});if(!l.ok)continue;let{opened:c,pages:f}=await l.json();if(c)return{where:"editor",via:a.agent?"the agent mirror":`${Oe.basename(a.file)}'s page`};ye(a)&&(o+=f??0)}catch{}return o>0?{where:"external"}:void 0}async function tr(n){try{process.kill(n,"SIGTERM")}catch{}await pn(n)}async function Ku(n){try{let e=await fetch(`${n.url}/__pages`,{signal:AbortSignal.timeout(JO)});if(!e.ok)return;let{pages:t}=await e.json();return typeof t=="number"?t:void 0}catch{return}}async function Ft(n,e=ye(n)?"keep":"close"){try{let t=await fetch(`${n.url}/__stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pages:e}),signal:AbortSignal.timeout(Ry)});if(!t.ok)throw new Error(`/__stop ${t.status}`);let{closed:r=0,stuck:s=0}=await t.json(),i=Date.now()+Ry;for(;er(n.pid)&&Date.now()<i;)await My(100);return er(n.pid)?(await tr(n.pid),"killed"):(await pn(n.pid),{closed:r,stuck:s})}catch{return await tr(n.pid),"killed"}}function hn(n,e){let t=re(e);return n.filter(r=>!ye(r)&&r.pid!==process.pid&&re(r.file)===t)}async function Yo(n,e){let t=hn(await Z(),n);for(let r of t)await Ft(r,e!==void 0&&r.port===e?"keep":"close");return t}function WO(n,e,t){(process.platform==="win32"?Cy("cmd",["/c","start","","/b",n,...e],{cwd:t,stdio:"ignore",windowsHide:!0}):Cy(n,e,{cwd:t,detached:!0,stdio:"ignore"})).unref()}function sr(){return Oe.join(Oe.dirname(FO(import.meta.url)),"index.js")}function Dy(n,e={}){return{command:process.execPath,args:[sr(),...e.trust?["--trust"]:[],...e.mode?["--mode",e.mode]:[],n,...e.open===!1?["--no-open"]:[]]}}function By(n){return{command:process.execPath,args:[sr(),`agent:${n}`,"--no-open"]}}async function jy(n,e,t,r){let s=await n();if(s)return s;WO(e.command,e.args,t);let i=Date.now()+2e4;for(;Date.now()<i;){await My(150);let o=await n();if(o)return o}throw new Error(`Launched ${r} but it did not register within 20s.`)}async function xs(n,e={}){let t=e.cwd??process.cwd(),r=Oe.resolve(t,n),s=await Zn({kind:"bulb",file:r},t),[i]=await Yo(r,s),o={...e,mode:e.mode??i?.mode};return jy(async()=>hn(await Z(),r)[0],Dy(n,o),t,Oe.basename(n))}async function Hu(n,e=process.cwd()){return jy(()=>zo(e,n),By(n),e,`the ${n} mirror`)}var _y,UO,Ry,JO,My,$e=k(()=>{"use strict";Ye();fn();Wo();_y=1e6;UO=/^── run (\d+) ── /;Ry=6e3,JO=500;My=n=>new Promise(e=>setTimeout(e,n))});function ir(n){return{...xp(n),server:n.files.get("server.ts")??""}}function Vo(n){return!!n.server&&!n.code}var Es=k(()=>{"use strict";ee();ee()});function Go(n){let e=/^---[^\n]*\n([\s\S]*?)\n---/.exec(n),t=e?/^\s*name:\s*(.+?)\s*$/m.exec(e[1]):null;return t?t[1].replace(/^["']|["']$/g,""):void 0}function zu(n){return Yn(Go(n)??"bulb")||"bulb"}var Yu=k(()=>{"use strict";ee()});import{readdirSync as KO,readFileSync as HO,statSync as zO}from"fs";import{join as Fy,basename as YO}from"path";function qy(n,e,t){if(e>8)return t;let r;try{r=KO(n,{withFileTypes:!0})}catch{return t}for(let s of r)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;qy(Fy(n,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(Fy(n,s.name));return t}function VO(n,e){let t,r=!1;try{let s=HO(n,"utf8");t=Go(s.slice(0,1024));let i=We(s);r=!!i&&Vo(ir(i))}catch{}return{mtime:e,name:t??YO(n).replace(/\.bulb\.md$/,""),serverOnly:r}}function Xo(n){let e=new Map,t=qy(n,0,[]).map(r=>{let s=0;try{s=zO(r).mtimeMs}catch{}let i=s?Uy.get(r):void 0,o=i?.mtime===s?i:VO(r,s);return s&&e.set(r,o),{path:r,...o}});return Uy=e,t}var Uy,Jy=k(()=>{"use strict";ee();Es();Yu();Uy=new Map});function or(n){if(n.server.trim())return"server-side code (server.ts)";let e=n.code;if(/\btb\s*\.\s*fs\b/.test(e)||e.includes("/__fs"))return"the filesystem";if(/\btb\s*\.\s*ai\b/.test(e)||e.includes("/__ai")||n.infer.trim()||/\btb\s*\.\s*infer\b/.test(e))return"AI (your API keys)";if(/\btb\s*\.\s*server\s*\.\s*\w/.test(e)||e.includes("/__api"))return"server-side code (server.ts)"}var Qo=k(()=>{"use strict"});import{readFile as GO}from"fs/promises";async function Vu(n){try{let e=We(await GO(n,"utf-8"));return e?or(ir(e)):void 0}catch{return}}var Wy=k(()=>{"use strict";Es();Qo()});function Gu(n){let e=n.split(""),t=(i,o)=>{for(let a=i;a<o&&a<e.length;a++)e[a]!==`
|
|
320
320
|
`&&(e[a]=" ")},r=0,s="";for(;r<n.length;){let i=n[r],o=n[r+1];if(i==="/"&&o==="/"){let a=r;for(;a<n.length&&n[a]!==`
|