typebulb 0.10.7 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import*as Vn from"fs/promises";import*as q from"path";import*as sr from"fs/promises";import{existsSync as ae,readFileSync as Hn}from"fs";import*as P from"path";import{pathToFileURL as qn}from"url";import{resolve as St}from"resolve.exports";import{init as or,parse as ir}from"es-module-lexer";function ar(r,e){let t=P.join(r,"package.json");try{return JSON.parse(Hn(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var xt=["browser","import","default"],nr=["node","import","default"];function cr(r){let e=r.indexOf("=");if(e===-1)throw new Error(`--replace must be <name>=<path> (got '${r}')`);let t=r.slice(0,e).trim(),n=r.slice(e+1).trim();if(!t)throw new Error(`--replace missing package name (got '${r}')`);if(!n)throw new Error(`--replace missing path for '${t}'`);if(t.startsWith("@"))throw new Error(`--replace does not support scoped names yet; '${t}' is scoped`);return{name:t,dir:P.resolve(n)}}async function lr(r){let{name:e,dir:t}=r;if(!ae(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let n=ar(t,e),s=zn(n,e),o=P.resolve(t,s);if(!ae(o))throw new Error(`--replace package '${e}' entry not found on disk: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);let i=P.dirname(o),a=`/local/${e}/${P.basename(o)}`,c=Gn(n,t);return await Kn(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function zn(r,e){if(r.exports!==void 0){let n;try{n=St(r,".",{browser:!0,conditions:xt})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${xt.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=Pt(n);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${xt.join(", ")}); too complex to override.`);return s}let t=r.module??r.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function Gn(r,e){if(r.exports!==void 0)try{let n=St(r,".",{conditions:["types"]}),s=Pt(n);if(s){let o=P.resolve(e,s);if(ae(o))return o}}catch{}let t=r.types??r.typings;if(t){let n=P.resolve(e,t);if(ae(n))return n}}function Pt(r){if(typeof r=="string")return r;if(Array.isArray(r))return r.find(e=>typeof e=="string")}async function Kn(r,e,t){await or;let n=P.normalize(t),s=new Set,o=[e];for(;o.length;){let i=o.shift();if(s.has(i))continue;s.add(i);let a;try{a=await sr.readFile(i,"utf8")}catch{continue}let c,l;try{[c,,,l]=ir(a,i)}catch{continue}if(i===e&&!l)throw new Error(`override package '${r}' entry is not an ES module (no import/export syntax); CommonJS or non-module entries aren't supported (esm.sh would have to transform it).`);for(let p of c){if(p.d===-2)continue;let d=p.n;if(d&&!d.startsWith("node:")){if(d.startsWith("./")||d.startsWith("../")||d.startsWith("/")){let m=Yn(i,d,n);m&&!s.has(m)&&o.push(m);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${r} externalizes '${d}'`)}}}}function Yn(r,e,t){let n=e.replace(/[?#].*$/,""),s=P.resolve(P.dirname(r),n),o=[s,s+".js",s+".mjs",P.join(s,"index.js"),P.join(s,"index.mjs")];for(let i of o)if(P.normalize(i).startsWith(t)&&ae(i))return i}function Xn(r,e,t){let n=ar(r,e),s;if(n.exports!==void 0)try{s=Pt(St(n,t,{conditions:nr}))}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${nr.join(", ")}): ${i instanceof Error?i.message:i}`)}else t==="."&&(s=n.main??n.module);if(!s)throw new Error(`--replace package '${e}' has no node export for '${t}'.`);let o=P.resolve(r,s);if(!ae(o))throw new Error(`--replace package '${e}' built file not found: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);return qn(o).href}async function dr(r,e){await or;let t;try{[t]=ir(r)}catch{return r}let n="",s=0;for(let o of t){if(o.d!==-1)continue;let i=o.n;if(!i||i!==e.name&&!i.startsWith(e.name+"/"))continue;let a=i===e.name?".":"."+i.slice(e.name.length),c=Xn(e.dir,e.name,a);n+=r.slice(s,o.s)+c,s=o.e}return n+r.slice(s)}function ur(r){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,noTrust:!1,follow:!1,help:!1,version:!1},t=["check","predict","logs","stop","trust","untrust","skill","models"],n=r[0];if(n==="agent"||n?.startsWith("agent:")){e.subcommand="agent";let s=n.indexOf(":");if(s!==-1){let o=n.slice(s+1);o&&(e.agentTarget=o)}r=r.slice(1)}else n&&t.includes(n)&&(e.subcommand=n,r=r.slice(1));for(let s=0;s<r.length;s++){let o=r[s];if(o==="--help"||o==="-h")e.help=!0;else if(o==="--version"||o==="-V")e.version=!0;else if(o==="--no-watch")e.watch=!1;else if(o==="--no-open")e.open=!1;else if(o==="--server")e.server=!0;else if(o==="--trust")e.trust=!0;else if(o==="--no-trust")e.noTrust=!0;else if(o==="--mode"){let i=r[++s];(!i||i.startsWith("-"))&&(console.error("Missing value for --mode (e.g. --mode staging)"),process.exit(1)),e.mode=i}else if(o==="--follow"||o==="-f")e.follow=!0;else if(o==="--lines"||o==="-n"){let i=parseInt(r[++s],10);(isNaN(i)||i<0)&&(console.error(`Invalid --lines value: ${r[s]}`),process.exit(1)),e.lines=i}else if(o==="--port"||o==="-p"){let i=r[++s],a=parseInt(i,10);isNaN(a)&&(console.error(`Invalid port: ${i}`),process.exit(1)),e.port=a}else if(o==="--replace"||o.startsWith("--replace=")){let i=o.startsWith("--replace=")?o.slice(10):r[++s]??"";try{let a=cr(i);if(e.local)throw new Error(`--replace can only be used once (got '${e.local.name}' and '${a.name}')`);e.local=a}catch(a){console.error(a instanceof Error?a.message:String(a)),process.exit(1)}}else o.startsWith("-")||(e.file=o)}return e}function pr(){console.log(`
2
+ var Ks=Object.defineProperty;var j=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ys=(r,e)=>{for(var t in e)Ks(r,t,{get:e[t],enumerable:!0})};function at(r){try{let e=r.split(`
3
+ `),t=0;if(e[t]?.trim()!=="---")return null;t++;let n=[];for(;t<e.length&&e[t]?.trim()!=="---";)n.push(e[t]),t++;if(e[t]?.trim()!=="---")return null;t++;let s=oo(n);if(!s)return null;let o=new Map;for(;t<e.length;){let a=e[t]?.trim()?.match(/^\*\*(.+)\*\*$/);if(a){let c=a[1].trim();for(t++;t<e.length&&e[t]?.trim()==="";)t++;let l=e[t]?.match(/^(`{3,})(\w*)\s*$/);if(!l){t++;continue}let d=l[1];t++;let u=[];for(;t<e.length&&!e[t]?.match(new RegExp(`^${d}\\s*$`));)u.push(e[t]),t++;t++,o.set(c,u.join(`
4
+ `))}else t++}return{frontmatter:s,files:o}}catch{return null}}function oo(r){let e={};for(let t of r){let n=t.indexOf(":");if(n===-1)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();switch(s){case"format":e.format=o;break;case"name":e.name=io(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function io(r){return r.startsWith('"')&&r.endsWith('"')?r.slice(1,-1).replace(/\\"/g,'"'):r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function ct(r){let e=t=>r.files.get(so[t].path)||"";return{name:r.frontmatter.name,code:e("code"),css:e("css"),html:e("html"),config:e("config"),notes:e("notes"),data:e("data"),infer:e("infer"),insight:e("insight"),server:e("server")}}function ao(r){try{return JSON.parse(r),!0}catch{}return!!(/^\s*<[\s\S]*>/.test(r)||/^---\s*$/m.test(r)||/^\w[\w\s]*:[ \t]/m.test(r))}function qr(r){let e=r.trim();return e?ao(e)?[e]:r.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function Gr(r){if(!r.trim())return{};try{return JSON.parse(r)}catch{return{}}}var so,Kt=j(()=>{so={code:{path:"code.tsx",language:"typescript"},css:{path:"styles.css",language:"css"},html:{path:"index.html",language:"html"},config:{path:"config.json",language:"json"},notes:{path:"notes.md",language:"markdown"},data:{path:"data.txt",language:"text"},infer:{path:"infer.md",language:"markdown"},insight:{path:"insight.json",language:"json"},server:{path:"server.ts",language:"typescript"}}});import{join as pr,resolve as Vo}from"path";import{homedir as zo}from"os";function Tt(){let r=process.env.TYPEBULB_SERVERS_DIR;return r?pr(r,".."):pr(zo(),".typebulb")}function ce(){return process.env.TYPEBULB_SERVERS_DIR||pr(Tt(),"servers")}function U(r){let e=Vo(r);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}function Rn(r,e){let t=U(r),n=U(e);return t.startsWith(n.endsWith("/")?n:n+"/")?!t.includes("/node_modules/"):!1}var Ge=j(()=>{});import{readFileSync as qo,writeFileSync as Go,mkdirSync as Ko}from"fs";import{join as Yo}from"path";function kn(){return Yo(Tt(),"trust.json")}function fr(){try{let r=JSON.parse(qo(kn(),"utf8"));return new Set(Array.isArray(r)?r:[])}catch{return new Set}}function Xo(r){Ko(Tt(),{recursive:!0}),Go(kn(),JSON.stringify([...r]))}function le(r){return fr().has(U(r))}function Se(r,e){let t=fr(),n=U(r);(e?t.has(n):!t.has(n))||(e?t.add(n):t.delete(n),Xo(t))}function mr(){return[...fr()]}var Ke=j(()=>{Ge()});function Re(r){if(r.server.trim())return"server-side code (server.ts)";let e=r.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"))return"AI (your API keys)";if(/\btb\s*\.\s*server\s*\.\s*(?!log\b)\w/.test(e)||e.includes("/__api"))return"server-side code (server.ts)"}var It=j(()=>{});import{spawn as jn}from"child_process";import{readdir as hi,readFile as Un,writeFile as Wn,unlink as Xe,mkdir as gi}from"fs/promises";import{mkdirSync as yi,writeFileSync as Nn,appendFileSync as bi,readFileSync as Jn}from"fs";import*as W from"path";import{fileURLToPath as wi}from"url";function yr(r){return W.join(ce(),`${r}.json`)}function Qe(r){return W.join(ce(),`${r}.log`)}function $t(r){let e=Qe(r);try{yi(ce(),{recursive:!0}),Nn(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),n=process.stderr.write.bind(process.stderr),s=0,o=!1,i=a=>{if(!o)try{let c=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(bi(e,c),s+=c.length,s>2*Ln){let l=Jn(e),d=l.subarray(Math.max(0,l.length-Ln));Nn(e,d),s=d.length}}catch{o=!0}};return process.stdout.write=((a,...c)=>(i(a),t(a,...c))),process.stderr.write=((a,...c)=>(i(a),n(a,...c))),()=>{process.stdout.write=t,process.stderr.write=n}}function ke(r,e=0){try{let t=Jn(Qe(r)),n=e>=0&&e<=t.length?e:0;return{text:t.subarray(n).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function vi(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function Ot(r){await gi(ce(),{recursive:!0}),await Wn(yr(r.pid),JSON.stringify(r))}async function Hn(r,e){let t=yr(r);try{let n=JSON.parse(await Un(t,"utf8"));if(n.denied===e)return;n.denied=e,await Wn(t,JSON.stringify(n))}catch{}}async function Ze(r){await Xe(yr(r)).catch(()=>{}),await Xe(Qe(r)).catch(()=>{})}async function D(r){let e;try{e=await hi(ce())}catch{return[]}let t=[];return await Promise.all(e.map(async s=>{if(!s.endsWith(".json"))return;let o=W.join(ce(),s),i;try{i=JSON.parse(await Un(o,"utf8"))}catch{await Xe(o).catch(()=>{});return}i&&typeof i.pid=="number"&&vi(i.pid)?t.push(i):(await Xe(o).catch(()=>{}),i?.pid&&await Xe(Qe(i.pid)).catch(()=>{}))})),(r?t.filter(s=>s.agent==null&&Rn(s.file,r)):t).sort((s,o)=>s.startedAt-o.startedAt)}async function Te(r){try{process.kill(r,"SIGTERM")}catch{}await Ze(r)}function Si(){return W.join(W.dirname(wi(import.meta.url)),"index.js")}function Pi(r,e={}){return{command:process.execPath,args:[Si(),...e.trust?["--trust"]:[],r,...e.open===!1?["--no-open"]:[]]}}async function Dt(r,e={}){let t=e.cwd??process.cwd(),n=W.resolve(t,r),s=(await D()).find(l=>l.file===n);if(s)return s;let{command:o,args:i}=Pi(r,e);(process.platform==="win32"?jn("cmd",["/c","start","","/b",o,...i],{cwd:t,stdio:"ignore",windowsHide:!0}):jn(o,i,{cwd:t,detached:!0,stdio:"ignore"})).unref();let c=Date.now()+2e4;for(;Date.now()<c;){await xi(150);let l=(await D()).find(d=>d.file===n);if(l)return l}throw new Error(`Launched ${W.basename(r)} but it did not register within 20s.`)}var Ln,xi,de=j(()=>{Ge();Ln=1e6;xi=r=>new Promise(e=>setTimeout(e,r))});function Wt(r){let e=/^---[^\n]*\n([\s\S]*?)\n---/.exec(r),t=e?/^\s*name:\s*(.+?)\s*$/m.exec(e[1]):null;return t?t[1].replace(/^["']|["']$/g,""):void 0}function _r(r){return(Wt(r)??"bulb").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"bulb"}var Ar=j(()=>{});import{readdirSync as Hi,readFileSync as Vi,statSync as zi}from"fs";import{join as gs,basename as qi}from"path";function ys(r,e,t){if(e>8)return t;let n;try{n=Hi(r,{withFileTypes:!0})}catch{return t}for(let s of n)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;ys(gs(r,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(gs(r,s.name));return t}function Cr(r){return ys(r,0,[]).map(e=>{let t=0;try{t=zi(e).mtimeMs}catch{}let n;try{n=Wt(Vi(e,"utf8").slice(0,1024))}catch{}return{path:e,name:n??qi(e).replace(/\.bulb\.md$/,""),mtime:t}})}var bs=j(()=>{Ar()});import{readFile as Gi}from"fs/promises";async function Ir(r){try{let e=at(await Gi(r,"utf-8"));return e?Re(ct(e)):void 0}catch{return}}var ws=j(()=>{Kt();It()});import{spawn as Ki}from"child_process";import{basename as Yi}from"path";function Xi(){return process.env.TYPEBULB_EDITOR||"code"}function Zi(r,e,t){return t==null?[e]:Qi.test(Yi(r))?["-g",`${e}:${t}`]:[`+${t}`,e]}function ea(r,e){let t=Xi();return{command:t,args:Zi(t,r,e)}}function $r(r,e){let{command:t,args:n}=ea(r,e),s=Ki(t,n,{shell:!0,detached:!0,stdio:"ignore"});s.on("error",o=>console.error("[typebulb] editor launch failed:",o?.message??o)),s.unref()}var Qi,vs=j(()=>{Qi=/^(code|code-insiders|codium|vscodium|cursor|windsurf)(\.cmd|\.exe)?$/i});var xs=j(()=>{de();bs();ws();Ar();vs();Ke()});var Us={};Ys(Us,{attach:()=>Ra,breakout:()=>Ta,info:()=>va,launchBulb:()=>Ia,listBreakouts:()=>_a,listBulbFiles:()=>Ca,listSessions:()=>Ea,openFile:()=>ka,poll:()=>xa,predictTrustOf:()=>$a,readBulbLog:()=>Da,setBulbTrust:()=>Oa,stopBreakout:()=>Aa});import{existsSync as $e,openSync as ks,readSync as Ts,closeSync as _s,statSync as fe,readdirSync as Or,watchFile as ta,unwatchFile as Ss,mkdirSync as As,writeFileSync as Cs,readFileSync as Dr,unlinkSync as ra,rmSync as na}from"fs";import{join as k}from"path";import{homedir as sa}from"os";function Is(r){return r?.message??String(r)}function oa(r){return r.replace(/[^a-zA-Z0-9]/g,"-")}function $s(r){let e=Br(r);if(!$e(e))return[];let t;try{t=Or(e)}catch{return[]}let n=[];for(let s of t){if(!s.endsWith(".jsonl"))continue;let o=k(e,s);try{let i=fe(o);i.isFile()&&n.push({sessionId:s.slice(0,-6),file:o,mtime:i.mtimeMs})}catch{}}return n}function Ht(r){return k(r,ca)}function Ds(r,e){return k(Ht(r),`${e}.lock`)}function da(r,e){try{let t=Ds(r,e);if(Date.now()-fe(t).mtimeMs>=Os)return!1;try{if(parseInt(Dr(t,"utf8").trim(),10)===process.pid)return!1}catch{}return!0}catch{return!1}}function Bs(r,e){if(e)try{As(Ht(r),{recursive:!0}),Cs(Ds(r,e),String(process.pid))}catch(t){console.error("[lock] claim failed:",Is(t))}}function ua(r){try{na(k(r,".claude-bulb"),{recursive:!0,force:!0})}catch{}}function pa(r){let e=Ht(r);if(!$e(e))return;let t;try{t=Or(e)}catch{return}let n=Date.now();for(let s of t){if(!s.endsWith(".lock"))continue;let o=k(e,s);try{let i=fe(o);n-i.mtimeMs>la&&ra(o)}catch{}}}function Ps(r){return typeof r=="string"?r:Array.isArray(r)?r.map(e=>typeof e=="string"?e:e?.text??e?.content??JSON.stringify(e)).join(`
5
+ `):r==null?"":JSON.stringify(r)}function Ms(r){try{return fe(r),!1}catch(e){return e.code==="ENOENT"}}function Fs(){let r=C;if(r.file&&!Ms(r.file)){Bs(r.cwd,r.sessionId);return}let e=fa(r);e&&js(e)}function fa(r){if(!r.everAttached)return ma(r.cwd)??ha(r.cwd,()=>!0)}function ma(r){let e=Ht(r);if(!$e(e))return;let t;try{t=Or(e)}catch{return}let n;for(let o of t)if(o.endsWith(".lock"))try{let i=fe(k(e,o));if(Date.now()-i.mtimeMs>=Os||parseInt(Dr(k(e,o),"utf8").trim(),10)!==process.pid)continue;(!n||i.mtimeMs>n.mtime)&&(n={sessionId:o.slice(0,-5),mtime:i.mtimeMs})}catch{}if(!n)return;let s=k(Br(r),`${n.sessionId}.jsonl`);if(!Ms(s))return{sessionId:n.sessionId,file:s,mtime:n.mtime}}function ha(r,e){return $s(r).sort((t,n)=>n.mtime-t.mtime).find(t=>!da(r,t.sessionId)&&e(t))}function js(r){let e=C;if(e.file)try{Ss(e.file)}catch{}e.file=r.file,e.sessionId=r.sessionId,e.everAttached=!0,e.partial="",e.offset=0,e.totals={in:0,out:0,cached:0,cacheCreate:0},e.entries=new Map,e.chainLastUuid=void 0,e.buffer.push({type:"cleared"}),e.buffer.push({type:"session",sessionId:r.sessionId}),Bs(e.cwd,r.sessionId),Es();try{Ss(r.file)}catch{}ta(r.file,{interval:200},()=>Es())}function Es(){let r=C;if(!r.file)return;let e;try{e=fe(r.file).size}catch{return}if(e<=r.offset)return;let t;try{t=ks(r.file,"r")}catch{return}try{let c=e-r.offset,l=Buffer.alloc(c),d=0;for(;d<c;){let u=Ts(t,l,d,c-d,r.offset+d);if(!u)break;d+=u}r.offset+=d,r.partial+=l.subarray(0,d).toString("utf8")}finally{_s(t)}let n,s;for(;(s=r.partial.indexOf(`
6
+ `))>=0;){let c=r.partial.slice(0,s);if(r.partial=r.partial.slice(s+1),!c.trim())continue;let l;try{l=JSON.parse(c)}catch{continue}l&&l.uuid&&(r.entries.set(l.uuid,l),l.isSidechain||(n=l.uuid))}if(!n)return;let o=[],i=r.entries.get(n),a=!1;for(;i;){if(o.push(i),i.uuid===r.chainLastUuid){a=!0;break}i=i.parentUuid?r.entries.get(i.parentUuid):void 0}if(a)for(let c=o.length-2;c>=0;c--)Rs(o[c]);else{r.chainLastUuid!==void 0&&(r.buffer.push({type:"cleared"}),r.buffer.push({type:"session",sessionId:r.sessionId}),r.totals={in:0,out:0,cached:0,cacheCreate:0});for(let c=o.length-1;c>=0;c--)Rs(o[c])}r.chainLastUuid=n}function Ns(r){let e=r.trim();return!!e&&ga.some(t=>t.test(e))}function ba(r){return r.replace(ya,"")}function Jt(r){let e=ba(r).trim();return e&&!Ns(e)?e:""}function Ls(r){return r?.type==="text"&&typeof r.text=="string"?Jt(r.text):""}function Rs(r){try{wa(r)}catch(e){console.error("[claude-bulb] skipped malformed entry:",Is(e))}}function wa(r){if(r.isSidechain)return;let e=C;if(r.type==="user"){let t=r.message?.content;if(typeof t=="string"){let n=Jt(t);n&&e.buffer.push({type:"user",text:n})}else if(Array.isArray(t))for(let n of t)if(n?.type==="tool_result")e.buffer.push({type:"tool_result",id:n.tool_use_id??"",content:Ps(n.content),isError:!!n.is_error});else{let s=Ls(n);s&&e.buffer.push({type:"user",text:s})}}else if(r.type==="attachment"&&r.attachment?.type==="queued_command"){let t=Jt(Ps(r.attachment.prompt));t&&e.buffer.push({type:"user",text:t})}else if(r.type==="assistant"){let t=r.message?.content,n=Array.isArray(t)?t:[],s=n.filter(c=>c.type==="text").map(c=>c.text??"").filter(c=>!Ns(c)).join(""),o=n.filter(c=>c.type==="thinking").map(c=>c.thinking??"").join(`
7
+ `),i=n.filter(c=>c.type==="tool_use").map(c=>({id:c.id??"",name:c.name??"",input:c.input??{}}));if(s||o||i.length){let c=Date.parse(r.timestamp??""),l=!isNaN(c)&&c>=e.sessionStartMs;e.buffer.push({type:"assistant",text:s,thinking:o,tools:i,live:l})}let a=r.message?.usage??r.usage;a&&(e.totals.in+=a.input_tokens??0,e.totals.out+=a.output_tokens??0,e.totals.cached+=a.cache_read_input_tokens??0,e.totals.cacheCreate+=a.cache_creation_input_tokens??0,e.buffer.push({type:"usage",...e.totals}))}}async function va(){return{cwd:C.cwd,pid:process.pid}}async function xa(r){let e=C;return Fs(),{events:e.buffer.slice(r),cursor:e.buffer.length,working:Sa(e)}}function Sa(r){let e;for(let o of r.entries.values())(o.type==="user"||o.type==="assistant")&&(e=o);if(!e)return!1;if(e.type==="user")return!0;let n=(Array.isArray(e.message?.content)?e.message.content:[]).filter(o=>o.type==="tool_use").map(o=>o.id);if(n.length===0)return!1;let s=new Set;for(let o of r.entries.values()){let i=o.message?.content;if(Array.isArray(i))for(let a of i)a.type==="tool_result"&&a.tool_use_id&&s.add(a.tool_use_id)}return n.some(o=>o&&!s.has(o))}function Pa(r){let e;try{e=ks(r,"r")}catch{return""}try{let n=65536;try{n=fe(r).size}catch{}let s=(l,d)=>{if(d<=0)return"";let u=Buffer.alloc(d),f=Ts(e,u,0,d,l);return u.subarray(0,f).toString("utf8")},o=(l,d,u)=>{let f="";for(let m of l.split(`
8
+ `)){if(!m.includes(`"${d}"`))continue;let g;try{g=JSON.parse(m)}catch{continue}let v=g?.[u];g?.type===d&&typeof v=="string"&&v&&(f=v)}return f},i=s(0,Math.min(65536,n)),a=n>65536?s(n-65536,65536):"",c=o(a,"custom-title","customTitle")||o(i,"custom-title","customTitle")||o(a,"ai-title","aiTitle")||o(i,"ai-title","aiTitle");if(c)return c.replace(/\s+/g," ").trim().slice(0,200);for(let l of i.split(`
9
+ `)){if(!l.trim())continue;let d;try{d=JSON.parse(l)}catch{continue}if(!d||d.isSidechain||d.type!=="user")continue;let u=d.message?.content,f="";typeof u=="string"?f=Jt(u):Array.isArray(u)&&(f=u.map(Ls).filter(Boolean).join(" "));let m=f.replace(/\s+/g," ").trim();if(m)return(m.replace(/^Continuing from a prior session\. Here is the summary of our work so far:\s*/i,"").trim()||m).slice(0,200)}return""}finally{_s(e)}}async function Ea(){return $s(C.cwd).sort((r,e)=>e.mtime-r.mtime).map(({sessionId:r,file:e,mtime:t})=>({sessionId:r,mtime:t,preview:Pa(e)}))}async function Ra(r){let e=C,t=k(Br(e.cwd),`${r}.jsonl`);return $e(t)?t===e.file?{ok:!0}:(js({sessionId:r,file:t}),{ok:!0}):{ok:!1,error:"session not found"}}async function ka(r,e){return $r(r,e),{ok:!0}}async function Ta(r){let e=C.cwd,t=k(e,"typebulbs");As(t,{recursive:!0});let n=_r(r),s=`${n}.bulb.md`;for(let c=2;$e(k(t,s))&&Dr(k(t,s),"utf8")!==r;c++)s=`${n}-${c}.bulb.md`;let o=k(t,s);$e(o)||Cs(o,r);let i=k("typebulbs",s),a=await Dt(i,{cwd:e,open:!0});return{ok:!0,file:i,pid:a.pid,url:a.url}}async function _a(){return D(C.cwd)}async function Aa(r){return await Te(r),{ok:!0}}async function Ca(){return Cr(C.cwd).map(r=>({...r,trusted:le(r.path)}))}async function Ia(r,e){let t=C.cwd;e!=null&&Se(r,e);let n=await Dt(r,{cwd:t,open:!0,trust:e});return{ok:!0,file:n.file,pid:n.pid,url:n.url,trust:!!n.trust}}async function $a(r){return{cap:await Ir(r)}}async function Oa(r,e){return Se(r,e),{ok:!0}}async function Da(r,e){return ke(r,e)}var ia,aa,Br,ca,Os,la,C,ga,ya,Ws=j(()=>{xs();ia=".typebulb",aa=k(sa(),".claude","projects"),Br=r=>k(aa,oa(r));ca=`${ia}/locks`,Os=5e3,la=6e4;C={cwd:process.cwd(),sessionId:"",sessionStartMs:Date.now(),buffer:[],partial:"",offset:0,totals:{in:0,out:0,cached:0,cacheCreate:0},everAttached:!1,entries:new Map};ga=[/\[Request interrupted by user\b/i,/\[Tool use was interrupted\]/i,/Claude Code returned an error/i,/\[ede_diagnostic\]/i,/^No response requested\.?$/i,/^<task-notification\b/i,/^<system-reminder\b/i];ya=/<ide_[a-z_]+>[\s\S]*?<\/ide_[a-z_]+>/gi;ua(C.cwd);pa(C.cwd);Fs()});import*as Gs from"fs/promises";import*as X from"path";import*as jr from"fs/promises";import{existsSync as he,readFileSync as Xs}from"fs";import*as P from"path";import{pathToFileURL as Qs}from"url";import{resolve as qt}from"resolve.exports";import{init as Nr,parse as Lr}from"es-module-lexer";function Ur(r,e){let t=P.join(r,"package.json");try{return JSON.parse(Xs(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var zt=["browser","import","default"],Fr=["node","import","default"];function Wr(r){let e=r.indexOf("=");if(e===-1)throw new Error(`--replace must be <name>=<path> (got '${r}')`);let t=r.slice(0,e).trim(),n=r.slice(e+1).trim();if(!t)throw new Error(`--replace missing package name (got '${r}')`);if(!n)throw new Error(`--replace missing path for '${t}'`);if(t.startsWith("@"))throw new Error(`--replace does not support scoped names yet; '${t}' is scoped`);return{name:t,dir:P.resolve(n)}}async function Jr(r){let{name:e,dir:t}=r;if(!he(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let n=Ur(t,e),s=Zs(n,e),o=P.resolve(t,s);if(!he(o))throw new Error(`--replace package '${e}' entry not found on disk: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);let i=P.dirname(o),a=`/local/${e}/${P.basename(o)}`,c=eo(n,t);return await to(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function Zs(r,e){if(r.exports!==void 0){let n;try{n=qt(r,".",{browser:!0,conditions:zt})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${zt.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=Gt(n);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${zt.join(", ")}); too complex to override.`);return s}let t=r.module??r.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function eo(r,e){if(r.exports!==void 0)try{let n=qt(r,".",{conditions:["types"]}),s=Gt(n);if(s){let o=P.resolve(e,s);if(he(o))return o}}catch{}let t=r.types??r.typings;if(t){let n=P.resolve(e,t);if(he(n))return n}}function Gt(r){if(typeof r=="string")return r;if(Array.isArray(r))return r.find(e=>typeof e=="string")}async function to(r,e,t){await Nr;let n=P.normalize(t),s=new Set,o=[e];for(;o.length;){let i=o.shift();if(s.has(i))continue;s.add(i);let a;try{a=await jr.readFile(i,"utf8")}catch{continue}let c,l;try{[c,,,l]=Lr(a,i)}catch{continue}if(i===e&&!l)throw new Error(`override package '${r}' entry is not an ES module (no import/export syntax); CommonJS or non-module entries aren't supported (esm.sh would have to transform it).`);for(let d of c){if(d.d===-2)continue;let u=d.n;if(u&&!u.startsWith("node:")){if(u.startsWith("./")||u.startsWith("../")||u.startsWith("/")){let f=ro(i,u,n);f&&!s.has(f)&&o.push(f);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${r} externalizes '${u}'`)}}}}function ro(r,e,t){let n=e.replace(/[?#].*$/,""),s=P.resolve(P.dirname(r),n),o=[s,s+".js",s+".mjs",P.join(s,"index.js"),P.join(s,"index.mjs")];for(let i of o)if(P.normalize(i).startsWith(t)&&he(i))return i}function no(r,e,t){let n=Ur(r,e),s;if(n.exports!==void 0)try{s=Gt(qt(n,t,{conditions:Fr}))}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${Fr.join(", ")}): ${i instanceof Error?i.message:i}`)}else t==="."&&(s=n.main??n.module);if(!s)throw new Error(`--replace package '${e}' has no node export for '${t}'.`);let o=P.resolve(r,s);if(!he(o))throw new Error(`--replace package '${e}' built file not found: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);return Qs(o).href}async function Hr(r,e){await Nr;let t;try{[t]=Lr(r)}catch{return r}let n="",s=0;for(let o of t){if(o.d!==-1)continue;let i=o.n;if(!i||i!==e.name&&!i.startsWith(e.name+"/"))continue;let a=i===e.name?".":"."+i.slice(e.name.length),c=no(e.dir,e.name,a);n+=r.slice(s,o.s)+c,s=o.e}return n+r.slice(s)}function Vr(r){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,noTrust:!1,follow:!1,all:!1,help:!1,version:!1},t=["check","predict","logs","stop","trust","untrust","skill","models"],n=r[0];if(n==="agent"||n?.startsWith("agent:")){e.subcommand="agent";let s=n.indexOf(":");if(s!==-1){let o=n.slice(s+1);o&&(e.agentTarget=o)}r=r.slice(1)}else n&&t.includes(n)&&(e.subcommand=n,r=r.slice(1));for(let s=0;s<r.length;s++){let o=r[s];if(o==="--help"||o==="-h")e.help=!0;else if(o==="--version"||o==="-V")e.version=!0;else if(o==="--no-watch")e.watch=!1;else if(o==="--no-open")e.open=!1;else if(o==="--server")e.server=!0;else if(o==="--trust")e.trust=!0;else if(o==="--no-trust")e.noTrust=!0;else if(o==="--mode"){let i=r[++s];(!i||i.startsWith("-"))&&(console.error("Missing value for --mode (e.g. --mode staging)"),process.exit(1)),e.mode=i}else if(o==="--follow"||o==="-f")e.follow=!0;else if(o==="--all")e.all=!0;else if(o==="--lines"||o==="-n"){let i=parseInt(r[++s],10);(isNaN(i)||i<0)&&(console.error(`Invalid --lines value: ${r[s]}`),process.exit(1)),e.lines=i}else if(o==="--port"||o==="-p"){let i=r[++s],a=parseInt(i,10);isNaN(a)&&(console.error(`Invalid port: ${i}`),process.exit(1)),e.port=a}else if(o==="--replace"||o.startsWith("--replace=")){let i=o.startsWith("--replace=")?o.slice(10):r[++s]??"";try{let a=Wr(i);if(e.local)throw new Error(`--replace can only be used once (got '${e.local.name}' and '${a.name}')`);e.local=a}catch(a){console.error(a instanceof Error?a.message:String(a)),process.exit(1)}}else o.startsWith("-")||(e.file=o)}return e}function zr(){console.log(`
3
10
  typebulb - Local bulb runner for Typebulb
4
11
 
5
12
  Usage:
@@ -21,7 +28,8 @@ Usage:
21
28
  For agents: fetch tb.server.log / errors of a
22
29
  bulb you launched without watching its terminal.
23
30
  typebulb stop [file|pid] Stop a running bulb server (no arg: list this
24
- project's running servers; a pid stops any).
31
+ project's running servers; a pid stops any;
32
+ --all reaps every bulb + viewer, all projects).
25
33
  typebulb trust [file] Remember a bulb as Trusted, so a later run grants
26
34
  fs/AI/server.ts without --trust (no arg: list the
27
35
  remembered-trusted bulbs).
@@ -87,9 +95,7 @@ Examples:
87
95
  typebulb my-editor.bulb.md
88
96
  typebulb --no-watch --port 8080 my-editor.bulb.md
89
97
  typebulb .
90
- `)}import*as X from"fs/promises";import*as nt from"path";import{pathToFileURL as Ns}from"url";var Qn={code:{path:"code.tsx",language:"typescript"},css:{path:"styles.css",language:"css"},html:{path:"index.html",language:"html"},config:{path:"config.json",language:"json"},notes:{path:"notes.md",language:"markdown"},data:{path:"data.txt",language:"text"},infer:{path:"infer.md",language:"markdown"},insight:{path:"insight.json",language:"json"},server:{path:"server.ts",language:"typescript"}};function fr(r){try{let e=r.split(`
91
- `),t=0;if(e[t]?.trim()!=="---")return null;t++;let n=[];for(;t<e.length&&e[t]?.trim()!=="---";)n.push(e[t]),t++;if(e[t]?.trim()!=="---")return null;t++;let s=Zn(n);if(!s)return null;let o=new Map;for(;t<e.length;){let a=e[t]?.trim()?.match(/^\*\*(.+)\*\*$/);if(a){let c=a[1].trim();for(t++;t<e.length&&e[t]?.trim()==="";)t++;let l=e[t]?.match(/^(`{3,})(\w*)\s*$/);if(!l){t++;continue}let p=l[1];t++;let d=[];for(;t<e.length&&!e[t]?.match(new RegExp(`^${p}\\s*$`));)d.push(e[t]),t++;t++,o.set(c,d.join(`
92
- `))}else t++}return{frontmatter:s,files:o}}catch{return null}}function Zn(r){let e={};for(let t of r){let n=t.indexOf(":");if(n===-1)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();switch(s){case"format":e.format=o;break;case"name":e.name=es(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function es(r){return r.startsWith('"')&&r.endsWith('"')?r.slice(1,-1).replace(/\\"/g,'"'):r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function mr(r){let e=t=>r.files.get(Qn[t].path)||"";return{name:r.frontmatter.name,code:e("code"),css:e("css"),html:e("html"),config:e("config"),notes:e("notes"),data:e("data"),infer:e("infer"),insight:e("insight"),server:e("server")}}function ts(r){try{return JSON.parse(r),!0}catch{}return!!(/^\s*<[\s\S]*>/.test(r)||/^---\s*$/m.test(r)||/^\w[\w\s]*:[ \t]/m.test(r))}function hr(r){let e=r.trim();return e?ts(e)?[e]:r.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function gr(r){if(!r.trim())return{};try{return JSON.parse(r)}catch{return{}}}import{transform as rs}from"sucrase";function Rt(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=rs(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var we="https://esm.sh",xe="https://cdn.jsdelivr.net/npm/",Et="https://data.jsdelivr.com/v1/package/npm/";function br(r){let e=(r||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var y=class r{constructor(e,t,n){let s=typeof e=="string"?r.parse(e):e;this.name=s.name,this.version=ce(t??s.version),this.subpath=ce(n??s.subpath)}static parse(e){let t=br(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=yr(t[1]??""),a=ce(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=yr(t[0]),i=ce(t.slice(1).join("/"));return new r({name:s,version:o,subpath:i})}}static fromUrl(e){try{let t=new URL(e),n=new URL(we).host,s=new URL(xe).host;if(t.host===n){let o=br(t.pathname.replace(/^\/v\d+\//,"/"));if(!o.length)return;let i=o[0].startsWith("@")?`${o[0]}/${o[1]??""}`:o[0];return r.parse(i)}if(t.host===s){let o=t.pathname.split("/npm/")[1];if(!o)return;let i=o.split("/")[0]||"";return r.parse(i)}return}catch{return}}static versionFromUrl(e){return r.fromUrl(e)?.version}format(){let e=this.version?`${this.name}@${this.version}`:this.name;return this.subpath?`${e}/${this.subpath}`:e}root(){return this.name}static rootOf(e){return r.parse(e).name}withVersion(e){return new r({name:this.name,version:ce(e),subpath:this.subpath})}withPreferredVersion(e,t){let n=e||t;return n?this.withVersion(n):this}static isBare(e){if(!e||e.startsWith(".")||e.startsWith("/"))return!1;let t=e.toLowerCase();return!t.startsWith("http://")&&!t.startsWith("https://")}},ce=r=>r&&r.length?r:void 0,yr=r=>{let e=r.indexOf("@");return e<0?[r,void 0]:[r.slice(0,e),ce(r.slice(e+1))]};async function k(r){try{return await r()}catch{return}}var Se=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=we,this.jsDelivrBase=xe,this.jsDelivrMeta=Et,this.pinMs=1e4,this.versionsIndexMs=1440*60*1e3,this.metaTtlMs=10080*60*1e3,this.pinCache=new Map}normalizeRelative(e){let t=e||"";return t.startsWith("./")?t.slice(2):t.replace(/^\/+/,"")}ensureLeadingDotSlash(e){return e.startsWith("./")?e:`./${e}`}baseDir(e){let t=typeof e=="string"?new y(e):e;return`${this.jsDelivrBase}${t.name}${t.version?`@${t.version}`:""}/`}file(e,t){return new URL(this.normalizeRelative(t),this.baseDir(e)).toString()}packageJson(e){return this.file(e,"package.json")}buildEsmUrl(e,t={}){let{target:n="es2022",bundle:s=!1,external:o}=t,i=new URLSearchParams({target:n});return s&&i.append("bundle",""),o?.length&&i.append("external",o.join(",")),`${this.esmHost}/${e}?${i.toString()}`}async pinEsmUrl(e,t="es2022"){let n=this.buildEsmUrl(e,{target:t}),s=await k(()=>this.http.head(n));return s?.ok?s.url||n:void 0}async resolveExactVersion(e){let t=Date.now(),n=this.pinCache.get(e);if(n&&t-n.ts<this.pinMs)return n.value;let s=await this.tryResolveFromUrls([this.buildEsmUrl(e),`${this.esmHost}/${e}`]);return this.pinCache.set(e,{value:s,ts:t}),s}async tryResolveFromUrls(e){for(let t of e){let n=await k(()=>this.http.head(t)),s=this.parseVersionFromUrl(n?.url||t);if(s)return s}}async fetchVersionsIndex(e){if(await this.cache.isNegative(e))return;let t=await this.cache.getIndex(e);if(t&&Date.now()-t.updatedAt<this.versionsIndexMs)return{versions:t.versions,distTags:t.distTags};let n=await k(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(e)}`));if(!n?.versions?.length){await this.cache.recordNegative(e);return}await this.cache.clearNegative(e);let s=n.distTags&&Object.keys(n.distTags).length?n.distTags:void 0;return await this.cache.setIndex(e,n.versions,s),n}parseVersionFromUrl(e){let t=y.fromUrl(e)?.version;return t&&/\d+\.\d+\.\d+/.test(t)?t:void 0}async fetchPackageMeta(e,t){let n=await this.cache.getMeta(e,t);if(n&&Date.now()-n.updatedAt<this.metaTtlMs){let{dependencies:p,peerDependencies:d,peerDependenciesMeta:m}=n;return{name:e,version:t,dependencies:p,peerDependencies:d,peerDependenciesMeta:m}}let s=this.packageJson(new y(`${e}@${t}`)),o=await k(()=>this.http.getJson(s));if(!o)return;let i=p=>p&&Object.keys(p).length?p:void 0,a=i(o.dependencies),c=i(o.peerDependencies),l=i(o.peerDependenciesMeta);return await this.cache.setMeta(e,t,a,c,l),{name:e,version:t,dependencies:a,peerDependencies:c,peerDependenciesMeta:l}}};var vr=r=>r.startsWith("@types/"),Pe=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!vr(e)),kt=r=>Object.keys(r?.dependencies||{}).filter(e=>!vr(e)),ns=r=>Pe(r).filter(e=>!r?.peerDependenciesMeta?.[e]?.optional),Re=class{constructor(e){this.cdn=e}async resolve(e,t){let n=await this.fetchMeta(e),{allRoots:s,autoAddedPeers:o}=await this.expandWithPeers(n,t),i=this.computeFlags(s);return{allRoots:s,flags:i,autoAddedPeers:o}}async fetchMeta(e){return Promise.all(e.map(async({name:t,version:n})=>({name:t,version:n,meta:await this.cdn.fetchPackageMeta(t,n)})))}async expandWithPeers(e,t){let n=new Map(e.map(o=>[o.name,o])),s=[];for(let o of e)for(let i of ns(o.meta))!n.has(i)&&!s.some(a=>a.name===i)&&s.push({name:i,requiredBy:o.name});for(let{name:o,requiredBy:i}of s)try{let a=await t(o),c=await this.cdn.fetchPackageMeta(o,a);n.set(o,{name:o,version:a,meta:c})}catch(a){console.warn(`[typebulb] Failed to resolve peer "${o}" for "${i}":`,a)}return{allRoots:[...n.values()],autoAddedPeers:s.filter(o=>n.has(o.name))}}computeFlags(e){let t=new Set(e.flatMap(o=>Pe(o.meta))),n=new Map;for(let o of e)for(let i of kt(o.meta))n.set(i,(n.get(i)||0)+1);let s=new Set([...n.entries()].filter(([,o])=>o>=2).map(([o])=>o));return new Map(e.map(o=>[o.name,{isPeerRoot:t.has(o.name),hasPeers:Pe(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var Ee=class{constructor(e,t,n){this.cache=e,this.cdn=t,this.semver=n}selectVersionFromIndex(e,t,n){return this.semver.selectBestVersion(e,{range:t,distTags:n})}async learnExactVersion(e){let t=await k(()=>this.cdn.fetchVersionsIndex(e));if(t?.versions?.length){let n=this.semver.selectBestVersion(t.versions,{distTags:t.distTags});if(n)return n}return this.cdn.resolveExactVersion(e)}async resolveExactForRoot(e,t){if(!t)return this.learnExactVersion(e);let n=await this.cache.getPinnedExact(e,t);if(n){if(this.semver.isExactVersion(n))return n;console.debug("[typebulb] cached version for",e,"is not exact (",n,"); re-resolving from registry")}let s=await k(()=>this.cdn.fetchVersionsIndex(e));if(s?.versions?.length){let i=this.selectVersionFromIndex(s.versions,t,s.distTags);if(i){if(this.semver.isExactVersion(i))return await this.cache.setPinnedExact(e,t,i),i}else{console.debug("[typebulb] refreshing version cache for",e,"(",t,"not in cached set \u2014 likely a new release)"),await this.cache.invalidateVersionsCache(e);let a=await k(()=>this.cdn.fetchVersionsIndex(e));if(a?.versions?.length){let c=this.selectVersionFromIndex(a.versions,t,a.distTags);if(c&&this.semver.isExactVersion(c))return await this.cache.setPinnedExact(e,t,c),c}}}let o=await this.cdn.resolveExactVersion(`${e}@${t}`);if(o&&this.semver.isExactVersion(o))return await this.cache.setPinnedExact(e,t,o),o}async effectivePackage(e,t){let n=new y(e),s=n.root(),o=t[s],i=o?await k(()=>this.cache.getPinnedExact(s,o))??await k(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?n.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as ss,parse as os}from"es-module-lexer";var le=class r{constructor(e,t,n,s){this.version=e,this.cdn=t,this.peer=n,this.cache=s}extractImportsSync(e){let t=new Set;for(let n of r.importPatterns){n.lastIndex=0;for(let s of e.matchAll(n))y.isBare(s[1])&&t.add(s[1])}return Array.from(t)}async extractImports(e){let t=new Set,n=s=>{y.isBare(s)&&t.add(s)};try{await ss;let[s]=os(e);s.forEach(o=>n(e.slice(o.s,o.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,n){let s=(await this.extractImports(e)).filter(d=>!n?.has(y.rootOf(d))),o=[...new Set(s.map(y.rootOf))],i=await Promise.all(o.map(async d=>({name:d,version:await this.resolveVersion(d,t)}))),{allRoots:a,flags:c,autoAddedPeers:l}=await this.peer.resolve(i,d=>this.resolveVersion(d,t)),p=this.buildEntries([...s,...l.map(d=>d.name)],a,c,t);return{importMap:{imports:Object.fromEntries(p)},prefetchUrls:p.map(([,d])=>d)}}async resolveVersion(e,t){let n=t[e],s=n?`${e}@${n}`:e,o=await this.version.resolveExactForRoot(e,n);if(!o){let i=await k(()=>this.cdn.pinEsmUrl(s));if(!i)throw new Error(`Cannot resolve ${s}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);o=y.versionFromUrl(i),o&&n&&await k(()=>this.cache.setPinnedExact(e,n,o))}if(!o)throw new Error(`Cannot resolve ${s}: no concrete version found.`);return o}buildEntries(e,t,n,s){let o=new Map(t.map(g=>[g.name,g])),i=g=>{let S=o.get(y.rootOf(g));return new y(g).withPreferredVersion(S.version,s[S.name]).format()},a=new Set([...n.entries()].filter(([,g])=>g.isPeerRoot||g.isSharedDep).map(([g])=>g)),c=new Set(e.filter(g=>g!==y.rootOf(g)).map(y.rootOf)),l=[],p=new Set,d=new Set(e.filter(g=>g===y.rootOf(g))),m=new Set;for(let g of e){let S=y.rootOf(g),F=o.get(S),{isPeerRoot:B,hasPeers:_,isSharedDep:u}=n.get(S),f=c.has(S),b=g!==S,v=!(B||u)&&(f||!_),T=this.singletonDepsOf(F,a),z=b&&d.has(S);z&&m.add(S);let N=z?[...T,S]:T.length?T:void 0;l.push([g,this.cdn.buildEsmUrl(i(g),{bundle:v,external:N})]),p.add(g)}let h=new Set([...a,...m]);for(let g of h)o.has(g)&&(p.has(g)||l.push([g,this.cdn.buildEsmUrl(i(g),{})]),l.push([`${g}/`,`${this.cdn.esmHost}/${i(g)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...Pe(e.meta),...kt(e.meta)])].filter(n=>t.has(n))}};le.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as wr,satisfies as is,maxSatisfying as Tt,major as as,prerelease as cs,rsort as ls,valid as ds}from"semver";var Je=class{cmp(e,t){return e===t?0:wr(e,t)?1:wr(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!is(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=Tt(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?ls(e)[0]:void 0}selectBestVersion(e,t){if(!e?.length)return;let n=t?.range?.trim()||"*",s=t?.preferStable??!0,o=t?.distTags?.latest;if(o&&e.includes(o)&&this.satisfies(n,o))return o;if(s){let a=Tt(e,n,{includePrerelease:!1});if(a)return a}return Tt(e,n,{includePrerelease:!0})??void 0}majorOf(e){return as(e)}isPrerelease(e){return cs(e)!==null}isExactVersion(e){return ds(e)!==null}},Q=new Je;function xr(r,e){let t=new Se(r,e),n=new Re(t),s=new Ee(r,t,Q);return{packageService:new le(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as jr from"fs/promises";import*as $ from"path";var _t=[{name:"es5"},{name:"es2015.core"},{name:"es2015.collection"},{name:"es2015.promise"},{name:"es2015.iterable"},{name:"es2015.symbol"},{name:"es2015.symbol.wellknown"},{name:"es2015.generator"},{name:"es2015.proxy"},{name:"es2015.reflect"},{name:"es2016.array.include"},{name:"es2016.intl"},{name:"es2017.object"},{name:"es2017.string"},{name:"es2017.sharedmemory"},{name:"es2017.typedarrays"},{name:"es2017.date"},{name:"es2017.intl"},{name:"es2018.asynciterable"},{name:"es2018.asyncgenerator"},{name:"es2018.promise"},{name:"es2018.regexp"},{name:"es2018.intl"},{name:"es2019.array"},{name:"es2019.object"},{name:"es2019.string"},{name:"es2019.symbol"},{name:"es2019.intl"},{name:"es2020.bigint"},{name:"es2020.promise"},{name:"es2020.string"},{name:"es2020.sharedmemory"},{name:"es2020.date"},{name:"es2020.number"},{name:"es2020.symbol.wellknown"},{name:"es2020.intl"},{name:"es2021.promise"},{name:"es2021.string"},{name:"es2021.weakref"},{name:"es2021.intl"},{name:"es2022.array"},{name:"es2022.object"},{name:"es2022.error"},{name:"es2022.string"},{name:"es2022.regexp"},{name:"es2022.intl"},{name:"es2023.array"},{name:"es2023.collection"},{name:"es2023.intl",since:"5.5"},{name:"es2024.arraybuffer",since:"5.5"},{name:"es2024.collection",since:"5.5"},{name:"es2024.object",since:"5.5"},{name:"es2024.promise",since:"5.5"},{name:"es2024.regexp",since:"5.5"},{name:"es2024.sharedmemory",since:"5.5"},{name:"es2024.string",since:"5.5"},{name:"esnext.array",since:"5.5"},{name:"esnext.collection"},{name:"esnext.decorators"},{name:"esnext.disposable"},{name:"esnext.error",since:"5.5"},{name:"esnext.float16",since:"5.5"},{name:"esnext.iterator",since:"5.5"},{name:"esnext.object"},{name:"esnext.promise"},{name:"esnext.sharedmemory",since:"5.5"},{name:"esnext.intl"}],Ct=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var Sr=`
98
+ `)}Kt();import*as re from"fs/promises";import*as kt from"path";import{pathToFileURL as Ho}from"url";import{transform as co}from"sucrase";function Yt(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=co(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var Oe="https://esm.sh",De="https://cdn.jsdelivr.net/npm/",Xt="https://data.jsdelivr.com/v1/package/npm/";function Kr(r){let e=(r||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var y=class r{constructor(e,t,n){let s=typeof e=="string"?r.parse(e):e;this.name=s.name,this.version=ge(t??s.version),this.subpath=ge(n??s.subpath)}static parse(e){let t=Kr(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=Yr(t[1]??""),a=ge(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=Yr(t[0]),i=ge(t.slice(1).join("/"));return new r({name:s,version:o,subpath:i})}}static fromUrl(e){try{let t=new URL(e),n=new URL(Oe).host,s=new URL(De).host;if(t.host===n){let o=Kr(t.pathname.replace(/^\/v\d+\//,"/"));if(!o.length)return;let i=o[0].startsWith("@")?`${o[0]}/${o[1]??""}`:o[0];return r.parse(i)}if(t.host===s){let o=t.pathname.split("/npm/")[1];if(!o)return;let i=o.split("/")[0]||"";return r.parse(i)}return}catch{return}}static versionFromUrl(e){return r.fromUrl(e)?.version}format(){let e=this.version?`${this.name}@${this.version}`:this.name;return this.subpath?`${e}/${this.subpath}`:e}root(){return this.name}static rootOf(e){return r.parse(e).name}withVersion(e){return new r({name:this.name,version:ge(e),subpath:this.subpath})}withPreferredVersion(e,t){let n=e||t;return n?this.withVersion(n):this}static isBare(e){if(!e||e.startsWith(".")||e.startsWith("/"))return!1;let t=e.toLowerCase();return!t.startsWith("http://")&&!t.startsWith("https://")}},ge=r=>r&&r.length?r:void 0,Yr=r=>{let e=r.indexOf("@");return e<0?[r,void 0]:[r.slice(0,e),ge(r.slice(e+1))]};async function A(r){try{return await r()}catch{return}}var Be=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=Oe,this.jsDelivrBase=De,this.jsDelivrMeta=Xt,this.pinMs=1e4,this.versionsIndexMs=1440*60*1e3,this.metaTtlMs=10080*60*1e3,this.pinCache=new Map}normalizeRelative(e){let t=e||"";return t.startsWith("./")?t.slice(2):t.replace(/^\/+/,"")}ensureLeadingDotSlash(e){return e.startsWith("./")?e:`./${e}`}baseDir(e){let t=typeof e=="string"?new y(e):e;return`${this.jsDelivrBase}${t.name}${t.version?`@${t.version}`:""}/`}file(e,t){return new URL(this.normalizeRelative(t),this.baseDir(e)).toString()}packageJson(e){return this.file(e,"package.json")}buildEsmUrl(e,t={}){let{target:n="es2022",bundle:s=!1,external:o}=t,i=new URLSearchParams({target:n});return s&&i.append("bundle",""),o?.length&&i.append("external",o.join(",")),`${this.esmHost}/${e}?${i.toString()}`}async pinEsmUrl(e,t="es2022"){let n=this.buildEsmUrl(e,{target:t}),s=await A(()=>this.http.head(n));return s?.ok?s.url||n:void 0}async resolveExactVersion(e){let t=Date.now(),n=this.pinCache.get(e);if(n&&t-n.ts<this.pinMs)return n.value;let s=await this.tryResolveFromUrls([this.buildEsmUrl(e),`${this.esmHost}/${e}`]);return this.pinCache.set(e,{value:s,ts:t}),s}async tryResolveFromUrls(e){for(let t of e){let n=await A(()=>this.http.head(t)),s=this.parseVersionFromUrl(n?.url||t);if(s)return s}}async fetchVersionsIndex(e){if(await this.cache.isNegative(e))return;let t=await this.cache.getIndex(e);if(t&&Date.now()-t.updatedAt<this.versionsIndexMs)return{versions:t.versions,distTags:t.distTags};let n=await A(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(e)}`));if(!n?.versions?.length){await this.cache.recordNegative(e);return}await this.cache.clearNegative(e);let s=n.distTags&&Object.keys(n.distTags).length?n.distTags:void 0;return await this.cache.setIndex(e,n.versions,s),n}parseVersionFromUrl(e){let t=y.fromUrl(e)?.version;return t&&/\d+\.\d+\.\d+/.test(t)?t:void 0}async fetchPackageMeta(e,t){let n=await this.cache.getMeta(e,t);if(n&&Date.now()-n.updatedAt<this.metaTtlMs){let{dependencies:d,peerDependencies:u,peerDependenciesMeta:f}=n;return{name:e,version:t,dependencies:d,peerDependencies:u,peerDependenciesMeta:f}}let s=this.packageJson(new y(`${e}@${t}`)),o=await A(()=>this.http.getJson(s));if(!o)return;let i=d=>d&&Object.keys(d).length?d:void 0,a=i(o.dependencies),c=i(o.peerDependencies),l=i(o.peerDependenciesMeta);return await this.cache.setMeta(e,t,a,c,l),{name:e,version:t,dependencies:a,peerDependencies:c,peerDependenciesMeta:l}}};var Xr=r=>r.startsWith("@types/"),Me=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!Xr(e)),Qt=r=>Object.keys(r?.dependencies||{}).filter(e=>!Xr(e)),lo=r=>Me(r).filter(e=>!r?.peerDependenciesMeta?.[e]?.optional),Fe=class{constructor(e){this.cdn=e}async resolve(e,t){let n=await this.fetchMeta(e),{allRoots:s,autoAddedPeers:o}=await this.expandWithPeers(n,t),i=this.computeFlags(s);return{allRoots:s,flags:i,autoAddedPeers:o}}async fetchMeta(e){return Promise.all(e.map(async({name:t,version:n})=>({name:t,version:n,meta:await this.cdn.fetchPackageMeta(t,n)})))}async expandWithPeers(e,t){let n=new Map(e.map(o=>[o.name,o])),s=[];for(let o of e)for(let i of lo(o.meta))!n.has(i)&&!s.some(a=>a.name===i)&&s.push({name:i,requiredBy:o.name});for(let{name:o,requiredBy:i}of s)try{let a=await t(o),c=await this.cdn.fetchPackageMeta(o,a);n.set(o,{name:o,version:a,meta:c})}catch(a){console.warn(`[typebulb] Failed to resolve peer "${o}" for "${i}":`,a)}return{allRoots:[...n.values()],autoAddedPeers:s.filter(o=>n.has(o.name))}}computeFlags(e){let t=new Set(e.flatMap(o=>Me(o.meta))),n=new Map;for(let o of e)for(let i of Qt(o.meta))n.set(i,(n.get(i)||0)+1);let s=new Set([...n.entries()].filter(([,o])=>o>=2).map(([o])=>o));return new Map(e.map(o=>[o.name,{isPeerRoot:t.has(o.name),hasPeers:Me(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var je=class{constructor(e,t,n){this.cache=e,this.cdn=t,this.semver=n}selectVersionFromIndex(e,t,n){return this.semver.selectBestVersion(e,{range:t,distTags:n})}async learnExactVersion(e){let t=await A(()=>this.cdn.fetchVersionsIndex(e));if(t?.versions?.length){let n=this.semver.selectBestVersion(t.versions,{distTags:t.distTags});if(n)return n}return this.cdn.resolveExactVersion(e)}async resolveExactForRoot(e,t){if(!t)return this.learnExactVersion(e);let n=await this.cache.getPinnedExact(e,t);if(n){if(this.semver.isExactVersion(n))return n;console.debug("[typebulb] cached version for",e,"is not exact (",n,"); re-resolving from registry")}let s=await A(()=>this.cdn.fetchVersionsIndex(e));if(s?.versions?.length){let i=this.selectVersionFromIndex(s.versions,t,s.distTags);if(i){if(this.semver.isExactVersion(i))return await this.cache.setPinnedExact(e,t,i),i}else{console.debug("[typebulb] refreshing version cache for",e,"(",t,"not in cached set \u2014 likely a new release)"),await this.cache.invalidateVersionsCache(e);let a=await A(()=>this.cdn.fetchVersionsIndex(e));if(a?.versions?.length){let c=this.selectVersionFromIndex(a.versions,t,a.distTags);if(c&&this.semver.isExactVersion(c))return await this.cache.setPinnedExact(e,t,c),c}}}let o=await this.cdn.resolveExactVersion(`${e}@${t}`);if(o&&this.semver.isExactVersion(o))return await this.cache.setPinnedExact(e,t,o),o}async effectivePackage(e,t){let n=new y(e),s=n.root(),o=t[s],i=o?await A(()=>this.cache.getPinnedExact(s,o))??await A(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?n.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as uo,parse as po}from"es-module-lexer";var ye=class r{constructor(e,t,n,s){this.version=e,this.cdn=t,this.peer=n,this.cache=s}extractImportsSync(e){let t=new Set;for(let n of r.importPatterns){n.lastIndex=0;for(let s of e.matchAll(n))y.isBare(s[1])&&t.add(s[1])}return Array.from(t)}async extractImports(e){let t=new Set,n=s=>{y.isBare(s)&&t.add(s)};try{await uo;let[s]=po(e);s.forEach(o=>n(e.slice(o.s,o.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,n){let s=(await this.extractImports(e)).filter(u=>!n?.has(y.rootOf(u))),o=[...new Set(s.map(y.rootOf))],i=await Promise.all(o.map(async u=>({name:u,version:await this.resolveVersion(u,t)}))),{allRoots:a,flags:c,autoAddedPeers:l}=await this.peer.resolve(i,u=>this.resolveVersion(u,t)),d=this.buildEntries([...s,...l.map(u=>u.name)],a,c,t);return{importMap:{imports:Object.fromEntries(d)},prefetchUrls:d.map(([,u])=>u)}}async resolveVersion(e,t){let n=t[e],s=n?`${e}@${n}`:e,o=await this.version.resolveExactForRoot(e,n);if(!o){let i=await A(()=>this.cdn.pinEsmUrl(s));if(!i)throw new Error(`Cannot resolve ${s}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);o=y.versionFromUrl(i),o&&n&&await A(()=>this.cache.setPinnedExact(e,n,o))}if(!o)throw new Error(`Cannot resolve ${s}: no concrete version found.`);return o}buildEntries(e,t,n,s){let o=new Map(t.map(g=>[g.name,g])),i=g=>{let v=o.get(y.rootOf(g));return new y(g).withPreferredVersion(v.version,s[v.name]).format()},a=new Set([...n.entries()].filter(([,g])=>g.isPeerRoot||g.isSharedDep).map(([g])=>g)),c=new Set(e.filter(g=>g!==y.rootOf(g)).map(y.rootOf)),l=[],d=new Set,u=new Set(e.filter(g=>g===y.rootOf(g))),f=new Set;for(let g of e){let v=y.rootOf(g),$=o.get(v),{isPeerRoot:O,hasPeers:E,isSharedDep:T}=n.get(v),p=c.has(v),h=g!==v,x=!(O||T)&&(p||!E),w=this.singletonDepsOf($,a),V=h&&u.has(v);V&&f.add(v);let se=V?[...w,v]:w.length?w:void 0;l.push([g,this.cdn.buildEsmUrl(i(g),{bundle:x,external:se})]),d.add(g)}let m=new Set([...a,...f]);for(let g of m)o.has(g)&&(d.has(g)||l.push([g,this.cdn.buildEsmUrl(i(g),{})]),l.push([`${g}/`,`${this.cdn.esmHost}/${i(g)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...Me(e.meta),...Qt(e.meta)])].filter(n=>t.has(n))}};ye.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as Qr,satisfies as fo,maxSatisfying as Zt,major as mo,prerelease as ho,rsort as go,valid as yo}from"semver";var lt=class{cmp(e,t){return e===t?0:Qr(e,t)?1:Qr(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!fo(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=Zt(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?go(e)[0]:void 0}selectBestVersion(e,t){if(!e?.length)return;let n=t?.range?.trim()||"*",s=t?.preferStable??!0,o=t?.distTags?.latest;if(o&&e.includes(o)&&this.satisfies(n,o))return o;if(s){let a=Zt(e,n,{includePrerelease:!1});if(a)return a}return Zt(e,n,{includePrerelease:!0})??void 0}majorOf(e){return mo(e)}isPrerelease(e){return ho(e)!==null}isExactVersion(e){return yo(e)!==null}},oe=new lt;function Zr(r,e){let t=new Be(r,e),n=new Fe(t),s=new je(r,t,oe);return{packageService:new ye(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as hn from"fs/promises";import*as L from"path";var er=[{name:"es5"},{name:"es2015.core"},{name:"es2015.collection"},{name:"es2015.promise"},{name:"es2015.iterable"},{name:"es2015.symbol"},{name:"es2015.symbol.wellknown"},{name:"es2015.generator"},{name:"es2015.proxy"},{name:"es2015.reflect"},{name:"es2016.array.include"},{name:"es2016.intl"},{name:"es2017.object"},{name:"es2017.string"},{name:"es2017.sharedmemory"},{name:"es2017.typedarrays"},{name:"es2017.date"},{name:"es2017.intl"},{name:"es2018.asynciterable"},{name:"es2018.asyncgenerator"},{name:"es2018.promise"},{name:"es2018.regexp"},{name:"es2018.intl"},{name:"es2019.array"},{name:"es2019.object"},{name:"es2019.string"},{name:"es2019.symbol"},{name:"es2019.intl"},{name:"es2020.bigint"},{name:"es2020.promise"},{name:"es2020.string"},{name:"es2020.sharedmemory"},{name:"es2020.date"},{name:"es2020.number"},{name:"es2020.symbol.wellknown"},{name:"es2020.intl"},{name:"es2021.promise"},{name:"es2021.string"},{name:"es2021.weakref"},{name:"es2021.intl"},{name:"es2022.array"},{name:"es2022.object"},{name:"es2022.error"},{name:"es2022.string"},{name:"es2022.regexp"},{name:"es2022.intl"},{name:"es2023.array"},{name:"es2023.collection"},{name:"es2023.intl",since:"5.5"},{name:"es2024.arraybuffer",since:"5.5"},{name:"es2024.collection",since:"5.5"},{name:"es2024.object",since:"5.5"},{name:"es2024.promise",since:"5.5"},{name:"es2024.regexp",since:"5.5"},{name:"es2024.sharedmemory",since:"5.5"},{name:"es2024.string",since:"5.5"},{name:"esnext.array",since:"5.5"},{name:"esnext.collection"},{name:"esnext.decorators"},{name:"esnext.disposable"},{name:"esnext.error",since:"5.5"},{name:"esnext.float16",since:"5.5"},{name:"esnext.iterator",since:"5.5"},{name:"esnext.object"},{name:"esnext.promise"},{name:"esnext.sharedmemory",since:"5.5"},{name:"esnext.intl"}],tr=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var en=`
93
99
  /**
94
100
  * Get raw data chunk from the Data tab.
95
101
  * @param index - Chunk index (0-based). Separate chunks with 2 blank lines.
@@ -100,7 +106,7 @@ Examples:
100
106
  * @param index - Chunk index (0-based)
101
107
  * @throws If chunk is not valid JSON/JSON-ish
102
108
  */
103
- json<T = unknown>(index: number): T;`,Pr=`
109
+ json<T = unknown>(index: number): T;`,tn=`
104
110
  /**
105
111
  * Get the insight data produced by the inference layer.
106
112
  *
@@ -109,7 +115,7 @@ Examples:
109
115
  *
110
116
  * @returns The parsed insight JSON, or undefined if no insight is available
111
117
  */
112
- insight<T = unknown>(): T | undefined;`,Rr=`
118
+ insight<T = unknown>(): T | undefined;`,rn=`
113
119
  /**
114
120
  * General-purpose AI call.
115
121
  *
@@ -126,7 +132,7 @@ Examples:
126
132
  model?: string;
127
133
  /** Enable/disable web search. Default: on for BYOK, always off for free model. */
128
134
  webSearch?: boolean;
129
- }): Promise<{ text: string }>;`,Er=`
135
+ }): Promise<{ text: string }>;`,nn=`
130
136
  /**
131
137
  * Returns AI models available to the current user.
132
138
  * Models are filtered by the user's configured API keys.
@@ -141,7 +147,7 @@ Examples:
141
147
  friendlyName: string;
142
148
  /** Provider display name, e.g. "Anthropic" */
143
149
  providerName: string;
144
- }>>;`,us="\n /**\n * The bulb's theme override (`<html data-theme>`).\n *\n * - Get: the current override \u2014 `'dark'` | `'light'`, or `undefined` when\n * following the OS preference.\n * - Set `'dark'`/`'light'` to force and persist it (per-bulb); set\n * `undefined` to clear the override and follow the OS again.\n *\n * Drives `<html data-theme>`, so render off `html[data-theme=\"\u2026\"]` selectors\n * (or observe the attribute) rather than reading `tb.theme`.\n */\n theme: 'light' | 'dark' | undefined;",kr=`
150
+ }>>;`,bo="\n /**\n * The bulb's theme override (`<html data-theme>`).\n *\n * - Get: the current override \u2014 `'dark'` | `'light'`, or `undefined` when\n * following the OS preference.\n * - Set `'dark'`/`'light'` to force and persist it (per-bulb); set\n * `undefined` to clear the override and follow the OS again.\n *\n * Drives `<html data-theme>`, so render off `html[data-theme=\"\u2026\"]` selectors\n * (or observe the attribute) rather than reading `tb.theme`.\n */\n theme: 'light' | 'dark' | undefined;",sn=`
145
151
  /**
146
152
  * The mode this bulb is running in.
147
153
  *
@@ -151,7 +157,7 @@ Examples:
151
157
  * - \`'embedded'\` \u2014 Running as a bulb embedded inside another bulb (sandboxed,
152
158
  * client-only: AI, filesystem, and server RPC are unavailable)
153
159
  */
154
- mode: 'local' | 'editor' | 'published' | 'embedded';`,Tr=`
160
+ mode: 'local' | 'editor' | 'published' | 'embedded';`,on=`
155
161
  /**
156
162
  * Local filesystem access (CLI only).
157
163
  *
@@ -165,7 +171,7 @@ Examples:
165
171
  readBytes(path: string): Promise<Uint8Array>;
166
172
  /** Write text or raw bytes to a file. Creates parent directories if needed. */
167
173
  write(path: string, content: string | Uint8Array): Promise<boolean>;
168
- };`,ps=`
174
+ };`,wo=`
169
175
  /**
170
176
  * Server-side function proxy. The built-in \`log\` prints to CLI stdout
171
177
  * (falls back to console.log on web). On the server side, this object only
@@ -173,7 +179,7 @@ Examples:
173
179
  */
174
180
  server: {
175
181
  log(...args: any[]): Promise<void>;
176
- };`,fs=`
182
+ };`,vo=`
177
183
  /**
178
184
  * Async value inspector for tensor-like objects.
179
185
  *
@@ -240,7 +246,7 @@ Examples:
240
246
  *
241
247
  * @returns The full canonical URL
242
248
  */
243
- url(): Promise<string>;`,ms=`
249
+ url(): Promise<string>;`,xo=`
244
250
  /**
245
251
  * Server-side function proxy.
246
252
  *
@@ -248,23 +254,23 @@ Examples:
248
254
  * \`tb.server.log(...)\` is a built-in that prints to CLI stdout (falls back to console.log on web).
249
255
  * User exports override built-ins of the same name.
250
256
  */
251
- server: Record<string, (...args: any[]) => Promise<any>>;`,At=`
257
+ server: Record<string, (...args: any[]) => Promise<any>>;`,rr=`
252
258
  /**
253
259
  * Typebulb utilities namespace.
254
260
  * Type \`tb.\` to discover available helpers.
255
261
  */
256
- declare const tb: {${Sr}${fs}${Pr}${ms}${Rr}${Tr}${Er}${us}${kr}
262
+ declare const tb: {${en}${vo}${tn}${xo}${rn}${on}${nn}${bo}${sn}
257
263
  };
258
- `,Ot=`
264
+ `,nr=`
259
265
  /**
260
266
  * Typebulb utilities namespace (server-side).
261
267
  * Type \`tb.\` to discover available helpers.
262
268
  */
263
- declare const tb: {${Sr}${Pr}${Rr}${Tr}${ps}${Er}${kr}
269
+ declare const tb: {${en}${tn}${rn}${on}${wo}${nn}${sn}
264
270
  };
265
- `;var Z=class{constructor(e){this.store=e}async isNegative(e){let t=await Ve(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await Ve(()=>this.store.get(e)))?.attempts||0)+1;await Ve(()=>this.store.set(e,{until:Date.now()+hs(n),attempts:n}))}async clearNegative(e){await Ve(()=>this.store.delete(e))}};function hs(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function Ve(r){try{return await r()}catch{return}}import xs from"p-limit";import{resolve as _r}from"resolve.exports";var de=class{constructor(e){this.fetchDts=e}fetchDtsText(e){return this.tryUrls([e])}async tryUrls(e){for(let t of e){let n=await this.fetchDts(t);if(n&&(this.looksLikeDts(n.dts)||/\.(d\.ts|d\.mts)(?:[?#].*)?$/i.test(n.url)||/[?&]dts(?:[&#]|$)/i.test(n.url)))return n}}looksLikeDts(e){return/^\s*export\s*\{\s*\}\s*;?\s*$/m.test(e)?!0:/declare\s+(module|namespace|class|interface|function|const|var|let)/.test(e)||/interface\s+\w+/.test(e)||/type\s+\w+\s*=/.test(e)}};var G={maxRelativeTypeRefs:500,maxBareDeps:8,maxBareDepth:3,prefetchConcurrency:4,negativeTtlMs:1e4},ke=["index.d.ts","index.d.mts"],Te=/\.d\.(ts|mts)$/i;function It(r){if(Te.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function He(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function _e(r,{retries:e=2,timeoutMs:t=15e3,init:n}={}){for(let s=0;s<=e;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),t);try{let a=await fetch(r,{...n,signal:o.signal});if(gs(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function gs(r){return r===408||r===429||r>=500&&r<600}var Ce=class extends de{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let n=this.cdnClient.packageJson(new y({name:e,version:t})),s=await _e(n);if(!s?.ok)return;let o;try{o=await s.json()}catch{return}if(o)return{pkg:o,baseDir:this.cdnClient.baseDir(new y({name:e,version:t??o.version})),version:t}}extractPathFromResult(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.find(t=>typeof t=="string")}async tryUntilSuccess(e,t){for(let n of e){let s=await t(n);if(s)return s}}async resolveFromSelected(e,t){if(e.kind==="types"){let s=this.cdnClient.normalizeRelative(e.path);if(!s||s==="/"||s===".")return this.tryUntilSuccess([...ke],t);if(!Te.test(s)){let o=await this.tryUntilSuccess(this.declarationCandidatesFor(s),t);if(o)return o}return t(s)}let n=this.declarationCandidatesFor(e.path);return this.tryUntilSuccess([...ke,...n],t)}toResolutionResult(e){return{kind:Te.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(_r(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(_r(s,n,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=y.parse(e),{pkg:n,baseDir:s}=await this.loadPackageAtVersionedRoot(t.name,t.version)||{};if(!n||!s)return;let o={name:t.name,version:t.version},i=new y(o).format(),a=new y({...o,subpath:t.subpath}).format(),c=d=>this.fetchCandidateFrom(s,t.name,d);if(t.subpath){let d=this.cdnClient.ensureLeadingDotSlash(t.subpath),m=this.resolveExportsPath(n,d);if(m){let g=await this.resolveFromSelected(this.toResolutionResult(m),c);if(g)return{...g,resolvedPkg:a}}let h=await this.tryUntilSuccess(this.declarationCandidatesFor(d),c);if(h)return{...h,resolvedPkg:a}}let l=n.types??n.typings;if(l){let d=await this.resolveFromSelected({kind:"types",path:l},c);if(d)return{...d,resolvedPkg:i}}let p=this.resolveExportsPath(n,".");if(p){let d=await this.resolveFromSelected(this.toResolutionResult(p),c);if(d)return{...d,resolvedPkg:i}}return}catch{return}}async fetchCandidateFrom(e,t,n){let s=this.cdnClient.normalizeRelative(n),o=new URL(s,e).toString(),i=await this.fetchDtsText(o);return i?{dts:i.dts,url:i.url,resolvedPkg:t}:void 0}declarationCandidatesFor(e){if(!e||e==="./"||e==="/")return[...ke];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),n=He(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...He(`${s}index`)),n}};import{gunzipSync as bs}from"fflate";var ue=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await _e(n,{timeoutMs:3e4});if(!s?.ok)return new Map;let o=new Uint8Array(await s.arrayBuffer());return this.extractDtsFiles(o)}getTarballUrl(e,t){return`https://registry.npmjs.org/${e.replace("/","%2F")}/-/${e.split("/").pop()}-${t}.tgz`}normalizeTarPath(e){let t=e.replace(/^package\//,""),n=t.indexOf("/");return n>0?t.substring(n+1):t}extractDtsFiles(e){let t=new Map;try{let n=bs(e),s=new TextDecoder("utf-8"),o=0;for(;o<n.length-512;){let i=n.slice(o,o+512);if(i[0]===0)break;let a=i.slice(0,100),c=a.indexOf(0),l=s.decode(a.slice(0,c>0?c:100)).trim(),p=i.slice(124,136),d=s.decode(p).trim().replace(/\0/g,""),m=parseInt(d,8)||0,h=String.fromCharCode(i[156]);if(o+=512,(h==="0"||h==="\0")&&(l.endsWith(".d.ts")||l.endsWith(".d.mts"))){let g=n.slice(o,o+m);t.set(this.normalizeTarPath(l),s.decode(g))}o+=Math.ceil(m/512)*512}}catch{}return t}},ys=new ue;var Ae=class extends de{constructor(e,t,n,s=new ue){super(e),this.cdnClient=t,this.cache=n,this.tarballFetcher=s}typesNameCandidates(e){let t=e.startsWith("@")?e.slice(1).replace("/","__"):e;return t.includes(".")?[t,t.split(".").join("-"),t.split(".").join("")]:[t]}selectTypesVersion(e,t,n){try{if(n){let o=Q.majorOf(n),i=e.filter(a=>Q.majorOf(a)===o);if(i.length)return i.sort((a,c)=>Q.cmp(c,a))[0]}let s=t?.latest;return s&&e.includes(s)?s:e[0]}catch{return e[0]}}async fetchFromVersionedRoot(e,t){let n=new y(e),s=n.version;if(!s)return;let o;try{o=await this.tarballFetcher.fetchAndExtract(n.name,s)}catch{return}if(!o||o.size===0)return;for(let[a,c]of o.entries()){let l=this.cdnClient.file(e,a);try{await this.cache.setCachedFile(l,c)}catch{}}let i=t.subpath?[t.subpath+".d.ts",t.subpath+"/index.d.ts"]:["index.d.ts"];for(let a of i){let c=o.get(a);if(c)return{dts:c,url:this.cdnClient.file(e,a),resolvedPkg:t.subpath?new y(t).format():t.name}}}async resolve(e){let t=y.parse(e);if(t.name)for(let n of this.typesNameCandidates(t.name)){let s=`@types/${n}`,o;try{o=await this.cdnClient.fetchVersionsIndex(s)}catch{continue}if(!o?.versions?.length)continue;let i=this.selectTypesVersion(o.versions,o.distTags,t.version),a=await this.fetchFromVersionedRoot(`${s}@${i}`,t);if(a)return a}}};var Oe=class{collectRelativeTypeRefs(e){return this.collectRefs(e).filter(t=>t.startsWith("./")||t.startsWith("../"))}collectBareModuleRefs(e){return this.collectRefs(e).filter(t=>this.isBare(t))}collectRefs(e){let t=new Set,n=(s,o)=>(t.add(s[o]),null);return this.matchAll(e,/(import|export)\s+[^'"\n]*from\s*['"]([^'"\n]+)['"]/,s=>n(s,2)),this.matchAll(e,/export\s*\*\s*from\s*['"]([^'"\n]+)['"]/,s=>n(s,1)),Array.from(t)}matchAll(e,t,n){let s=[];try{let o=new RegExp(t.source,"g"),i;for(;i=o.exec(e);){let a=n(i);a!==null&&s.push(a)}}catch{}return s}isBare(e){return!(e.startsWith("./")||e.startsWith("../")||e.startsWith("file:")||e.startsWith("http://")||e.startsWith("https://"))}};var Cr="file:///node_modules",Ie=class{constructor(){this.epoch=0,this.listeners=new Set}getEpoch(){return this.epoch}bumpEpoch(){this.epoch+=1;for(let e of this.listeners)try{e(this.epoch)}catch{}return this.epoch}onEpochChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}epochDir(){return`__tsepoch_${this.epoch}`}pathForMain(e){return`${Cr}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=vs(t);return`${Cr}/${this.epochDir()}/${e}/${n}`}};function vs(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as ws}from"lru-cache";function $t(r){let e=new ws({ttl:1e4,max:500}),t=new Map;return async function(s){try{if(await r.isNegative(s))return;let o=e.get(s);if(o&&Date.now()-o<1e4)return;let i=await r.getCachedFile(s);if(i)return{dts:i,url:s};let a=t.get(s);if(a)return a;let c=(async()=>{let l=await fetch(s,{cache:"no-store"});if(!l.ok){l.status===404&&(e.set(s,Date.now()),await r.recordNegative(s));return}let p=await l.text(),d=l.url||s;return await r.clearNegative(s),await r.setCachedFile(d,p),{dts:p,url:d}})();return t.set(s,c),await c.finally(()=>t.delete(s))}catch{return}}}var qe=class{constructor(e){this.inFlight=new Map,this.scanner=new Oe,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=$t(e.cache),this.typescriptProvider=new Ce(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new Ae(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new Ie}withInFlight(e,t){let n=this.inFlight.get(e);if(n)return n;let s=t().finally(()=>this.inFlight.delete(e));return this.inFlight.set(e,s),s}invalidate(){this.virtualFs.bumpEpoch(),this.inFlight.clear()}capArray(e,t){return e.length<=t?e:e.slice(0,t)}pushFileIfNew(e,t,n){e.some(s=>s.path===t)||e.push({path:t,content:n})}createStubDef(e){let t=this.virtualFs.pathForMain(e);return{pkg:e,mainPath:t,files:[{path:t,content:"export const _shim: any; export default _shim;"}],shims:[{module:e,path:t}]}}async trySubpathWithRootFallback(e,t){let n=new y(e);return n.subpath?this.fetchRootDts(n.name,t):void 0}async fetchViaProviders(e){for(let t of[this.typescriptProvider,this.definitelyTypedProvider])try{let n=await t.resolve(e);if(n?.dts)return n}catch{}}subpathsMatch(e,t){return new y(e).subpath===new y(t).subpath}async fetchRootDts(e,t){let{effectivePackage:n,root:s,pinned:o}=await this.versionResolver.effectivePackage(e,t),i=await this.cache.getCachedDts(n);if(i?.content){let c=i.url??this.cdnClient.file(o?`${s}@${o}`:s,"index.d.ts");return{dts:i.content,url:c,resolvedPkg:n}}let a;try{a=await this.fetchViaProviders(n)}catch{return}if(!(!a?.dts||!a.url)){try{await this.cache.setCachedFile(a.url,a.dts)}catch{}if(this.subpathsMatch(n,a.resolvedPkg||n)){try{await this.cache.setCachedDts(n,a.dts,a.url)}catch{}return a}}}extractPackageRootUrl(e){let t=e.pathname.match(/^(.+@[^/]+\/)/);return t?new URL(t[1],e.origin):new URL("./",e)}toVirtualPath(e,t,n){let s=t.pathname.startsWith(e.pathname)?t.pathname.slice(e.pathname.length):`__deps__/${encodeURIComponent(t.toString()).replace(/%/g,"_")}.d.ts`;return this.virtualFs.pathFor(n,s)}computeEntryPath(e,t){if(!e)return{mainPath:this.virtualFs.pathForMain(t),packageRootUrl:void 0};let n=new URL(e),s=this.extractPackageRootUrl(n);return{mainPath:this.toVirtualPath(s,n,t),packageRootUrl:s}}async expandRelativeRefs(e,t,n,s,o=new Set,i){if(!o.has(t)&&(o.add(t),!(o.size>G.maxRelativeTypeRefs)))try{let a=new URL(t),c=new URL("./",a);i??(i=this.extractPackageRootUrl(a));let l=this.capArray(this.scanner.collectRelativeTypeRefs(e),G.maxRelativeTypeRefs);for(let p of l)await this.tryRelativeRef(p,c,i,n,s,o)}catch{}}async tryRelativeRef(e,t,n,s,o,i){try{let a=new URL(e,t),c=a.pathname+a.search,l=It(c)?[c]:this.typescriptProvider.declarationCandidatesFor(c);for(let p of l){let m=new URL(p,a).toString();if(i.has(m))return;let h=await this.fetchDts(m);if(h?.dts){let g=this.toVirtualPath(n,new URL(h.url),s);this.pushFileIfNew(o,g,h.dts),await this.expandRelativeRefs(h.dts,h.url,s,o,i,n);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new y(e).name!==new y(t).name}ambientlyDeclares(e,t){for(let n of e.matchAll(/declare\s+module\s+['"]([^'"]+)['"]/g)){let s=n[1];if(s===t||s.endsWith("/*")&&t.startsWith(s.slice(0,-1)))return!0}return!1}markFileAmbient(e,t){let n=e.find(s=>s.path===t);n&&(n.ambient=!0)}async prefetchBareDeps(e,t,n,s,o){try{let i=this.capArray(this.scanner.collectBareModuleRefs(e),G.maxBareDeps).filter(l=>this.isDifferentPackage(l,t));if(!i.length)return;let a=new Set([t]),c=xs(G.prefetchConcurrency);await Promise.all(i.map(l=>c(()=>this.prefetchBareDepsRecursive(l,n,s,G.maxBareDepth,a,o).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,n,s,o,i){if(s<=0||o.has(e))return;o.add(e);let a=await this.fetchRootDts(e,i);if(!a?.dts)return;let c=a.resolvedPkg||e,l=this.virtualFs.pathForMain(c);this.pushFileIfNew(t,l,a.dts),this.ambientlyDeclares(a.dts,e)?this.markFileAmbient(t,l):n.push({module:e,path:l}),a.url&&await this.expandRelativeRefs(a.dts,a.url,c,t);let p=this.capArray(this.scanner.collectBareModuleRefs(a.dts),G.maxBareDeps).filter(d=>!o.has(d));for(let d of p)await this.prefetchBareDepsRecursive(d,t,n,s-1,o,i)}async resolve(e,t,n){let s=await this.packageService.extractImports(e),o=n?[...s,...n]:s;return(await Promise.all(o.map(a=>this.resolveOne(a,t)))).filter(a=>!!a)}async resolveOne(e,t){let{effectivePackage:n}=await this.versionResolver.effectivePackage(e,t);return this.withInFlight(n,async()=>{let s=await this.fetchRootDts(e,t)??await this.trySubpathWithRootFallback(e,t);return s?this.buildDefFromContent(e,s,s.resolvedPkg||e,t):this.createStubDef(e)})}async buildDefFromContent(e,t,n,s){let{dts:o,url:i,resolvedPkg:a}=t,c=new y(a||n),l=c.version?`${c.name}@${c.version}`:c.name,{mainPath:p,packageRootUrl:d}=this.computeEntryPath(i,l),m=[{path:p,content:o}],h=[];i&&await this.expandRelativeRefs(o,i,l,m,void 0,d);let g=m.map(_=>_.content).join(`
266
- `);await this.prefetchBareDeps(g,l,m,h,s);let S=c.format(),F=e===S?[e]:[e,S],B=F.some(_=>this.ambientlyDeclares(o,_));return B?this.markFileAmbient(m,p):h.push(...F.map(_=>({module:_,path:p}))),{pkg:e,mainPath:p,files:m,shims:h,ambient:B}}};function Dt(r){return new qe(r)}import*as L from"fs/promises";import*as U from"path";import*as Ir from"os";import*as Mt from"fs/promises";import*as Ar from"crypto";function I(r){return Ar.createHash("sha1").update(r).digest("hex")}async function ee(r){try{return JSON.parse(await Mt.readFile(r,"utf8"))}catch{return}}async function ze(r){try{return await Mt.readFile(r,"utf8")}catch{return}}var Or=1,K=U.join(Ir.homedir(),".typebulb","cache"),$e=U.join(K,"packages"),De=U.join(K,"proxy"),Ge=U.join(K,"dts"),Ss=U.join(K,"emit"),jt;function x(){return jt||(jt=Ps()),jt}function Ke(r,e){return U.join(Ss,I(r),e)}async function Ps(){await L.mkdir(K,{recursive:!0});let r=U.join(K,"version.json");if((await Rs(r))?.version===Or)return;let t=await L.readdir(K).catch(()=>[]);await Promise.all(t.map(n=>L.rm(U.join(K,n),{recursive:!0,force:!0}))),await L.writeFile(r,JSON.stringify({version:Or})+`
267
- `,"utf8")}async function Rs(r){try{let e=await L.readFile(r,"utf8");return JSON.parse(e)}catch{return}}import*as Y from"fs/promises";import*as $r from"path";async function C(r,e){await Y.mkdir($r.dirname(r),{recursive:!0});let t=`${r}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await Y.writeFile(t,e,"utf8"),await Y.rename(t,r).catch(async n=>{throw await Y.rm(t,{force:!0}).catch(()=>{}),n})}var pe=class{constructor(e){this.filePath=e}mem;loadPromise;load(){return this.mem?Promise.resolve(this.mem):(this.loadPromise||(this.loadPromise=ee(this.filePath).then(e=>(this.mem=new Map(Object.entries(e??{})),this.mem))),this.loadPromise)}async get(e){return(await this.load()).get(e)}async set(e,t){let n=await this.load();n.set(e,t),await this.persist(n)}async delete(e){let t=await this.load();t.delete(e)&&await this.persist(t)}async persist(e){await C(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var Ft=$.join($e,"indexes"),Dr=$.join($e,"pinned"),Es=$.join($e,"meta"),ks=$.join($e,"negative.json"),fe=Symbol("missing"),Xe=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new Z(new pe(ks));async getPinnedExact(e,t){let n=`${e}@${t}`,s=this.pinnedMem.get(n);if(s!==void 0)return s===fe?void 0:s;await x();let o=await ze($.join(Dr,I(n)+".txt"));return this.pinnedMem.set(n,o??fe),o}async setPinnedExact(e,t,n){let s=`${e}@${t}`;this.pinnedMem.set(s,n),await x(),await C($.join(Dr,I(s)+".txt"),n)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===fe?void 0:t;await x();let n=await ee($.join(Ft,Ye(e)+".json"));return this.indexMem.set(e,n??fe),n}async setIndex(e,t,n){let s={versions:t,distTags:n,updatedAt:Date.now()};this.indexMem.set(e,s),await x(),await C($.join(Ft,Ye(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await jr.rm($.join(Ft,Ye(e)+".json"),{force:!0})}async isNegative(e){return await x(),this.negativeCache.isNegative(e)}async recordNegative(e){await x(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let n=`${e}@${t}`,s=this.metaMem.get(n);if(s!==void 0)return s===fe?void 0:s;await x();let o=await ee(Mr(e,t));return this.metaMem.set(n,o??fe),o}async setMeta(e,t,n,s,o){let i={dependencies:n,peerDependencies:s,peerDependenciesMeta:o,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,i),await x(),await C(Mr(e,t),JSON.stringify(i))}};function Mr(r,e){return $.join(Es,Ye(r),encodeURIComponent(e)+".json")}function Ye(r){return r.replace(/\//g,"__")}var Fr={async getJson(r){try{let e=await fetch(r,{redirect:"follow"});return e.ok?await e.json():void 0}catch{return}},async head(r){try{let e=await fetch(r,{method:"HEAD",redirect:"follow"});return{ok:e.ok,url:e.url}}catch{return}}};var Ts=new Xe,{packageService:Qe,versionResolver:Nr,cdnClient:Lr,peerResolver:Ma}=xr(Ts,Fr);var Br=`
271
+ `;var ie=class{constructor(e){this.store=e}async isNegative(e){let t=await dt(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await dt(()=>this.store.get(e)))?.attempts||0)+1;await dt(()=>this.store.set(e,{until:Date.now()+So(n),attempts:n}))}async clearNegative(e){await dt(()=>this.store.delete(e))}};function So(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function dt(r){try{return await r()}catch{return}}import _o from"p-limit";import{resolve as an}from"resolve.exports";var be=class{constructor(e){this.fetchDts=e}fetchDtsText(e){return this.tryUrls([e])}async tryUrls(e){for(let t of e){let n=await this.fetchDts(t);if(n&&(this.looksLikeDts(n.dts)||/\.(d\.ts|d\.mts)(?:[?#].*)?$/i.test(n.url)||/[?&]dts(?:[&#]|$)/i.test(n.url)))return n}}looksLikeDts(e){return/^\s*export\s*\{\s*\}\s*;?\s*$/m.test(e)?!0:/declare\s+(module|namespace|class|interface|function|const|var|let)/.test(e)||/interface\s+\w+/.test(e)||/type\s+\w+\s*=/.test(e)}};var Z={maxRelativeTypeRefs:500,maxBareDeps:8,maxBareDepth:3,prefetchConcurrency:4,negativeTtlMs:1e4},Ne=["index.d.ts","index.d.mts"],Le=/\.d\.(ts|mts)$/i;function sr(r){if(Le.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function ut(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function Ue(r,{retries:e=2,timeoutMs:t=15e3,init:n}={}){for(let s=0;s<=e;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),t);try{let a=await fetch(r,{...n,signal:o.signal});if(Po(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function Po(r){return r===408||r===429||r>=500&&r<600}var We=class extends be{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let n=this.cdnClient.packageJson(new y({name:e,version:t})),s=await Ue(n);if(!s?.ok)return;let o;try{o=await s.json()}catch{return}if(o)return{pkg:o,baseDir:this.cdnClient.baseDir(new y({name:e,version:t??o.version})),version:t}}extractPathFromResult(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.find(t=>typeof t=="string")}async tryUntilSuccess(e,t){for(let n of e){let s=await t(n);if(s)return s}}async resolveFromSelected(e,t){if(e.kind==="types"){let s=this.cdnClient.normalizeRelative(e.path);if(!s||s==="/"||s===".")return this.tryUntilSuccess([...Ne],t);if(!Le.test(s)){let o=await this.tryUntilSuccess(this.declarationCandidatesFor(s),t);if(o)return o}return t(s)}let n=this.declarationCandidatesFor(e.path);return this.tryUntilSuccess([...Ne,...n],t)}toResolutionResult(e){return{kind:Le.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(an(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(an(s,n,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=y.parse(e),{pkg:n,baseDir:s}=await this.loadPackageAtVersionedRoot(t.name,t.version)||{};if(!n||!s)return;let o={name:t.name,version:t.version},i=new y(o).format(),a=new y({...o,subpath:t.subpath}).format(),c=u=>this.fetchCandidateFrom(s,t.name,u);if(t.subpath){let u=this.cdnClient.ensureLeadingDotSlash(t.subpath),f=this.resolveExportsPath(n,u);if(f){let g=await this.resolveFromSelected(this.toResolutionResult(f),c);if(g)return{...g,resolvedPkg:a}}let m=await this.tryUntilSuccess(this.declarationCandidatesFor(u),c);if(m)return{...m,resolvedPkg:a}}let l=n.types??n.typings;if(l){let u=await this.resolveFromSelected({kind:"types",path:l},c);if(u)return{...u,resolvedPkg:i}}let d=this.resolveExportsPath(n,".");if(d){let u=await this.resolveFromSelected(this.toResolutionResult(d),c);if(u)return{...u,resolvedPkg:i}}return}catch{return}}async fetchCandidateFrom(e,t,n){let s=this.cdnClient.normalizeRelative(n),o=new URL(s,e).toString(),i=await this.fetchDtsText(o);return i?{dts:i.dts,url:i.url,resolvedPkg:t}:void 0}declarationCandidatesFor(e){if(!e||e==="./"||e==="/")return[...Ne];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),n=ut(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...ut(`${s}index`)),n}};import{gunzipSync as Eo}from"fflate";var we=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await Ue(n,{timeoutMs:3e4});if(!s?.ok)return new Map;let o=new Uint8Array(await s.arrayBuffer());return this.extractDtsFiles(o)}getTarballUrl(e,t){return`https://registry.npmjs.org/${e.replace("/","%2F")}/-/${e.split("/").pop()}-${t}.tgz`}normalizeTarPath(e){let t=e.replace(/^package\//,""),n=t.indexOf("/");return n>0?t.substring(n+1):t}extractDtsFiles(e){let t=new Map;try{let n=Eo(e),s=new TextDecoder("utf-8"),o=0;for(;o<n.length-512;){let i=n.slice(o,o+512);if(i[0]===0)break;let a=i.slice(0,100),c=a.indexOf(0),l=s.decode(a.slice(0,c>0?c:100)).trim(),d=i.slice(124,136),u=s.decode(d).trim().replace(/\0/g,""),f=parseInt(u,8)||0,m=String.fromCharCode(i[156]);if(o+=512,(m==="0"||m==="\0")&&(l.endsWith(".d.ts")||l.endsWith(".d.mts"))){let g=n.slice(o,o+f);t.set(this.normalizeTarPath(l),s.decode(g))}o+=Math.ceil(f/512)*512}}catch{}return t}},Ro=new we;var Je=class extends be{constructor(e,t,n,s=new we){super(e),this.cdnClient=t,this.cache=n,this.tarballFetcher=s}typesNameCandidates(e){let t=e.startsWith("@")?e.slice(1).replace("/","__"):e;return t.includes(".")?[t,t.split(".").join("-"),t.split(".").join("")]:[t]}selectTypesVersion(e,t,n){try{if(n){let o=oe.majorOf(n),i=e.filter(a=>oe.majorOf(a)===o);if(i.length)return i.sort((a,c)=>oe.cmp(c,a))[0]}let s=t?.latest;return s&&e.includes(s)?s:e[0]}catch{return e[0]}}async fetchFromVersionedRoot(e,t){let n=new y(e),s=n.version;if(!s)return;let o;try{o=await this.tarballFetcher.fetchAndExtract(n.name,s)}catch{return}if(!o||o.size===0)return;for(let[a,c]of o.entries()){let l=this.cdnClient.file(e,a);try{await this.cache.setCachedFile(l,c)}catch{}}let i=t.subpath?[t.subpath+".d.ts",t.subpath+"/index.d.ts"]:["index.d.ts"];for(let a of i){let c=o.get(a);if(c)return{dts:c,url:this.cdnClient.file(e,a),resolvedPkg:t.subpath?new y(t).format():t.name}}}async resolve(e){let t=y.parse(e);if(t.name)for(let n of this.typesNameCandidates(t.name)){let s=`@types/${n}`,o;try{o=await this.cdnClient.fetchVersionsIndex(s)}catch{continue}if(!o?.versions?.length)continue;let i=this.selectTypesVersion(o.versions,o.distTags,t.version),a=await this.fetchFromVersionedRoot(`${s}@${i}`,t);if(a)return a}}};var He=class{collectRelativeTypeRefs(e){return this.collectRefs(e).filter(t=>t.startsWith("./")||t.startsWith("../"))}collectBareModuleRefs(e){return this.collectRefs(e).filter(t=>this.isBare(t))}collectRefs(e){let t=new Set,n=(s,o)=>(t.add(s[o]),null);return this.matchAll(e,/(import|export)\s+[^'"\n]*from\s*['"]([^'"\n]+)['"]/,s=>n(s,2)),this.matchAll(e,/export\s*\*\s*from\s*['"]([^'"\n]+)['"]/,s=>n(s,1)),Array.from(t)}matchAll(e,t,n){let s=[];try{let o=new RegExp(t.source,"g"),i;for(;i=o.exec(e);){let a=n(i);a!==null&&s.push(a)}}catch{}return s}isBare(e){return!(e.startsWith("./")||e.startsWith("../")||e.startsWith("file:")||e.startsWith("http://")||e.startsWith("https://"))}};var cn="file:///node_modules",Ve=class{constructor(){this.epoch=0,this.listeners=new Set}getEpoch(){return this.epoch}bumpEpoch(){this.epoch+=1;for(let e of this.listeners)try{e(this.epoch)}catch{}return this.epoch}onEpochChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}epochDir(){return`__tsepoch_${this.epoch}`}pathForMain(e){return`${cn}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=ko(t);return`${cn}/${this.epochDir()}/${e}/${n}`}};function ko(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as To}from"lru-cache";function or(r){let e=new To({ttl:1e4,max:500}),t=new Map;return async function(s){try{if(await r.isNegative(s))return;let o=e.get(s);if(o&&Date.now()-o<1e4)return;let i=await r.getCachedFile(s);if(i)return{dts:i,url:s};let a=t.get(s);if(a)return a;let c=(async()=>{let l=await fetch(s,{cache:"no-store"});if(!l.ok){l.status===404&&(e.set(s,Date.now()),await r.recordNegative(s));return}let d=await l.text(),u=l.url||s;return await r.clearNegative(s),await r.setCachedFile(u,d),{dts:d,url:u}})();return t.set(s,c),await c.finally(()=>t.delete(s))}catch{return}}}var pt=class{constructor(e){this.inFlight=new Map,this.scanner=new He,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=or(e.cache),this.typescriptProvider=new We(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new Je(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new Ve}withInFlight(e,t){let n=this.inFlight.get(e);if(n)return n;let s=t().finally(()=>this.inFlight.delete(e));return this.inFlight.set(e,s),s}invalidate(){this.virtualFs.bumpEpoch(),this.inFlight.clear()}capArray(e,t){return e.length<=t?e:e.slice(0,t)}pushFileIfNew(e,t,n){e.some(s=>s.path===t)||e.push({path:t,content:n})}createStubDef(e){let t=this.virtualFs.pathForMain(e);return{pkg:e,mainPath:t,files:[{path:t,content:"export const _shim: any; export default _shim;"}],shims:[{module:e,path:t}]}}async trySubpathWithRootFallback(e,t){let n=new y(e);return n.subpath?this.fetchRootDts(n.name,t):void 0}async fetchViaProviders(e){for(let t of[this.typescriptProvider,this.definitelyTypedProvider])try{let n=await t.resolve(e);if(n?.dts)return n}catch{}}subpathsMatch(e,t){return new y(e).subpath===new y(t).subpath}async fetchRootDts(e,t){let{effectivePackage:n,root:s,pinned:o}=await this.versionResolver.effectivePackage(e,t),i=await this.cache.getCachedDts(n);if(i?.content){let c=i.url??this.cdnClient.file(o?`${s}@${o}`:s,"index.d.ts");return{dts:i.content,url:c,resolvedPkg:n}}let a;try{a=await this.fetchViaProviders(n)}catch{return}if(!(!a?.dts||!a.url)){try{await this.cache.setCachedFile(a.url,a.dts)}catch{}if(this.subpathsMatch(n,a.resolvedPkg||n)){try{await this.cache.setCachedDts(n,a.dts,a.url)}catch{}return a}}}extractPackageRootUrl(e){let t=e.pathname.match(/^(.+@[^/]+\/)/);return t?new URL(t[1],e.origin):new URL("./",e)}toVirtualPath(e,t,n){let s=t.pathname.startsWith(e.pathname)?t.pathname.slice(e.pathname.length):`__deps__/${encodeURIComponent(t.toString()).replace(/%/g,"_")}.d.ts`;return this.virtualFs.pathFor(n,s)}computeEntryPath(e,t){if(!e)return{mainPath:this.virtualFs.pathForMain(t),packageRootUrl:void 0};let n=new URL(e),s=this.extractPackageRootUrl(n);return{mainPath:this.toVirtualPath(s,n,t),packageRootUrl:s}}async expandRelativeRefs(e,t,n,s,o=new Set,i){if(!o.has(t)&&(o.add(t),!(o.size>Z.maxRelativeTypeRefs)))try{let a=new URL(t),c=new URL("./",a);i??(i=this.extractPackageRootUrl(a));let l=this.capArray(this.scanner.collectRelativeTypeRefs(e),Z.maxRelativeTypeRefs);for(let d of l)await this.tryRelativeRef(d,c,i,n,s,o)}catch{}}async tryRelativeRef(e,t,n,s,o,i){try{let a=new URL(e,t),c=a.pathname+a.search,l=sr(c)?[c]:this.typescriptProvider.declarationCandidatesFor(c);for(let d of l){let f=new URL(d,a).toString();if(i.has(f))return;let m=await this.fetchDts(f);if(m?.dts){let g=this.toVirtualPath(n,new URL(m.url),s);this.pushFileIfNew(o,g,m.dts),await this.expandRelativeRefs(m.dts,m.url,s,o,i,n);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new y(e).name!==new y(t).name}ambientlyDeclares(e,t){for(let n of e.matchAll(/declare\s+module\s+['"]([^'"]+)['"]/g)){let s=n[1];if(s===t||s.endsWith("/*")&&t.startsWith(s.slice(0,-1)))return!0}return!1}markFileAmbient(e,t){let n=e.find(s=>s.path===t);n&&(n.ambient=!0)}async prefetchBareDeps(e,t,n,s,o){try{let i=this.capArray(this.scanner.collectBareModuleRefs(e),Z.maxBareDeps).filter(l=>this.isDifferentPackage(l,t));if(!i.length)return;let a=new Set([t]),c=_o(Z.prefetchConcurrency);await Promise.all(i.map(l=>c(()=>this.prefetchBareDepsRecursive(l,n,s,Z.maxBareDepth,a,o).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,n,s,o,i){if(s<=0||o.has(e))return;o.add(e);let a=await this.fetchRootDts(e,i);if(!a?.dts)return;let c=a.resolvedPkg||e,l=this.virtualFs.pathForMain(c);this.pushFileIfNew(t,l,a.dts),this.ambientlyDeclares(a.dts,e)?this.markFileAmbient(t,l):n.push({module:e,path:l}),a.url&&await this.expandRelativeRefs(a.dts,a.url,c,t);let d=this.capArray(this.scanner.collectBareModuleRefs(a.dts),Z.maxBareDeps).filter(u=>!o.has(u));for(let u of d)await this.prefetchBareDepsRecursive(u,t,n,s-1,o,i)}async resolve(e,t,n){let s=await this.packageService.extractImports(e),o=n?[...s,...n]:s;return(await Promise.all(o.map(a=>this.resolveOne(a,t)))).filter(a=>!!a)}async resolveOne(e,t){let{effectivePackage:n}=await this.versionResolver.effectivePackage(e,t);return this.withInFlight(n,async()=>{let s=await this.fetchRootDts(e,t)??await this.trySubpathWithRootFallback(e,t);return s?this.buildDefFromContent(e,s,s.resolvedPkg||e,t):this.createStubDef(e)})}async buildDefFromContent(e,t,n,s){let{dts:o,url:i,resolvedPkg:a}=t,c=new y(a||n),l=c.version?`${c.name}@${c.version}`:c.name,{mainPath:d,packageRootUrl:u}=this.computeEntryPath(i,l),f=[{path:d,content:o}],m=[];i&&await this.expandRelativeRefs(o,i,l,f,void 0,u);let g=f.map(E=>E.content).join(`
272
+ `);await this.prefetchBareDeps(g,l,f,m,s);let v=c.format(),$=e===v?[e]:[e,v],O=$.some(E=>this.ambientlyDeclares(o,E));return O?this.markFileAmbient(f,d):m.push(...$.map(E=>({module:E,path:d}))),{pkg:e,mainPath:d,files:f,shims:m,ambient:O}}};function ir(r){return new pt(r)}import*as z from"fs/promises";import*as q from"path";import*as un from"os";import*as ar from"fs/promises";import*as ln from"crypto";function N(r){return ln.createHash("sha1").update(r).digest("hex")}async function ae(r){try{return JSON.parse(await ar.readFile(r,"utf8"))}catch{return}}async function ft(r){try{return await ar.readFile(r,"utf8")}catch{return}}var dn=1,ee=q.join(un.homedir(),".typebulb","cache"),ze=q.join(ee,"packages"),qe=q.join(ee,"proxy"),mt=q.join(ee,"dts"),Ao=q.join(ee,"emit"),cr;function S(){return cr||(cr=Co()),cr}function ht(r,e){return q.join(Ao,N(r),e)}async function Co(){await z.mkdir(ee,{recursive:!0});let r=q.join(ee,"version.json");if((await Io(r))?.version===dn)return;let t=await z.readdir(ee).catch(()=>[]);await Promise.all(t.map(n=>z.rm(q.join(ee,n),{recursive:!0,force:!0}))),await z.writeFile(r,JSON.stringify({version:dn})+`
273
+ `,"utf8")}async function Io(r){try{let e=await z.readFile(r,"utf8");return JSON.parse(e)}catch{return}}import*as te from"fs/promises";import*as pn from"path";async function B(r,e){await te.mkdir(pn.dirname(r),{recursive:!0});let t=`${r}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await te.writeFile(t,e,"utf8"),await te.rename(t,r).catch(async n=>{throw await te.rm(t,{force:!0}).catch(()=>{}),n})}var ve=class{constructor(e){this.filePath=e}mem;loadPromise;load(){return this.mem?Promise.resolve(this.mem):(this.loadPromise||(this.loadPromise=ae(this.filePath).then(e=>(this.mem=new Map(Object.entries(e??{})),this.mem))),this.loadPromise)}async get(e){return(await this.load()).get(e)}async set(e,t){let n=await this.load();n.set(e,t),await this.persist(n)}async delete(e){let t=await this.load();t.delete(e)&&await this.persist(t)}async persist(e){await B(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var lr=L.join(ze,"indexes"),fn=L.join(ze,"pinned"),$o=L.join(ze,"meta"),Oo=L.join(ze,"negative.json"),xe=Symbol("missing"),yt=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new ie(new ve(Oo));async getPinnedExact(e,t){let n=`${e}@${t}`,s=this.pinnedMem.get(n);if(s!==void 0)return s===xe?void 0:s;await S();let o=await ft(L.join(fn,N(n)+".txt"));return this.pinnedMem.set(n,o??xe),o}async setPinnedExact(e,t,n){let s=`${e}@${t}`;this.pinnedMem.set(s,n),await S(),await B(L.join(fn,N(s)+".txt"),n)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===xe?void 0:t;await S();let n=await ae(L.join(lr,gt(e)+".json"));return this.indexMem.set(e,n??xe),n}async setIndex(e,t,n){let s={versions:t,distTags:n,updatedAt:Date.now()};this.indexMem.set(e,s),await S(),await B(L.join(lr,gt(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await hn.rm(L.join(lr,gt(e)+".json"),{force:!0})}async isNegative(e){return await S(),this.negativeCache.isNegative(e)}async recordNegative(e){await S(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let n=`${e}@${t}`,s=this.metaMem.get(n);if(s!==void 0)return s===xe?void 0:s;await S();let o=await ae(mn(e,t));return this.metaMem.set(n,o??xe),o}async setMeta(e,t,n,s,o){let i={dependencies:n,peerDependencies:s,peerDependenciesMeta:o,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,i),await S(),await B(mn(e,t),JSON.stringify(i))}};function mn(r,e){return L.join($o,gt(r),encodeURIComponent(e)+".json")}function gt(r){return r.replace(/\//g,"__")}var gn={async getJson(r){try{let e=await fetch(r,{redirect:"follow"});return e.ok?await e.json():void 0}catch{return}},async head(r){try{let e=await fetch(r,{method:"HEAD",redirect:"follow"});return{ok:e.ok,url:e.url}}catch{return}}};var Do=new yt,{packageService:bt,versionResolver:yn,cdnClient:bn,peerResolver:Ll}=Zr(Do,gn);var wn=`
268
274
  (() => {
269
275
  // Embedded (bulb-in-a-bulb): runs inside a sandboxed iframe with no parent
270
276
  // bridge, so privileged tb.* (AI, fs, server RPC) can't reach a host and would
@@ -474,26 +480,17 @@ declare const tb: {${Sr}${Pr}${Rr}${Tr}${ps}${Er}${kr}
474
480
  };
475
481
  }
476
482
  })();
477
- `;function Ur(r){let{name:e,code:t,css:n,html:s,data:o,insight:i,importMap:a,watch:c,theme:l}=r,p=s.trim()||'<div id="app"></div>',d=h=>h.replace(/<\/script/gi,"<\\/script"),m={imports:As(a.imports)};return`<!DOCTYPE html>
478
- <html>
479
- <head>
480
- <meta charset="utf-8">
481
- <meta name="viewport" content="width=device-width, initial-scale=1">
482
- <title>${Cs(e)} - typebulb</title>
483
- <script>
484
- // Theme engine. Sets html[data-theme] before stylesheets paint (no flash) and
485
- // exposes the tb.theme accessor via window.__tbTheme. The override is persisted
486
- // per-bulb in localStorage; its absence means follow the OS. Ctrl/Cmd+Shift+L
487
- // toggles the effective theme. See Specs/Theme.md.
483
+ `;function wt(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}var vt=` *, *::before, *::after { box-sizing: border-box; }
484
+ body { margin: 0; font-family: system-ui, -apple-system, sans-serif; }
485
+ html[data-theme="dark"] { color-scheme: dark; }
486
+ html[data-theme="light"] { color-scheme: light; }`;function xt(r,e){let t=n=>n.replace(/<\/script/gi,"<\\/script");return` <script>
488
487
  (function() {
489
488
  try {
490
- var KEY = ${d(JSON.stringify("tb-theme:"+e))};
489
+ var KEY = ${t(JSON.stringify("tb-theme:"+r))};
491
490
  var doc = document.documentElement;
492
491
  var mq = window.matchMedia('(prefers-color-scheme: dark)');
493
492
  var os = function() { return mq.matches ? 'dark' : 'light'; };
494
- // A host-forced theme (bulb-in-a-bulb) outranks the OS but not an explicit
495
- // in-iframe override, so the user can still toggle the embed independently.
496
- var FORCED = ${d(JSON.stringify(l??null))};
493
+ var FORCED = ${t(JSON.stringify(e??null))};
497
494
  var stored = function() {
498
495
  try { var v = localStorage.getItem(KEY); return (v === 'dark' || v === 'light') ? v : undefined; }
499
496
  catch (e) { return undefined; }
@@ -510,7 +507,6 @@ declare const tb: {${Sr}${Pr}${Rr}${Tr}${ps}${Er}${kr}
510
507
  }
511
508
  };
512
509
  apply(effective());
513
- // OS changes only steer the theme while there is no override.
514
510
  var onOsChange = function() { if (!stored()) apply(os()); };
515
511
  mq.addEventListener ? mq.addEventListener('change', onOsChange) : mq.addListener(onOsChange);
516
512
  window.__tbTheme = { get: stored, set: set, effective: effective };
@@ -522,39 +518,41 @@ declare const tb: {${Sr}${Pr}${Rr}${Tr}${ps}${Er}${kr}
522
518
  });
523
519
  } catch (e) {}
524
520
  })();
525
- </script>
521
+ </script>`}function vn(r){let{name:e,code:t,css:n,html:s,data:o,insight:i,importMap:a,watch:c,theme:l}=r,d=s.trim()||'<div id="app"></div>',u=m=>m.replace(/<\/script/gi,"<\\/script"),f={imports:Mo(a.imports)};return`<!DOCTYPE html>
522
+ <html>
523
+ <head>
524
+ <meta charset="utf-8">
525
+ <meta name="viewport" content="width=device-width, initial-scale=1">
526
+ <title>${wt(e)} - typebulb</title>
527
+ ${xt(e,l)}
526
528
  <script type="importmap">
527
- ${JSON.stringify(m,null,2)}
529
+ ${JSON.stringify(f,null,2)}
528
530
  </script>
529
531
  <style>
530
- /* Reset and base styles */
531
- *, *::before, *::after { box-sizing: border-box; }
532
- body { margin: 0; font-family: system-ui, -apple-system, sans-serif; }
533
- html[data-theme="dark"] { color-scheme: dark; }
534
- html[data-theme="light"] { color-scheme: light; }
532
+ ${vt}
535
533
  </style>
536
534
  <style>
537
535
  ${n}
538
536
  </style>
539
537
  </head>
540
538
  <body>
541
- ${p}
539
+ ${d}
542
540
 
543
- ${o.length>0?`<script>window.__TB_DATA__ = ${d(JSON.stringify(o))};</script>`:""}
544
- ${i?`<script>window.__TB_INSIGHT__ = ${d(JSON.stringify(i))};</script>`:""}
541
+ ${o.length>0?`<script>window.__TB_DATA__ = ${u(JSON.stringify(o))};</script>`:""}
542
+ ${i?`<script>window.__TB_INSIGHT__ = ${u(JSON.stringify(i))};</script>`:""}
545
543
  ${c?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
546
544
 
547
545
  <script>
548
- ${Br}
546
+ ${wn}
549
547
  </script>
550
548
 
551
- ${_s}
549
+ ${Bo}
552
550
 
553
551
  <script type="module">
554
- ${d(t)}
552
+ ${u(t)}
555
553
  </script>
556
554
  </body>
557
- </html>`}var _s=`<script>
555
+ </html>`}var Bo=`<script>
558
556
  (function () {
559
557
  if (window.parent === window) return;
560
558
  var de = document.documentElement;
@@ -625,50 +623,114 @@ ${d(t)}
625
623
  }
626
624
  });
627
625
  })();
628
- </script>`;function Cs(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function As(r){let e={};for(let[t,n]of Object.entries(r))e[t]=n.startsWith("https://")?"/proxy/"+n:n;return e}import*as et from"fs/promises";import*as Ze from"path";import{existsSync as Wr,readFileSync as Os}from"fs";import{execFile as Is}from"child_process";import{promisify as $s}from"util";import{satisfies as Ds}from"semver";var Ms=$s(Is);async function tt(r,e,t){let s=r.map(i=>js(i,t)).filter(i=>!Fs(i,e));if(s.length===0)return;await et.mkdir(e,{recursive:!0});let o=Ze.join(e,"package.json");Wr(o)||await et.writeFile(o,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${s.join(", ")}`),await Ms("npm",["install","--no-audit","--no-fund",...s],{cwd:e,shell:!0})}function js(r,e){if(!e||Vr(r))return r;let t=e[r];return t?`${r}@${t}`:r}function Fs(r,e){let t=Ze.join(e,"node_modules",Jr(r));if(!Wr(t))return!1;let n=Vr(r);if(!n)return!0;try{let s=JSON.parse(Os(Ze.join(t,"package.json"),"utf-8")).version;return Ds(s,n)}catch{return!1}}function rt(r){let e=new Set,t=/\bimport\s+(?:[\s\S]*?\s+from\s+)?['"]([^./][^'"]*)['"]/g,n;for(;n=t.exec(r);){let s=n[1];if(s.includes(":"))continue;let o=s.startsWith("@")?s.split("/").slice(0,2).join("/"):s.split("/")[0];e.add(o)}return[...e]}function Jr(r){if(r.startsWith("@")){let t=r.indexOf("/");if(t<0)return r;let n=r.indexOf("@",t+1);return n<0?r:r.slice(0,n)}let e=r.indexOf("@");return e<0?r:r.slice(0,e)}function Vr(r){let e=Jr(r);return r.length>e.length?r.slice(e.length+1):""}async function Hr(r){let t=(await X.readdir(r)).find(n=>n.endsWith(".bulb.md"));return t?nt.join(r,t):null}async function W(r){let e=await X.readFile(r,"utf-8"),t=fr(e);if(!t)throw new Error("Invalid .bulb.md file format");let n=mr(t);return{bulb:n,config:gr(n.config)}}async function Nt(r,e,t,n){let s=Rt(r,{serverOnly:!0});if(s.error)throw new Error(`Server compilation error: ${s.error}`);let o=s.code;t&&(o=await dr(o,t));let i=nt.join(e,".typebulb");await X.mkdir(i,{recursive:!0});let a=rt(o);a.length>0&&await tt(a,i,n);let c=nt.join(i,"server.mjs");return await X.writeFile(c,o,"utf-8"),await import(`${Ns(c).href}?t=${Date.now()}`)}async function Lt(r,e,t,n,s){let{bulb:o,config:i}=await W(r),a=hr(o.data),c=Rt(o.code,{jsxImportSource:i.jsxImportSource});c.error&&console.error("Compilation error:",c.error);let{importMap:l}=await Qe.buildImportMap(c.code,i.dependencies??{},n?new Set([n.name]):void 0);n&&(l.imports[n.name]=n.entryUrl);let p=Ur({name:o.name,code:c.code,css:o.css,html:o.html,data:a,insight:o.insight,importMap:l,watch:e}),d=null;return o.server&&t&&(d=await Nt(o.server,s,n,i.dependencies)),{html:p,bulb:o,serverExports:d}}import{readFileSync as Us,writeFileSync as Ws,mkdirSync as Js}from"fs";import{join as Vs}from"path";import{join as Bt,resolve as Ls}from"path";import{homedir as Bs}from"os";function st(){let r=process.env.TYPEBULB_SERVERS_DIR;return r?Bt(r,".."):Bt(Bs(),".typebulb")}function te(){return process.env.TYPEBULB_SERVERS_DIR||Bt(st(),"servers")}function D(r){let e=Ls(r);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}function qr(r,e){let t=D(r),n=D(e);return t.startsWith(n.endsWith("/")?n:n+"/")?!t.includes("/node_modules/"):!1}function zr(){return Vs(st(),"trust.json")}function Ut(){try{let r=JSON.parse(Us(zr(),"utf8"));return new Set(Array.isArray(r)?r:[])}catch{return new Set}}function Hs(r){Js(st(),{recursive:!0}),Ws(zr(),JSON.stringify([...r]))}function ot(r){return Ut().has(D(r))}function Gr(r,e){let t=Ut(),n=D(r);(e?t.has(n):!t.has(n))||(e?t.add(n):t.delete(n),Hs(t))}function Kr(){return[...Ut()]}import qs from"open";async function it(r){await qs(r)}import*as J from"path";import{fileURLToPath as zs}from"url";var at={claude:{file:"claude.bulb.md",srcEnv:"TYPEBULB_CLAUDE_SRC",viewer:!0}};function me(r){let e=at[r];if(!e)return;let t=e.srcEnv?process.env[e.srcEnv]:void 0;return t?J.resolve(t):J.join(J.dirname(zs(import.meta.url)),"..","bulbs",e.file)}function ct(r){let e=J.basename(r).toLowerCase();for(let[t,n]of Object.entries(at))if(n.viewer&&n.file.toLowerCase()===e)return t}function Wt(){return Object.entries(at).filter(([,r])=>r.viewer).map(([r])=>r)}function Yr(r){let e=J.basename(r).toLowerCase();return Object.values(at).some(t=>t.file.toLowerCase()===e)}import*as rn from"path";import{spawn as co}from"child_process";import*as E from"fs/promises";import*as R from"path";import*as he from"path";var Gs=he.join(Ge,"pkg"),Ks=he.join(Ge,"files"),Ys=he.join(Ge,"negative.json"),dt=class{pkgMem=new Map;fileMem=new Map;negativeCache=new Z(new pe(Ys));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await x();let t=await ee(Xr(e));return this.pkgMem.set(e,t),t}async setCachedDts(e,t,n){let s={content:t,url:n};this.pkgMem.set(e,s),await lt(async()=>{await x(),await C(Xr(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await x();let t=await ze(Qr(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await lt(async()=>{await x(),await C(Qr(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await lt(async()=>{await x(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return lt(()=>this.negativeCache.clearNegative(e))}};async function lt(r){try{await r()}catch{}}function Xr(r){return he.join(Gs,I(r)+".json")}function Qr(r){return he.join(Ks,I(r)+".txt")}var Jt;function Xs(){return Jt||(Jt=Dt({cache:new dt,cdnClient:Lr,packageService:Qe,versionResolver:Nr})),Jt}var Zr="file:///node_modules/";async function en(r){let e=Ke(r.emitKey,"typecheck");await x(),await E.rm(e,{recursive:!0,force:!0}),await E.mkdir(e,{recursive:!0});let t=to(r.jsxImportSource,r.dependencies),n=await Xs().resolve(r.code,r.dependencies,t),s=r.local?.name,o=s?n.filter(p=>p.pkg!==s):n,i=new Set;for(let p of o)for(let d of p.files){let m=ut(d.path);if(!m||i.has(m))continue;i.add(m);let h=R.join(e,"node_modules",m);await E.mkdir(R.dirname(h),{recursive:!0}),await E.writeFile(h,d.content,"utf8")}let a={};for(let p of o)for(let d of p.shims){let m=ut(d.path);m&&(a[d.module]=[`./node_modules/${m}`])}for(let p of o){if(p.ambient)continue;let d=ut(p.mainPath);d&&(a[p.pkg]=[`./node_modules/${d}`])}let c=new Set;for(let p of o)for(let d of p.files){if(!d.ambient)continue;let m=ut(d.path);m&&c.add(`node_modules/${m}`)}if(r.local){delete a[r.local.name];let p=await ro(r.local,e);p?a[r.local.name]=[`./node_modules/${r.local.name}/${p}`]:console.warn(` local: '${r.local.name}' ships no type defs; check cannot type against it.`)}let l=Qs(r.jsxImportSource,a,[...c]);return await E.writeFile(R.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
629
- `,"utf8"),await E.writeFile(R.join(e,"code.tsx"),r.code,"utf8"),await E.writeFile(R.join(e,"tb.d.ts"),At,"utf8"),{dir:e}}function Qs(r,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:Zs([..._t,...Ct]),jsx:"react-jsx",jsxImportSource:r??"react",strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0,baseUrl:".",paths:e},include:["code.tsx","tb.d.ts",...t]}}function Zs(r){return r.filter(e=>!e.since).map(e=>eo(e.name))}function eo(r){return r.split(".").map(e=>/^es\d+$/i.test(e)?e.toUpperCase():e==="dom"?"DOM":e==="esnext"?"ESNext":e.charAt(0).toUpperCase()+e.slice(1)).join(".")}function to(r,e){let t=r??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function ut(r){if(!r.startsWith(Zr))return;let e=r.slice(Zr.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function ro(r,e){if(!r.typesAbs)return;let t=R.dirname(r.typesAbs),n=R.join(e,"node_modules",r.name);for(let s of await no(t)){let o=R.join(n,R.relative(t,s));await E.mkdir(R.dirname(o),{recursive:!0}),await E.copyFile(s,o)}return R.basename(r.typesAbs)}async function no(r){let e=[];async function t(n){let s=await E.readdir(n,{withFileTypes:!0});for(let o of s){let i=R.join(n,o.name);o.isDirectory()?await t(i):/\.d\.ts(\.map)?$/.test(o.name)&&e.push(i)}}return await t(r),e}import*as A from"fs/promises";import*as V from"path";import{existsSync as so}from"fs";var oo="^22";async function tn(r){let e=Ke(r.emitKey,"typecheck-server");await x(),await A.rm(e,{recursive:!0,force:!0}),await A.mkdir(e,{recursive:!0});let t=V.join(r.bulbDir,".typebulb"),n=rt(r.server).filter(i=>i!==r.local?.name);await tt([`@types/node@${oo}`,...n],t,r.dependencies);let s=V.join(t,"node_modules"),o=V.join(e,"node_modules");return await ao(s,o),await A.writeFile(V.join(e,"server.ts"),r.server,"utf8"),await A.writeFile(V.join(e,"tb.d.ts"),Ot,"utf8"),await A.writeFile(V.join(e,"tsconfig.json"),JSON.stringify(io(r.local),null,2)+`
630
- `,"utf8"),{dir:e}}function io(r){let e={target:"es2023",module:"esnext",moduleResolution:"bundler",lib:["ES2023"],types:["node"],strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0};if(r?.typesAbs){let t=o=>o.replace(/\\/g,"/"),n=t(V.dirname(r.typesAbs)),s=t(r.typesAbs).replace(/\.d\.ts$/,"");e.baseUrl=".",e.paths={[r.name]:[s],[`${r.name}/*`]:[`${n}/*`]}}return{compilerOptions:e,include:["server.ts","tb.d.ts"]}}async function ao(r,e){if(!so(r)){await A.mkdir(e,{recursive:!0});return}await A.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await A.symlink(r,e,t)}async function nn(r,e){let{bulb:t,config:n}=await W(r);!t.code&&!t.server&&(console.error("Bulb has neither **code.tsx** nor **server.ts**; nothing to check."),process.exit(1));let s=[];if(t.code){let{dir:i}=await en({code:t.code,dependencies:n.dependencies??{},jsxImportSource:n.jsxImportSource,emitKey:r,local:e});s.push({role:"client",dir:i})}if(t.server){let{dir:i}=await tn({server:t.server,bulbDir:rn.dirname(r),emitKey:r,local:e?{name:e.name,typesAbs:e.typesAbs}:void 0,dependencies:n.dependencies});s.push({role:"server",dir:i})}let o=!1;for(let{role:i,dir:a}of s){let{stdout:c,exitCode:l}=await lo(a);for(let p of c.split(/\r?\n/))p.trim()&&console.log(`${i} ${p}`);l!==0&&(o=!0)}o&&process.exit(1)}function lo(r){return new Promise(e=>{let t=co("npx",["tsc","--noEmit"],{cwd:r,shell:!0}),n="";t.stdout?.on("data",s=>{n+=s.toString()}),t.stderr?.on("data",s=>{n+=s.toString()}),t.on("close",s=>e({stdout:n,exitCode:s??1}))})}function pt(r){if(r.server.trim())return"server-side code (server.ts)";let e=r.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"))return"AI (your API keys)";if(/\btb\s*\.\s*server\s*\.\s*(?!log\b)\w/.test(e)||e.includes("/__api"))return"server-side code (server.ts)"}async function sn(r,e){let{bulb:t}=await W(r),n=pt(t);if(ot(r)){console.log("remembered-trusted \u2014 runs with filesystem / AI / server.ts automatically (`typebulb untrust` to revoke)."),n&&console.log(` (it uses ${n})`);return}n?(console.log(`This bulb appears to use ${n}; it runs Restricted unless you grant trust:`),console.log(` ${e}`)):console.log("No privileged capability detected \u2014 runs Restricted by default. (A clean scan is a hint, not a guarantee.)")}import*as Me from"path";async function on(r,e){if(!r){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let n=Kr();if(!n.length){console.log("No bulbs are remembered as trusted.");return}console.log("Trusted bulbs (run with fs/AI/server.ts without --trust):");for(let s of n)console.log(` ${s}`);return}let t=Me.resolve(r);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),Gr(t,e),console.log(e?`Trusted ${Me.basename(t)} \u2014 runs with fs / AI / server.ts (no --trust needed).`:`Untrusted ${Me.basename(t)} \u2014 runs Restricted.`),console.log(` ${t}`)}import{readdir as uo,readFile as ln,writeFile as dn,unlink as je,mkdir as po}from"fs/promises";import{mkdirSync as fo,writeFileSync as an,appendFileSync as mo,readFileSync as un}from"fs";import*as re from"path";var cn=1e6;function Vt(r){return re.join(te(),`${r}.json`)}function ft(r){return re.join(te(),`${r}.log`)}function pn(r){let e=ft(r);try{fo(te(),{recursive:!0}),an(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),n=process.stderr.write.bind(process.stderr),s=0,o=!1,i=a=>{if(!o)try{let c=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(mo(e,c),s+=c.length,s>2*cn){let l=un(e),p=l.subarray(Math.max(0,l.length-cn));an(e,p),s=p.length}}catch{o=!0}};return process.stdout.write=((a,...c)=>(i(a),t(a,...c))),process.stderr.write=((a,...c)=>(i(a),n(a,...c))),()=>{process.stdout.write=t,process.stderr.write=n}}function Ht(r,e=0){try{let t=un(ft(r)),n=e>=0&&e<=t.length?e:0;return{text:t.subarray(n).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function ho(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function fn(r){await po(te(),{recursive:!0}),await dn(Vt(r.pid),JSON.stringify(r))}async function mn(r,e){let t=Vt(r);try{let n=JSON.parse(await ln(t,"utf8"));if(n.denied===e)return;n.denied=e,await dn(t,JSON.stringify(n))}catch{}}async function qt(r){await je(Vt(r)).catch(()=>{}),await je(ft(r)).catch(()=>{})}async function ne(r){let e;try{e=await uo(te())}catch{return[]}let t=[];return await Promise.all(e.map(async s=>{if(!s.endsWith(".json"))return;let o=re.join(te(),s),i;try{i=JSON.parse(await ln(o,"utf8"))}catch{await je(o).catch(()=>{});return}i&&typeof i.pid=="number"&&ho(i.pid)?t.push(i):(await je(o).catch(()=>{}),i?.pid&&await je(ft(i.pid)).catch(()=>{}))})),(r?t.filter(s=>qr(s.file,r)&&!Yr(s.file)):t).sort((s,o)=>s.startedAt-o.startedAt)}async function hn(r){try{process.kill(r,"SIGTERM")}catch{}await qt(r)}async function zt(r,e){let t=D(r);return(await ne()).find(n=>n.cwd!=null&&D(n.cwd)===t&&(e?ct(n.file)===e:ct(n.file)!=null))}async function gn(){let r=await zt(process.cwd()),e=r?ct(r.file):void 0,t=e?"output a bulb block; it renders live here":"start the viewer yourself \u2014 `npx typebulb agent:claude --no-open` \u2014 share the localhost link it prints, then output a bulb block",n=[e?`You ran \`typebulb agent\`. Viewer '${e}' is up at ${r?.url}.`:"You ran `typebulb agent`. No viewer is running.",`- To show a bulb inline in this chat: ${t}.`,"- To make a bulb to keep and iterate on: write a .bulb.md and run `npx typebulb my-bulb.bulb.md`.","Working with bulbs? Run `npx typebulb skill` for the full authoring guide \u2014 save it to your skills folder if the user wants bulbs on hand across sessions."];process.stdout.write(n.join(`
626
+ </script>`;function Mo(r){let e={};for(let[t,n]of Object.entries(r))e[t]=n.startsWith("https://")?"/proxy/"+n:n;return e}import*as Pt from"fs/promises";import*as St from"path";import{existsSync as xn,readFileSync as Fo}from"fs";import{execFile as jo}from"child_process";import{promisify as No}from"util";import{satisfies as Lo}from"semver";var Uo=No(jo);async function Et(r,e,t){let s=r.map(i=>Wo(i,t)).filter(i=>!Jo(i,e));if(s.length===0)return;await Pt.mkdir(e,{recursive:!0});let o=St.join(e,"package.json");xn(o)||await Pt.writeFile(o,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${s.join(", ")}`),await Uo("npm",["install","--no-audit","--no-fund",...s],{cwd:e,shell:!0})}function Wo(r,e){if(!e||Pn(r))return r;let t=e[r];return t?`${r}@${t}`:r}function Jo(r,e){let t=St.join(e,"node_modules",Sn(r));if(!xn(t))return!1;let n=Pn(r);if(!n)return!0;try{let s=JSON.parse(Fo(St.join(t,"package.json"),"utf-8")).version;return Lo(s,n)}catch{return!1}}function Rt(r){let e=new Set,t=/\bimport\s+(?:[\s\S]*?\s+from\s+)?['"]([^./][^'"]*)['"]/g,n;for(;n=t.exec(r);){let s=n[1];if(s.includes(":"))continue;let o=s.startsWith("@")?s.split("/").slice(0,2).join("/"):s.split("/")[0];e.add(o)}return[...e]}function Sn(r){if(r.startsWith("@")){let t=r.indexOf("/");if(t<0)return r;let n=r.indexOf("@",t+1);return n<0?r:r.slice(0,n)}let e=r.indexOf("@");return e<0?r:r.slice(0,e)}function Pn(r){let e=Sn(r);return r.length>e.length?r.slice(e.length+1):""}async function En(r){let t=(await re.readdir(r)).find(n=>n.endsWith(".bulb.md"));return t?kt.join(r,t):null}async function G(r){let e=await re.readFile(r,"utf-8"),t=at(e);if(!t)throw new Error("Invalid .bulb.md file format");let n=ct(t);return{bulb:n,config:Gr(n.config)}}async function dr(r,e,t,n){let s=Yt(r,{serverOnly:!0});if(s.error)throw new Error(`Server compilation error: ${s.error}`);let o=s.code;t&&(o=await Hr(o,t));let i=kt.join(e,".typebulb");await re.mkdir(i,{recursive:!0});let a=Rt(o);a.length>0&&await Et(a,i,n);let c=kt.join(i,"server.mjs");return await re.writeFile(c,o,"utf-8"),await import(`${Ho(c).href}?t=${Date.now()}`)}async function ur(r,e,t,n,s){let{bulb:o,config:i}=await G(r),a=qr(o.data),c=Yt(o.code,{jsxImportSource:i.jsxImportSource});c.error&&console.error("Compilation error:",c.error);let{importMap:l}=await bt.buildImportMap(c.code,i.dependencies??{},n?new Set([n.name]):void 0);n&&(l.imports[n.name]=n.entryUrl);let d=vn({name:o.name,code:c.code,css:o.css,html:o.html,data:a,insight:o.insight,importMap:l,watch:e}),u=null;return o.server&&t&&(u=await dr(o.server,s,n,i.dependencies)),{html:d,bulb:o,serverExports:u}}Ke();import Qo from"open";async function Pe(r){await Qo(r)}var Tn=new Set(["claude"]);function _n(r){return Tn.has(r)}function hr(){return[...Tn]}import*as Dn from"path";import{spawn as fi}from"child_process";import*as _ from"fs/promises";import*as R from"path";import*as Ee from"path";var Zo=Ee.join(mt,"pkg"),ei=Ee.join(mt,"files"),ti=Ee.join(mt,"negative.json"),At=class{pkgMem=new Map;fileMem=new Map;negativeCache=new ie(new ve(ti));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await S();let t=await ae(An(e));return this.pkgMem.set(e,t),t}async setCachedDts(e,t,n){let s={content:t,url:n};this.pkgMem.set(e,s),await _t(async()=>{await S(),await B(An(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await S();let t=await ft(Cn(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await _t(async()=>{await S(),await B(Cn(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await _t(async()=>{await S(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return _t(()=>this.negativeCache.clearNegative(e))}};async function _t(r){try{await r()}catch{}}function An(r){return Ee.join(Zo,N(r)+".json")}function Cn(r){return Ee.join(ei,N(r)+".txt")}var gr;function ri(){return gr||(gr=ir({cache:new At,cdnClient:bn,packageService:bt,versionResolver:yn})),gr}var In="file:///node_modules/";async function $n(r){let e=ht(r.emitKey,"typecheck");await S(),await _.rm(e,{recursive:!0,force:!0}),await _.mkdir(e,{recursive:!0});let t=ii(r.jsxImportSource,r.dependencies),n=await ri().resolve(r.code,r.dependencies,t),s=r.local?.name,o=s?n.filter(d=>d.pkg!==s):n,i=new Set;for(let d of o)for(let u of d.files){let f=Ct(u.path);if(!f||i.has(f))continue;i.add(f);let m=R.join(e,"node_modules",f);await _.mkdir(R.dirname(m),{recursive:!0}),await _.writeFile(m,u.content,"utf8")}let a={};for(let d of o)for(let u of d.shims){let f=Ct(u.path);f&&(a[u.module]=[`./node_modules/${f}`])}for(let d of o){if(d.ambient)continue;let u=Ct(d.mainPath);u&&(a[d.pkg]=[`./node_modules/${u}`])}let c=new Set;for(let d of o)for(let u of d.files){if(!u.ambient)continue;let f=Ct(u.path);f&&c.add(`node_modules/${f}`)}if(r.local){delete a[r.local.name];let d=await ai(r.local,e);d?a[r.local.name]=[`./node_modules/${r.local.name}/${d}`]:console.warn(` local: '${r.local.name}' ships no type defs; check cannot type against it.`)}let l=ni(r.jsxImportSource,a,[...c]);return await _.writeFile(R.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
627
+ `,"utf8"),await _.writeFile(R.join(e,"code.tsx"),r.code,"utf8"),await _.writeFile(R.join(e,"tb.d.ts"),rr,"utf8"),{dir:e}}function ni(r,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:si([...er,...tr]),jsx:"react-jsx",jsxImportSource:r??"react",strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0,baseUrl:".",paths:e},include:["code.tsx","tb.d.ts",...t]}}function si(r){return r.filter(e=>!e.since).map(e=>oi(e.name))}function oi(r){return r.split(".").map(e=>/^es\d+$/i.test(e)?e.toUpperCase():e==="dom"?"DOM":e==="esnext"?"ESNext":e.charAt(0).toUpperCase()+e.slice(1)).join(".")}function ii(r,e){let t=r??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function Ct(r){if(!r.startsWith(In))return;let e=r.slice(In.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function ai(r,e){if(!r.typesAbs)return;let t=R.dirname(r.typesAbs),n=R.join(e,"node_modules",r.name);for(let s of await ci(t)){let o=R.join(n,R.relative(t,s));await _.mkdir(R.dirname(o),{recursive:!0}),await _.copyFile(s,o)}return R.basename(r.typesAbs)}async function ci(r){let e=[];async function t(n){let s=await _.readdir(n,{withFileTypes:!0});for(let o of s){let i=R.join(n,o.name);o.isDirectory()?await t(i):/\.d\.ts(\.map)?$/.test(o.name)&&e.push(i)}}return await t(r),e}import*as M from"fs/promises";import*as K from"path";import{existsSync as li}from"fs";var di="^22";async function On(r){let e=ht(r.emitKey,"typecheck-server");await S(),await M.rm(e,{recursive:!0,force:!0}),await M.mkdir(e,{recursive:!0});let t=K.join(r.bulbDir,".typebulb"),n=Rt(r.server).filter(i=>i!==r.local?.name);await Et([`@types/node@${di}`,...n],t,r.dependencies);let s=K.join(t,"node_modules"),o=K.join(e,"node_modules");return await pi(s,o),await M.writeFile(K.join(e,"server.ts"),r.server,"utf8"),await M.writeFile(K.join(e,"tb.d.ts"),nr,"utf8"),await M.writeFile(K.join(e,"tsconfig.json"),JSON.stringify(ui(r.local),null,2)+`
628
+ `,"utf8"),{dir:e}}function ui(r){let e={target:"es2023",module:"esnext",moduleResolution:"bundler",lib:["ES2023"],types:["node"],strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0};if(r?.typesAbs){let t=o=>o.replace(/\\/g,"/"),n=t(K.dirname(r.typesAbs)),s=t(r.typesAbs).replace(/\.d\.ts$/,"");e.baseUrl=".",e.paths={[r.name]:[s],[`${r.name}/*`]:[`${n}/*`]}}return{compilerOptions:e,include:["server.ts","tb.d.ts"]}}async function pi(r,e){if(!li(r)){await M.mkdir(e,{recursive:!0});return}await M.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await M.symlink(r,e,t)}async function Bn(r,e){let{bulb:t,config:n}=await G(r);!t.code&&!t.server&&(console.error("Bulb has neither **code.tsx** nor **server.ts**; nothing to check."),process.exit(1));let s=[];if(t.code){let{dir:i}=await $n({code:t.code,dependencies:n.dependencies??{},jsxImportSource:n.jsxImportSource,emitKey:r,local:e});s.push({role:"client",dir:i})}if(t.server){let{dir:i}=await On({server:t.server,bulbDir:Dn.dirname(r),emitKey:r,local:e?{name:e.name,typesAbs:e.typesAbs}:void 0,dependencies:n.dependencies});s.push({role:"server",dir:i})}let o=!1;for(let{role:i,dir:a}of s){let{stdout:c,exitCode:l}=await mi(a);for(let d of c.split(/\r?\n/))d.trim()&&console.log(`${i} ${d}`);l!==0&&(o=!0)}o&&process.exit(1)}function mi(r){return new Promise(e=>{let t=fi("npx",["tsc","--noEmit"],{cwd:r,shell:!0}),n="";t.stdout?.on("data",s=>{n+=s.toString()}),t.stderr?.on("data",s=>{n+=s.toString()}),t.on("close",s=>e({stdout:n,exitCode:s??1}))})}It();Ke();async function Mn(r,e){let{bulb:t}=await G(r),n=Re(t);if(le(r)){console.log("remembered-trusted \u2014 runs with filesystem / AI / server.ts automatically (`typebulb untrust` to revoke)."),n&&console.log(` (it uses ${n})`);return}n?(console.log(`This bulb appears to use ${n}; it runs Restricted unless you grant trust:`),console.log(` ${e}`)):console.log("No privileged capability detected \u2014 runs Restricted by default. (A clean scan is a hint, not a guarantee.)")}Ke();import*as Ye from"path";async function Fn(r,e){if(!r){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let n=mr();if(!n.length){console.log("No bulbs are remembered as trusted.");return}console.log("Trusted bulbs (run with fs/AI/server.ts without --trust):");for(let s of n)console.log(` ${s}`);return}let t=Ye.resolve(r);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),Se(t,e),console.log(e?`Trusted ${Ye.basename(t)} \u2014 runs with fs / AI / server.ts (no --trust needed).`:`Untrusted ${Ye.basename(t)} \u2014 runs Restricted.`),console.log(` ${t}`)}Ge();de();async function br(r,e){let t=U(r);return(await D()).find(n=>n.cwd!=null&&U(n.cwd)===t&&(e?n.agent===e:n.agent!=null))}async function Vn(){let r=await br(process.cwd()),e=r?.agent,t=e?"output a bulb block; it renders live here":"start the viewer yourself \u2014 `npx typebulb agent:claude --no-open` \u2014 share the localhost link it prints, then output a bulb block",n=[e?`You ran \`typebulb agent\`. Viewer '${e}' is up at ${r?.url}.`:"You ran `typebulb agent`. No viewer is running.",`- To show a bulb inline in this chat: ${t}.`,"- To make a bulb to keep and iterate on: write a .bulb.md and run `npx typebulb my-bulb.bulb.md`.","Working with bulbs? Run `npx typebulb skill` for the full authoring guide \u2014 save it to your skills folder if the user wants bulbs on hand across sessions."];process.stdout.write(n.join(`
631
629
  `)+`
632
- `)}import{readFileSync as go,existsSync as bo}from"fs";import*as H from"path";function yo(r){return[...r?[`.env.${r}.local`,`.env.${r}`]:[],".env.local",".env"]}function ge(r,e=process.cwd()){let t={},n=[];for(let s of yo(r)){let o;try{o=go(H.resolve(e,s),"utf-8")}catch{continue}n.push(s);for(let[i,a]of vo(o))process.env[i]===void 0&&(process.env[i]=a,t[i]=s)}return{mode:r,sources:t,loaded:n}}function*vo(r){for(let e of r.split(`
633
- `)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),yield[s,o]}}function wo(r){let e=new Set,t=/process\.env\.([A-Za-z_$][\w$]*)|process\.env\[\s*['"]([^'"]+)['"]\s*\]/g;for(let n;n=t.exec(r);)e.add(n[1]??n[2]);return[...e]}function mt(r,e,t){let{sources:n,mode:s,loaded:o}=r,i=process.cwd(),a=H.dirname(e),c=`(mode: ${s??"none"})`,l=t?wo(t):[],p=l.filter(h=>n[h]).map(h=>`${h} \u2190 ${n[h]}`);p.length?console.log(`env: ${p.join(", ")} ${c}`):o.length&&console.log(`env: loaded ${o.join(", ")} ${c}`),s&&!o.some(h=>h===`.env.${s}`||h===`.env.${s}.local`)&&console.log(`env: mode=${s} \u2014 no .env.${s} found; using .env`);let d=H.resolve(a)!==H.resolve(i);if(d)for(let h of[".env.local",".env"])bo(H.join(a,h))&&console.log(`env: ${H.join(a,h)} present but not loaded (cwd is ${i})`);let m=l.filter(h=>process.env[h]===void 0);if(m.length){let h=d?` \u2014 try running from ${a}`:"";console.log(`env: server.ts reads ${m.join(", ")} but ${m.length>1?"they are":"it's"} unset${h}`)}}var ye={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"},xo="https://api.typebulb.com/api/models",So=1440*60*1e3,be=null;async function ht(){if(!be||Date.now()-be.fetchedAt>So){let r=await fetch(xo);if(!r.ok)return be?bn(be.models):[];be={models:await r.json(),fetchedAt:Date.now()}}return bn(be.models)}function bn(r){let e=new Set(Object.entries(ye).filter(([,t])=>!!process.env[t]).map(([t])=>t));return r.filter(t=>e.has(t.provider))}function yn(){return Object.values(ye).some(r=>!!process.env[r])}function vn(r,e,t){let n=Math.max(...r.map(i=>i.name.length)),s=Math.max(...r.map(i=>i.friendlyName.length)),o=["Models available to tb.ai (filtered by your .env keys):",""];for(let i of r)o.push(` ${i.name.padEnd(n)} ${i.friendlyName.padEnd(s)} (${i.provider})`);return o.push("","Pass an id as the `model` in tb.ai({ provider, model })."),e&&t&&o.push(`Default (from .env): ${e} / ${t}`),o.join(`
634
- `)}async function wn(r){if(ge(r),!yn()){console.log("No AI provider keys found in this directory's .env. Set one of these to use tb.ai:");for(let[t,n]of Object.entries(ye))console.log(` ${n.padEnd(20)} (${t})`);console.log("Then re-run `typebulb models`.");return}let e=await ht();if(e.length===0){console.log("Couldn't fetch the model catalog (offline?). tb.ai still works with any valid provider/model id for your keys.");return}console.log(vn(e,process.env.TB_AI_PROVIDER,process.env.TB_AI_MODEL))}import*as Sn from"fs/promises";import*as gt from"path";import{fileURLToPath as Eo}from"url";function Po(r){return`---
630
+ `)}import{readFileSync as Ei,existsSync as Ri}from"fs";import*as Y from"path";function ki(r){return[...r?[`.env.${r}.local`,`.env.${r}`]:[],".env.local",".env"]}function ne(r,e=process.cwd()){let t={},n=[];for(let s of ki(r)){let o;try{o=Ei(Y.resolve(e,s),"utf-8")}catch{continue}n.push(s);for(let[i,a]of Ti(o))process.env[i]===void 0&&(process.env[i]=a,t[i]=s)}return{mode:r,sources:t,loaded:n}}function*Ti(r){for(let e of r.split(`
631
+ `)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),yield[s,o]}}function _i(r){let e=new Set,t=/process\.env\.([A-Za-z_$][\w$]*)|process\.env\[\s*['"]([^'"]+)['"]\s*\]/g;for(let n;n=t.exec(r);)e.add(n[1]??n[2]);return[...e]}function _e(r,e,t){let{sources:n,mode:s,loaded:o}=r,i=process.cwd(),a=Y.dirname(e),c=`(mode: ${s??"none"})`,l=t?_i(t):[],d=l.filter(m=>n[m]).map(m=>`${m} \u2190 ${n[m]}`);d.length?console.log(`env: ${d.join(", ")} ${c}`):o.length&&console.log(`env: loaded ${o.join(", ")} ${c}`),s&&!o.some(m=>m===`.env.${s}`||m===`.env.${s}.local`)&&console.log(`env: mode=${s} \u2014 no .env.${s} found; using .env`);let u=Y.resolve(a)!==Y.resolve(i);if(u)for(let m of[".env.local",".env"])Ri(Y.join(a,m))&&console.log(`env: ${Y.join(a,m)} present but not loaded (cwd is ${i})`);let f=l.filter(m=>process.env[m]===void 0);if(f.length){let m=u?` \u2014 try running from ${a}`:"";console.log(`env: server.ts reads ${f.join(", ")} but ${f.length>1?"they are":"it's"} unset${m}`)}}var Ce={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"},Ai="https://api.typebulb.com/api/models",Ci=1440*60*1e3,Ae=null;async function Bt(){if(!Ae||Date.now()-Ae.fetchedAt>Ci){let r=await fetch(Ai);if(!r.ok)return Ae?zn(Ae.models):[];Ae={models:await r.json(),fetchedAt:Date.now()}}return zn(Ae.models)}function zn(r){let e=new Set(Object.entries(Ce).filter(([,t])=>!!process.env[t]).map(([t])=>t));return r.filter(t=>e.has(t.provider))}function qn(){return Object.values(Ce).some(r=>!!process.env[r])}function Gn(r,e,t){let n=Math.max(...r.map(i=>i.name.length)),s=Math.max(...r.map(i=>i.friendlyName.length)),o=["Models available to tb.ai (filtered by your .env keys):",""];for(let i of r)o.push(` ${i.name.padEnd(n)} ${i.friendlyName.padEnd(s)} (${i.provider})`);return o.push("","Pass an id as the `model` in tb.ai({ provider, model })."),e&&t&&o.push(`Default (from .env): ${e} / ${t}`),o.join(`
632
+ `)}async function Kn(r){if(ne(r),!qn()){console.log("No AI provider keys found in this directory's .env. Set one of these to use tb.ai:");for(let[t,n]of Object.entries(Ce))console.log(` ${n.padEnd(20)} (${t})`);console.log("Then re-run `typebulb models`.");return}let e=await Bt();if(e.length===0){console.log("Couldn't fetch the model catalog (offline?). tb.ai still works with any valid provider/model id for your keys.");return}console.log(Gn(e,process.env.TB_AI_PROVIDER,process.env.TB_AI_MODEL))}import*as Xn from"fs/promises";import*as Mt from"path";import{fileURLToPath as Oi}from"url";function Ii(r){return`---
635
633
  name: typebulb
636
634
  description: Author and run Typebulb bulbs \u2014 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 a Claude Code session through Typebulb's agent viewer (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/embed 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.
637
635
  version: ${r}
638
- ---`}function Ro(r){return`> Generated from typebulb v${r}. If \`npx typebulb --version\` reports a newer version, re-run \`npx typebulb skill\` to refresh this file.`}function xn(r,e){return`${Po(e)}
636
+ ---`}function $i(r){return`> Generated from typebulb v${r}. If \`npx typebulb --version\` reports a newer version, re-run \`npx typebulb skill\` to refresh this file.`}function Yn(r,e){return`${Ii(e)}
639
637
 
640
- ${Ro(e)}
638
+ ${$i(e)}
641
639
 
642
640
  ${r.trim()}
643
- `}async function Pn(r){let e=gt.join(gt.dirname(Eo(import.meta.url)),"..","README.md"),t;try{t=await Sn.readFile(e,"utf8")}catch{console.error(`Could not read the bundled README (expected at ${e}).`),process.exit(1)}process.stdout.write(xn(t,r))}import*as Rn from"path";function ko(r,e){return/^\d+$/.test(e)?r.find(t=>t.pid===parseInt(e,10)):r.find(t=>D(t.file)===D(e))}function En(r,e){for(let t of r)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function kn(r,e){if(!r.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),En(r,t=>console.log(t)),console.log(`
644
- `+e)}function Tn(r,e,t){let n=ko(r,e);if(n)return n;console.error(`No running server for '${e}'.`),r.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),En(r,s=>console.error(s))):console.error("No bulb servers are running."),process.exit(1)}async function _n(r,e){if(!r){kn(await ne(process.cwd()),"Run `typebulb logs <file|pid>` to print one server's console.");return}let t=Tn(await ne(),me(r)??r,"logs"),n=Ht(t.pid),s=n.text;if(e.lines&&e.lines>0){let o=s.split(`
641
+ `}async function Qn(r){let e=Mt.join(Mt.dirname(Oi(import.meta.url)),"..","README.md"),t;try{t=await Xn.readFile(e,"utf8")}catch{console.error(`Could not read the bundled README (expected at ${e}).`),process.exit(1)}process.stdout.write(Yn(t,r))}Ge();de();import*as wr from"path";function Di(r,e){return/^\d+$/.test(e)?r.find(t=>t.pid===parseInt(e,10)):r.find(t=>t.agent===e)??r.find(t=>U(t.file)===U(e))}function Zn(r,e){for(let t of r)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function es(r,e){if(!r.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),Zn(r,t=>console.log(t)),console.log(`
642
+ `+e)}function ts(r,e,t){let n=Di(r,e);if(n)return n;console.error(`No running server for '${e}'.`),r.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),Zn(r,s=>console.error(s))):console.error("No bulb servers are running."),process.exit(1)}async function rs(r,e){if(!r){es(await D(process.cwd()),"Run `typebulb logs <file|pid>` to print one server's console.");return}let t=ts(await D(),r,"logs"),n=ke(t.pid),s=n.text;if(e.lines&&e.lines>0){let o=s.split(`
645
643
  `);o.length&&o[o.length-1]===""&&o.pop(),s=o.slice(-e.lines).join(`
646
644
  `)}if(process.stdout.write(s),s&&!s.endsWith(`
647
645
  `)&&process.stdout.write(`
648
- `),e.follow){let o=n.offset,i=setInterval(()=>{let c=Ht(t.pid,o);o=c.offset,c.text&&process.stdout.write(c.text)},500),a=()=>{clearInterval(i),process.exit(0)};process.on("SIGINT",a),process.on("SIGTERM",a),await new Promise(()=>{})}}async function Cn(r){if(!r){kn(await ne(process.cwd()),"Run `typebulb stop <file|pid>` to stop one.");return}let e=Tn(await ne(),me(r)??r,"stop");await hn(e.pid),console.log(`Stopped ${Rn.basename(e.file)} (pid ${e.pid}, ${e.url}).`)}import*as Ln from"fs/promises";import*as ve from"path";import{EventEmitter as Nn}from"events";import{Hono as _o}from"hono";import{serve as Co}from"@hono/node-server";import{streamSSE as Ao}from"hono/streaming";import*as oe from"fs/promises";import*as j from"path";var O=class extends Error{constructor(e,t="unknown",n=!1){super(e),this.code=t,this.retryable=n}},M=class{getPath(e,t){return this.path}parseStreamChunk(e){return this.checkAndThrowError(e),this.parseProviderStreamChunk(e)}isReasoningEnabled(e){return e?.reasoning!==void 0&&e.reasoning>0}extractSystemMessages(e,t=`
646
+ `),e.follow){let o=n.offset,i=setInterval(()=>{let c=ke(t.pid,o);o=c.offset,c.text&&process.stdout.write(c.text)},500),a=()=>{clearInterval(i),process.exit(0)};process.on("SIGINT",a),process.on("SIGTERM",a),await new Promise(()=>{})}}async function ns(r){if(!r){es(await D(process.cwd()),"Run `typebulb stop <file|pid>` to stop one.");return}let e=ts(await D(),r,"stop");await Te(e.pid),console.log(`Stopped ${e.agent??wr.basename(e.file)} (pid ${e.pid}, ${e.url}).`)}async function ss(){let r=await D();if(!r.length){console.log("No running bulb servers.");return}await Promise.all(r.map(e=>Te(e.pid))),console.log(`Stopped ${r.length} server${r.length===1?"":"s"}:`);for(let e of r)console.log(` ${e.url} pid ${e.pid} ${e.agent??wr.basename(e.file)}`)}import*as fs from"fs/promises";import*as Ie from"path";import{EventEmitter as ps}from"events";It();import{Hono as Mi}from"hono";import{serve as Fi}from"@hono/node-server";import{streamSSE as ji}from"hono/streaming";import*as pe from"fs/promises";import*as H from"path";var F=class extends Error{constructor(e,t="unknown",n=!1){super(e),this.code=t,this.retryable=n}},J=class{getPath(e,t){return this.path}parseStreamChunk(e){return this.checkAndThrowError(e),this.parseProviderStreamChunk(e)}isReasoningEnabled(e){return e?.reasoning!==void 0&&e.reasoning>0}extractSystemMessages(e,t=`
649
647
 
650
- `){let n=e.filter(s=>s.role==="system").map(s=>s.content);return{system:n.length?n.join(t):void 0,conversationMessages:e.filter(s=>s.role!=="system")}}parseJsonError(e,t,n=!1){if(!e)return{message:`HTTP ${t}`};try{let s=JSON.parse(e);if(s.error&&typeof s.error=="object"){let o={message:s.error.message||`HTTP ${t}`,type:s.error.type};return n&&(o.code=s.error.code),o}return s.message?{message:s.message}:{message:e}}catch{return{message:e}}}checkAndThrowError(e){if("type"in e&&e.type==="error"&&"message"in e){let t=e.message,n=e.code||"unknown",s=!!e.retryable;throw new O(t,n,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new O(t)}}extractErrorMessage(e){if(typeof e=="string")try{let t=JSON.parse(e);return t.error?.message||t.message||e}catch{return e}return typeof e=="object"&&e!==null?e.message||JSON.stringify(e):`${this.providerName} returned an error`}};var Fe=class extends M{constructor(){super(...arguments),this.providerName="Anthropic",this.defaultBaseUrl="https://api.anthropic.com",this.path="/v1/messages"}buildHeaders(e){return{"x-api-key":e,"anthropic-version":"2023-06-01","Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(i),stream:s};if(n?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),o&&(a.system=[{type:"text",text:o,cache_control:{type:"ephemeral"}}]),this.isReasoningEnabled(n)){let c=n.reasoning;if(this.isModernModel(t)){let l={0:"low",1:"low",2:"medium",3:"high"};a.thinking={type:"adaptive"},a.output_config={effort:l[c]}}else{let l={0:0,1:2048,2:4096,3:8192};a.thinking={type:"enabled",budget_tokens:l[c]}}}return a}parseError(e,t){return this.parseJsonError(e,t)}parseNonStreamingResponse(e){if(!this.isAnthropicResponse(e))return{text:""};let t=e.content.filter(s=>s.type==="text").map(s=>s.text).join(""),n=e.content.filter(s=>s.type==="thinking").map(s=>s.thinking).join(`
648
+ `){let n=e.filter(s=>s.role==="system").map(s=>s.content);return{system:n.length?n.join(t):void 0,conversationMessages:e.filter(s=>s.role!=="system")}}parseJsonError(e,t,n=!1){if(!e)return{message:`HTTP ${t}`};try{let s=JSON.parse(e);if(s.error&&typeof s.error=="object"){let o={message:s.error.message||`HTTP ${t}`,type:s.error.type};return n&&(o.code=s.error.code),o}return s.message?{message:s.message}:{message:e}}catch{return{message:e}}}checkAndThrowError(e){if("type"in e&&e.type==="error"&&"message"in e){let t=e.message,n=e.code||"unknown",s=!!e.retryable;throw new F(t,n,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new F(t)}}extractErrorMessage(e){if(typeof e=="string")try{let t=JSON.parse(e);return t.error?.message||t.message||e}catch{return e}return typeof e=="object"&&e!==null?e.message||JSON.stringify(e):`${this.providerName} returned an error`}};var et=class extends J{constructor(){super(...arguments),this.providerName="Anthropic",this.defaultBaseUrl="https://api.anthropic.com",this.path="/v1/messages"}buildHeaders(e){return{"x-api-key":e,"anthropic-version":"2023-06-01","Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(i),stream:s};if(n?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),o&&(a.system=[{type:"text",text:o,cache_control:{type:"ephemeral"}}]),this.isReasoningEnabled(n)){let c=n.reasoning;if(this.isModernModel(t)){let l={0:"low",1:"low",2:"medium",3:"high"};a.thinking={type:"adaptive"},a.output_config={effort:l[c]}}else{let l={0:0,1:2048,2:4096,3:8192};a.thinking={type:"enabled",budget_tokens:l[c]}}}return a}parseError(e,t){return this.parseJsonError(e,t)}parseNonStreamingResponse(e){if(!this.isAnthropicResponse(e))return{text:""};let t=e.content.filter(s=>s.type==="text").map(s=>s.text).join(""),n=e.content.filter(s=>s.type==="thinking").map(s=>s.thinking).join(`
651
649
 
652
- `);return{text:t,reasoning:n||void 0}}parseProviderStreamChunk(e){if(!("type"in e))return null;switch(e.type){case"content_block_delta":return e.delta.type==="text_delta"?{text:e.delta.text||""}:e.delta.type==="thinking_delta"?{reasoning:e.delta.thinking||""}:null;case"message_start":case"content_block_start":case"content_block_stop":case"message_delta":case"message_stop":case"ping":return null;default:return null}}withLastMessageCached(e){let t=e.length-1;return e.map((n,s)=>s===t?{role:n.role,content:[{type:"text",text:n.content,cache_control:{type:"ephemeral"}}]}:n)}isAnthropicResponse(e){return"content"in e&&Array.isArray(e.content)&&"type"in e&&e.type==="message"}isModernModel(e){let t=e.match(/^claude-\w+-(\d+)-(\d+)/);return!!t&&(+t[1]>4||+t[1]==4&&+t[2]>=6)}getMaxTokens(e){return this.isModernModel(e)?64e3:32e3}};var Ne=class extends M{constructor(){super(...arguments),this.providerName="OpenAI",this.defaultBaseUrl="https://api.openai.com",this.path="/v1/responses",this.effortMap={0:"minimal",1:"low",2:"medium",3:"high"}}buildHeaders(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let o=this.convertMessagesToInput(e),i={model:t,input:o,stream:s};return n?.webSearch!==!1&&(i.tools=[{type:"web_search"}]),this.isReasoningEnabled(n)&&(i.reasoning={effort:this.effortMap[n.reasoning],summary:"auto"}),i}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.isResponsesApiResponse(e))return{text:""};let t=e.output_text||"",n;if(e.output&&Array.isArray(e.output))for(let s of e.output)s.type==="reasoning"&&s.summary&&(n=s.summary.map(o=>o.text).join(`
653
- `)),!t&&s.type==="message"&&s.content&&(t=s.content.filter(o=>o.type==="output_text").map(o=>o.text).join(""));return{text:t,reasoning:n}}parseProviderStreamChunk(e){if(!this.isResponsesApiEvent(e))return null;switch(e.type){case"error":return null;case"response.failed":{let s=e.response?.error,o=s?.message||"Response failed",i=s?.code==="insufficient_quota"||s?.code==="rate_limit_exceeded";throw new O(o,i?"rate_limit":"unknown",i)}case"response.output_text.delta":return{text:e.delta};case"response.reasoning_summary_text.delta":return{reasoning:e.delta};case"response.created":case"response.in_progress":case"response.output_item.added":case"response.output_item.done":case"response.content_part.added":case"response.content_part.done":case"response.output_text.done":case"response.output_text.annotation.added":case"response.reasoning_summary_text.done":case"response.completed":case"response.web_search_call.in_progress":case"response.web_search_call.searching":case"response.web_search_call.completed":return null;default:return null}}convertMessagesToInput(e){return e.map(t=>t.role==="system"?`System: ${t.content}`:t.role==="user"?`User: ${t.content}`:t.role==="assistant"?`Assistant: ${t.content}`:t.content).join(`
650
+ `);return{text:t,reasoning:n||void 0}}parseProviderStreamChunk(e){if(!("type"in e))return null;switch(e.type){case"content_block_delta":return e.delta.type==="text_delta"?{text:e.delta.text||""}:e.delta.type==="thinking_delta"?{reasoning:e.delta.thinking||""}:null;case"message_start":case"content_block_start":case"content_block_stop":case"message_delta":case"message_stop":case"ping":return null;default:return null}}withLastMessageCached(e){let t=e.length-1;return e.map((n,s)=>s===t?{role:n.role,content:[{type:"text",text:n.content,cache_control:{type:"ephemeral"}}]}:n)}isAnthropicResponse(e){return"content"in e&&Array.isArray(e.content)&&"type"in e&&e.type==="message"}isModernModel(e){let t=e.match(/^claude-\w+-(\d+)-(\d+)/);return!!t&&(+t[1]>4||+t[1]==4&&+t[2]>=6)}getMaxTokens(e){return this.isModernModel(e)?64e3:32e3}};var tt=class extends J{constructor(){super(...arguments),this.providerName="OpenAI",this.defaultBaseUrl="https://api.openai.com",this.path="/v1/responses",this.effortMap={0:"minimal",1:"low",2:"medium",3:"high"}}buildHeaders(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let o=this.convertMessagesToInput(e),i={model:t,input:o,stream:s};return n?.webSearch!==!1&&(i.tools=[{type:"web_search"}]),this.isReasoningEnabled(n)&&(i.reasoning={effort:this.effortMap[n.reasoning],summary:"auto"}),i}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.isResponsesApiResponse(e))return{text:""};let t=e.output_text||"",n;if(e.output&&Array.isArray(e.output))for(let s of e.output)s.type==="reasoning"&&s.summary&&(n=s.summary.map(o=>o.text).join(`
651
+ `)),!t&&s.type==="message"&&s.content&&(t=s.content.filter(o=>o.type==="output_text").map(o=>o.text).join(""));return{text:t,reasoning:n}}parseProviderStreamChunk(e){if(!this.isResponsesApiEvent(e))return null;switch(e.type){case"error":return null;case"response.failed":{let s=e.response?.error,o=s?.message||"Response failed",i=s?.code==="insufficient_quota"||s?.code==="rate_limit_exceeded";throw new F(o,i?"rate_limit":"unknown",i)}case"response.output_text.delta":return{text:e.delta};case"response.reasoning_summary_text.delta":return{reasoning:e.delta};case"response.created":case"response.in_progress":case"response.output_item.added":case"response.output_item.done":case"response.content_part.added":case"response.content_part.done":case"response.output_text.done":case"response.output_text.annotation.added":case"response.reasoning_summary_text.done":case"response.completed":case"response.web_search_call.in_progress":case"response.web_search_call.searching":case"response.web_search_call.completed":return null;default:return null}}convertMessagesToInput(e){return e.map(t=>t.role==="system"?`System: ${t.content}`:t.role==="user"?`User: ${t.content}`:t.role==="assistant"?`Assistant: ${t.content}`:t.content).join(`
654
652
 
655
- `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var Le=class extends M{constructor(){super(...arguments),this.providerName="Gemini",this.defaultBaseUrl="https://generativelanguage.googleapis.com",this.path="/v1beta/models"}getPath(e,t){return`/v1beta/models/${e}:${t?"streamGenerateContent":"generateContent"}${t?"?alt=sse":""}`}buildHeaders(e){return{"Content-Type":"application/json","x-goog-api-key":e}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e,`
653
+ `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var rt=class extends J{constructor(){super(...arguments),this.providerName="Gemini",this.defaultBaseUrl="https://generativelanguage.googleapis.com",this.path="/v1beta/models"}getPath(e,t){return`/v1beta/models/${e}:${t?"streamGenerateContent":"generateContent"}${t?"?alt=sse":""}`}buildHeaders(e){return{"Content-Type":"application/json","x-goog-api-key":e}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e,`
656
654
  `),c={contents:i.map(l=>({role:l.role==="assistant"?"model":"user",parts:[{text:l.content}]}))};return n?.webSearch!==!1&&(c.tools=[{google_search:{}}]),o&&(c.systemInstruction={role:"system",parts:[{text:o}]}),this.isReasoningEnabled(n)&&(c.generationConfig={temperature:.7+n.reasoning*.1}),c}parseError(e,t){if(!e)return{message:`HTTP ${t}`};try{let n=JSON.parse(e),s=Array.isArray(n)?n[0]?.error:n?.error;return s&&typeof s=="object"?{message:(s.message||`HTTP ${t}`).split(`
657
- `)[0],type:s.status,code:s.code?.toString()}:n.message?{message:n.message}:{message:e}}catch{return{message:e}}}parseNonStreamingResponse(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return{text:"",status:"failed",error:"Invalid response format"};let t=this.extractText(e)||"",n=e.candidates?.[0]?.finishReason,s="complete";return n==="MAX_TOKENS"?s="interrupted":(n==="SAFETY"||n==="RECITATION")&&(s="failed"),{text:t,status:s}}parseProviderStreamChunk(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return null;let t=this.extractText(e);return t?{text:t}:null}isGeminiResponse(e){return typeof e=="object"&&e!==null&&"candidates"in e&&Array.isArray(e.candidates)}extractText(e){let t=e.candidates?.[0];if(t?.content?.parts)return t.content.parts.map(n=>n.text).filter(Boolean).join("")}checkGeminiError(e){if(typeof e=="object"&&e!==null&&"error"in e){let t=e.error,n;if(typeof t=="string")n=t;else if(typeof t=="object"&&t!==null){let s=t;n=s.message||s.status||"Gemini returned an error"}else n="Gemini returned an error";throw new O(n)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new O(`Prompt blocked: ${t}`)}}};var Be=class extends M{constructor(){super(...arguments),this.providerName="OpenRouter",this.defaultBaseUrl="https://openrouter.ai/api",this.path="/api/v1/chat/completions",this.effortMap={0:"low",1:"low",2:"medium",3:"high"}}buildHeaders(e,t){let n={Authorization:`Bearer ${e}`,"x-api-key":e,"Content-Type":"application/json",Accept:"application/json","X-Title":"Typebulb"};return t&&(n["HTTP-Referer"]=t,n.Referer=t,n.Origin=t),n}buildPayload(e,t,n,s){let o={model:t,messages:e,stream:s};return n?.webSearch===!0&&(o.plugins=[{id:"web"}]),this.isReasoningEnabled(n)&&(o.reasoning={effort:this.effortMap[n.reasoning]}),o}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.hasChoices(e))return{text:""};let t=e.choices[0],n=t?.message?.content??t?.text??"",s=t?.message?.reasoning??e.reasoning;return{text:n,reasoning:s}}parseProviderStreamChunk(e){if(!this.hasChoices(e))return null;let t=e.choices[0];if(!t)return null;let n=t.delta||t.message;if(!n)return null;let s=n.content||void 0,o=n.reasoning||void 0;return!s&&!o?null:{text:s,reasoning:o}}hasChoices(e){return typeof e=="object"&&e!==null&&"choices"in e&&Array.isArray(e.choices)}};var To=new Map([["openai",new Ne],["openrouter",new Be],["anthropic",new Fe],["gemini",new Le]]);function se(r){let e=To.get(r);if(!e)throw new Error(`Unsupported protocol: ${r}`);return e}async function Gt(r,e){let t=se(r.protocol),n=t.getPath(e.model,e.stream),s=new URL(n,r.baseUrl).toString(),o=t.buildHeaders(r.apiKey,e.origin),i=t.buildPayload(e.messages,e.model,{reasoning:e.reasoning,webSearch:e.webSearch},e.stream);return e.modifyPayload?.(i),fetch(s,{method:"POST",headers:o,body:JSON.stringify(i),signal:e.signal})}async function Kt(r,e){let t=se(e),n=await r.text().catch(()=>""),{message:s}=t.parseError(n,r.status),o=r.status,i="unknown";return o===429?i="rate_limit":o===413&&(i="context_exceeded"),{code:i,message:s,retryable:o===429}}function An(r){let e=r.indexOf(`\r
655
+ `)[0],type:s.status,code:s.code?.toString()}:n.message?{message:n.message}:{message:e}}catch{return{message:e}}}parseNonStreamingResponse(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return{text:"",status:"failed",error:"Invalid response format"};let t=this.extractText(e)||"",n=e.candidates?.[0]?.finishReason,s="complete";return n==="MAX_TOKENS"?s="interrupted":(n==="SAFETY"||n==="RECITATION")&&(s="failed"),{text:t,status:s}}parseProviderStreamChunk(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return null;let t=this.extractText(e);return t?{text:t}:null}isGeminiResponse(e){return typeof e=="object"&&e!==null&&"candidates"in e&&Array.isArray(e.candidates)}extractText(e){let t=e.candidates?.[0];if(t?.content?.parts)return t.content.parts.map(n=>n.text).filter(Boolean).join("")}checkGeminiError(e){if(typeof e=="object"&&e!==null&&"error"in e){let t=e.error,n;if(typeof t=="string")n=t;else if(typeof t=="object"&&t!==null){let s=t;n=s.message||s.status||"Gemini returned an error"}else n="Gemini returned an error";throw new F(n)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new F(`Prompt blocked: ${t}`)}}};var nt=class extends J{constructor(){super(...arguments),this.providerName="OpenRouter",this.defaultBaseUrl="https://openrouter.ai/api",this.path="/api/v1/chat/completions",this.effortMap={0:"low",1:"low",2:"medium",3:"high"}}buildHeaders(e,t){let n={Authorization:`Bearer ${e}`,"x-api-key":e,"Content-Type":"application/json",Accept:"application/json","X-Title":"Typebulb"};return t&&(n["HTTP-Referer"]=t,n.Referer=t,n.Origin=t),n}buildPayload(e,t,n,s){let o={model:t,messages:e,stream:s};return n?.webSearch===!0&&(o.plugins=[{id:"web"}]),this.isReasoningEnabled(n)&&(o.reasoning={effort:this.effortMap[n.reasoning]}),o}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.hasChoices(e))return{text:""};let t=e.choices[0],n=t?.message?.content??t?.text??"",s=t?.message?.reasoning??e.reasoning;return{text:n,reasoning:s}}parseProviderStreamChunk(e){if(!this.hasChoices(e))return null;let t=e.choices[0];if(!t)return null;let n=t.delta||t.message;if(!n)return null;let s=n.content||void 0,o=n.reasoning||void 0;return!s&&!o?null:{text:s,reasoning:o}}hasChoices(e){return typeof e=="object"&&e!==null&&"choices"in e&&Array.isArray(e.choices)}};var Bi=new Map([["openai",new tt],["openrouter",new nt],["anthropic",new et],["gemini",new rt]]);function ue(r){let e=Bi.get(r);if(!e)throw new Error(`Unsupported protocol: ${r}`);return e}async function vr(r,e){let t=ue(r.protocol),n=t.getPath(e.model,e.stream),s=new URL(n,r.baseUrl).toString(),o=t.buildHeaders(r.apiKey,e.origin),i=t.buildPayload(e.messages,e.model,{reasoning:e.reasoning,webSearch:e.webSearch},e.stream);return e.modifyPayload?.(i),fetch(s,{method:"POST",headers:o,body:JSON.stringify(i),signal:e.signal})}async function xr(r,e){let t=ue(e),n=await r.text().catch(()=>""),{message:s}=t.parseError(n,r.status),o=r.status,i="unknown";return o===429?i="rate_limit":o===413&&(i="context_exceeded"),{code:i,message:s,retryable:o===429}}function os(r){let e=r.indexOf(`\r
658
656
  \r
659
657
  `),t=r.indexOf(`
660
658
 
661
- `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function Yt(r){let t=r.split(/\r?\n/).filter(s=>s.startsWith("data:"));if(!t.length)return null;let n=t.map(s=>s.replace(/^data:\s?/,"")).join(`
662
- `).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function On(r,e,t){let n=new TextDecoder,s="",o=!1,i=t?new Promise((a,c)=>{t.aborted&&c(new Error("Aborted")),t.addEventListener("abort",()=>c(new Error("Aborted")),{once:!0})}):null;for(;;){let a=i?await Promise.race([r.read(),i]):await r.read(),{done:c,value:l}=a;if(c){if(s.trim()){let m=Yt(s);m!==null&&m!=="done"&&e(m)}break}o=!0,s+=n.decode(l,{stream:!0});let{pos:p,len:d}=An(s);for(;p!==-1;){let m=s.slice(0,p);s=s.slice(p+d);let h=Yt(m);if(h==="done"){s="";break}h!==null&&e(h),{pos:p,len:d}=An(s)}}return{receivedAnyData:o}}async function Xt(r,e){let t=e??(r.headers.get("X-Provider-Protocol")||"openai"),n=se(t);if(!r.body)throw new Error("Response body is missing");let s=r.body.getReader(),o="";return await On(s,i=>{let a=n.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as Qt from"fs/promises";import*as Ue from"path";var bt=class{async get(e){let t=I(e),n=Ue.join(De,t+".bin"),s=Ue.join(De,t+".json");try{let[o,i]=await Promise.all([Qt.readFile(n),Qt.readFile(s,"utf8")]),a=JSON.parse(i);return{body:o,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await x();let n=I(e),s=Ue.join(De,n+".bin"),o=Ue.join(De,n+".json"),i={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([C(s,t.body),C(o,JSON.stringify(i))])}};var $n="127.0.0.1",Oo=new Set(["localhost","127.0.0.1","::1"]);function Io(r){if(r)try{return new URL(r.includes("://")?r:`http://${r}`).hostname}catch{return}}function In(r){let e=Io(r);return!!e&&Oo.has(e)}function yt(r){return r instanceof Error?r.message:"Unknown error"}async function Dn(r){let{getHtml:e,basePath:t,port:n,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c}=r,l=new _o;l.use("*",async(u,f)=>{if(!In(u.req.header("host")))return u.text("Forbidden: untrusted Host",403);await f()}),l.use("*",async(u,f)=>{await f(),u.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),u.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let p=["/__fs/*","/__api/*","/__ai"],d=async(u,f)=>{if(!a){let b=new URL(u.req.url).pathname,w=b.startsWith("/__fs")?"the filesystem":b==="/__ai"?"AI (your API keys)":"server-side code (server.ts)";mn(process.pid,w);let v=c?`
663
- ${c}`:"";return u.text(`Forbidden: this capability requires --trust.${v}`,403)}await f()},m=async(u,f)=>{let b=u.req.header("sec-fetch-site");if(b){if(b==="cross-site")return u.text("Forbidden: cross-site request",403)}else{let w=u.req.header("origin");if(w&&!In(w))return u.text("Forbidden: cross-origin request",403)}await f()};for(let u of p)l.use(u,d),l.use(u,m);l.use("/__log",m),l.post("/__log",async u=>{try{let{args:f}=await u.req.json();console.log(...f||[])}catch{}return u.json({ok:!0})}),l.get("/",u=>u.html(e())),l.post("/__fs/read",async u=>{try{let{path:f}=await u.req.json(),b=er(f,t),w=await oe.readFile(b);return new Response(new Uint8Array(w),{headers:{"Content-Type":"application/octet-stream"}})}catch(f){let b=yt(f);return u.json({error:b},400)}}),l.post("/__fs/write",async u=>{try{let f=u.req.query("path");if(!f)return u.json({error:"Missing path"},400);let b=er(f,t);return await oe.mkdir(j.dirname(b),{recursive:!0}),await oe.writeFile(b,Buffer.from(await u.req.arrayBuffer())),u.json({success:!0})}catch(f){let b=yt(f);return u.json({error:b},400)}});let h={log:console.log};l.post("/__api/:name",async u=>{try{let f=o?.(),b=u.req.param("name"),w=f?.[b]??h[b];if(!w||typeof w!="function")return u.json({error:`API function '${b}' not found`},404);let{args:v}=await u.req.json(),T=await w(...v||[]);return u.json({result:T})}catch(f){let b=yt(f);return u.json({error:b},500)}}),l.post("/__ai",async u=>{try{let{messages:f,system:b,reasoning:w,provider:v,model:T,webSearch:z}=await u.req.json();if(!f||!Array.isArray(f)||f.length===0)return u.json({message:"messages array is required",code:"unknown",retryable:!1},400);let N=$o(v,T);if(typeof N=="string")return u.json({message:N,code:"unknown",retryable:!1},400);let wt=[...b?[{role:"system",content:b}]:[],...f.map(We=>({role:We.role,content:We.content}))],ie=await Gt(N,{model:N.model,messages:wt,stream:!0,reasoning:w??0,webSearch:z??!0});if(!ie.ok){let We=await Kt(ie,N.protocol);return u.json(We,ie.status)}let rr=await Xt(ie,N.protocol);return rr||console.warn("[tb.ai] Empty response from provider"),u.json({text:rr})}catch(f){if(f instanceof O)return u.json({message:f.message,code:f.code,retryable:f.retryable},500);let b=yt(f);return u.json({message:b,code:"unknown",retryable:!1},500)}}),l.get("/__models",async u=>{try{let f=await ht();return u.json(f)}catch{return u.json([],200)}});let g=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],S=new bt;if(l.get("/proxy/*",async u=>{let f=new URL(u.req.url),w=(f.pathname+f.search).slice(7),v=w.lastIndexOf("https://");return v===-1?u.text("Invalid proxy URL",400):F(u,w.slice(v))}),i){let u=`/local/${i.name}/`;l.get("/local/*",async f=>{let{pathname:b}=new URL(f.req.url);if(!b.startsWith(u))return f.text("Not Found",404);let w=decodeURIComponent(b.slice(u.length));try{let v=er(w,i.serveDir),T=await oe.readFile(v);return new Response(T,{headers:{"Content-Type":Do(v)}})}catch{return f.text("Not Found",404)}})}async function F(u,f){let b;try{b=new URL(f)}catch{return u.text("Invalid URL",400)}if(b.protocol!=="https:")return u.text("HTTPS only",400);if(!g.includes(b.hostname))return u.text("Host not allowed",403);let w=await S.get(f);if(w)return new Response(w.body,{status:200,headers:Zt(w.contentType,w.cacheControl)});try{let v=await fetch(f,{headers:{Accept:u.req.header("Accept")||"*/*"},redirect:"follow"});if(!v.ok)return u.text(`Upstream ${v.status}`,v.status);let T=v.headers.get("Content-Type")||void 0,z=v.headers.get("Cache-Control")||void 0;if(v.body){let[N,wt]=v.body.tee();return(async()=>{try{let ie=await new Response(wt).arrayBuffer();await S.set(f,{body:Buffer.from(ie),contentType:T,cacheControl:z})}catch{}})(),new Response(N,{status:v.status,headers:Zt(T,z)})}return new Response(null,{status:v.status,headers:Zt(T,z)})}catch(v){return u.text(`Proxy fetch failed: ${v instanceof Error?v.message:v}`,502)}}s&&l.get("/__reload",u=>Ao(u,async f=>{let b=()=>{f.writeSSE({event:"reload",data:""})};for(s.on("reload",b),f.onAbort(()=>{s.removeListener("reload",b)});;)await f.sleep(3e4)}));let B=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;l.notFound(async u=>{if(u.req.method!=="GET")return u.text("Not Found",404);let f=new URL(u.req.url);return B.test(f.pathname)?F(u,"https://esm.sh"+f.pathname+f.search):u.text("Not Found",404)});let _=Co({fetch:l.fetch,port:n,hostname:$n});return{port:n,close:()=>_.close()}}function $o(r,e){let t=r??process.env.TB_AI_PROVIDER,n=e??process.env.TB_AI_MODEL;if(!t)return"No provider specified. Set TB_AI_PROVIDER in your .env file or pass provider in the tb.ai() call.";if(!n)return"No model specified. Set TB_AI_MODEL in your .env file or pass model in the tb.ai() call.";let s;try{s=se(t)}catch{return`Unknown provider '${t}'.`}let o=ye[t],i=process.env[o];return i?{apiKey:i,baseUrl:s.defaultBaseUrl,protocol:t,model:n,isFreeModel:!1}:`No API key for '${t}'. Set ${o} in your .env file.`}function Zt(r,e){let t=new Headers;return r&&t.set("Content-Type",r),e&&t.set("Cache-Control",e),t.set("Access-Control-Allow-Origin","*"),t.set("Cross-Origin-Resource-Policy","cross-origin"),t}function Do(r){switch(j.extname(r).toLowerCase()){case".js":case".mjs":return"text/javascript";case".wasm":return"application/wasm";case".json":case".map":return"application/json";default:return"application/octet-stream"}}function er(r,e){let t=j.resolve(e,r),n=j.normalize(e),s=j.normalize(t);if(s!==n&&!s.startsWith(n+j.sep))throw new Error("Path traversal detected - access denied");return t}async function tr(r){let e=await import("net");return new Promise(t=>{let n=e.createServer();n.listen(r,$n,()=>{let s=n.address(),o=typeof s=="object"&&s?s.port:r;n.close(()=>t(o))}),n.on("error",()=>{t(tr(r+1))})})}import Mn from"chokidar";var jn={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function vt(r){let{bulbPath:e,emitter:t}=r,n=Mn.watch(e,jn);return n.on("change",()=>{t.emit("reload")}),()=>n.close()}function Fn(r){let{dir:e,onChange:t,debounceMs:n=150}=r,s,o=Mn.watch(e,jn);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,n)}),()=>{s&&clearTimeout(s),o.close()}}async function Bn(r,e,t,n,s){let o=process.cwd(),i=pn(process.pid),a=e.watch?new Nn:void 0,c=ge(e.mode);console.log(`Loading ${ve.basename(r)}...`);let{html:l,bulb:p,serverExports:d}=await Lt(r,e.watch,e.trust,n,s);mt(c,r,p.server);let m=await tr(e.port),h=await Dn({getHtml:()=>l,basePath:o,port:m,reloadEmitter:a,getServerExports:()=>d,localOverride:n?{name:n.name,serveDir:n.serveDir}:void 0,trusted:e.trust,trustHint:t}),g=`http://localhost:${m}`,S=e.trust?void 0:pt(p);await fn({pid:process.pid,port:m,url:g,file:r,cwd:process.cwd(),startedAt:Date.now(),trust:e.trust,predicted:S}),console.log(`
664
- ${p.name}`),console.log(` ${g}`),m!==e.port&&console.log(` (port ${e.port} was busy)`),e.trust?console.log(" trust: granted (filesystem, AI, server.ts enabled)"):console.log(S?` trust: sandboxed \u2014 this bulb appears to use ${S}; re-run with --trust to enable it:
659
+ `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function Sr(r){let t=r.split(/\r?\n/).filter(s=>s.startsWith("data:"));if(!t.length)return null;let n=t.map(s=>s.replace(/^data:\s?/,"")).join(`
660
+ `).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function is(r,e,t){let n=new TextDecoder,s="",o=!1,i=t?new Promise((a,c)=>{t.aborted&&c(new Error("Aborted")),t.addEventListener("abort",()=>c(new Error("Aborted")),{once:!0})}):null;for(;;){let a=i?await Promise.race([r.read(),i]):await r.read(),{done:c,value:l}=a;if(c){if(s.trim()){let f=Sr(s);f!==null&&f!=="done"&&e(f)}break}o=!0,s+=n.decode(l,{stream:!0});let{pos:d,len:u}=os(s);for(;d!==-1;){let f=s.slice(0,d);s=s.slice(d+u);let m=Sr(f);if(m==="done"){s="";break}m!==null&&e(m),{pos:d,len:u}=os(s)}}return{receivedAnyData:o}}async function Pr(r,e){let t=e??(r.headers.get("X-Provider-Protocol")||"openai"),n=ue(t);if(!r.body)throw new Error("Response body is missing");let s=r.body.getReader(),o="";return await is(s,i=>{let a=n.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as Er from"fs/promises";import*as st from"path";var Ft=class{async get(e){let t=N(e),n=st.join(qe,t+".bin"),s=st.join(qe,t+".json");try{let[o,i]=await Promise.all([Er.readFile(n),Er.readFile(s,"utf8")]),a=JSON.parse(i);return{body:o,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await S();let n=N(e),s=st.join(qe,n+".bin"),o=st.join(qe,n+".json"),i={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([B(s,t.body),B(o,JSON.stringify(i))])}};de();var ls="127.0.0.1",Ni=new Set(["localhost","127.0.0.1","::1"]);function Li(r){if(r)try{return new URL(r.includes("://")?r:`http://${r}`).hostname}catch{return}}function as(r){let e=Li(r);return!!e&&Ni.has(e)}function jt(r){return r instanceof Error?r.message:"Unknown error"}async function Nt(r){let{getHtml:e,basePath:t,port:n,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c,staticAssets:l}=r,d=new Mi;d.use("*",async(p,h)=>{if(!as(p.req.header("host")))return p.text("Forbidden: untrusted Host",403);await h()}),d.use("*",async(p,h)=>{await h(),p.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),p.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let u=["/__fs/*","/__api/*","/__ai"],f=async(p,h)=>{if(!a){let b=new URL(p.req.url).pathname,x=b.startsWith("/__fs")?"the filesystem":b==="/__ai"?"AI (your API keys)":"server-side code (server.ts)";Hn(process.pid,x);let w=c?`
661
+ ${c}`:"";return p.text(`Forbidden: this capability requires --trust.${w}`,403)}await h()},m=async(p,h)=>{let b=p.req.header("sec-fetch-site");if(b){if(b==="cross-site")return p.text("Forbidden: cross-site request",403)}else{let x=p.req.header("origin");if(x&&!as(x))return p.text("Forbidden: cross-origin request",403)}await h()};for(let p of u)d.use(p,f),d.use(p,m);d.use("/__log",m),d.post("/__log",async p=>{try{let{args:h}=await p.req.json();console.log(...h||[])}catch{}return p.json({ok:!0})}),d.get("/",p=>p.html(e())),d.post("/__fs/read",async p=>{try{let{path:h}=await p.req.json(),b=kr(h,t),x=await pe.readFile(b);return new Response(new Uint8Array(x),{headers:{"Content-Type":"application/octet-stream"}})}catch(h){let b=jt(h);return p.json({error:b},400)}}),d.post("/__fs/write",async p=>{try{let h=p.req.query("path");if(!h)return p.json({error:"Missing path"},400);let b=kr(h,t);return await pe.mkdir(H.dirname(b),{recursive:!0}),await pe.writeFile(b,Buffer.from(await p.req.arrayBuffer())),p.json({success:!0})}catch(h){let b=jt(h);return p.json({error:b},400)}});let g={log:console.log};d.post("/__api/:name",async p=>{try{let h=o?.(),b=p.req.param("name"),x=h?.[b]??g[b];if(!x||typeof x!="function")return p.json({error:`API function '${b}' not found`},404);let{args:w}=await p.req.json(),V=await x(...w||[]);return p.json({result:V})}catch(h){let b=jt(h);return p.json({error:b},500)}}),d.post("/__ai",async p=>{try{let{messages:h,system:b,reasoning:x,provider:w,model:V,webSearch:se}=await p.req.json();if(!h||!Array.isArray(h)||h.length===0)return p.json({message:"messages array is required",code:"unknown",retryable:!1},400);let Q=Ui(w,V);if(typeof Q=="string")return p.json({message:Q,code:"unknown",retryable:!1},400);let Vt=[...b?[{role:"system",content:b}]:[],...h.map(it=>({role:it.role,content:it.content}))],me=await vr(Q,{model:Q.model,messages:Vt,stream:!0,reasoning:x??0,webSearch:se??!0});if(!me.ok){let it=await xr(me,Q.protocol);return p.json(it,me.status)}let Mr=await Pr(me,Q.protocol);return Mr||console.warn("[tb.ai] Empty response from provider"),p.json({text:Mr})}catch(h){if(h instanceof F)return p.json({message:h.message,code:h.code,retryable:h.retryable},500);let b=jt(h);return p.json({message:b,code:"unknown",retryable:!1},500)}}),d.get("/__models",async p=>{try{let h=await Bt();return p.json(h)}catch{return p.json([],200)}});let v=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],$=new Ft;d.get("/proxy/*",async p=>{let h=new URL(p.req.url),x=(h.pathname+h.search).slice(7),w=x.lastIndexOf("https://");return w===-1?p.text("Invalid proxy URL",400):O(p,x.slice(w))}),i&&cs(d,`/local/${i.name}/`,i.serveDir),l&&cs(d,l.mount,l.dir);async function O(p,h){let b;try{b=new URL(h)}catch{return p.text("Invalid URL",400)}if(b.protocol!=="https:")return p.text("HTTPS only",400);if(!v.includes(b.hostname))return p.text("Host not allowed",403);let x=await $.get(h);if(x)return new Response(x.body,{status:200,headers:Rr(x.contentType,x.cacheControl)});try{let w=await fetch(h,{headers:{Accept:p.req.header("Accept")||"*/*"},redirect:"follow"});if(!w.ok)return p.text(`Upstream ${w.status}`,w.status);let V=w.headers.get("Content-Type")||void 0,se=w.headers.get("Cache-Control")||void 0;if(w.body){let[Q,Vt]=w.body.tee();return(async()=>{try{let me=await new Response(Vt).arrayBuffer();await $.set(h,{body:Buffer.from(me),contentType:V,cacheControl:se})}catch{}})(),new Response(Q,{status:w.status,headers:Rr(V,se)})}return new Response(null,{status:w.status,headers:Rr(V,se)})}catch(w){return p.text(`Proxy fetch failed: ${w instanceof Error?w.message:w}`,502)}}s&&d.get("/__reload",p=>ji(p,async h=>{let b=()=>{h.writeSSE({event:"reload",data:""})};for(s.on("reload",b),h.onAbort(()=>{s.removeListener("reload",b)});;)await h.sleep(3e4)}));let E=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;d.notFound(async p=>{if(p.req.method!=="GET")return p.text("Not Found",404);let h=new URL(p.req.url);return E.test(h.pathname)?O(p,"https://esm.sh"+h.pathname+h.search):p.text("Not Found",404)});let T=Fi({fetch:d.fetch,port:n,hostname:ls});return{port:n,close:()=>T.close()}}function Ui(r,e){let t=r??process.env.TB_AI_PROVIDER,n=e??process.env.TB_AI_MODEL;if(!t)return"No provider specified. Set TB_AI_PROVIDER in your .env file or pass provider in the tb.ai() call.";if(!n)return"No model specified. Set TB_AI_MODEL in your .env file or pass model in the tb.ai() call.";let s;try{s=ue(t)}catch{return`Unknown provider '${t}'.`}let o=Ce[t],i=process.env[o];return i?{apiKey:i,baseUrl:s.defaultBaseUrl,protocol:t,model:n,isFreeModel:!1}:`No API key for '${t}'. Set ${o} in your .env file.`}function Rr(r,e){let t=new Headers;return r&&t.set("Content-Type",r),e&&t.set("Cache-Control",e),t.set("Access-Control-Allow-Origin","*"),t.set("Cross-Origin-Resource-Policy","cross-origin"),t}function cs(r,e,t){r.get(`${e}*`,async n=>{let{pathname:s}=new URL(n.req.url);if(!s.startsWith(e))return n.text("Not Found",404);let o=decodeURIComponent(s.slice(e.length));try{let i=kr(o,t),a=await pe.readFile(i);return new Response(a,{headers:{"Content-Type":Wi(i)}})}catch{return n.text("Not Found",404)}})}function Wi(r){switch(H.extname(r).toLowerCase()){case".js":case".mjs":return"text/javascript";case".wasm":return"application/wasm";case".json":case".map":return"application/json";default:return"application/octet-stream"}}function kr(r,e){let t=H.resolve(e,r),n=H.normalize(e),s=H.normalize(t);if(s!==n&&!s.startsWith(n+H.sep))throw new Error("Path traversal detected - access denied");return t}async function ot(r){let e=await import("net");return new Promise(t=>{let n=e.createServer();n.listen(r,ls,()=>{let s=n.address(),o=typeof s=="object"&&s?s.port:r;n.close(()=>t(o))}),n.on("error",()=>{t(ot(r+1))})})}import ds from"chokidar";var us={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Lt(r){let{bulbPath:e,emitter:t}=r,n=ds.watch(e,us);return n.on("change",()=>{t.emit("reload")}),()=>n.close()}function Ut(r){let{dir:e,onChange:t,debounceMs:n=150}=r,s,o=ds.watch(e,us);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,n)}),()=>{s&&clearTimeout(s),o.close()}}de();async function ms(r,e,t,n,s){let o=process.cwd(),i=$t(process.pid),a=e.watch?new ps:void 0,c=ne(e.mode);console.log(`Loading ${Ie.basename(r)}...`);let{html:l,bulb:d,serverExports:u}=await ur(r,e.watch,e.trust,n,s);_e(c,r,d.server);let f=await ot(e.port),m=await Nt({getHtml:()=>l,basePath:o,port:f,reloadEmitter:a,getServerExports:()=>u,localOverride:n?{name:n.name,serveDir:n.serveDir}:void 0,trusted:e.trust,trustHint:t}),g=`http://localhost:${f}`,v=e.trust?void 0:Re(d);await Ot({pid:process.pid,port:f,url:g,file:r,cwd:process.cwd(),startedAt:Date.now(),trust:e.trust,predicted:v}),console.log(`
662
+ ${d.name}`),console.log(` ${g}`),f!==e.port&&console.log(` (port ${e.port} was busy)`),e.trust?console.log(" trust: granted (filesystem, AI, server.ts enabled)"):console.log(v?` trust: sandboxed \u2014 this bulb appears to use ${v}; re-run with --trust to enable it:
665
663
  ${t}
666
664
  `:` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
667
665
  `),e.watch&&console.log(` Watching for changes...
668
- `);let F,B;if(e.watch&&a){let u=new Nn;if(u.on("reload",async()=>{try{console.log("Recompiling...");let f=await Lt(r,!0,e.trust,n,s);l=f.html,d=f.serverExports,a.emit("reload"),console.log(`Done. Browser reloading...
669
- `)}catch(f){console.error("Compile error:",f)}}),F=vt({bulbPath:r,emitter:u}),n){let{name:f,serveDir:b}=n;B=Fn({dir:b,onChange:()=>{console.log(`Local package '${f}' changed. Browser reloading...
670
- `),a.emit("reload")}})}}e.open&&await it(g);let _=async()=>{console.log(`
671
- Shutting down...`),h.close(),F?.(),B?.(),i(),await qt(process.pid);let u=ve.join(ve.dirname(r),".typebulb","server.mjs");await Ln.rm(u,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",_),process.on("SIGTERM",_)}import*as Un from"path";import{EventEmitter as Mo}from"events";async function Wn(r,e,t,n,s){let o=ge(t),i=!1,a=async()=>{let{bulb:c,config:l}=await W(r);i||(mt(o,r,c.server),i=!0),await Nt(c.server,s,n,l.dependencies)};if(console.log(`Running ${Un.basename(r)}...`),await a(),e){console.log(`Watching for changes...
672
- `);let c=new Mo;c.on("reload",async()=>{try{console.log("Re-running..."),await a()}catch(l){console.error("Error:",l)}}),vt({bulbPath:r,emitter:c})}}var Jn="0.10.7";async function jo(){let r=ur(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${Jn}`),process.exit(0)),r.help&&(pr(),process.exit(0)),r.subcommand==="logs"){await _n(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="stop"){await Cn(r.file||void 0);return}if(r.subcommand==="skill"){await Pn(Jn);return}if(r.subcommand==="models"){await wn(r.mode);return}if(r.subcommand==="agent"){if(!r.agentTarget){await gn();return}me(r.agentTarget)||(console.error(`Unknown agent '${r.agentTarget}'. Known: ${Wt().join(", ")}.`),process.exit(1));let l=await zt(process.cwd(),r.agentTarget);if(l){console.log(`Viewer '${r.agentTarget}' is already running for this project:
673
- ${l.url}`),r.open&&await it(l.url);return}r.file=r.agentTarget,r.subcommand="run"}if(r.subcommand==="trust"||r.subcommand==="untrust"){await on(r.file||void 0,r.subcommand==="trust");return}let e,t=!1;if(!r.file||r.file==="."){let l=await Hr(process.cwd());l||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=l}else e=q.resolve(r.file);if(!await Vn.access(e).then(()=>!0,()=>!1)){let l=r.agentTarget?me(r.file):void 0;l?(e=l,t=!0):Wt().includes(r.file)?(console.error(`To open the ${r.file} agent viewer, 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 s=r.file&&r.file!=="."?r.file:q.relative(process.cwd(),e)||q.basename(e),o=`npx typebulb --trust ${s.includes(" ")?`"${s}"`:s}`;if(r.subcommand==="predict"){await sn(e,o);return}if(t)r.trust=!r.noTrust,r.trust&&console.log("trust: granted (built-in bulb)");else{let l=!r.noTrust&&ot(e);l&&!r.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||l}let i;try{i=await W(e)}catch{}let a;if(r.local){i&&!(r.local.name in(i.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),i&&(!i.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{a=await lr(r.local)}catch(l){console.error(l instanceof Error?l.message:String(l)),process.exit(1)}console.log(`replace: ${a.name} \u2192 ${q.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await nn(e,a);return}let c=t?process.cwd():q.dirname(e);if(i&&i.bulb.server&&(!i.bulb.code||r.server)){r.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
674
- ${o}`),process.exit(1)),await Wn(e,r.watch,r.mode,a,c);return}await Bn(e,r,o,a,c)}jo().catch(r=>{console.error("Error:",r.message),process.exit(1)});
666
+ `);let $,O;if(e.watch&&a){let T=new ps;if(T.on("reload",async()=>{try{console.log("Recompiling...");let p=await ur(r,!0,e.trust,n,s);l=p.html,u=p.serverExports,a.emit("reload"),console.log(`Done. Browser reloading...
667
+ `)}catch(p){console.error("Compile error:",p)}}),$=Lt({bulbPath:r,emitter:T}),n){let{name:p,serveDir:h}=n;O=Ut({dir:h,onChange:()=>{console.log(`Local package '${p}' changed. Browser reloading...
668
+ `),a.emit("reload")}})}}e.open&&await Pe(g);let E=async()=>{console.log(`
669
+ Shutting down...`),m.close(),$?.(),O?.(),i(),await Ze(process.pid);let T=Ie.join(Ie.dirname(r),".typebulb","server.mjs");await fs.rm(T,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",E),process.on("SIGTERM",E)}import{readFileSync as Js,copyFileSync as Ba,existsSync as Ma}from"fs";import*as I from"path";import{fileURLToPath as Fa}from"url";import{EventEmitter as ja}from"events";de();var Tr="/agents/claude/client.js",Ji=`
670
+ (() => {
671
+ const api = async (name, ...args) => {
672
+ const resp = await fetch('/__api/' + name, {
673
+ method: 'POST',
674
+ headers: { 'Content-Type': 'application/json' },
675
+ body: JSON.stringify({ args })
676
+ });
677
+ const data = await resp.json();
678
+ if (!resp.ok) throw new Error(data.error || 'API call failed');
679
+ return data.result;
680
+ };
681
+ const serverLog = async (...args) => {
682
+ try {
683
+ const resp = await fetch('/__log', {
684
+ method: 'POST',
685
+ headers: { 'Content-Type': 'application/json' },
686
+ body: JSON.stringify({ args })
687
+ });
688
+ if (!resp.ok) console.log(...args);
689
+ } catch { console.log(...args); }
690
+ };
691
+ globalThis.tb = Object.freeze({
692
+ server: new Proxy({}, {
693
+ get: (_, name) => name === 'log'
694
+ ? (...args) => serverLog(...args)
695
+ : (...args) => api(name, ...args)
696
+ })
697
+ });
698
+ if (window.__TYPEBULB_WATCH__) {
699
+ const es = new EventSource('/__reload');
700
+ es.addEventListener('reload', () => { console.log('[typebulb] Reloading...'); window.location.reload(); });
701
+ es.onerror = () => { es.close(); };
702
+ }
703
+ })();
704
+ `;function hs(r){let{name:e,styles:t,mountHtml:n,watch:s,theme:o}=r;return`<!DOCTYPE html>
705
+ <html>
706
+ <head>
707
+ <meta charset="utf-8">
708
+ <meta name="viewport" content="width=device-width, initial-scale=1">
709
+ <title>${wt(e)} - typebulb</title>
710
+ ${xt(e,o)}
711
+ <style>
712
+ ${vt}
713
+ </style>
714
+ <style>
715
+ ${t}
716
+ </style>
717
+ </head>
718
+ <body>
719
+ ${n}
720
+
721
+ ${s?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
722
+
723
+ <script>
724
+ ${Ji}
725
+ </script>
726
+
727
+ <script type="module" src="${Tr}"></script>
728
+ </body>
729
+ </html>`}async function Hs(r){let e=process.cwd(),t=$t(process.pid),n=r.watch?new ja:void 0,s=ne(r.mode),o=await Promise.resolve().then(()=>(Ws(),Us));_e(s,I.join(e,"viewer"));let i=I.dirname(Fa(import.meta.url)),a=I.join(i,"agents","claude"),c=I.join(i,"..","agents","claude"),l=I.join(a,"styles.css"),d=I.join(a,"index.html"),u=()=>hs({name:"Claude Bulb",styles:Js(l,"utf8"),mountHtml:Js(d,"utf8"),watch:r.watch}),f=await ot(r.port),m=await Nt({getHtml:u,basePath:e,port:f,reloadEmitter:n,getServerExports:()=>o,trusted:!0,staticAssets:{mount:`${I.posix.dirname(Tr)}/`,dir:a}}),g=`http://localhost:${f}`;await Ot({pid:process.pid,port:f,url:g,file:"agent:claude",cwd:e,startedAt:Date.now(),trust:!0,agent:"claude"}),console.log(`
730
+ Claude Bulb`),console.log(` ${g}`),f!==r.port&&console.log(` (port ${r.port} was busy)`),r.watch&&console.log(` Watching for changes...
731
+ `);async function v(){await(await import("esbuild")).build({entryPoints:[I.join(c,"client","index.ts")],bundle:!0,platform:"browser",format:"esm",outfile:I.join(a,"client.js")});for(let T of["styles.css","index.html"])Ba(I.join(c,T),I.join(a,T))}let $;if(r.watch&&n){let E=Ma(c),T=!1;$=Ut({dir:E?c:a,onChange:async()=>{if(!T){T=!0;try{E&&await v(),console.log(`Viewer rebuilt. Browser reloading...
732
+ `),n.emit("reload")}catch(p){console.error("Viewer rebuild failed:",p instanceof Error?p.message:p)}finally{T=!1}}}})}r.open&&await Pe(g);let O=async()=>{console.log(`
733
+ Shutting down...`),m.close(),$?.(),t(),await Ze(process.pid),process.exit(0)};process.on("SIGINT",O),process.on("SIGTERM",O)}import*as Vs from"path";import{EventEmitter as Na}from"events";async function zs(r,e,t,n,s){let o=ne(t),i=!1,a=async()=>{let{bulb:c,config:l}=await G(r);i||(_e(o,r,c.server),i=!0),await dr(c.server,s,n,l.dependencies)};if(console.log(`Running ${Vs.basename(r)}...`),await a(),e){console.log(`Watching for changes...
734
+ `);let c=new Na;c.on("reload",async()=>{try{console.log("Re-running..."),await a()}catch(l){console.error("Error:",l)}}),Lt({bulbPath:r,emitter:c})}}var qs="0.11.1";async function La(){let r=Vr(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${qs}`),process.exit(0)),r.help&&(zr(),process.exit(0)),r.subcommand==="logs"){await rs(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="stop"){r.all?await ss():await ns(r.file||void 0);return}if(r.subcommand==="skill"){await Qn(qs);return}if(r.subcommand==="models"){await Kn(r.mode);return}if(r.subcommand==="agent"){if(!r.agentTarget){await Vn();return}_n(r.agentTarget)||(console.error(`Unknown agent '${r.agentTarget}'. Known: ${hr().join(", ")}.`),process.exit(1));let l=await br(process.cwd(),r.agentTarget);if(l){console.log(`Viewer '${r.agentTarget}' is already running for this project:
735
+ ${l.url}`),r.open&&await Pe(l.url);return}await Hs(r);return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await Fn(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let l=await En(process.cwd());l||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=l}else e=X.resolve(r.file);await Gs.access(e).then(()=>!0,()=>!1)||(hr().includes(r.file)&&(console.error(`To open the ${r.file} agent viewer, 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:X.relative(process.cwd(),e)||X.basename(e),s=`npx typebulb --trust ${n.includes(" ")?`"${n}"`:n}`;if(r.subcommand==="predict"){await Mn(e,s);return}let o=!r.noTrust&&le(e);o&&!r.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||o;let i;try{i=await G(e)}catch{}let a;if(r.local){i&&!(r.local.name in(i.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),i&&(!i.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{a=await Jr(r.local)}catch(l){console.error(l instanceof Error?l.message:String(l)),process.exit(1)}console.log(`replace: ${a.name} \u2192 ${X.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await Bn(e,a);return}let c=X.dirname(e);if(i&&i.bulb.server&&(!i.bulb.code||r.server)){r.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
736
+ ${s}`),process.exit(1)),await zs(e,r.watch,r.mode,a,c);return}await ms(e,r,s,a,c)}La().catch(r=>{console.error("Error:",r.message),process.exit(1)});