typebulb 0.11.6 → 0.11.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -8
- package/dist/agents/claude/client.js +106 -105
- package/dist/agents/claude/styles.css +60 -32
- package/dist/index.js +81 -77
- package/dist/render.js +16 -15
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
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=
|
|
4
|
-
`))}else t++}return{frontmatter:s,files:o}}catch{return null}}function
|
|
5
|
-
|
|
6
|
-
`))
|
|
7
|
-
`)
|
|
8
|
-
`)){
|
|
9
|
-
`)){if(!
|
|
2
|
+
var so=Object.defineProperty;var B=(r,e)=>()=>(r&&(e=r(r=0)),e);var oo=(r,e)=>{for(var t in e)so(r,t,{get:e[t],enumerable:!0})};function lt(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=ho(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 ho(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=go(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function go(r){return r.startsWith('"')&&r.endsWith('"')?r.slice(1,-1).replace(/\\"/g,'"'):r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function dt(r){let e=t=>r.files.get(mo[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 bo(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 tn(r){let e=r.trim();return e?bo(e)?[e]:r.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function rn(r){if(!r.trim())return{};try{return JSON.parse(r)}catch{return{}}}var mo,Qt=B(()=>{mo={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 hr,resolve as ei}from"path";import{homedir as ti}from"os";function At(){let r=process.env.TYPEBULB_SERVERS_DIR;return r?hr(r,".."):hr(ti(),".typebulb")}function ce(){return process.env.TYPEBULB_SERVERS_DIR||hr(At(),"servers")}function _(r){let e=ei(r);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}function On(r,e){let t=_(r),n=_(e);return t.startsWith(n.endsWith("/")?n:n+"/")?!t.includes("/node_modules/"):!1}var Ke=B(()=>{});import{readFileSync as ri,writeFileSync as ni,mkdirSync as si}from"fs";import{join as oi}from"path";function Dn(){return oi(At(),"trust.json")}function gr(){try{let r=JSON.parse(ri(Dn(),"utf8"));return new Set(Array.isArray(r)?r:[])}catch{return new Set}}function ii(r){si(At(),{recursive:!0}),ni(Dn(),JSON.stringify([...r]))}function le(r){return gr().has(_(r))}function Se(r,e){let t=gr(),n=_(r);(e?t.has(n):!t.has(n))||(e?t.add(n):t.delete(n),ii(t))}function br(){return[...gr()]}var Ye=B(()=>{Ke()});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 Ot=B(()=>{});import{spawn as zn}from"child_process";import{readdir as Ei,readFile as Kn,writeFile as Yn,unlink as Qe,mkdir as Ri}from"fs/promises";import{mkdirSync as ki,writeFileSync as qn,appendFileSync as Ti,readFileSync as Xn}from"fs";import*as W from"path";import{fileURLToPath as _i}from"url";function vr(r){return W.join(ce(),`${r}.json`)}function Ze(r){return W.join(ce(),`${r}.log`)}function Dt(r){let e=Ze(r);try{ki(ce(),{recursive:!0}),qn(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(Ti(e,c),s+=c.length,s>2*Gn){let l=Xn(e),d=l.subarray(Math.max(0,l.length-Gn));qn(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=Xn(Ze(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 Ai(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function Mt(r){await Ri(ce(),{recursive:!0}),await Yn(vr(r.pid),JSON.stringify(r))}async function Qn(r,e){let t=vr(r);try{let n=JSON.parse(await Kn(t,"utf8"));if(n.denied===e)return;n.denied=e,await Yn(t,JSON.stringify(n))}catch{}}async function et(r){await Qe(vr(r)).catch(()=>{}),await Qe(Ze(r)).catch(()=>{})}async function C(r){let e;try{e=await Ei(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 Kn(o,"utf8"))}catch{await Qe(o).catch(()=>{});return}i&&typeof i.pid=="number"&&Ai(i.pid)?t.push(i):(await Qe(o).catch(()=>{}),i?.pid&&await Qe(Ze(i.pid)).catch(()=>{}))})),(r?t.filter(s=>s.agent==null&&On(s.file,r)):t).sort((s,o)=>s.startedAt-o.startedAt)}async function Te(r){try{process.kill(r,"SIGTERM")}catch{}await et(r)}function $i(){return W.join(W.dirname(_i(import.meta.url)),"index.js")}function Ii(r,e={}){return{command:process.execPath,args:[$i(),...e.trust?["--trust"]:[],r,...e.open===!1?["--no-open"]:[]]}}async function Bt(r,e={}){let t=e.cwd??process.cwd(),n=W.resolve(t,r),s=(await C()).find(l=>l.file===n);if(s)return s;let{command:o,args:i}=Ii(r,e);(process.platform==="win32"?zn("cmd",["/c","start","","/b",o,...i],{cwd:t,stdio:"ignore",windowsHide:!0}):zn(o,i,{cwd:t,detached:!0,stdio:"ignore"})).unref();let c=Date.now()+2e4;for(;Date.now()<c;){await Ci(150);let l=(await C()).find(d=>d.file===n);if(l)return l}throw new Error(`Launched ${W.basename(r)} but it did not register within 20s.`)}var Gn,Ci,de=B(()=>{Ke();Gn=1e6;Ci=r=>new Promise(e=>setTimeout(e,r))});function Ht(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 Ir(r){return(Ht(r)??"bulb").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"bulb"}var Or=B(()=>{});import{readdirSync as ea,readFileSync as ta,statSync as ra}from"fs";import{join as Rs,basename as na}from"path";function ks(r,e,t){if(e>8)return t;let n;try{n=ea(r,{withFileTypes:!0})}catch{return t}for(let s of n)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;ks(Rs(r,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(Rs(r,s.name));return t}function Dr(r){return ks(r,0,[]).map(e=>{let t=0;try{t=ra(e).mtimeMs}catch{}let n;try{n=Ht(ta(e,"utf8").slice(0,1024))}catch{}return{path:e,name:n??na(e).replace(/\.bulb\.md$/,""),mtime:t}})}var Ts=B(()=>{Or()});import{readFile as sa}from"fs/promises";async function Mr(r){try{let e=lt(await sa(r,"utf-8"));return e?Re(dt(e)):void 0}catch{return}}var _s=B(()=>{Qt();Ot()});import{spawn as oa}from"child_process";import{basename as ia}from"path";function aa(){return process.env.TYPEBULB_EDITOR||"code"}function la(r,e,t){return t==null?[e]:ca.test(ia(r))?["-g",`${e}:${t}`]:[`+${t}`,e]}function da(r,e){let t=aa();return{command:t,args:la(t,r,e)}}function Br(r,e){let{command:t,args:n}=da(r,e),s=oa(t,n,{shell:!0,detached:!0,stdio:"ignore"});s.on("error",o=>console.error("[typebulb] editor launch failed:",o?.message??o)),s.unref()}var ca,As=B(()=>{ca=/^(code|code-insiders|codium|vscodium|cursor|windsurf)(\.cmd|\.exe)?$/i});var Cs=B(()=>{de();Ts();_s();Or();As();Ye()});var Vt,$s=B(()=>{Vt=class{#e=new Map;accept(e,t){return this.#e.get(e)===t?!1:(this.#e.set(e,t),!0)}}});var Ys={};oo(Ys,{attach:()=>ja,blockToMarkdown:()=>Wr,breakout:()=>La,capText:()=>at,info:()=>Ca,isHiddenTurn:()=>Jr,launchBulb:()=>Ja,listBreakouts:()=>Na,listBulbFiles:()=>Wa,listSessions:()=>Ba,logEmbedError:()=>Oa,openFile:()=>Fa,poll:()=>$a,predictTrustOf:()=>Ha,readBulbLog:()=>za,setBulbTrust:()=>Va,stopBreakout:()=>Ua});import{existsSync as Oe,openSync as Ms,readSync as Bs,closeSync as js,statSync as fe,readdirSync as Lr,watchFile as ua,unwatchFile as Is,mkdirSync as Fs,writeFileSync as Ls,readFileSync as Nr,unlinkSync as pa,rmSync as fa}from"fs";import{join as k}from"path";import{homedir as ma}from"os";function Ns(r){return r?.message??String(r)}function ha(r){return r.replace(/[^a-zA-Z0-9]/g,"-")}function Us(r){let e=Ur(r);if(!Oe(e))return[];let t;try{t=Lr(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 qt(r){return k(r,ya)}function Js(r,e){return k(qt(r),`${e}.lock`)}function va(r,e){try{let t=Js(r,e);if(Date.now()-fe(t).mtimeMs>=Ws)return!1;try{if(parseInt(Nr(t,"utf8").trim(),10)===process.pid)return!1}catch{}return!0}catch{return!1}}function Hs(r,e){if(e)try{Fs(qt(r),{recursive:!0}),Ls(Js(r,e),String(process.pid))}catch(t){console.error("[lock] claim failed:",Ns(t))}}function xa(r){try{fa(k(r,".claude-bulb"),{recursive:!0,force:!0})}catch{}}function Sa(r){let e=qt(r);if(!Oe(e))return;let t;try{t=Lr(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>wa&&pa(o)}catch{}}}function Wr(r){let e=r?.type==="image"?r.source:void 0;return e?.type==="base64"&&e.data?``:""}function at(r){return r.length>jr?r.slice(0,jr)+`
|
|
5
|
+
\u2026[${r.length-jr} more characters truncated]`:r}function Fr(r){return typeof r=="string"?at(r):Array.isArray(r)?r.map(e=>{if(typeof e=="string")return at(e);let t=e;return typeof t?.text=="string"?at(t.text):t?.content!=null?Fr(t.content):Wr(t)}).join(`
|
|
6
|
+
`):r==null?"":at(JSON.stringify(r))}function Vs(r){try{return fe(r),!1}catch(e){return e.code==="ENOENT"}}function zs(){let r=I;if(r.file&&!Vs(r.file)){Hs(r.cwd,r.sessionId);return}let e=Pa(r);e&&qs(e)}function Pa(r){if(!r.everAttached)return Ea(r.cwd)??Ra(r.cwd,()=>!0)}function Ea(r){let e=qt(r);if(!Oe(e))return;let t;try{t=Lr(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>=Ws||parseInt(Nr(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(Ur(r),`${n.sessionId}.jsonl`);if(!Vs(s))return{sessionId:n.sessionId,file:s,mtime:n.mtime}}function Ra(r,e){return Us(r).sort((t,n)=>n.mtime-t.mtime).find(t=>!va(r,t.sessionId)&&e(t))}function qs(r){let e=I;if(e.file)try{Is(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}),Hs(e.cwd,r.sessionId),Os();try{Is(r.file)}catch{}ua(r.file,{interval:200},()=>Os())}function Os(){let r=I;if(!r.file)return;let e;try{e=fe(r.file).size}catch{return}if(e<=r.offset)return;let t;try{t=Ms(r.file,"r")}catch{return}try{let c=e-r.offset,l=Buffer.alloc(c),d=0;for(;d<c;){let u=Bs(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{js(t)}let n,s;for(;(s=r.partial.indexOf(`
|
|
7
|
+
`))>=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--)Ds(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--)Ds(o[c])}r.chainLastUuid=n}function Gs(r){let e=r.trim();return!!e&&ka.some(t=>t.test(e))}function _a(r){return r.replace(Ta,"")}function zt(r){let e=_a(r).trim();return e&&!Gs(e)?e:""}function Ks(r){return r?.type==="text"&&typeof r.text=="string"?zt(r.text):""}function Jr(r){return!!r.isSidechain||!!r.isMeta}function Ds(r){try{Aa(r)}catch(e){console.error("[claude-bulb] skipped malformed entry:",Ns(e))}}function Aa(r){if(Jr(r))return;let e=I;if(r.type==="user"){let t=r.message?.content;if(typeof t=="string"){let n=zt(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:Fr(n.content),isError:!!n.is_error});else{let s=Ks(n)||Wr(n);s&&e.buffer.push({type:"user",text:s})}}else if(r.type==="attachment"&&r.attachment?.type==="queued_command"){let t=zt(Fr(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=>!Gs(c)).join(""),o=n.filter(c=>c.type==="thinking").map(c=>c.thinking??"").join(`
|
|
8
|
+
`),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 Ca(){return{cwd:I.cwd,pid:process.pid}}async function $a(r){let e=I;return zs(),{events:e.buffer.slice(r),cursor:e.buffer.length,working:Da(e)}}async function Oa(r,e){Ia.accept(r,e)&&console.log(e)}function Da(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 Ma(r){let e;try{e=Ms(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=Bs(e,u,0,d,l);return u.subarray(0,f).toString("utf8")},o=(l,d,u)=>{let f="";for(let m of l.split(`
|
|
9
|
+
`)){if(!m.includes(`"${d}"`))continue;let h;try{h=JSON.parse(m)}catch{continue}let w=h?.[u];h?.type===d&&typeof w=="string"&&w&&(f=w)}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(`
|
|
10
|
+
`)){if(!l.trim())continue;let d;try{d=JSON.parse(l)}catch{continue}if(!d||Jr(d)||d.type!=="user")continue;let u=d.message?.content,f="";typeof u=="string"?f=zt(u):Array.isArray(u)&&(f=u.map(Ks).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{js(e)}}async function Ba(){return Us(I.cwd).sort((r,e)=>e.mtime-r.mtime).map(({sessionId:r,file:e,mtime:t})=>({sessionId:r,mtime:t,preview:Ma(e)}))}async function ja(r){let e=I,t=k(Ur(e.cwd),`${r}.jsonl`);return Oe(t)?t===e.file?{ok:!0}:(qs({sessionId:r,file:t}),{ok:!0}):{ok:!1,error:"session not found"}}async function Fa(r,e){return Br(r,e),{ok:!0}}async function La(r){let e=I.cwd,t=k(e,"typebulbs");Fs(t,{recursive:!0});let n=Ir(r),s=`${n}.bulb.md`;for(let c=2;Oe(k(t,s))&&Nr(k(t,s),"utf8")!==r;c++)s=`${n}-${c}.bulb.md`;let o=k(t,s);Oe(o)||Ls(o,r);let i=k("typebulbs",s),a=await Bt(i,{cwd:e,open:!0});return{ok:!0,file:i,pid:a.pid,url:a.url}}async function Na(){return C(I.cwd)}async function Ua(r){return await Te(r),{ok:!0}}async function Wa(){return Dr(I.cwd).map(r=>({...r,trusted:le(r.path)}))}async function Ja(r,e){let t=I.cwd;e!=null&&Se(r,e);let n=await Bt(r,{cwd:t,open:!0,trust:e});return{ok:!0,file:n.file,pid:n.pid,url:n.url,trust:!!n.trust}}async function Ha(r){return{cap:await Mr(r)}}async function Va(r,e){return Se(r,e),{ok:!0}}async function za(r,e){return ke(r,e)}var ga,ba,Ur,ya,Ws,wa,jr,I,ka,Ta,Ia,Xs=B(()=>{Cs();$s();ga=".typebulb",ba=k(ma(),".claude","projects"),Ur=r=>k(ba,ha(r));ya=`${ga}/locks`,Ws=5e3,wa=6e4;jr=5e4;I={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};ka=[/\[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];Ta=/<ide_[a-z_]+>[\s\S]*?<\/ide_[a-z_]+>/gi;Ia=new Vt;xa(I.cwd);Sa(I.cwd);zs()});import*as no from"fs/promises";import*as X from"path";import*as zr from"fs/promises";import{existsSync as he,readFileSync as io}from"fs";import*as P from"path";import{pathToFileURL as ao}from"url";import{resolve as Yt}from"resolve.exports";import{init as qr,parse as Gr}from"es-module-lexer";function Kr(r,e){let t=P.join(r,"package.json");try{return JSON.parse(io(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var Kt=["browser","import","default"],Vr=["node","import","default"];function Yr(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 Xr(r){let{name:e,dir:t}=r;if(!he(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let n=Kr(t,e),s=co(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=lo(n,t);return await uo(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function co(r,e){if(r.exports!==void 0){let n;try{n=Yt(r,".",{browser:!0,conditions:Kt})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${Kt.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=Xt(n);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${Kt.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 lo(r,e){if(r.exports!==void 0)try{let n=Yt(r,".",{conditions:["types"]}),s=Xt(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 Xt(r){if(typeof r=="string")return r;if(Array.isArray(r))return r.find(e=>typeof e=="string")}async function uo(r,e,t){await qr;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 zr.readFile(i,"utf8")}catch{continue}let c,l;try{[c,,,l]=Gr(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=po(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 po(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 fo(r,e,t){let n=Kr(r,e),s;if(n.exports!==void 0)try{s=Xt(Yt(n,t,{conditions:Vr}))}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${Vr.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 ao(o).href}async function Qr(r,e){await qr;let t;try{[t]=Gr(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=fo(e.dir,e.name,a);n+=r.slice(s,o.s)+c,s=o.e}return n+r.slice(s)}function Zr(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==="--bulbs")e.stopScope="bulbs";else if(o==="--agent")e.stopScope="agent";else if(o==="--global")e.stopScope="global";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=Yr(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 en(){console.log(`
|
|
10
11
|
typebulb - Local bulb runner for Typebulb
|
|
11
12
|
|
|
12
13
|
Usage:
|
|
@@ -28,8 +29,10 @@ Usage:
|
|
|
28
29
|
For agents: fetch tb.server.log / errors of a
|
|
29
30
|
bulb you launched without watching its terminal.
|
|
30
31
|
typebulb stop [file|pid] Stop a running bulb server (no arg: list this
|
|
31
|
-
project's running servers; a pid stops any
|
|
32
|
-
|
|
32
|
+
project's running servers; a pid/path stops any).
|
|
33
|
+
Batch flags: --bulbs (this project's bulbs, the
|
|
34
|
+
viewer survives), --agent (this project's viewer),
|
|
35
|
+
--global (every bulb + viewer, all projects).
|
|
33
36
|
typebulb trust [file] Remember a bulb as Trusted, so a later run grants
|
|
34
37
|
fs/AI/server.ts without --trust (no arg: list the
|
|
35
38
|
remembered-trusted bulbs).
|
|
@@ -95,7 +98,7 @@ Examples:
|
|
|
95
98
|
typebulb my-editor.bulb.md
|
|
96
99
|
typebulb --no-watch --port 8080 my-editor.bulb.md
|
|
97
100
|
typebulb .
|
|
98
|
-
`)}Xt();import*as re from"fs/promises";import*as Tt from"path";import{pathToFileURL as Ko}from"url";import{transform as mo}from"sucrase";function Qt(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=mo(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var De="https://esm.sh",Be="https://cdn.jsdelivr.net/npm/",Zt="https://data.jsdelivr.com/v1/package/npm/";function Qr(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=Qr(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=Zr(t[1]??""),a=ge(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=Zr(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(De).host,s=new URL(Be).host;if(t.host===n){let o=Qr(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,Zr=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 Me=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=De,this.jsDelivrBase=Be,this.jsDelivrMeta=Zt,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 en=r=>r.startsWith("@types/"),je=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!en(e)),er=r=>Object.keys(r?.dependencies||{}).filter(e=>!en(e)),ho=r=>je(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 ho(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=>je(o.meta))),n=new Map;for(let o of e)for(let i of er(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:je(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var Ne=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 go,parse as yo}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 go;let[s]=yo(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([...je(e.meta),...er(e.meta)])].filter(n=>t.has(n))}};ye.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as tn,satisfies as bo,maxSatisfying as tr,major as wo,prerelease as vo,rsort as xo,valid as So}from"semver";var dt=class{cmp(e,t){return e===t?0:tn(e,t)?1:tn(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!bo(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=tr(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?xo(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=tr(e,n,{includePrerelease:!1});if(a)return a}return tr(e,n,{includePrerelease:!0})??void 0}majorOf(e){return wo(e)}isPrerelease(e){return vo(e)!==null}isExactVersion(e){return So(e)!==null}},oe=new dt;function rn(r,e){let t=new Me(r,e),n=new Fe(t),s=new Ne(r,t,oe);return{packageService:new ye(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as bn from"fs/promises";import*as U from"path";var rr=[{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"}],nr=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var nn=`
|
|
101
|
+
`)}Qt();import*as re from"fs/promises";import*as _t from"path";import{pathToFileURL as Zo}from"url";import{transform as yo}from"sucrase";function Zt(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=yo(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var De="https://esm.sh",Me="https://cdn.jsdelivr.net/npm/",er="https://data.jsdelivr.com/v1/package/npm/";function nn(r){let e=(r||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var b=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=nn(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=sn(t[1]??""),a=ge(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=sn(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(De).host,s=new URL(Me).host;if(t.host===n){let o=nn(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,sn=r=>{let e=r.indexOf("@");return e<0?[r,void 0]:[r.slice(0,e),ge(r.slice(e+1))]};async function $(r){try{return await r()}catch{return}}var Be=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=De,this.jsDelivrBase=Me,this.jsDelivrMeta=er,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 b(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 $(()=>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 $(()=>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 $(()=>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=b.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 b(`${e}@${t}`)),o=await $(()=>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 on=r=>r.startsWith("@types/"),je=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!on(e)),tr=r=>Object.keys(r?.dependencies||{}).filter(e=>!on(e)),wo=r=>je(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 wo(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=>je(o.meta))),n=new Map;for(let o of e)for(let i of tr(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:je(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var Le=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 $(()=>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 $(()=>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 $(()=>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 b(e),s=n.root(),o=t[s],i=o?await $(()=>this.cache.getPinnedExact(s,o))??await $(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?n.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as vo,parse as xo}from"es-module-lexer";var be=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))b.isBare(s[1])&&t.add(s[1])}return Array.from(t)}async extractImports(e){let t=new Set,n=s=>{b.isBare(s)&&t.add(s)};try{await vo;let[s]=xo(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(b.rootOf(u))),o=[...new Set(s.map(b.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 $(()=>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=b.versionFromUrl(i),o&&n&&await $(()=>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(h=>[h.name,h])),i=h=>{let w=o.get(b.rootOf(h));return new b(h).withPreferredVersion(w.version,s[w.name]).format()},a=new Set([...n.entries()].filter(([,h])=>h.isPeerRoot||h.isSharedDep).map(([h])=>h)),c=new Set(e.filter(h=>h!==b.rootOf(h)).map(b.rootOf)),l=[],d=new Set,u=new Set(e.filter(h=>h===b.rootOf(h))),f=new Set;for(let h of e){let w=b.rootOf(h),D=o.get(w),{isPeerRoot:M,hasPeers:E,isSharedDep:T}=n.get(w),p=c.has(w),g=h!==w,x=!(M||T)&&(p||!E),v=this.singletonDepsOf(D,a),V=g&&u.has(w);V&&f.add(w);let se=V?[...v,w]:v.length?v:void 0;l.push([h,this.cdn.buildEsmUrl(i(h),{bundle:x,external:se})]),d.add(h)}let m=new Set([...a,...f]);for(let h of m)o.has(h)&&(d.has(h)||l.push([h,this.cdn.buildEsmUrl(i(h),{})]),l.push([`${h}/`,`${this.cdn.esmHost}/${i(h)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...je(e.meta),...tr(e.meta)])].filter(n=>t.has(n))}};be.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as an,satisfies as So,maxSatisfying as rr,major as Po,prerelease as Eo,rsort as Ro,valid as ko}from"semver";var ut=class{cmp(e,t){return e===t?0:an(e,t)?1:an(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!So(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=rr(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?Ro(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=rr(e,n,{includePrerelease:!1});if(a)return a}return rr(e,n,{includePrerelease:!0})??void 0}majorOf(e){return Po(e)}isPrerelease(e){return Eo(e)!==null}isExactVersion(e){return ko(e)!==null}},oe=new ut;function cn(r,e){let t=new Be(r,e),n=new Fe(t),s=new Le(r,t,oe);return{packageService:new be(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as Pn from"fs/promises";import*as U from"path";var nr=[{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"}],sr=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var ln=`
|
|
99
102
|
/**
|
|
100
103
|
* Get raw data chunk from the Data tab.
|
|
101
104
|
* @param index - Chunk index (0-based). Separate chunks with 2 blank lines.
|
|
@@ -106,7 +109,7 @@ Examples:
|
|
|
106
109
|
* @param index - Chunk index (0-based)
|
|
107
110
|
* @throws If chunk is not valid JSON/JSON-ish
|
|
108
111
|
*/
|
|
109
|
-
json<T = unknown>(index: number): T;`,
|
|
112
|
+
json<T = unknown>(index: number): T;`,dn=`
|
|
110
113
|
/**
|
|
111
114
|
* Get the insight data produced by the inference layer.
|
|
112
115
|
*
|
|
@@ -115,7 +118,7 @@ Examples:
|
|
|
115
118
|
*
|
|
116
119
|
* @returns The parsed insight JSON, or undefined if no insight is available
|
|
117
120
|
*/
|
|
118
|
-
insight<T = unknown>(): T | undefined;`,
|
|
121
|
+
insight<T = unknown>(): T | undefined;`,un=`
|
|
119
122
|
/**
|
|
120
123
|
* General-purpose AI call.
|
|
121
124
|
*
|
|
@@ -132,7 +135,7 @@ Examples:
|
|
|
132
135
|
model?: string;
|
|
133
136
|
/** Enable/disable web search. Default: on for BYOK, always off for free model. */
|
|
134
137
|
webSearch?: boolean;
|
|
135
|
-
}): Promise<{ text: string }>;`,
|
|
138
|
+
}): Promise<{ text: string }>;`,pn=`
|
|
136
139
|
/**
|
|
137
140
|
* Returns AI models available to the current user.
|
|
138
141
|
* Models are filtered by the user's configured API keys.
|
|
@@ -147,7 +150,7 @@ Examples:
|
|
|
147
150
|
friendlyName: string;
|
|
148
151
|
/** Provider display name, e.g. "Anthropic" */
|
|
149
152
|
providerName: string;
|
|
150
|
-
}>>;`,
|
|
153
|
+
}>>;`,To="\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;",fn=`
|
|
151
154
|
/**
|
|
152
155
|
* The mode this bulb is running in.
|
|
153
156
|
*
|
|
@@ -157,7 +160,7 @@ Examples:
|
|
|
157
160
|
* - \`'embedded'\` \u2014 Running as a bulb embedded inside another bulb (sandboxed,
|
|
158
161
|
* client-only: AI, filesystem, and server RPC are unavailable)
|
|
159
162
|
*/
|
|
160
|
-
mode: 'local' | 'editor' | 'published' | 'embedded';`,
|
|
163
|
+
mode: 'local' | 'editor' | 'published' | 'embedded';`,mn=`
|
|
161
164
|
/**
|
|
162
165
|
* Local filesystem access (CLI only).
|
|
163
166
|
*
|
|
@@ -171,7 +174,7 @@ Examples:
|
|
|
171
174
|
readBytes(path: string): Promise<Uint8Array>;
|
|
172
175
|
/** Write text or raw bytes to a file. Creates parent directories if needed. */
|
|
173
176
|
write(path: string, content: string | Uint8Array): Promise<boolean>;
|
|
174
|
-
};`,
|
|
177
|
+
};`,_o=`
|
|
175
178
|
/**
|
|
176
179
|
* Server-side function proxy. The built-in \`log\` prints to CLI stdout
|
|
177
180
|
* (falls back to console.log on web). On the server side, this object only
|
|
@@ -179,7 +182,7 @@ Examples:
|
|
|
179
182
|
*/
|
|
180
183
|
server: {
|
|
181
184
|
log(...args: any[]): Promise<void>;
|
|
182
|
-
};`,
|
|
185
|
+
};`,Ao=`
|
|
183
186
|
/**
|
|
184
187
|
* Async value inspector for tensor-like objects.
|
|
185
188
|
*
|
|
@@ -246,7 +249,7 @@ Examples:
|
|
|
246
249
|
*
|
|
247
250
|
* @returns The full canonical URL
|
|
248
251
|
*/
|
|
249
|
-
url(): Promise<string>;`,
|
|
252
|
+
url(): Promise<string>;`,Co=`
|
|
250
253
|
/**
|
|
251
254
|
* Server-side function proxy.
|
|
252
255
|
*
|
|
@@ -254,23 +257,23 @@ Examples:
|
|
|
254
257
|
* \`tb.server.log(...)\` is a built-in that prints to CLI stdout (falls back to console.log on web).
|
|
255
258
|
* User exports override built-ins of the same name.
|
|
256
259
|
*/
|
|
257
|
-
server: Record<string, (...args: any[]) => Promise<any>>;`,
|
|
260
|
+
server: Record<string, (...args: any[]) => Promise<any>>;`,or=`
|
|
258
261
|
/**
|
|
259
262
|
* Typebulb utilities namespace.
|
|
260
263
|
* Type \`tb.\` to discover available helpers.
|
|
261
264
|
*/
|
|
262
|
-
declare const tb: {${
|
|
265
|
+
declare const tb: {${ln}${Ao}${dn}${Co}${un}${mn}${pn}${To}${fn}
|
|
263
266
|
};
|
|
264
|
-
`,
|
|
267
|
+
`,ir=`
|
|
265
268
|
/**
|
|
266
269
|
* Typebulb utilities namespace (server-side).
|
|
267
270
|
* Type \`tb.\` to discover available helpers.
|
|
268
271
|
*/
|
|
269
|
-
declare const tb: {${
|
|
272
|
+
declare const tb: {${ln}${dn}${un}${mn}${_o}${pn}${fn}
|
|
270
273
|
};
|
|
271
|
-
`;var ie=class{constructor(e){this.store=e}async isNegative(e){let t=await ut(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await ut(()=>this.store.get(e)))?.attempts||0)+1;await ut(()=>this.store.set(e,{until:Date.now()+To(n),attempts:n}))}async clearNegative(e){await ut(()=>this.store.delete(e))}};function To(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function ut(r){try{return await r()}catch{return}}import Oo from"p-limit";import{resolve as dn}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},Le=["index.d.ts","index.d.mts"],Ue=/\.d\.(ts|mts)$/i;function ir(r){if(Ue.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function pt(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function We(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(_o(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function _o(r){return r===408||r===429||r>=500&&r<600}var Je=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 We(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([...Le],t);if(!Ue.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([...Le,...n],t)}toResolutionResult(e){return{kind:Ue.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(dn(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(dn(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[...Le];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),n=pt(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...pt(`${s}index`)),n}};import{gunzipSync as Ao}from"fflate";var we=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await We(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=Ao(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}},Co=new we;var He=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 Ve=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 un="file:///node_modules",ze=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`${un}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=Io(t);return`${un}/${this.epochDir()}/${e}/${n}`}};function Io(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as $o}from"lru-cache";function ar(r){let e=new $o({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 ft=class{constructor(e){this.inFlight=new Map,this.scanner=new Ve,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=ar(e.cache),this.typescriptProvider=new Je(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new He(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new ze}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=ir(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=Oo(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(
|
|
273
|
-
`,"utf8")}async function
|
|
274
|
+
`;var ie=class{constructor(e){this.store=e}async isNegative(e){let t=await pt(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await pt(()=>this.store.get(e)))?.attempts||0)+1;await pt(()=>this.store.set(e,{until:Date.now()+$o(n),attempts:n}))}async clearNegative(e){await pt(()=>this.store.delete(e))}};function $o(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function pt(r){try{return await r()}catch{return}}import jo from"p-limit";import{resolve as hn}from"resolve.exports";var ye=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"],Ue=/\.d\.(ts|mts)$/i;function ar(r){if(Ue.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function ft(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function We(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(Io(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function Io(r){return r===408||r===429||r>=500&&r<600}var Je=class extends ye{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let n=this.cdnClient.packageJson(new b({name:e,version:t})),s=await We(n);if(!s?.ok)return;let o;try{o=await s.json()}catch{return}if(o)return{pkg:o,baseDir:this.cdnClient.baseDir(new b({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(!Ue.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:Ue.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(hn(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(hn(s,n,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=b.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 b(o).format(),a=new b({...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 h=await this.resolveFromSelected(this.toResolutionResult(f),c);if(h)return{...h,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=ft(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...ft(`${s}index`)),n}};import{gunzipSync as Oo}from"fflate";var we=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await We(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=Oo(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 h=n.slice(o,o+f);t.set(this.normalizeTarPath(l),s.decode(h))}o+=Math.ceil(f/512)*512}}catch{}return t}},Do=new we;var He=class extends ye{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 b(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 b(t).format():t.name}}}async resolve(e){let t=b.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 Ve=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 gn="file:///node_modules",ze=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`${gn}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=Mo(t);return`${gn}/${this.epochDir()}/${e}/${n}`}};function Mo(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as Bo}from"lru-cache";function cr(r){let e=new Bo({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 mt=class{constructor(e){this.inFlight=new Map,this.scanner=new Ve,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=cr(e.cache),this.typescriptProvider=new Je(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new He(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new ze}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 b(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 b(e).subpath===new b(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=ar(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 h=this.toVirtualPath(n,new URL(m.url),s);this.pushFileIfNew(o,h,m.dts),await this.expandRelativeRefs(m.dts,m.url,s,o,i,n);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new b(e).name!==new b(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=jo(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 b(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 h=f.map(E=>E.content).join(`
|
|
275
|
+
`);await this.prefetchBareDeps(h,l,f,m,s);let w=c.format(),D=e===w?[e]:[e,w],M=D.some(E=>this.ambientlyDeclares(o,E));return M?this.markFileAmbient(f,d):m.push(...D.map(E=>({module:E,path:d}))),{pkg:e,mainPath:d,files:f,shims:m,ambient:M}}};function lr(r){return new mt(r)}import*as z from"fs/promises";import*as q from"path";import*as wn from"os";import*as dr from"fs/promises";import*as bn from"crypto";function N(r){return bn.createHash("sha1").update(r).digest("hex")}async function ae(r){try{return JSON.parse(await dr.readFile(r,"utf8"))}catch{return}}async function ht(r){try{return await dr.readFile(r,"utf8")}catch{return}}var yn=1,ee=q.join(wn.homedir(),".typebulb","cache"),qe=q.join(ee,"packages"),Ge=q.join(ee,"proxy"),gt=q.join(ee,"dts"),Fo=q.join(ee,"emit"),ur;function S(){return ur||(ur=Lo()),ur}function bt(r,e){return q.join(Fo,N(r),e)}async function Lo(){await z.mkdir(ee,{recursive:!0});let r=q.join(ee,"version.json");if((await No(r))?.version===yn)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:yn})+`
|
|
276
|
+
`,"utf8")}async function No(r){try{let e=await z.readFile(r,"utf8");return JSON.parse(e)}catch{return}}import*as te from"fs/promises";import*as vn from"path";async function j(r,e){await te.mkdir(vn.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 j(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var pr=U.join(qe,"indexes"),xn=U.join(qe,"pinned"),Uo=U.join(qe,"meta"),Wo=U.join(qe,"negative.json"),xe=Symbol("missing"),wt=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new ie(new ve(Wo));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 ht(U.join(xn,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 j(U.join(xn,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(U.join(pr,yt(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 j(U.join(pr,yt(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await Pn.rm(U.join(pr,yt(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(Sn(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 j(Sn(e,t),JSON.stringify(i))}};function Sn(r,e){return U.join(Uo,yt(r),encodeURIComponent(e)+".json")}function yt(r){return r.replace(/\//g,"__")}var En={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 Jo=new wt,{packageService:vt,versionResolver:Rn,cdnClient:kn,peerResolver:Ql}=cn(Jo,En);var Tn=`
|
|
274
277
|
(() => {
|
|
275
278
|
// Embedded (bulb-in-a-bulb): runs inside a sandboxed iframe with no parent
|
|
276
279
|
// bridge, so privileged tb.* (AI, fs, server RPC) can't reach a host and would
|
|
@@ -480,10 +483,10 @@ declare const tb: {${nn}${sn}${on}${ln}${Eo}${an}${cn}
|
|
|
480
483
|
};
|
|
481
484
|
}
|
|
482
485
|
})();
|
|
483
|
-
`;function
|
|
486
|
+
`;function xt(r){return r.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var St=` *, *::before, *::after { box-sizing: border-box; }
|
|
484
487
|
body { margin: 0; display: flow-root; font-family: system-ui, -apple-system, sans-serif; }
|
|
485
488
|
html[data-theme="dark"] { color-scheme: dark; }
|
|
486
|
-
html[data-theme="light"] { color-scheme: light; }`;function
|
|
489
|
+
html[data-theme="light"] { color-scheme: light; }`;function Pt(r,e){let t=n=>n.replace(/<\/script/gi,"<\\/script");return` <script>
|
|
487
490
|
(function() {
|
|
488
491
|
try {
|
|
489
492
|
var KEY = ${t(JSON.stringify("tb-theme:"+r))};
|
|
@@ -518,41 +521,42 @@ declare const tb: {${nn}${sn}${on}${ln}${Eo}${an}${cn}
|
|
|
518
521
|
});
|
|
519
522
|
} catch (e) {}
|
|
520
523
|
})();
|
|
521
|
-
</script>`}function
|
|
524
|
+
</script>`}function _n(r){let{name:e,code:t,css:n,html:s,data:o,insight:i,importMap:a,watch:c,theme:l,embedded:d}=r,u=s.trim()||'<div id="app"></div>',f=d?"":`
|
|
525
|
+
html, body { height: 100%; }`,m=w=>w.replace(/<\/script/gi,"<\\/script"),h={imports:Vo(a.imports)};return`<!DOCTYPE html>
|
|
522
526
|
<html>
|
|
523
527
|
<head>
|
|
524
528
|
<meta charset="utf-8">
|
|
525
529
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
526
|
-
<title>${
|
|
527
|
-
${
|
|
530
|
+
<title>${xt(e)} - typebulb</title>
|
|
531
|
+
${Pt(e,l)}
|
|
528
532
|
<script type="importmap">
|
|
529
|
-
${JSON.stringify(
|
|
533
|
+
${JSON.stringify(h,null,2)}
|
|
530
534
|
</script>
|
|
531
535
|
<style>
|
|
532
|
-
${
|
|
536
|
+
${St}${f}
|
|
533
537
|
</style>
|
|
534
538
|
<style>
|
|
535
539
|
${n}
|
|
536
540
|
</style>
|
|
537
541
|
</head>
|
|
538
542
|
<body>
|
|
539
|
-
${
|
|
543
|
+
${u}
|
|
540
544
|
|
|
541
|
-
${o.length>0?`<script>window.__TB_DATA__ = ${
|
|
542
|
-
${i?`<script>window.__TB_INSIGHT__ = ${
|
|
545
|
+
${o.length>0?`<script>window.__TB_DATA__ = ${m(JSON.stringify(o))};</script>`:""}
|
|
546
|
+
${i?`<script>window.__TB_INSIGHT__ = ${m(JSON.stringify(i))};</script>`:""}
|
|
543
547
|
${c?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
|
|
544
548
|
|
|
545
549
|
<script>
|
|
546
|
-
${
|
|
550
|
+
${Tn}
|
|
547
551
|
</script>
|
|
548
552
|
|
|
549
|
-
${
|
|
553
|
+
${Ho}
|
|
550
554
|
|
|
551
555
|
<script type="module">
|
|
552
|
-
${
|
|
556
|
+
${m(t)}
|
|
553
557
|
</script>
|
|
554
558
|
</body>
|
|
555
|
-
</html>`}var
|
|
559
|
+
</html>`}var Ho=`<script>
|
|
556
560
|
(function () {
|
|
557
561
|
if (window.parent === window) return;
|
|
558
562
|
var de = document.documentElement;
|
|
@@ -623,50 +627,50 @@ ${u(t)}
|
|
|
623
627
|
}
|
|
624
628
|
});
|
|
625
629
|
})();
|
|
626
|
-
</script>`;function
|
|
627
|
-
`,"utf8"),await
|
|
628
|
-
`,"utf8"),{dir:e}}function
|
|
630
|
+
</script>`;function Vo(r){let e={};for(let[t,n]of Object.entries(r))e[t]=n.startsWith("https://")?"/proxy/"+n:n;return e}import*as Rt from"fs/promises";import*as Et from"path";import{existsSync as An,readFileSync as zo}from"fs";import{execFile as qo}from"child_process";import{promisify as Go}from"util";import{satisfies as Ko}from"semver";var Yo=Go(qo);async function kt(r,e,t){let s=r.map(i=>Xo(i,t)).filter(i=>!Qo(i,e));if(s.length===0)return;await Rt.mkdir(e,{recursive:!0});let o=Et.join(e,"package.json");An(o)||await Rt.writeFile(o,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${s.join(", ")}`),await Yo("npm",["install","--no-audit","--no-fund",...s],{cwd:e,shell:!0})}function Xo(r,e){if(!e||$n(r))return r;let t=e[r];return t?`${r}@${t}`:r}function Qo(r,e){let t=Et.join(e,"node_modules",Cn(r));if(!An(t))return!1;let n=$n(r);if(!n)return!0;try{let s=JSON.parse(zo(Et.join(t,"package.json"),"utf-8")).version;return Ko(s,n)}catch{return!1}}function Tt(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 Cn(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 $n(r){let e=Cn(r);return r.length>e.length?r.slice(e.length+1):""}async function In(r){let t=(await re.readdir(r)).find(n=>n.endsWith(".bulb.md"));return t?_t.join(r,t):null}async function G(r){let e=await re.readFile(r,"utf-8"),t=lt(e);if(!t)throw new Error("Invalid .bulb.md file format");let n=dt(t);return{bulb:n,config:rn(n.config)}}async function fr(r,e,t,n){let s=Zt(r,{serverOnly:!0});if(s.error)throw new Error(`Server compilation error: ${s.error}`);let o=s.code;t&&(o=await Qr(o,t));let i=_t.join(e,".typebulb");await re.mkdir(i,{recursive:!0});let a=Tt(o);a.length>0&&await kt(a,i,n);let c=_t.join(i,"server.mjs");return await re.writeFile(c,o,"utf-8"),await import(`${Zo(c).href}?t=${Date.now()}`)}async function mr(r,e,t,n,s){let{bulb:o,config:i}=await G(r),a=tn(o.data),c=Zt(o.code,{jsxImportSource:i.jsxImportSource});c.error&&console.error("Compilation error:",c.error);let{importMap:l}=await vt.buildImportMap(c.code,i.dependencies??{},n?new Set([n.name]):void 0);n&&(l.imports[n.name]=n.entryUrl);let d=_n({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 fr(o.server,s,n,i.dependencies)),{html:d,bulb:o,serverExports:u}}Ye();import ai from"open";async function Pe(r){await ai(r)}var Mn=new Set(["claude"]);function Bn(r){return Mn.has(r)}function yr(){return[...Mn]}import*as Wn from"path";import{spawn as Si}from"child_process";import*as A from"fs/promises";import*as R from"path";import*as Ee from"path";var ci=Ee.join(gt,"pkg"),li=Ee.join(gt,"files"),di=Ee.join(gt,"negative.json"),$t=class{pkgMem=new Map;fileMem=new Map;negativeCache=new ie(new ve(di));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await S();let t=await ae(jn(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 Ct(async()=>{await S(),await j(jn(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await S();let t=await ht(Fn(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await Ct(async()=>{await S(),await j(Fn(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await Ct(async()=>{await S(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return Ct(()=>this.negativeCache.clearNegative(e))}};async function Ct(r){try{await r()}catch{}}function jn(r){return Ee.join(ci,N(r)+".json")}function Fn(r){return Ee.join(li,N(r)+".txt")}var wr;function ui(){return wr||(wr=lr({cache:new $t,cdnClient:kn,packageService:vt,versionResolver:Rn})),wr}var Ln="file:///node_modules/";async function Nn(r){let e=bt(r.emitKey,"typecheck");await S(),await A.rm(e,{recursive:!0,force:!0}),await A.mkdir(e,{recursive:!0});let t=hi(r.jsxImportSource,r.dependencies),n=await ui().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=It(u.path);if(!f||i.has(f))continue;i.add(f);let m=R.join(e,"node_modules",f);await A.mkdir(R.dirname(m),{recursive:!0}),await A.writeFile(m,u.content,"utf8")}let a={};for(let d of o)for(let u of d.shims){let f=It(u.path);f&&(a[u.module]=[`./node_modules/${f}`])}for(let d of o){if(d.ambient)continue;let u=It(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=It(u.path);f&&c.add(`node_modules/${f}`)}if(r.local){delete a[r.local.name];let d=await gi(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=pi(r.jsxImportSource,a,[...c]);return await A.writeFile(R.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
|
|
631
|
+
`,"utf8"),await A.writeFile(R.join(e,"code.tsx"),r.code,"utf8"),await A.writeFile(R.join(e,"tb.d.ts"),or,"utf8"),{dir:e}}function pi(r,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:fi([...nr,...sr]),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 fi(r){return r.filter(e=>!e.since).map(e=>mi(e.name))}function mi(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 hi(r,e){let t=r??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function It(r){if(!r.startsWith(Ln))return;let e=r.slice(Ln.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function gi(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 bi(t)){let o=R.join(n,R.relative(t,s));await A.mkdir(R.dirname(o),{recursive:!0}),await A.copyFile(s,o)}return R.basename(r.typesAbs)}async function bi(r){let e=[];async function t(n){let s=await A.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 F from"fs/promises";import*as K from"path";import{existsSync as yi}from"fs";var wi="^22";async function Un(r){let e=bt(r.emitKey,"typecheck-server");await S(),await F.rm(e,{recursive:!0,force:!0}),await F.mkdir(e,{recursive:!0});let t=K.join(r.bulbDir,".typebulb"),n=Tt(r.server).filter(i=>i!==r.local?.name);await kt([`@types/node@${wi}`,...n],t,r.dependencies);let s=K.join(t,"node_modules"),o=K.join(e,"node_modules");return await xi(s,o),await F.writeFile(K.join(e,"server.ts"),r.server,"utf8"),await F.writeFile(K.join(e,"tb.d.ts"),ir,"utf8"),await F.writeFile(K.join(e,"tsconfig.json"),JSON.stringify(vi(r.local),null,2)+`
|
|
632
|
+
`,"utf8"),{dir:e}}function vi(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 xi(r,e){if(!yi(r)){await F.mkdir(e,{recursive:!0});return}await F.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await F.symlink(r,e,t)}async function Jn(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 Nn({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 Un({server:t.server,bulbDir:Wn.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 Pi(a);for(let d of c.split(/\r?\n/))d.trim()&&console.log(`${i} ${d}`);l!==0&&(o=!0)}o&&process.exit(1)}function Pi(r){return new Promise(e=>{let t=Si("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}))})}Ot();Ye();async function Hn(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.)")}Ye();import*as Xe from"path";async function Vn(r,e){if(!r){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let n=br();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=Xe.resolve(r);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),Se(t,e),console.log(e?`Trusted ${Xe.basename(t)} \u2014 runs with fs / AI / server.ts (no --trust needed).`:`Untrusted ${Xe.basename(t)} \u2014 runs Restricted.`),console.log(` ${t}`)}Ke();de();import{readFileSync as Oi}from"fs";import*as _e from"path";import{fileURLToPath as Di}from"url";function Zn(){return _e.join(_e.dirname(Di(import.meta.url)),"..")}function jt(){return _e.join(Zn(),"README.md")}function xr(){return _e.join(Zn(),"description.md")}function Mi(r){return`---
|
|
629
633
|
name: typebulb
|
|
630
|
-
description: ${
|
|
634
|
+
description: ${Oi(xr(),"utf8").trim().replace(/\s+/g," ")}
|
|
631
635
|
version: ${r}
|
|
632
|
-
---`}function
|
|
636
|
+
---`}function Bi(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 es(r,e){return`${Mi(e)}
|
|
633
637
|
|
|
634
|
-
${
|
|
638
|
+
${Bi(e)}
|
|
635
639
|
|
|
636
640
|
${r.trim()}
|
|
637
|
-
`}async function
|
|
641
|
+
`}async function Sr(r,e){let t=_(r);return(await C()).find(n=>n.cwd!=null&&_(n.cwd)===t&&(e?n.agent===e:n.agent!=null))}async function ts(){let r=await Sr(process.cwd()),e=r?.agent,n=[e?`Viewer '${e}' is up at ${r?.url} \u2014 the embedded bulbs render live there.`:"No viewer is running \u2014 to render embedded bulbs live inline, start one with `npx typebulb agent:claude --no-open`; it prints a localhost link that opens the viewer.","","Agents: Read the bulb-authoring skill before writing a bulb \u2014 get it assembled as one SKILL.md with `npx typebulb skill`, or read its parts directly:",` - description: ${xr()}`,` - skill body (the README is the skill): ${jt()}`];process.stdout.write(n.join(`
|
|
638
642
|
`)+`
|
|
639
|
-
`)}import{readFileSync as
|
|
640
|
-
`)){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
|
|
641
|
-
`)}async function
|
|
642
|
-
`+e)}function
|
|
643
|
+
`)}import{readFileSync as ji,existsSync as Fi}from"fs";import*as Y from"path";function Li(r){return[...r?[`.env.${r}.local`,`.env.${r}`]:[],".env.local",".env"]}function ne(r,e=process.cwd()){let t={},n=[];for(let s of Li(r)){let o;try{o=ji(Y.resolve(e,s),"utf-8")}catch{continue}n.push(s);for(let[i,a]of Ni(o))process.env[i]===void 0&&(process.env[i]=a,t[i]=s)}return{mode:r,sources:t,loaded:n}}function*Ni(r){for(let e of r.split(`
|
|
644
|
+
`)){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 Ui(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 Ae(r,e,t){let{sources:n,mode:s,loaded:o}=r,i=process.cwd(),a=Y.dirname(e),c=`(mode: ${s??"none"})`,l=t?Ui(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"])Fi(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 $e={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"},Wi="https://api.typebulb.com/api/models",Ji=1440*60*1e3,Ce=null;async function Ft(){if(!Ce||Date.now()-Ce.fetchedAt>Ji){let r=await fetch(Wi);if(!r.ok)return Ce?rs(Ce.models):[];Ce={models:await r.json(),fetchedAt:Date.now()}}return rs(Ce.models)}function rs(r){let e=new Set(Object.entries($e).filter(([,t])=>!!process.env[t]).map(([t])=>t));return r.filter(t=>e.has(t.provider))}function ns(){return Object.values($e).some(r=>!!process.env[r])}function ss(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(`
|
|
645
|
+
`)}async function os(r){if(ne(r),!ns()){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($e))console.log(` ${n.padEnd(20)} (${t})`);console.log("Then re-run `typebulb models`.");return}let e=await Ft();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(ss(e,process.env.TB_AI_PROVIDER,process.env.TB_AI_MODEL))}import*as is from"fs/promises";async function as(r){let e=jt(),t;try{t=await is.readFile(e,"utf8")}catch{console.error(`Could not read the bundled README (expected at ${e}).`),process.exit(1)}process.stdout.write(es(t,r))}Ke();de();import*as Pr from"path";function Hi(r,e,t){if(/^\d+$/.test(e))return r.find(s=>s.pid===parseInt(e,10));let n=r.filter(s=>s.agent===e);return n.length?(t?n.find(o=>o.cwd&&_(o.cwd)===_(t)):void 0)??n[0]:r.find(s=>_(s.file)===_(e))}function cs(r,e){for(let t of r)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function ls(r,e){if(!r.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),cs(r,t=>console.log(t)),console.log(`
|
|
646
|
+
`+e)}function ds(r,e,t,n){let s=Hi(r,e,n);if(s)return s;console.error(`No running server for '${e}'.`),r.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),cs(r,o=>console.error(o))):console.error("No bulb servers are running."),process.exit(1)}async function us(r,e){if(!r){ls(await C(process.cwd()),"Run `typebulb logs <file|pid>` to print one server's console.");return}let t=ds(await C(),r,"logs",process.cwd()),n=ke(t.pid),s=n.text;if(e.lines&&e.lines>0){let o=s.split(`
|
|
643
647
|
`);o.length&&o[o.length-1]===""&&o.pop(),s=o.slice(-e.lines).join(`
|
|
644
648
|
`)}if(process.stdout.write(s),s&&!s.endsWith(`
|
|
645
649
|
`)&&process.stdout.write(`
|
|
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
|
|
650
|
+
`),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 ps(r){if(!r){ls(await C(process.cwd()),"Run `typebulb stop <file|pid>` to stop one.");return}let e=ds(await C(),r,"stop",process.cwd());await Te(e.pid),console.log(`Stopped ${e.agent??Pr.basename(e.file)} (pid ${e.pid}, ${e.url}).`)}async function fs(r){let e=process.cwd(),t=r==="global"?await C():r==="bulbs"?await C(e):(await C()).filter(s=>s.agent!=null&&s.cwd!=null&&_(s.cwd)===_(e)),n=r==="global"?"server":r==="agent"?"viewer":"bulb";if(!t.length){console.log(r==="global"?"No running bulb servers.":`No running ${n}s for this project.`);return}await Promise.all(t.map(s=>Te(s.pid))),console.log(`Stopped ${t.length} ${n}${t.length===1?"":"s"}:`);for(let s of t)console.log(` ${s.url} pid ${s.pid} ${s.agent??Pr.basename(s.file)}`)}import*as Ss from"fs/promises";import*as Ie from"path";import{EventEmitter as xs}from"events";Ot();import{Hono as zi}from"hono";import{serve as qi}from"@hono/node-server";import{streamSSE as Gi}from"hono/streaming";import*as pe from"fs/promises";import*as H from"path";var L=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=`
|
|
647
651
|
|
|
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
|
|
652
|
+
`){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 L(t,n,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new L(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 tt=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(`
|
|
649
653
|
|
|
650
654
|
`);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 rt=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
|
|
655
|
+
`)),!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 L(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(`
|
|
652
656
|
|
|
653
657
|
`)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var nt=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,`
|
|
654
658
|
`),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(`
|
|
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
|
|
659
|
+
`)[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 L(n)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new L(`Prompt blocked: ${t}`)}}};var st=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 Vi=new Map([["openai",new rt],["openrouter",new st],["anthropic",new tt],["gemini",new nt]]);function ue(r){let e=Vi.get(r);if(!e)throw new Error(`Unsupported protocol: ${r}`);return e}async function Er(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 Rr(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 ms(r){let e=r.indexOf(`\r
|
|
656
660
|
\r
|
|
657
661
|
`),t=r.indexOf(`
|
|
658
662
|
|
|
659
|
-
`);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function
|
|
660
|
-
`).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function
|
|
661
|
-
${c}`:"";return p.text(`Forbidden: this capability requires --trust.${
|
|
662
|
-
${d.name}`),console.log(` ${
|
|
663
|
+
`);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function kr(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(`
|
|
664
|
+
`).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function hs(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=kr(s);f!==null&&f!=="done"&&e(f)}break}o=!0,s+=n.decode(l,{stream:!0});let{pos:d,len:u}=ms(s);for(;d!==-1;){let f=s.slice(0,d);s=s.slice(d+u);let m=kr(f);if(m==="done"){s="";break}m!==null&&e(m),{pos:d,len:u}=ms(s)}}return{receivedAnyData:o}}async function Tr(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 hs(s,i=>{let a=n.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as _r from"fs/promises";import*as ot from"path";var Lt=class{async get(e){let t=N(e),n=ot.join(Ge,t+".bin"),s=ot.join(Ge,t+".json");try{let[o,i]=await Promise.all([_r.readFile(n),_r.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=ot.join(Ge,n+".bin"),o=ot.join(Ge,n+".json"),i={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([j(s,t.body),j(o,JSON.stringify(i))])}};de();var ys="127.0.0.1",Ki=new Set(["localhost","127.0.0.1","::1"]);function Yi(r){if(r)try{return new URL(r.includes("://")?r:`http://${r}`).hostname}catch{return}}function gs(r){let e=Yi(r);return!!e&&Ki.has(e)}function Nt(r){return r instanceof Error?r.message:"Unknown error"}async function Ut(r){let{getHtml:e,basePath:t,port:n,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c,staticAssets:l}=r,d=new zi;d.use("*",async(p,g)=>{if(!gs(p.req.header("host")))return p.text("Forbidden: untrusted Host",403);await g()}),d.use("*",async(p,g)=>{await g(),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,g)=>{if(!a){let y=new URL(p.req.url).pathname,x=y.startsWith("/__fs")?"the filesystem":y==="/__ai"?"AI (your API keys)":"server-side code (server.ts)";Qn(process.pid,x);let v=c?`
|
|
665
|
+
${c}`:"";return p.text(`Forbidden: this capability requires --trust.${v}`,403)}await g()},m=async(p,g)=>{let y=p.req.header("sec-fetch-site");if(y){if(y==="cross-site")return p.text("Forbidden: cross-site request",403)}else{let x=p.req.header("origin");if(x&&!gs(x))return p.text("Forbidden: cross-origin request",403)}await g()};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:g}=await p.req.json();console.log(...g||[])}catch{}return p.json({ok:!0})}),d.get("/",p=>p.html(e())),d.post("/__fs/read",async p=>{try{let{path:g}=await p.req.json(),y=Cr(g,t),x=await pe.readFile(y);return new Response(new Uint8Array(x),{headers:{"Content-Type":"application/octet-stream"}})}catch(g){let y=Nt(g);return p.json({error:y},400)}}),d.post("/__fs/write",async p=>{try{let g=p.req.query("path");if(!g)return p.json({error:"Missing path"},400);let y=Cr(g,t);return await pe.mkdir(H.dirname(y),{recursive:!0}),await pe.writeFile(y,Buffer.from(await p.req.arrayBuffer())),p.json({success:!0})}catch(g){let y=Nt(g);return p.json({error:y},400)}});let h={log:console.log};d.post("/__api/:name",async p=>{try{let g=o?.(),y=p.req.param("name"),x=g?.[y]??h[y];if(!x||typeof x!="function")return p.json({error:`API function '${y}' not found`},404);let{args:v}=await p.req.json(),V=await x(...v||[]);return p.json({result:V})}catch(g){let y=Nt(g);return p.json({error:y},500)}}),d.post("/__ai",async p=>{try{let{messages:g,system:y,reasoning:x,provider:v,model:V,webSearch:se}=await p.req.json();if(!g||!Array.isArray(g)||g.length===0)return p.json({message:"messages array is required",code:"unknown",retryable:!1},400);let Q=Xi(v,V);if(typeof Q=="string")return p.json({message:Q,code:"unknown",retryable:!1},400);let Gt=[...y?[{role:"system",content:y}]:[],...g.map(ct=>({role:ct.role,content:ct.content}))],me=await Er(Q,{model:Q.model,messages:Gt,stream:!0,reasoning:x??0,webSearch:se??!0});if(!me.ok){let ct=await Rr(me,Q.protocol);return p.json(ct,me.status)}let Hr=await Tr(me,Q.protocol);return Hr||console.warn("[tb.ai] Empty response from provider"),p.json({text:Hr})}catch(g){if(g instanceof L)return p.json({message:g.message,code:g.code,retryable:g.retryable},500);let y=Nt(g);return p.json({message:y,code:"unknown",retryable:!1},500)}}),d.get("/__models",async p=>{try{let g=await Ft();return p.json(g)}catch{return p.json([],200)}});let w=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],D=new Lt;d.get("/proxy/*",async p=>{let g=new URL(p.req.url),x=(g.pathname+g.search).slice(7),v=x.lastIndexOf("https://");return v===-1?p.text("Invalid proxy URL",400):M(p,x.slice(v))}),i&&bs(d,`/local/${i.name}/`,i.serveDir),l&&bs(d,l.mount,l.dir);async function M(p,g){let y;try{y=new URL(g)}catch{return p.text("Invalid URL",400)}if(y.protocol!=="https:")return p.text("HTTPS only",400);if(!w.includes(y.hostname))return p.text("Host not allowed",403);let x=await D.get(g);if(x)return new Response(x.body,{status:200,headers:Ar(x.contentType,x.cacheControl)});try{let v=await fetch(g,{headers:{Accept:p.req.header("Accept")||"*/*"},redirect:"follow"});if(!v.ok)return p.text(`Upstream ${v.status}`,v.status);let V=v.headers.get("Content-Type")||void 0,se=v.headers.get("Cache-Control")||void 0;if(v.body){let[Q,Gt]=v.body.tee();return(async()=>{try{let me=await new Response(Gt).arrayBuffer();await D.set(g,{body:Buffer.from(me),contentType:V,cacheControl:se})}catch{}})(),new Response(Q,{status:v.status,headers:Ar(V,se)})}return new Response(null,{status:v.status,headers:Ar(V,se)})}catch(v){return p.text(`Proxy fetch failed: ${v instanceof Error?v.message:v}`,502)}}s&&d.get("/__reload",p=>Gi(p,async g=>{let y=()=>{g.writeSSE({event:"reload",data:""})};for(s.on("reload",y),g.onAbort(()=>{s.removeListener("reload",y)});;)await g.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 g=new URL(p.req.url);return E.test(g.pathname)?M(p,"https://esm.sh"+g.pathname+g.search):p.text("Not Found",404)});let T=qi({fetch:d.fetch,port:n,hostname:ys});return{port:n,close:()=>T.close()}}function Xi(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=$e[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 Ar(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 bs(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=Cr(o,t),a=await pe.readFile(i);return new Response(a,{headers:{"Content-Type":Qi(i)}})}catch{return n.text("Not Found",404)}})}function Qi(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 Cr(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 it(r){let e=await import("net");return new Promise(t=>{let n=e.createServer();n.listen(r,ys,()=>{let s=n.address(),o=typeof s=="object"&&s?s.port:r;n.close(()=>t(o))}),n.on("error",()=>{t(it(r+1))})})}import ws from"chokidar";var vs={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Wt(r){let{bulbPath:e,emitter:t}=r,n=ws.watch(e,vs);return n.on("change",()=>{t.emit("reload")}),()=>n.close()}function Jt(r){let{dir:e,onChange:t,debounceMs:n=150}=r,s,o=ws.watch(e,vs);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,n)}),()=>{s&&clearTimeout(s),o.close()}}de();async function Ps(r,e,t,n,s){let o=process.cwd(),i=Dt(process.pid),a=e.watch?new xs:void 0,c=ne(e.mode);console.log(`Loading ${Ie.basename(r)}...`);let{html:l,bulb:d,serverExports:u}=await mr(r,e.watch,e.trust,n,s);Ae(c,r,d.server);let f=await it(e.port),m=await Ut({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}),h=`http://localhost:${f}`,w=e.trust?void 0:Re(d);await Mt({pid:process.pid,port:f,url:h,file:r,cwd:process.cwd(),startedAt:Date.now(),trust:e.trust,predicted:w}),console.log(`
|
|
666
|
+
${d.name}`),console.log(` ${h}`),f!==e.port&&console.log(` (port ${e.port} was busy)`),e.trust?console.log(" trust: granted (filesystem, AI, server.ts enabled)"):console.log(w?` trust: sandboxed \u2014 this bulb appears to use ${w}; re-run with --trust to enable it:
|
|
663
667
|
${t}
|
|
664
668
|
`:` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
|
|
665
669
|
`),e.watch&&console.log(` Watching for changes...
|
|
666
|
-
`);let
|
|
667
|
-
`)}catch(p){console.error("Compile error:",p)}})
|
|
668
|
-
`),a.emit("reload")}})}}e.open&&await Pe(
|
|
669
|
-
Shutting down...`),m.close()
|
|
670
|
+
`);let D,M;if(e.watch&&a){let T=new xs;if(T.on("reload",async()=>{try{console.log("Recompiling...");let p=await mr(r,!0,e.trust,n,s);l=p.html,u=p.serverExports,a.emit("reload"),console.log(`Done. Browser reloading...
|
|
671
|
+
`)}catch(p){console.error("Compile error:",p)}}),D=Wt({bulbPath:r,emitter:T}),n){let{name:p,serveDir:g}=n;M=Jt({dir:g,onChange:()=>{console.log(`Local package '${p}' changed. Browser reloading...
|
|
672
|
+
`),a.emit("reload")}})}}e.open&&await Pe(h);let E=async()=>{console.log(`
|
|
673
|
+
Shutting down...`),m.close(),D?.(),M?.(),i(),await et(process.pid);let T=Ie.join(Ie.dirname(r),".typebulb","server.mjs");await Ss.rm(T,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",E),process.on("SIGTERM",E)}import{readFileSync as Qs,copyFileSync as qa,existsSync as Ga}from"fs";import*as O from"path";import{fileURLToPath as Ka}from"url";import{EventEmitter as Ya}from"events";de();var $r="/agents/claude/client.js",Zi=`
|
|
670
674
|
(() => {
|
|
671
675
|
const api = async (name, ...args) => {
|
|
672
676
|
const resp = await fetch('/__api/' + name, {
|
|
@@ -701,15 +705,15 @@ Shutting down...`),m.close(),$?.(),O?.(),i(),await et(process.pid);let T=$e.join
|
|
|
701
705
|
es.onerror = () => { es.close(); };
|
|
702
706
|
}
|
|
703
707
|
})();
|
|
704
|
-
`;function
|
|
708
|
+
`;function Es(r){let{name:e,styles:t,mountHtml:n,watch:s,theme:o}=r;return`<!DOCTYPE html>
|
|
705
709
|
<html>
|
|
706
710
|
<head>
|
|
707
711
|
<meta charset="utf-8">
|
|
708
712
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
709
|
-
<title>${
|
|
710
|
-
${
|
|
713
|
+
<title>${xt(e)} - typebulb</title>
|
|
714
|
+
${Pt(e,o)}
|
|
711
715
|
<style>
|
|
712
|
-
${
|
|
716
|
+
${St}
|
|
713
717
|
</style>
|
|
714
718
|
<style>
|
|
715
719
|
${t}
|
|
@@ -721,16 +725,16 @@ ${n}
|
|
|
721
725
|
${s?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
|
|
722
726
|
|
|
723
727
|
<script>
|
|
724
|
-
${
|
|
728
|
+
${Zi}
|
|
725
729
|
</script>
|
|
726
730
|
|
|
727
|
-
<script type="module" src="${
|
|
731
|
+
<script type="module" src="${$r}"></script>
|
|
728
732
|
</body>
|
|
729
|
-
</html>`}async function
|
|
730
|
-
Claude Bulb`),console.log(` ${
|
|
731
|
-
`);async function
|
|
732
|
-
`),n.emit("reload")}catch(p){console.error("Viewer rebuild failed:",p instanceof Error?p.message:p)}finally{T=!1}}}})}r.open&&await Pe(
|
|
733
|
-
Shutting down...`),m.close()
|
|
734
|
-
`);let c=new
|
|
735
|
-
${l.url}`),r.open&&await Pe(l.url);return}await
|
|
736
|
-
${s}`),process.exit(1)),await
|
|
733
|
+
</html>`}async function Zs(r){let e=process.cwd(),t=Dt(process.pid),n=r.watch?new Ya:void 0,s=ne(r.mode),o=await Promise.resolve().then(()=>(Xs(),Ys));Ae(s,O.join(e,"viewer"));let i=O.dirname(Ka(import.meta.url)),a=O.join(i,"agents","claude"),c=O.join(i,"..","agents","claude"),l=O.join(a,"styles.css"),d=O.join(a,"index.html"),u=()=>Es({name:"Claude Bulb",styles:Qs(l,"utf8"),mountHtml:Qs(d,"utf8"),watch:r.watch}),f=await it(r.port),m=await Ut({getHtml:u,basePath:e,port:f,reloadEmitter:n,getServerExports:()=>o,trusted:!0,staticAssets:{mount:`${O.posix.dirname($r)}/`,dir:a}}),h=`http://localhost:${f}`;await Mt({pid:process.pid,port:f,url:h,file:"agent:claude",cwd:e,startedAt:Date.now(),trust:!0,agent:"claude"}),console.log(`
|
|
734
|
+
Claude Bulb`),console.log(` ${h}`),f!==r.port&&console.log(` (port ${r.port} was busy)`),r.watch&&console.log(` Watching for changes...
|
|
735
|
+
`);async function w(){await(await import("esbuild")).build({entryPoints:[O.join(c,"client","index.ts")],bundle:!0,platform:"browser",format:"esm",outfile:O.join(a,"client.js")});for(let T of["styles.css","index.html"])qa(O.join(c,T),O.join(a,T))}let D;if(r.watch&&n){let E=Ga(c),T=!1;D=Jt({dir:E?c:a,onChange:async()=>{if(!T){T=!0;try{E&&await w(),console.log(`Viewer rebuilt. Browser reloading...
|
|
736
|
+
`),n.emit("reload")}catch(p){console.error("Viewer rebuild failed:",p instanceof Error?p.message:p)}finally{T=!1}}}})}r.open&&await Pe(h);let M=async()=>{console.log(`
|
|
737
|
+
Shutting down...`),m.close(),D?.(),t(),await et(process.pid),process.exit(0)};process.on("SIGINT",M),process.on("SIGTERM",M)}import*as eo from"path";import{EventEmitter as Xa}from"events";async function to(r,e,t,n,s){let o=ne(t),i=!1,a=async()=>{let{bulb:c,config:l}=await G(r);i||(Ae(o,r,c.server),i=!0),await fr(c.server,s,n,l.dependencies)};if(console.log(`Running ${eo.basename(r)}...`),await a(),e){console.log(`Watching for changes...
|
|
738
|
+
`);let c=new Xa;c.on("reload",async()=>{try{console.log("Re-running..."),await a()}catch(l){console.error("Error:",l)}}),Wt({bulbPath:r,emitter:c})}}var ro="0.11.8";async function Qa(){let r=Zr(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${ro}`),process.exit(0)),r.help&&(en(),process.exit(0)),r.subcommand==="logs"){await us(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="stop"){r.stopScope?await fs(r.stopScope):await ps(r.file||void 0);return}if(r.subcommand==="skill"){await as(ro);return}if(r.subcommand==="models"){await os(r.mode);return}if(r.subcommand==="agent"){if(!r.agentTarget){await ts();return}Bn(r.agentTarget)||(console.error(`Unknown agent '${r.agentTarget}'. Known: ${yr().join(", ")}.`),process.exit(1));let l=await Sr(process.cwd(),r.agentTarget);if(l){console.log(`Viewer '${r.agentTarget}' is already running for this project:
|
|
739
|
+
${l.url}`),r.open&&await Pe(l.url);return}await Zs(r);return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await Vn(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let l=await In(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 no.access(e).then(()=>!0,()=>!1)||(yr().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 Hn(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 Xr(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 Jn(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:
|
|
740
|
+
${s}`),process.exit(1)),await to(e,r.watch,r.mode,a,c);return}await Ps(e,r,s,a,c)}Qa().catch(r=>{console.error("Error:",r.message),process.exit(1)});
|