typebulb 0.9.4 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import*as st from"fs/promises";import*as R from"path";import{spawn as qs}from"child_process";import{EventEmitter as Wt}from"events";import*as Vt from"fs/promises";import{existsSync as te,readFileSync as fn}from"fs";import*as P from"path";import{pathToFileURL as hn}from"url";import{resolve as at}from"resolve.exports";import{init as qt,parse as Gt}from"es-module-lexer";function zt(r,e){let t=P.join(r,"package.json");try{return JSON.parse(fn(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var it=["browser","import","default"],Ht=["node","import","default"];function Kt(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 Yt(r){let{name:e,dir:t}=r;if(!te(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let n=zt(t,e),s=mn(n,e),o=P.resolve(t,s);if(!te(o))throw new Error(`--replace package '${e}' entry not found on disk: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);let i=P.dirname(o),a=`/local/${e}/${P.basename(o)}`,c=gn(n,t);return await yn(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function mn(r,e){if(r.exports!==void 0){let n;try{n=at(r,".",{browser:!0,conditions:it})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${it.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=ct(n);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${it.join(", ")}); too complex to override.`);return s}let t=r.module??r.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function gn(r,e){if(r.exports!==void 0)try{let n=at(r,".",{conditions:["types"]}),s=ct(n);if(s){let o=P.resolve(e,s);if(te(o))return o}}catch{}let t=r.types??r.typings;if(t){let n=P.resolve(e,t);if(te(n))return n}}function ct(r){if(typeof r=="string")return r;if(Array.isArray(r))return r.find(e=>typeof e=="string")}async function yn(r,e,t){await qt;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 Vt.readFile(i,"utf8")}catch{continue}let c,l;try{[c,,,l]=Gt(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 h=bn(i,u,n);h&&!s.has(h)&&o.push(h);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${r} externalizes '${u}'`)}}}}function bn(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)&&te(i))return i}function wn(r,e,t){let n=zt(r,e),s;if(n.exports!==void 0)try{s=ct(at(n,t,{conditions:Ht}))}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${Ht.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(!te(o))throw new Error(`--replace package '${e}' built file not found: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);return hn(o).href}async function Xt(r,e){await qt;let t;try{[t]=Gt(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=wn(e.dir,e.name,a);n+=r.slice(s,o.s)+c,s=o.e}return n+r.slice(s)}function Qt(r){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,noTrust:!1,follow:!1,help:!1,version:!1};["check","logs","stop","trust","untrust"].includes(r[0])&&(e.subcommand=r[0],r=r.slice(1));for(let n=0;n<r.length;n++){let s=r[n];if(s==="--help"||s==="-h")e.help=!0;else if(s==="--version"||s==="-V")e.version=!0;else if(s==="--no-watch")e.watch=!1;else if(s==="--no-open")e.open=!1;else if(s==="--server")e.server=!0;else if(s==="--trust")e.trust=!0;else if(s==="--no-trust")e.noTrust=!0;else if(s==="--follow"||s==="-f")e.follow=!0;else if(s==="--lines"||s==="-n"){let o=parseInt(r[++n],10);(isNaN(o)||o<0)&&(console.error(`Invalid --lines value: ${r[n]}`),process.exit(1)),e.lines=o}else if(s==="--port"||s==="-p"){let o=r[++n],i=parseInt(o,10);isNaN(i)&&(console.error(`Invalid port: ${o}`),process.exit(1)),e.port=i}else if(s==="--replace"||s.startsWith("--replace=")){let o=s.startsWith("--replace=")?s.slice(10):r[++n]??"";try{let i=Kt(o);if(e.local)throw new Error(`--replace can only be used once (got '${e.local.name}' and '${i.name}')`);e.local=i}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}else s.startsWith("-")||(e.file=s)}return e}function Zt(){console.log(`
2
+ import*as it from"fs/promises";import*as P from"path";import{spawn as to}from"child_process";import{EventEmitter as zt}from"events";import*as Kt from"fs/promises";import{existsSync as re,readFileSync as gn}from"fs";import*as R from"path";import{pathToFileURL as yn}from"url";import{resolve as lt}from"resolve.exports";import{init as Xt,parse as Qt}from"es-module-lexer";function Zt(r,e){let t=R.join(r,"package.json");try{return JSON.parse(gn(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var ct=["browser","import","default"],Yt=["node","import","default"];function er(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:R.resolve(n)}}async function tr(r){let{name:e,dir:t}=r;if(!re(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let n=Zt(t,e),s=bn(n,e),o=R.resolve(t,s);if(!re(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=R.dirname(o),a=`/local/${e}/${R.basename(o)}`,c=vn(n,t);return await wn(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function bn(r,e){if(r.exports!==void 0){let n;try{n=lt(r,".",{browser:!0,conditions:ct})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${ct.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=dt(n);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${ct.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 vn(r,e){if(r.exports!==void 0)try{let n=lt(r,".",{conditions:["types"]}),s=dt(n);if(s){let o=R.resolve(e,s);if(re(o))return o}}catch{}let t=r.types??r.typings;if(t){let n=R.resolve(e,t);if(re(n))return n}}function dt(r){if(typeof r=="string")return r;if(Array.isArray(r))return r.find(e=>typeof e=="string")}async function wn(r,e,t){await Xt;let n=R.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 Kt.readFile(i,"utf8")}catch{continue}let c,l;try{[c,,,l]=Qt(a,i)}catch{continue}if(i===e&&!l)throw new Error(`override package '${r}' entry is not an ES module (no import/export syntax); CommonJS or non-module entries aren't supported (esm.sh would have to transform it).`);for(let p of c){if(p.d===-2)continue;let d=p.n;if(d&&!d.startsWith("node:")){if(d.startsWith("./")||d.startsWith("../")||d.startsWith("/")){let h=xn(i,d,n);h&&!s.has(h)&&o.push(h);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${r} externalizes '${d}'`)}}}}function xn(r,e,t){let n=e.replace(/[?#].*$/,""),s=R.resolve(R.dirname(r),n),o=[s,s+".js",s+".mjs",R.join(s,"index.js"),R.join(s,"index.mjs")];for(let i of o)if(R.normalize(i).startsWith(t)&&re(i))return i}function Sn(r,e,t){let n=Zt(r,e),s;if(n.exports!==void 0)try{s=dt(lt(n,t,{conditions:Yt}))}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${Yt.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=R.resolve(r,s);if(!re(o))throw new Error(`--replace package '${e}' built file not found: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);return yn(o).href}async function rr(r,e){await Xt;let t;try{[t]=Qt(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=Sn(e.dir,e.name,a);n+=r.slice(s,o.s)+c,s=o.e}return n+r.slice(s)}function nr(r){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,noTrust:!1,follow:!1,help:!1,version:!1};["check","predict","logs","stop","trust","untrust"].includes(r[0])&&(e.subcommand=r[0],r=r.slice(1));for(let n=0;n<r.length;n++){let s=r[n];if(s==="--help"||s==="-h")e.help=!0;else if(s==="--version"||s==="-V")e.version=!0;else if(s==="--no-watch")e.watch=!1;else if(s==="--no-open")e.open=!1;else if(s==="--server")e.server=!0;else if(s==="--trust")e.trust=!0;else if(s==="--no-trust")e.noTrust=!0;else if(s==="--mode"){let o=r[++n];(!o||o.startsWith("-"))&&(console.error("Missing value for --mode (e.g. --mode staging)"),process.exit(1)),e.mode=o}else if(s==="--follow"||s==="-f")e.follow=!0;else if(s==="--lines"||s==="-n"){let o=parseInt(r[++n],10);(isNaN(o)||o<0)&&(console.error(`Invalid --lines value: ${r[n]}`),process.exit(1)),e.lines=o}else if(s==="--port"||s==="-p"){let o=r[++n],i=parseInt(o,10);isNaN(i)&&(console.error(`Invalid port: ${o}`),process.exit(1)),e.port=i}else if(s==="--replace"||s.startsWith("--replace=")){let o=s.startsWith("--replace=")?s.slice(10):r[++n]??"";try{let i=er(o);if(e.local)throw new Error(`--replace can only be used once (got '${e.local.name}' and '${i.name}')`);e.local=i}catch(i){console.error(i instanceof Error?i.message:String(i)),process.exit(1)}}else s.startsWith("-")||(e.file=s)}return e}function sr(){console.log(`
3
3
  typebulb - Local bulb runner for Typebulb
4
4
 
5
5
  Usage:
6
6
  typebulb [file.bulb.md] Run a bulb (defaults to .bulb.md in cwd)
7
+ typebulb claude Launch claude.bulb, the built-in viewer for
8
+ Claude Code sessions (ships inside the CLI; no
9
+ download, no file to place, runs trusted).
7
10
  typebulb check [file.bulb.md] Type-check a bulb without running it
11
+ typebulb predict [file] Report the capability a bulb probably needs
12
+ (fs / AI / server.ts) without running it.
8
13
  typebulb logs [file|pid] Print a running bulb server's captured console
9
14
  (no arg: list running servers). For agents:
10
15
  fetch tb.server.log / errors of a bulb you
@@ -29,6 +34,9 @@ Options:
29
34
  trusted without this flag.
30
35
  --no-trust Force Restricted for this run even if the bulb is
31
36
  remembered-trusted (overrides the trust store).
37
+ --mode <name> Also load .env.<name> (+ .env.<name>.local) on top
38
+ of .env / .env.local. Free-form name; loads no mode
39
+ file by default.
32
40
  --server Run server.ts only, no web server (needs --trust)
33
41
  --replace <name>=<path> Replace a declared dependency with a local built
34
42
  package folder instead of a CDN (dev only).
@@ -49,7 +57,7 @@ Server API:
49
57
  Exported functions become callable from the browser:
50
58
  // in **server.ts**: export async function query(sql) { ... }
51
59
  // in **code.tsx**: const rows = await tb.server.query(sql)
52
- .env and .env.local are auto-loaded from the working directory.
60
+ .env / .env.local load from the working directory; --mode <name> adds .env.<name>.
53
61
 
54
62
  Built-in server functions (available without a **server.ts** section):
55
63
  tb.server.log(...) Print to the CLI's stdout
@@ -71,10 +79,10 @@ Examples:
71
79
  typebulb my-editor.bulb.md
72
80
  typebulb --no-watch --port 8080 my-editor.bulb.md
73
81
  typebulb .
74
- `)}import{readFileSync as vn}from"fs";import*as er from"path";function lt(){fe([".env",".env.local"],process.cwd(),!0)}function fe(r,e,t=!1){for(let n of r){let s=er.resolve(e,n);try{let o=vn(s,"utf-8");for(let i of o.split(`
75
- `)){let a=i.trim();if(!a||a.startsWith("#"))continue;let c=a.indexOf("=");if(c===-1)continue;let l=a.slice(0,c).trim(),d=a.slice(c+1).trim();(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),process.env[l]??=d}}catch{t||console.warn(` Warning: env file not found: ${n}`)}}}import*as G from"fs/promises";import*as ce from"path";import{pathToFileURL as as}from"url";var xn={code:{path:"code.tsx",language:"typescript"},css:{path:"styles.css",language:"css"},html:{path:"index.html",language:"html"},config:{path:"config.json",language:"json"},notes:{path:"notes.md",language:"markdown"},data:{path:"data.txt",language:"text"},infer:{path:"infer.md",language:"markdown"},insight:{path:"insight.json",language:"json"},server:{path:"server.ts",language:"typescript"}};function tr(r){try{let e=r.split(`
76
- `),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=Sn(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(`
77
- `))}else t++}return{frontmatter:s,files:o}}catch{return null}}function Sn(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=Pn(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function Pn(r){return r.startsWith('"')&&r.endsWith('"')?r.slice(1,-1).replace(/\\"/g,'"'):r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function rr(r){let e=t=>r.files.get(xn[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 Rn(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 nr(r){let e=r.trim();return e?Rn(e)?[e]:r.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function sr(r){if(!r.trim())return{};try{return JSON.parse(r)}catch{return{}}}import{transform as En}from"sucrase";function dt(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=En(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var he="https://esm.sh",me="https://cdn.jsdelivr.net/npm/",ut="https://data.jsdelivr.com/v1/package/npm/";function or(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=re(t??s.version),this.subpath=re(n??s.subpath)}static parse(e){let t=or(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=ir(t[1]??""),a=re(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=ir(t[0]),i=re(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(he).host,s=new URL(me).host;if(t.host===n){let o=or(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:re(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://")}},re=r=>r&&r.length?r:void 0,ir=r=>{let e=r.indexOf("@");return e<0?[r,void 0]:[r.slice(0,e),re(r.slice(e+1))]};async function T(r){try{return await r()}catch{return}}var ge=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=he,this.jsDelivrBase=me,this.jsDelivrMeta=ut,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 T(()=>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 T(()=>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 T(()=>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:h}=n;return{name:e,version:t,dependencies:d,peerDependencies:u,peerDependenciesMeta:h}}let s=this.packageJson(new y(`${e}@${t}`)),o=await T(()=>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 ar=r=>r.startsWith("@types/"),ye=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!ar(e)),pt=r=>Object.keys(r?.dependencies||{}).filter(e=>!ar(e)),kn=r=>ye(r).filter(e=>!r?.peerDependenciesMeta?.[e]?.optional),be=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 kn(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=>ye(o.meta))),n=new Map;for(let o of e)for(let i of pt(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:ye(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var we=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 T(()=>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.warn("[versionResolver] Rejecting invalid cached version for",e,":",n)}let s=await T(()=>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.warn("[versionResolver] Invalidating stale versions cache for",e,"- range",t,"not satisfied"),await this.cache.invalidateVersionsCache(e);let a=await T(()=>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 T(()=>this.cache.getPinnedExact(s,o))??await T(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?n.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as Tn,parse as _n}from"es-module-lexer";var ne=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 Tn;let[s]=_n(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 T(()=>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 T(()=>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(m=>[m.name,m])),i=m=>{let S=o.get(y.rootOf(m));return new y(m).withPreferredVersion(S.version,s[S.name]).format()},a=new Set([...n.entries()].filter(([,m])=>m.isPeerRoot||m.isSharedDep).map(([m])=>m)),c=new Set(e.filter(m=>m!==y.rootOf(m)).map(y.rootOf)),l=[],d=new Set,u=new Set(e.filter(m=>m===y.rootOf(m))),h=new Set;for(let m of e){let S=y.rootOf(m),O=o.get(S),{isPeerRoot:_,hasPeers:$,isSharedDep:p}=n.get(S),f=c.has(S),g=m!==S,w=!(_||p)&&(f||!$),C=this.singletonDepsOf(O,a),J=g&&u.has(S);J&&h.add(S);let L=J?[...C,S]:C.length?C:void 0;l.push([m,this.cdn.buildEsmUrl(i(m),{bundle:w,external:L})]),d.add(m)}let b=new Set([...a,...h]);for(let m of b)o.has(m)&&(d.has(m)||l.push([m,this.cdn.buildEsmUrl(i(m),{})]),l.push([`${m}/`,`${this.cdn.esmHost}/${i(m)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...ye(e.meta),...pt(e.meta)])].filter(n=>t.has(n))}};ne.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as cr,satisfies as Cn,maxSatisfying as ft,major as On,prerelease as In,rsort as Dn,valid as An}from"semver";var Ne=class{cmp(e,t){return e===t?0:cr(e,t)?1:cr(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!Cn(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=ft(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?Dn(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=ft(e,n,{includePrerelease:!1});if(a)return a}return ft(e,n,{includePrerelease:!0})??void 0}majorOf(e){return On(e)}isPrerelease(e){return In(e)!==null}isExactVersion(e){return An(e)!==null}},z=new Ne;function lr(r,e){let t=new ge(r,e),n=new be(t),s=new we(r,t,z);return{packageService:new ne(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as Rr from"fs/promises";import*as M from"path";var ht=[{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"}],mt=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var dr=`
82
+ `)}import{readFileSync as Rn,existsSync as Pn}from"fs";import*as U from"path";function En(r){return[...r?[`.env.${r}.local`,`.env.${r}`]:[],".env.local",".env"]}function ut(r,e=process.cwd()){let t={},n=[];for(let s of En(r)){let o;try{o=Rn(U.resolve(e,s),"utf-8")}catch{continue}n.push(s);for(let[i,a]of kn(o))process.env[i]===void 0&&(process.env[i]=a,t[i]=s)}return{mode:r,sources:t,loaded:n}}function*kn(r){for(let e of r.split(`
83
+ `)){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 Tn(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 pt(r,e,t){let{sources:n,mode:s,loaded:o}=r,i=process.cwd(),a=U.dirname(e),c=`(mode: ${s??"none"})`,l=t?Tn(t):[],p=l.filter(m=>n[m]).map(m=>`${m} \u2190 ${n[m]}`);p.length?console.log(`env: ${p.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 d=U.resolve(a)!==U.resolve(i);if(d)for(let m of[".env.local",".env"])Pn(U.join(a,m))&&console.log(`env: ${U.join(a,m)} present but not loaded (cwd is ${i})`);let h=l.filter(m=>process.env[m]===void 0);if(h.length){let m=d?` \u2014 try running from ${a}`:"";console.log(`env: server.ts reads ${h.join(", ")} but ${h.length>1?"they are":"it's"} unset${m}`)}}import*as G from"fs/promises";import*as Xe from"path";import{pathToFileURL as hs}from"url";var _n={code:{path:"code.tsx",language:"typescript"},css:{path:"styles.css",language:"css"},html:{path:"index.html",language:"html"},config:{path:"config.json",language:"json"},notes:{path:"notes.md",language:"markdown"},data:{path:"data.txt",language:"text"},infer:{path:"infer.md",language:"markdown"},insight:{path:"insight.json",language:"json"},server:{path:"server.ts",language:"typescript"}};function or(r){try{let e=r.split(`
84
+ `),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=Cn(n);if(!s)return null;let o=new Map;for(;t<e.length;){let a=e[t]?.trim()?.match(/^\*\*(.+)\*\*$/);if(a){let c=a[1].trim();for(t++;t<e.length&&e[t]?.trim()==="";)t++;let l=e[t]?.match(/^(`{3,})(\w*)\s*$/);if(!l){t++;continue}let p=l[1];t++;let d=[];for(;t<e.length&&!e[t]?.match(new RegExp(`^${p}\\s*$`));)d.push(e[t]),t++;t++,o.set(c,d.join(`
85
+ `))}else t++}return{frontmatter:s,files:o}}catch{return null}}function Cn(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=In(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function In(r){return r.startsWith('"')&&r.endsWith('"')?r.slice(1,-1).replace(/\\"/g,'"'):r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function ir(r){let e=t=>r.files.get(_n[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 On(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 ar(r){let e=r.trim();return e?On(e)?[e]:r.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function cr(r){if(!r.trim())return{};try{return JSON.parse(r)}catch{return{}}}import{transform as An}from"sucrase";function ft(r,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:n}=An(r,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:n}}catch(n){return{code:"",error:String(n)}}}var me="https://esm.sh",ge="https://cdn.jsdelivr.net/npm/",ht="https://data.jsdelivr.com/v1/package/npm/";function lr(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=ne(t??s.version),this.subpath=ne(n??s.subpath)}static parse(e){let t=lr(e||"");if(!t.length)return new r({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=dr(t[1]??""),a=ne(t.slice(2).join("/"));return new r({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=dr(t[0]),i=ne(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(me).host,s=new URL(ge).host;if(t.host===n){let o=lr(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:ne(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://")}},ne=r=>r&&r.length?r:void 0,dr=r=>{let e=r.indexOf("@");return e<0?[r,void 0]:[r.slice(0,e),ne(r.slice(e+1))]};async function T(r){try{return await r()}catch{return}}var ye=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=me,this.jsDelivrBase=ge,this.jsDelivrMeta=ht,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 T(()=>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 T(()=>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 T(()=>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:p,peerDependencies:d,peerDependenciesMeta:h}=n;return{name:e,version:t,dependencies:p,peerDependencies:d,peerDependenciesMeta:h}}let s=this.packageJson(new b(`${e}@${t}`)),o=await T(()=>this.http.getJson(s));if(!o)return;let i=p=>p&&Object.keys(p).length?p:void 0,a=i(o.dependencies),c=i(o.peerDependencies),l=i(o.peerDependenciesMeta);return await this.cache.setMeta(e,t,a,c,l),{name:e,version:t,dependencies:a,peerDependencies:c,peerDependenciesMeta:l}}};var ur=r=>r.startsWith("@types/"),be=r=>Object.keys(r?.peerDependencies||{}).filter(e=>!ur(e)),mt=r=>Object.keys(r?.dependencies||{}).filter(e=>!ur(e)),$n=r=>be(r).filter(e=>!r?.peerDependenciesMeta?.[e]?.optional),ve=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 $n(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=>be(o.meta))),n=new Map;for(let o of e)for(let i of mt(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:be(o.meta).length>0,isSharedDep:s.has(o.name)}]))}};var we=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 T(()=>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.warn("[versionResolver] Rejecting invalid cached version for",e,":",n)}let s=await T(()=>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.warn("[versionResolver] Invalidating stale versions cache for",e,"- range",t,"not satisfied"),await this.cache.invalidateVersionsCache(e);let a=await T(()=>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 T(()=>this.cache.getPinnedExact(s,o))??await T(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?n.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as Dn,parse as Mn}from"es-module-lexer";var se=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 Dn;let[s]=Mn(e);s.forEach(o=>n(e.slice(o.s,o.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,n){let s=(await this.extractImports(e)).filter(d=>!n?.has(b.rootOf(d))),o=[...new Set(s.map(b.rootOf))],i=await Promise.all(o.map(async d=>({name:d,version:await this.resolveVersion(d,t)}))),{allRoots:a,flags:c,autoAddedPeers:l}=await this.peer.resolve(i,d=>this.resolveVersion(d,t)),p=this.buildEntries([...s,...l.map(d=>d.name)],a,c,t);return{importMap:{imports:Object.fromEntries(p)},prefetchUrls:p.map(([,d])=>d)}}async resolveVersion(e,t){let n=t[e],s=n?`${e}@${n}`:e,o=await this.version.resolveExactForRoot(e,n);if(!o){let i=await T(()=>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 T(()=>this.cache.setPinnedExact(e,n,o))}if(!o)throw new Error(`Cannot resolve ${s}: no concrete version found.`);return o}buildEntries(e,t,n,s){let o=new Map(t.map(g=>[g.name,g])),i=g=>{let S=o.get(b.rootOf(g));return new b(g).withPreferredVersion(S.version,s[S.name]).format()},a=new Set([...n.entries()].filter(([,g])=>g.isPeerRoot||g.isSharedDep).map(([g])=>g)),c=new Set(e.filter(g=>g!==b.rootOf(g)).map(b.rootOf)),l=[],p=new Set,d=new Set(e.filter(g=>g===b.rootOf(g))),h=new Set;for(let g of e){let S=b.rootOf(g),j=o.get(S),{isPeerRoot:B,hasPeers:C,isSharedDep:u}=n.get(S),f=c.has(S),y=g!==S,v=!(B||u)&&(f||!C),_=this.singletonDepsOf(j,a),H=y&&d.has(S);H&&h.add(S);let N=H?[..._,S]:_.length?_:void 0;l.push([g,this.cdn.buildEsmUrl(i(g),{bundle:v,external:N})]),p.add(g)}let m=new Set([...a,...h]);for(let g of m)o.has(g)&&(p.has(g)||l.push([g,this.cdn.buildEsmUrl(i(g),{})]),l.push([`${g}/`,`${this.cdn.esmHost}/${i(g)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...be(e.meta),...mt(e.meta)])].filter(n=>t.has(n))}};se.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as pr,satisfies as Fn,maxSatisfying as gt,major as jn,prerelease as Nn,rsort as Ln,valid as Bn}from"semver";var je=class{cmp(e,t){return e===t?0:pr(e,t)?1:pr(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!Fn(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let n=gt(e,t,{includePrerelease:!0});return n===null?void 0:n}pickLatest(e){return e?.length?Ln(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=gt(e,n,{includePrerelease:!1});if(a)return a}return gt(e,n,{includePrerelease:!0})??void 0}majorOf(e){return jn(e)}isPrerelease(e){return Nn(e)!==null}isExactVersion(e){return Bn(e)!==null}},Y=new je;function fr(r,e){let t=new ye(r,e),n=new ve(t),s=new we(r,t,Y);return{packageService:new se(s,t,n,r),versionResolver:s,cdnClient:t,peerResolver:n}}import*as _r from"fs/promises";import*as D from"path";var yt=[{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"}],bt=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var hr=`
78
86
  /**
79
87
  * Get raw data chunk from the Data tab.
80
88
  * @param index - Chunk index (0-based). Separate chunks with 2 blank lines.
@@ -85,7 +93,7 @@ Examples:
85
93
  * @param index - Chunk index (0-based)
86
94
  * @throws If chunk is not valid JSON/JSON-ish
87
95
  */
88
- json<T = unknown>(index: number): T;`,ur=`
96
+ json<T = unknown>(index: number): T;`,mr=`
89
97
  /**
90
98
  * Get the insight data produced by the inference layer.
91
99
  *
@@ -94,7 +102,7 @@ Examples:
94
102
  *
95
103
  * @returns The parsed insight JSON, or undefined if no insight is available
96
104
  */
97
- insight<T = unknown>(): T | undefined;`,pr=`
105
+ insight<T = unknown>(): T | undefined;`,gr=`
98
106
  /**
99
107
  * General-purpose AI call.
100
108
  *
@@ -111,7 +119,7 @@ Examples:
111
119
  model?: string;
112
120
  /** Enable/disable web search. Default: on for BYOK, always off for free model. */
113
121
  webSearch?: boolean;
114
- }): Promise<{ text: string }>;`,fr=`
122
+ }): Promise<{ text: string }>;`,yr=`
115
123
  /**
116
124
  * Returns AI models available to the current user.
117
125
  * Models are filtered by the user's configured API keys.
@@ -126,7 +134,7 @@ Examples:
126
134
  friendlyName: string;
127
135
  /** Provider display name, e.g. "Anthropic" */
128
136
  providerName: string;
129
- }>>;`,$n="\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;",hr=`
137
+ }>>;`,Un="\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;",br=`
130
138
  /**
131
139
  * The mode this bulb is running in.
132
140
  *
@@ -136,7 +144,7 @@ Examples:
136
144
  * - \`'embedded'\` \u2014 Running as a bulb embedded inside another bulb (sandboxed,
137
145
  * client-only: AI, filesystem, and server RPC are unavailable)
138
146
  */
139
- mode: 'local' | 'editor' | 'published' | 'embedded';`,mr=`
147
+ mode: 'local' | 'editor' | 'published' | 'embedded';`,vr=`
140
148
  /**
141
149
  * Local filesystem access (CLI only).
142
150
  *
@@ -150,7 +158,7 @@ Examples:
150
158
  readBytes(path: string): Promise<Uint8Array>;
151
159
  /** Write text or raw bytes to a file. Creates parent directories if needed. */
152
160
  write(path: string, content: string | Uint8Array): Promise<boolean>;
153
- };`,Fn=`
161
+ };`,Wn=`
154
162
  /**
155
163
  * Server-side function proxy. The built-in \`log\` prints to CLI stdout
156
164
  * (falls back to console.log on web). On the server side, this object only
@@ -158,7 +166,7 @@ Examples:
158
166
  */
159
167
  server: {
160
168
  log(...args: any[]): Promise<void>;
161
- };`,Mn=`
169
+ };`,Jn=`
162
170
  /**
163
171
  * Async value inspector for tensor-like objects.
164
172
  *
@@ -225,7 +233,7 @@ Examples:
225
233
  *
226
234
  * @returns The full canonical URL
227
235
  */
228
- url(): Promise<string>;`,Nn=`
236
+ url(): Promise<string>;`,Hn=`
229
237
  /**
230
238
  * Server-side function proxy.
231
239
  *
@@ -233,23 +241,23 @@ Examples:
233
241
  * \`tb.server.log(...)\` is a built-in that prints to CLI stdout (falls back to console.log on web).
234
242
  * User exports override built-ins of the same name.
235
243
  */
236
- server: Record<string, (...args: any[]) => Promise<any>>;`,gt=`
244
+ server: Record<string, (...args: any[]) => Promise<any>>;`,vt=`
237
245
  /**
238
246
  * Typebulb utilities namespace.
239
247
  * Type \`tb.\` to discover available helpers.
240
248
  */
241
- declare const tb: {${dr}${Mn}${ur}${Nn}${pr}${mr}${fr}${$n}${hr}
249
+ declare const tb: {${hr}${Jn}${mr}${Hn}${gr}${vr}${yr}${Un}${br}
242
250
  };
243
- `,yt=`
251
+ `,wt=`
244
252
  /**
245
253
  * Typebulb utilities namespace (server-side).
246
254
  * Type \`tb.\` to discover available helpers.
247
255
  */
248
- declare const tb: {${dr}${ur}${pr}${mr}${Fn}${fr}${hr}
256
+ declare const tb: {${hr}${mr}${gr}${vr}${Wn}${yr}${br}
249
257
  };
250
- `;var K=class{constructor(e){this.store=e}async isNegative(e){let t=await je(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await je(()=>this.store.get(e)))?.attempts||0)+1;await je(()=>this.store.set(e,{until:Date.now()+jn(n),attempts:n}))}async clearNegative(e){await je(()=>this.store.delete(e))}};function jn(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function je(r){try{return await r()}catch{return}}import Hn from"p-limit";import{resolve as gr}from"resolve.exports";var se=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 H={maxRelativeTypeRefs:500,maxBareDeps:8,maxBareDepth:3,prefetchConcurrency:4,negativeTtlMs:1e4},ve=["index.d.ts","index.d.mts"],xe=/\.d\.(ts|mts)$/i;function bt(r){if(xe.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function Le(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function Se(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(Ln(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function Ln(r){return r===408||r===429||r>=500&&r<600}var Pe=class extends se{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 Se(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([...ve],t);if(!xe.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([...ve,...n],t)}toResolutionResult(e){return{kind:xe.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(gr(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(gr(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),h=this.resolveExportsPath(n,u);if(h){let m=await this.resolveFromSelected(this.toResolutionResult(h),c);if(m)return{...m,resolvedPkg:a}}let b=await this.tryUntilSuccess(this.declarationCandidatesFor(u),c);if(b)return{...b,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[...ve];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),n=Le(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...Le(`${s}index`)),n}};import{gunzipSync as Bn}from"fflate";var oe=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await Se(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=Bn(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,""),h=parseInt(u,8)||0,b=String.fromCharCode(i[156]);if(o+=512,(b==="0"||b==="\0")&&(l.endsWith(".d.ts")||l.endsWith(".d.mts"))){let m=n.slice(o,o+h);t.set(this.normalizeTarPath(l),s.decode(m))}o+=Math.ceil(h/512)*512}}catch{}return t}},Un=new oe;var Re=class extends se{constructor(e,t,n,s=new oe){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=z.majorOf(n),i=e.filter(a=>z.majorOf(a)===o);if(i.length)return i.sort((a,c)=>z.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 Ee=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 yr="file:///node_modules",ke=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`${yr}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=Wn(t);return`${yr}/${this.epochDir()}/${e}/${n}`}};function Wn(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as Jn}from"lru-cache";function wt(r){let e=new Jn({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 Be=class{constructor(e){this.inFlight=new Map,this.scanner=new Ee,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=wt(e.cache),this.typescriptProvider=new Pe(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new Re(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new ke}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>H.maxRelativeTypeRefs)))try{let a=new URL(t),c=new URL("./",a);i??(i=this.extractPackageRootUrl(a));let l=this.capArray(this.scanner.collectRelativeTypeRefs(e),H.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=bt(c)?[c]:this.typescriptProvider.declarationCandidatesFor(c);for(let d of l){let h=new URL(d,a).toString();if(i.has(h))return;let b=await this.fetchDts(h);if(b?.dts){let m=this.toVirtualPath(n,new URL(b.url),s);this.pushFileIfNew(o,m,b.dts),await this.expandRelativeRefs(b.dts,b.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),H.maxBareDeps).filter(l=>this.isDifferentPackage(l,t));if(!i.length)return;let a=new Set([t]),c=Hn(H.prefetchConcurrency);await Promise.all(i.map(l=>c(()=>this.prefetchBareDepsRecursive(l,n,s,H.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),H.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),h=[{path:d,content:o}],b=[];i&&await this.expandRelativeRefs(o,i,l,h,void 0,u);let m=h.map($=>$.content).join(`
251
- `);await this.prefetchBareDeps(m,l,h,b,s);let S=c.format(),O=e===S?[e]:[e,S],_=O.some($=>this.ambientlyDeclares(o,$));return _?this.markFileAmbient(h,d):b.push(...O.map($=>({module:$,path:d}))),{pkg:e,mainPath:d,files:h,shims:b,ambient:_}}};function vt(r){return new Be(r)}import*as B from"fs/promises";import*as U from"path";import*as vr from"os";import*as xt from"fs/promises";import*as br from"crypto";function F(r){return br.createHash("sha1").update(r).digest("hex")}async function Y(r){try{return JSON.parse(await xt.readFile(r,"utf8"))}catch{return}}async function Ue(r){try{return await xt.readFile(r,"utf8")}catch{return}}var wr=1,V=U.join(vr.homedir(),".typebulb","cache"),Te=U.join(V,"packages"),_e=U.join(V,"proxy"),We=U.join(V,"dts"),Vn=U.join(V,"emit"),St;function x(){return St||(St=qn()),St}function Je(r,e){return U.join(Vn,F(r),e)}async function qn(){await B.mkdir(V,{recursive:!0});let r=U.join(V,"version.json");if((await Gn(r))?.version===wr)return;let t=await B.readdir(V).catch(()=>[]);await Promise.all(t.map(n=>B.rm(U.join(V,n),{recursive:!0,force:!0}))),await B.writeFile(r,JSON.stringify({version:wr})+`
252
- `,"utf8")}async function Gn(r){try{let e=await B.readFile(r,"utf8");return JSON.parse(e)}catch{return}}import*as q from"fs/promises";import*as xr from"path";async function I(r,e){await q.mkdir(xr.dirname(r),{recursive:!0});let t=`${r}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await q.writeFile(t,e,"utf8"),await q.rename(t,r).catch(async n=>{throw await q.rm(t,{force:!0}).catch(()=>{}),n})}var ie=class{constructor(e){this.filePath=e}mem;loadPromise;load(){return this.mem?Promise.resolve(this.mem):(this.loadPromise||(this.loadPromise=Y(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 I(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var Pt=M.join(Te,"indexes"),Sr=M.join(Te,"pinned"),zn=M.join(Te,"meta"),Kn=M.join(Te,"negative.json"),ae=Symbol("missing"),Ve=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new K(new ie(Kn));async getPinnedExact(e,t){let n=`${e}@${t}`,s=this.pinnedMem.get(n);if(s!==void 0)return s===ae?void 0:s;await x();let o=await Ue(M.join(Sr,F(n)+".txt"));return this.pinnedMem.set(n,o??ae),o}async setPinnedExact(e,t,n){let s=`${e}@${t}`;this.pinnedMem.set(s,n),await x(),await I(M.join(Sr,F(s)+".txt"),n)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===ae?void 0:t;await x();let n=await Y(M.join(Pt,He(e)+".json"));return this.indexMem.set(e,n??ae),n}async setIndex(e,t,n){let s={versions:t,distTags:n,updatedAt:Date.now()};this.indexMem.set(e,s),await x(),await I(M.join(Pt,He(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await Rr.rm(M.join(Pt,He(e)+".json"),{force:!0})}async isNegative(e){return await x(),this.negativeCache.isNegative(e)}async recordNegative(e){await x(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let n=`${e}@${t}`,s=this.metaMem.get(n);if(s!==void 0)return s===ae?void 0:s;await x();let o=await Y(Pr(e,t));return this.metaMem.set(n,o??ae),o}async setMeta(e,t,n,s,o){let i={dependencies:n,peerDependencies:s,peerDependenciesMeta:o,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,i),await x(),await I(Pr(e,t),JSON.stringify(i))}};function Pr(r,e){return M.join(zn,He(r),encodeURIComponent(e)+".json")}function He(r){return r.replace(/\//g,"__")}var Er={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 Yn=new Ve,{packageService:qe,versionResolver:kr,cdnClient:Tr,peerResolver:sa}=lr(Yn,Er);var _r=`
258
+ `;var K=class{constructor(e){this.store=e}async isNegative(e){let t=await Ne(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let n=((await Ne(()=>this.store.get(e)))?.attempts||0)+1;await Ne(()=>this.store.set(e,{until:Date.now()+Vn(n),attempts:n}))}async clearNegative(e){await Ne(()=>this.store.delete(e))}};function Vn(r){return Math.min(9e5*Math.pow(2,Math.max(0,r-1)),864e5)}async function Ne(r){try{return await r()}catch{return}}import Xn from"p-limit";import{resolve as wr}from"resolve.exports";var oe=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 V={maxRelativeTypeRefs:500,maxBareDeps:8,maxBareDepth:3,prefetchConcurrency:4,negativeTtlMs:1e4},xe=["index.d.ts","index.d.mts"],Se=/\.d\.(ts|mts)$/i;function xt(r){if(Se.test(r))return!0;try{return new URL(r,"file://").search.includes("dts")}catch{return r.includes("?")&&r.includes("dts")}}function Le(r){return[`${r}.d.ts`,`${r}.d.mts`]}async function Re(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(qn(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function qn(r){return r===408||r===429||r>=500&&r<600}var Pe=class extends oe{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 Re(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([...xe],t);if(!Se.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([...xe,...n],t)}toResolutionResult(e){return{kind:Se.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let n=t||".",s=e;try{let o=this.extractPathFromResult(wr(s,n,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(wr(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=d=>this.fetchCandidateFrom(s,t.name,d);if(t.subpath){let d=this.cdnClient.ensureLeadingDotSlash(t.subpath),h=this.resolveExportsPath(n,d);if(h){let g=await this.resolveFromSelected(this.toResolutionResult(h),c);if(g)return{...g,resolvedPkg:a}}let m=await this.tryUntilSuccess(this.declarationCandidatesFor(d),c);if(m)return{...m,resolvedPkg:a}}let l=n.types??n.typings;if(l){let d=await this.resolveFromSelected({kind:"types",path:l},c);if(d)return{...d,resolvedPkg:i}}let p=this.resolveExportsPath(n,".");if(p){let d=await this.resolveFromSelected(this.toResolutionResult(p),c);if(d)return{...d,resolvedPkg:i}}return}catch{return}}async fetchCandidateFrom(e,t,n){let s=this.cdnClient.normalizeRelative(n),o=new URL(s,e).toString(),i=await this.fetchDtsText(o);return i?{dts:i.dts,url:i.url,resolvedPkg:t}:void 0}declarationCandidatesFor(e){if(!e||e==="./"||e==="/")return[...xe];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),n=Le(t),s=t.endsWith("/")?t:`${t}/`;return n.push(...Le(`${s}index`)),n}};import{gunzipSync as zn}from"fflate";var ie=class{async fetchAndExtract(e,t){let n=this.getTarballUrl(e,t),s=await Re(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=zn(e),s=new TextDecoder("utf-8"),o=0;for(;o<n.length-512;){let i=n.slice(o,o+512);if(i[0]===0)break;let a=i.slice(0,100),c=a.indexOf(0),l=s.decode(a.slice(0,c>0?c:100)).trim(),p=i.slice(124,136),d=s.decode(p).trim().replace(/\0/g,""),h=parseInt(d,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+h);t.set(this.normalizeTarPath(l),s.decode(g))}o+=Math.ceil(h/512)*512}}catch{}return t}},Gn=new ie;var Ee=class extends oe{constructor(e,t,n,s=new ie){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=Y.majorOf(n),i=e.filter(a=>Y.majorOf(a)===o);if(i.length)return i.sort((a,c)=>Y.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 ke=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 xr="file:///node_modules",Te=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`${xr}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let n=Yn(t);return`${xr}/${this.epochDir()}/${e}/${n}`}};function Yn(r){let e=r||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as Kn}from"lru-cache";function St(r){let e=new Kn({ttl:1e4,max:500}),t=new Map;return async function(s){try{if(await r.isNegative(s))return;let o=e.get(s);if(o&&Date.now()-o<1e4)return;let i=await r.getCachedFile(s);if(i)return{dts:i,url:s};let a=t.get(s);if(a)return a;let c=(async()=>{let l=await fetch(s,{cache:"no-store"});if(!l.ok){l.status===404&&(e.set(s,Date.now()),await r.recordNegative(s));return}let p=await l.text(),d=l.url||s;return await r.clearNegative(s),await r.setCachedFile(d,p),{dts:p,url:d}})();return t.set(s,c),await c.finally(()=>t.delete(s))}catch{return}}}var Be=class{constructor(e){this.inFlight=new Map,this.scanner=new ke,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=St(e.cache),this.typescriptProvider=new Pe(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new Ee(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new Te}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>V.maxRelativeTypeRefs)))try{let a=new URL(t),c=new URL("./",a);i??(i=this.extractPackageRootUrl(a));let l=this.capArray(this.scanner.collectRelativeTypeRefs(e),V.maxRelativeTypeRefs);for(let p of l)await this.tryRelativeRef(p,c,i,n,s,o)}catch{}}async tryRelativeRef(e,t,n,s,o,i){try{let a=new URL(e,t),c=a.pathname+a.search,l=xt(c)?[c]:this.typescriptProvider.declarationCandidatesFor(c);for(let p of l){let h=new URL(p,a).toString();if(i.has(h))return;let m=await this.fetchDts(h);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 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),V.maxBareDeps).filter(l=>this.isDifferentPackage(l,t));if(!i.length)return;let a=new Set([t]),c=Xn(V.prefetchConcurrency);await Promise.all(i.map(l=>c(()=>this.prefetchBareDepsRecursive(l,n,s,V.maxBareDepth,a,o).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,n,s,o,i){if(s<=0||o.has(e))return;o.add(e);let a=await this.fetchRootDts(e,i);if(!a?.dts)return;let c=a.resolvedPkg||e,l=this.virtualFs.pathForMain(c);this.pushFileIfNew(t,l,a.dts),this.ambientlyDeclares(a.dts,e)?this.markFileAmbient(t,l):n.push({module:e,path:l}),a.url&&await this.expandRelativeRefs(a.dts,a.url,c,t);let p=this.capArray(this.scanner.collectBareModuleRefs(a.dts),V.maxBareDeps).filter(d=>!o.has(d));for(let d of p)await this.prefetchBareDepsRecursive(d,t,n,s-1,o,i)}async resolve(e,t,n){let s=await this.packageService.extractImports(e),o=n?[...s,...n]:s;return(await Promise.all(o.map(a=>this.resolveOne(a,t)))).filter(a=>!!a)}async resolveOne(e,t){let{effectivePackage:n}=await this.versionResolver.effectivePackage(e,t);return this.withInFlight(n,async()=>{let s=await this.fetchRootDts(e,t)??await this.trySubpathWithRootFallback(e,t);return s?this.buildDefFromContent(e,s,s.resolvedPkg||e,t):this.createStubDef(e)})}async buildDefFromContent(e,t,n,s){let{dts:o,url:i,resolvedPkg:a}=t,c=new b(a||n),l=c.version?`${c.name}@${c.version}`:c.name,{mainPath:p,packageRootUrl:d}=this.computeEntryPath(i,l),h=[{path:p,content:o}],m=[];i&&await this.expandRelativeRefs(o,i,l,h,void 0,d);let g=h.map(C=>C.content).join(`
259
+ `);await this.prefetchBareDeps(g,l,h,m,s);let S=c.format(),j=e===S?[e]:[e,S],B=j.some(C=>this.ambientlyDeclares(o,C));return B?this.markFileAmbient(h,p):m.push(...j.map(C=>({module:C,path:p}))),{pkg:e,mainPath:p,files:h,shims:m,ambient:B}}};function Rt(r){return new Be(r)}import*as L from"fs/promises";import*as W from"path";import*as Pr from"os";import*as Pt from"fs/promises";import*as Sr from"crypto";function $(r){return Sr.createHash("sha1").update(r).digest("hex")}async function X(r){try{return JSON.parse(await Pt.readFile(r,"utf8"))}catch{return}}async function Ue(r){try{return await Pt.readFile(r,"utf8")}catch{return}}var Rr=1,q=W.join(Pr.homedir(),".typebulb","cache"),_e=W.join(q,"packages"),Ce=W.join(q,"proxy"),We=W.join(q,"dts"),Qn=W.join(q,"emit"),Et;function x(){return Et||(Et=Zn()),Et}function Je(r,e){return W.join(Qn,$(r),e)}async function Zn(){await L.mkdir(q,{recursive:!0});let r=W.join(q,"version.json");if((await es(r))?.version===Rr)return;let t=await L.readdir(q).catch(()=>[]);await Promise.all(t.map(n=>L.rm(W.join(q,n),{recursive:!0,force:!0}))),await L.writeFile(r,JSON.stringify({version:Rr})+`
260
+ `,"utf8")}async function es(r){try{let e=await L.readFile(r,"utf8");return JSON.parse(e)}catch{return}}import*as z from"fs/promises";import*as Er from"path";async function I(r,e){await z.mkdir(Er.dirname(r),{recursive:!0});let t=`${r}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await z.writeFile(t,e,"utf8"),await z.rename(t,r).catch(async n=>{throw await z.rm(t,{force:!0}).catch(()=>{}),n})}var ae=class{constructor(e){this.filePath=e}mem;loadPromise;load(){return this.mem?Promise.resolve(this.mem):(this.loadPromise||(this.loadPromise=X(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 I(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var kt=D.join(_e,"indexes"),kr=D.join(_e,"pinned"),ts=D.join(_e,"meta"),rs=D.join(_e,"negative.json"),ce=Symbol("missing"),Ve=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new K(new ae(rs));async getPinnedExact(e,t){let n=`${e}@${t}`,s=this.pinnedMem.get(n);if(s!==void 0)return s===ce?void 0:s;await x();let o=await Ue(D.join(kr,$(n)+".txt"));return this.pinnedMem.set(n,o??ce),o}async setPinnedExact(e,t,n){let s=`${e}@${t}`;this.pinnedMem.set(s,n),await x(),await I(D.join(kr,$(s)+".txt"),n)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===ce?void 0:t;await x();let n=await X(D.join(kt,He(e)+".json"));return this.indexMem.set(e,n??ce),n}async setIndex(e,t,n){let s={versions:t,distTags:n,updatedAt:Date.now()};this.indexMem.set(e,s),await x(),await I(D.join(kt,He(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await _r.rm(D.join(kt,He(e)+".json"),{force:!0})}async isNegative(e){return await x(),this.negativeCache.isNegative(e)}async recordNegative(e){await x(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let n=`${e}@${t}`,s=this.metaMem.get(n);if(s!==void 0)return s===ce?void 0:s;await x();let o=await X(Tr(e,t));return this.metaMem.set(n,o??ce),o}async setMeta(e,t,n,s,o){let i={dependencies:n,peerDependencies:s,peerDependenciesMeta:o,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,i),await x(),await I(Tr(e,t),JSON.stringify(i))}};function Tr(r,e){return D.join(ts,He(r),encodeURIComponent(e)+".json")}function He(r){return r.replace(/\//g,"__")}var Cr={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 ns=new Ve,{packageService:qe,versionResolver:Ir,cdnClient:Or,peerResolver:ha}=fr(ns,Cr);var Ar=`
253
261
  (() => {
254
262
  // Embedded (bulb-in-a-bulb): runs inside a sandboxed iframe with no parent
255
263
  // bridge, so privileged tb.* (AI, fs, server RPC) can't reach a host and would
@@ -459,12 +467,12 @@ declare const tb: {${dr}${ur}${pr}${mr}${Fn}${fr}${hr}
459
467
  };
460
468
  }
461
469
  })();
462
- `;function Cr(r){let{name:e,code:t,css:n,html:s,data:o,insight:i,importMap:a,watch:c,theme:l}=r,d=s.trim()||'<div id="app"></div>',u=b=>b.replace(/<\/script/gi,"<\\/script"),h={imports:Zn(a.imports)};return`<!DOCTYPE html>
470
+ `;function $r(r){let{name:e,code:t,css:n,html:s,data:o,insight:i,importMap:a,watch:c,theme:l}=r,p=s.trim()||'<div id="app"></div>',d=m=>m.replace(/<\/script/gi,"<\\/script"),h={imports:is(a.imports)};return`<!DOCTYPE html>
463
471
  <html>
464
472
  <head>
465
473
  <meta charset="utf-8">
466
474
  <meta name="viewport" content="width=device-width, initial-scale=1">
467
- <title>${Qn(e)} - typebulb</title>
475
+ <title>${os(e)} - typebulb</title>
468
476
  <script>
469
477
  // Theme engine. Sets html[data-theme] before stylesheets paint (no flash) and
470
478
  // exposes the tb.theme accessor via window.__tbTheme. The override is persisted
@@ -472,13 +480,13 @@ declare const tb: {${dr}${ur}${pr}${mr}${Fn}${fr}${hr}
472
480
  // toggles the effective theme. See Specs/Theme.md.
473
481
  (function() {
474
482
  try {
475
- var KEY = ${u(JSON.stringify("tb-theme:"+e))};
483
+ var KEY = ${d(JSON.stringify("tb-theme:"+e))};
476
484
  var doc = document.documentElement;
477
485
  var mq = window.matchMedia('(prefers-color-scheme: dark)');
478
486
  var os = function() { return mq.matches ? 'dark' : 'light'; };
479
487
  // A host-forced theme (bulb-in-a-bulb) outranks the OS but not an explicit
480
488
  // in-iframe override, so the user can still toggle the embed independently.
481
- var FORCED = ${u(JSON.stringify(l??null))};
489
+ var FORCED = ${d(JSON.stringify(l??null))};
482
490
  var stored = function() {
483
491
  try { var v = localStorage.getItem(KEY); return (v === 'dark' || v === 'light') ? v : undefined; }
484
492
  catch (e) { return undefined; }
@@ -523,23 +531,23 @@ ${n}
523
531
  </style>
524
532
  </head>
525
533
  <body>
526
- ${d}
534
+ ${p}
527
535
 
528
- ${o.length>0?`<script>window.__TB_DATA__ = ${u(JSON.stringify(o))};</script>`:""}
529
- ${i?`<script>window.__TB_INSIGHT__ = ${u(JSON.stringify(i))};</script>`:""}
536
+ ${o.length>0?`<script>window.__TB_DATA__ = ${d(JSON.stringify(o))};</script>`:""}
537
+ ${i?`<script>window.__TB_INSIGHT__ = ${d(JSON.stringify(i))};</script>`:""}
530
538
  ${c?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
531
539
 
532
540
  <script>
533
- ${_r}
541
+ ${Ar}
534
542
  </script>
535
543
 
536
- ${Xn}
544
+ ${ss}
537
545
 
538
546
  <script type="module">
539
- ${u(t)}
547
+ ${d(t)}
540
548
  </script>
541
549
  </body>
542
- </html>`}var Xn=`<script>
550
+ </html>`}var ss=`<script>
543
551
  (function () {
544
552
  if (window.parent === window) return;
545
553
  var de = document.documentElement;
@@ -554,17 +562,36 @@ ${u(t)}
554
562
  // viewport for a short bulb (so the frame shrinks to it), tracking the frame for a
555
563
  // full-bleed one (so it self-stabilises at the host's initial height).
556
564
  //
565
+ // Showing the Y scrollbar is DEFERRED; hiding it stays eager. Content grows (a new
566
+ // row, an expanded panel) synchronously, but the frame only grows a beat later, after
567
+ // the host receives the height message and resizes the iframe. In that gap body is
568
+ // taller than the still-old frame, so an eager overflow:auto flashes a scrollbar for
569
+ // exactly the round-trip. So when Y overflows we post the height and re-check after a
570
+ // short delay instead of flipping immediately: if the frame caught up the overflow is
571
+ // gone (no bar), and only an overflow that SURVIVES \u2014 a genuine host cap \u2014 gets auto.
572
+ // The host can't tell the iframe its cap (no host\u2192iframe channel), so this round-trip
573
+ // is how the embed distinguishes "frame about to grow" from "frame capped". X has no
574
+ // async resize (the host never grows width on content), so it flips inline.
575
+ //
557
576
  // Coalesce to one rAF and only write an overflow value that actually changed: setting
558
577
  // overflow adds/removes a scrollbar, which resizes the element and re-fires the
559
578
  // observer \u2014 writing unconditionally ping-pongs (the "ResizeObserver loop" warning).
560
- // The rAF + equality guard let it settle within a frame instead.
561
579
  var raf = 0;
580
+ var confirm = 0;
581
+ var showYScroll = function () {
582
+ confirm = 0;
583
+ if (de.scrollHeight > de.clientHeight + 1 && de.style.overflowY !== 'auto') de.style.overflowY = 'auto';
584
+ };
562
585
  var apply = function () {
563
586
  raf = 0;
564
- var oy = de.scrollHeight > de.clientHeight + 1 ? 'auto' : 'hidden';
565
- var ox = de.scrollWidth > de.clientWidth + 1 ? 'auto' : 'hidden';
566
- if (de.style.overflowY !== oy) de.style.overflowY = oy;
587
+ var ox = de.scrollWidth > de.clientWidth + 1 ? 'auto' : 'hidden';
567
588
  if (de.style.overflowX !== ox) de.style.overflowX = ox;
589
+ if (de.scrollHeight > de.clientHeight + 1) {
590
+ if (de.style.overflowY !== 'auto' && !confirm) confirm = setTimeout(showYScroll, 100);
591
+ } else {
592
+ if (confirm) { clearTimeout(confirm); confirm = 0; }
593
+ if (de.style.overflowY !== 'hidden') de.style.overflowY = 'hidden';
594
+ }
568
595
  post({ __typebulbEmbed: true, kind: 'height', height: Math.ceil(document.body.scrollHeight) });
569
596
  };
570
597
  var update = function () { if (!raf) raf = requestAnimationFrame(apply); };
@@ -591,34 +618,36 @@ ${u(t)}
591
618
  }
592
619
  });
593
620
  })();
594
- </script>`;function Qn(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Zn(r){let e={};for(let[t,n]of Object.entries(r))e[t]=n.startsWith("https://")?"/proxy/"+n:n;return e}import*as ze from"fs/promises";import*as Ge from"path";import{existsSync as Or,readFileSync as es}from"fs";import{execFile as ts}from"child_process";import{promisify as rs}from"util";import{satisfies as ns}from"semver";var ss=rs(ts);async function Ke(r,e,t){let s=r.map(i=>os(i,t)).filter(i=>!is(i,e));if(s.length===0)return;await ze.mkdir(e,{recursive:!0});let o=Ge.join(e,"package.json");Or(o)||await ze.writeFile(o,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${s.join(", ")}`),await ss("npm",["install","--no-audit","--no-fund",...s],{cwd:e,shell:!0})}function os(r,e){if(!e||Dr(r))return r;let t=e[r];return t?`${r}@${t}`:r}function is(r,e){let t=Ge.join(e,"node_modules",Ir(r));if(!Or(t))return!1;let n=Dr(r);if(!n)return!0;try{let s=JSON.parse(es(Ge.join(t,"package.json"),"utf-8")).version;return ns(s,n)}catch{return!1}}function Ye(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 Ir(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 Dr(r){let e=Ir(r);return r.length>e.length?r.slice(e.length+1):""}async function Ar(r){let t=(await G.readdir(r)).find(n=>n.endsWith(".bulb.md"));return t?ce.join(r,t):null}async function Ce(r){let e=await G.readFile(r,"utf-8"),t=tr(e);if(!t)throw new Error("Invalid .bulb.md file format");let n=rr(t);return{bulb:n,config:sr(n.config)}}async function Rt(r,e,t,n){let s=dt(r,{serverOnly:!0});if(s.error)throw new Error(`Server compilation error: ${s.error}`);let o=s.code;t&&(o=await Xt(o,t));let i=ce.join(e,".typebulb");await G.mkdir(i,{recursive:!0});let a=Ye(o);a.length>0&&await Ke(a,i,n);let c=ce.join(i,"server.mjs");return await G.writeFile(c,o,"utf-8"),await import(`${as(c).href}?t=${Date.now()}`)}async function Et(r,e,t,n){let{bulb:s,config:o}=await Ce(r),i=nr(s.data),a=dt(s.code,{jsxImportSource:o.jsxImportSource});a.error&&console.error("Compilation error:",a.error);let{importMap:c}=await qe.buildImportMap(a.code,o.dependencies??{},n?new Set([n.name]):void 0);n&&(c.imports[n.name]=n.entryUrl);let l=Cr({name:s.name,code:a.code,css:s.css,html:s.html,data:i,insight:s.insight,importMap:c,watch:e}),d=ce.dirname(r);o.env?.length&&fe(o.env,d);let u=null;return s.server&&t&&(u=await Rt(s.server,d,n,o.dependencies)),{html:l,bulb:s,serverExports:u}}import{Hono as gs}from"hono";import{serve as ys}from"@hono/node-server";import{streamSSE as bs}from"hono/streaming";import*as Z from"fs/promises";import*as j from"path";var D=class extends Error{constructor(e,t="unknown",n=!1){super(e),this.code=t,this.retryable=n}},N=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=`
621
+ </script>`;function os(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function is(r){let e={};for(let[t,n]of Object.entries(r))e[t]=n.startsWith("https://")?"/proxy/"+n:n;return e}import*as Ge from"fs/promises";import*as ze from"path";import{existsSync as Dr,readFileSync as as}from"fs";import{execFile as cs}from"child_process";import{promisify as ls}from"util";import{satisfies as ds}from"semver";var us=ls(cs);async function Ye(r,e,t){let s=r.map(i=>ps(i,t)).filter(i=>!fs(i,e));if(s.length===0)return;await Ge.mkdir(e,{recursive:!0});let o=ze.join(e,"package.json");Dr(o)||await Ge.writeFile(o,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${s.join(", ")}`),await us("npm",["install","--no-audit","--no-fund",...s],{cwd:e,shell:!0})}function ps(r,e){if(!e||Fr(r))return r;let t=e[r];return t?`${r}@${t}`:r}function fs(r,e){let t=ze.join(e,"node_modules",Mr(r));if(!Dr(t))return!1;let n=Fr(r);if(!n)return!0;try{let s=JSON.parse(as(ze.join(t,"package.json"),"utf-8")).version;return ds(s,n)}catch{return!1}}function Ke(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 Mr(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 Fr(r){let e=Mr(r);return r.length>e.length?r.slice(e.length+1):""}async function jr(r){let t=(await G.readdir(r)).find(n=>n.endsWith(".bulb.md"));return t?Xe.join(r,t):null}async function le(r){let e=await G.readFile(r,"utf-8"),t=or(e);if(!t)throw new Error("Invalid .bulb.md file format");let n=ir(t);return{bulb:n,config:cr(n.config)}}async function Tt(r,e,t,n){let s=ft(r,{serverOnly:!0});if(s.error)throw new Error(`Server compilation error: ${s.error}`);let o=s.code;t&&(o=await rr(o,t));let i=Xe.join(e,".typebulb");await G.mkdir(i,{recursive:!0});let a=Ke(o);a.length>0&&await Ye(a,i,n);let c=Xe.join(i,"server.mjs");return await G.writeFile(c,o,"utf-8"),await import(`${hs(c).href}?t=${Date.now()}`)}async function _t(r,e,t,n,s){let{bulb:o,config:i}=await le(r),a=ar(o.data),c=ft(o.code,{jsxImportSource:i.jsxImportSource});c.error&&console.error("Compilation error:",c.error);let{importMap:l}=await qe.buildImportMap(c.code,i.dependencies??{},n?new Set([n.name]):void 0);n&&(l.imports[n.name]=n.entryUrl);let p=$r({name:o.name,code:c.code,css:o.css,html:o.html,data:a,insight:o.insight,importMap:l,watch:e}),d=null;return o.server&&t&&(d=await Tt(o.server,s,n,i.dependencies)),{html:p,bulb:o,serverExports:d}}function Ct(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)"}import{Hono as Rs}from"hono";import{serve as Ps}from"@hono/node-server";import{streamSSE as Es}from"hono/streaming";import*as ee from"fs/promises";import*as F from"path";var O=class extends Error{constructor(e,t="unknown",n=!1){super(e),this.code=t,this.retryable=n}},M=class{getPath(e,t){return this.path}parseStreamChunk(e){return this.checkAndThrowError(e),this.parseProviderStreamChunk(e)}isReasoningEnabled(e){return e?.reasoning!==void 0&&e.reasoning>0}extractSystemMessages(e,t=`
595
622
 
596
- `){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 D(t,n,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new D(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 Oe=class extends N{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(`
623
+ `){let n=e.filter(s=>s.role==="system").map(s=>s.content);return{system:n.length?n.join(t):void 0,conversationMessages:e.filter(s=>s.role!=="system")}}parseJsonError(e,t,n=!1){if(!e)return{message:`HTTP ${t}`};try{let s=JSON.parse(e);if(s.error&&typeof s.error=="object"){let o={message:s.error.message||`HTTP ${t}`,type:s.error.type};return n&&(o.code=s.error.code),o}return s.message?{message:s.message}:{message:e}}catch{return{message:e}}}checkAndThrowError(e){if("type"in e&&e.type==="error"&&"message"in e){let t=e.message,n=e.code||"unknown",s=!!e.retryable;throw new O(t,n,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new O(t)}}extractErrorMessage(e){if(typeof e=="string")try{let t=JSON.parse(e);return t.error?.message||t.message||e}catch{return e}return typeof e=="object"&&e!==null?e.message||JSON.stringify(e):`${this.providerName} returned an error`}};var Ie=class extends M{constructor(){super(...arguments),this.providerName="Anthropic",this.defaultBaseUrl="https://api.anthropic.com",this.path="/v1/messages"}buildHeaders(e){return{"x-api-key":e,"anthropic-version":"2023-06-01","Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(i),stream:s};if(n?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),o&&(a.system=[{type:"text",text:o,cache_control:{type:"ephemeral"}}]),this.isReasoningEnabled(n)){let c=n.reasoning;if(this.isModernModel(t)){let l={0:"low",1:"low",2:"medium",3:"high"};a.thinking={type:"adaptive"},a.output_config={effort:l[c]}}else{let l={0:0,1:2048,2:4096,3:8192};a.thinking={type:"enabled",budget_tokens:l[c]}}}return a}parseError(e,t){return this.parseJsonError(e,t)}parseNonStreamingResponse(e){if(!this.isAnthropicResponse(e))return{text:""};let t=e.content.filter(s=>s.type==="text").map(s=>s.text).join(""),n=e.content.filter(s=>s.type==="thinking").map(s=>s.thinking).join(`
597
624
 
598
- `);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 Ie=class extends N{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(`
599
- `)),!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 D(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(`
625
+ `);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 Oe=class extends M{constructor(){super(...arguments),this.providerName="OpenAI",this.defaultBaseUrl="https://api.openai.com",this.path="/v1/responses",this.effortMap={0:"minimal",1:"low",2:"medium",3:"high"}}buildHeaders(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,n,s){let o=this.convertMessagesToInput(e),i={model:t,input:o,stream:s};return n?.webSearch!==!1&&(i.tools=[{type:"web_search"}]),this.isReasoningEnabled(n)&&(i.reasoning={effort:this.effortMap[n.reasoning],summary:"auto"}),i}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.isResponsesApiResponse(e))return{text:""};let t=e.output_text||"",n;if(e.output&&Array.isArray(e.output))for(let s of e.output)s.type==="reasoning"&&s.summary&&(n=s.summary.map(o=>o.text).join(`
626
+ `)),!t&&s.type==="message"&&s.content&&(t=s.content.filter(o=>o.type==="output_text").map(o=>o.text).join(""));return{text:t,reasoning:n}}parseProviderStreamChunk(e){if(!this.isResponsesApiEvent(e))return null;switch(e.type){case"error":return null;case"response.failed":{let s=e.response?.error,o=s?.message||"Response failed",i=s?.code==="insufficient_quota"||s?.code==="rate_limit_exceeded";throw new O(o,i?"rate_limit":"unknown",i)}case"response.output_text.delta":return{text:e.delta};case"response.reasoning_summary_text.delta":return{reasoning:e.delta};case"response.created":case"response.in_progress":case"response.output_item.added":case"response.output_item.done":case"response.content_part.added":case"response.content_part.done":case"response.output_text.done":case"response.output_text.annotation.added":case"response.reasoning_summary_text.done":case"response.completed":case"response.web_search_call.in_progress":case"response.web_search_call.searching":case"response.web_search_call.completed":return null;default:return null}}convertMessagesToInput(e){return e.map(t=>t.role==="system"?`System: ${t.content}`:t.role==="user"?`User: ${t.content}`:t.role==="assistant"?`Assistant: ${t.content}`:t.content).join(`
600
627
 
601
- `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var De=class extends N{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,`
628
+ `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var Ae=class extends M{constructor(){super(...arguments),this.providerName="Gemini",this.defaultBaseUrl="https://generativelanguage.googleapis.com",this.path="/v1beta/models"}getPath(e,t){return`/v1beta/models/${e}:${t?"streamGenerateContent":"generateContent"}${t?"?alt=sse":""}`}buildHeaders(e){return{"Content-Type":"application/json","x-goog-api-key":e}}buildPayload(e,t,n,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e,`
602
629
  `),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(`
603
- `)[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 D(n)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new D(`Prompt blocked: ${t}`)}}};var Ae=class extends N{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 cs=new Map([["openai",new Ie],["openrouter",new Ae],["anthropic",new Oe],["gemini",new De]]);function X(r){let e=cs.get(r);if(!e)throw new Error(`Unsupported protocol: ${r}`);return e}async function kt(r,e){let t=X(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 Tt(r,e){let t=X(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 $r(r){let e=r.indexOf(`\r
630
+ `)[0],type:s.status,code:s.code?.toString()}:n.message?{message:n.message}:{message:e}}catch{return{message:e}}}parseNonStreamingResponse(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return{text:"",status:"failed",error:"Invalid response format"};let t=this.extractText(e)||"",n=e.candidates?.[0]?.finishReason,s="complete";return n==="MAX_TOKENS"?s="interrupted":(n==="SAFETY"||n==="RECITATION")&&(s="failed"),{text:t,status:s}}parseProviderStreamChunk(e){if(this.checkGeminiError(e),!this.isGeminiResponse(e))return null;let t=this.extractText(e);return t?{text:t}:null}isGeminiResponse(e){return typeof e=="object"&&e!==null&&"candidates"in e&&Array.isArray(e.candidates)}extractText(e){let t=e.candidates?.[0];if(t?.content?.parts)return t.content.parts.map(n=>n.text).filter(Boolean).join("")}checkGeminiError(e){if(typeof e=="object"&&e!==null&&"error"in e){let t=e.error,n;if(typeof t=="string")n=t;else if(typeof t=="object"&&t!==null){let s=t;n=s.message||s.status||"Gemini returned an error"}else n="Gemini returned an error";throw new O(n)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new O(`Prompt blocked: ${t}`)}}};var $e=class extends M{constructor(){super(...arguments),this.providerName="OpenRouter",this.defaultBaseUrl="https://openrouter.ai/api",this.path="/api/v1/chat/completions",this.effortMap={0:"low",1:"low",2:"medium",3:"high"}}buildHeaders(e,t){let n={Authorization:`Bearer ${e}`,"x-api-key":e,"Content-Type":"application/json",Accept:"application/json","X-Title":"Typebulb"};return t&&(n["HTTP-Referer"]=t,n.Referer=t,n.Origin=t),n}buildPayload(e,t,n,s){let o={model:t,messages:e,stream:s};return n?.webSearch===!0&&(o.plugins=[{id:"web"}]),this.isReasoningEnabled(n)&&(o.reasoning={effort:this.effortMap[n.reasoning]}),o}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.hasChoices(e))return{text:""};let t=e.choices[0],n=t?.message?.content??t?.text??"",s=t?.message?.reasoning??e.reasoning;return{text:n,reasoning:s}}parseProviderStreamChunk(e){if(!this.hasChoices(e))return null;let t=e.choices[0];if(!t)return null;let n=t.delta||t.message;if(!n)return null;let s=n.content||void 0,o=n.reasoning||void 0;return!s&&!o?null:{text:s,reasoning:o}}hasChoices(e){return typeof e=="object"&&e!==null&&"choices"in e&&Array.isArray(e.choices)}};var ms=new Map([["openai",new Oe],["openrouter",new $e],["anthropic",new Ie],["gemini",new Ae]]);function Q(r){let e=ms.get(r);if(!e)throw new Error(`Unsupported protocol: ${r}`);return e}async function It(r,e){let t=Q(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 Ot(r,e){let t=Q(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 Nr(r){let e=r.indexOf(`\r
604
631
  \r
605
632
  `),t=r.indexOf(`
606
633
 
607
- `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function _t(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(`
608
- `).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function Fr(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 h=_t(s);h!==null&&h!=="done"&&e(h)}break}o=!0,s+=n.decode(l,{stream:!0});let{pos:d,len:u}=$r(s);for(;d!==-1;){let h=s.slice(0,d);s=s.slice(d+u);let b=_t(h);if(b==="done"){s="";break}b!==null&&e(b),{pos:d,len:u}=$r(s)}}return{receivedAnyData:o}}async function Ct(r,e){let t=e??(r.headers.get("X-Provider-Protocol")||"openai"),n=X(t);if(!r.body)throw new Error("Response body is missing");let s=r.body.getReader(),o="";return await Fr(s,i=>{let a=n.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as Ot from"fs/promises";import*as $e from"path";var Xe=class{async get(e){let t=F(e),n=$e.join(_e,t+".bin"),s=$e.join(_e,t+".json");try{let[o,i]=await Promise.all([Ot.readFile(n),Ot.readFile(s,"utf8")]),a=JSON.parse(i);return{body:o,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await x();let n=F(e),s=$e.join(_e,n+".bin"),o=$e.join(_e,n+".json"),i={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([I(s,t.body),I(o,JSON.stringify(i))])}};import{readdir as us,readFile as jr,writeFile as Lr,unlink as Fe,mkdir as ps}from"fs/promises";import{mkdirSync as fs,writeFileSync as Mr,appendFileSync as hs,readFileSync as Br}from"fs";import*as de from"path";import{join as It,resolve as ls}from"path";import{homedir as ds}from"os";function Qe(){let r=process.env.TYPEBULB_SERVERS_DIR;return r?It(r,".."):It(ds(),".typebulb")}function Q(){return process.env.TYPEBULB_SERVERS_DIR||It(Qe(),"servers")}function le(r){let e=ls(r);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}var Nr=1e6;function Dt(r){return de.join(Q(),`${r}.json`)}function Ze(r){return de.join(Q(),`${r}.log`)}function Ur(r){let e=Ze(r);try{fs(Q(),{recursive:!0}),Mr(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(hs(e,c),s+=c.length,s>2*Nr){let l=Br(e),d=l.subarray(Math.max(0,l.length-Nr));Mr(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 At(r,e=0){try{let t=Br(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 ms(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function Wr(r){await ps(Q(),{recursive:!0}),await Lr(Dt(r.pid),JSON.stringify(r))}async function Jr(r,e){let t=Dt(r);try{let n=JSON.parse(await jr(t,"utf8"));if(n.denied===e)return;n.denied=e,await Lr(t,JSON.stringify(n))}catch{}}async function $t(r){await Fe(Dt(r)).catch(()=>{}),await Fe(Ze(r)).catch(()=>{})}async function Ft(){let r;try{r=await us(Q())}catch{return[]}let e=[];return await Promise.all(r.map(async t=>{if(!t.endsWith(".json"))return;let n=de.join(Q(),t),s;try{s=JSON.parse(await jr(n,"utf8"))}catch{await Fe(n).catch(()=>{});return}s&&typeof s.pid=="number"&&ms(s.pid)?e.push(s):(await Fe(n).catch(()=>{}),s?.pid&&await Fe(Ze(s.pid)).catch(()=>{}))})),e.sort((t,n)=>t.startedAt-n.startedAt)}async function Hr(r){try{process.kill(r,"SIGTERM")}catch{}await $t(r)}var Gr="127.0.0.1",ws=new Set(["localhost","127.0.0.1","::1"]);function vs(r){if(r)try{return new URL(r.includes("://")?r:`http://${r}`).hostname}catch{return}}function Vr(r){let e=vs(r);return!!e&&ws.has(e)}function et(r){return r instanceof Error?r.message:"Unknown error"}async function zr(r){let{getHtml:e,basePath:t,port:n,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c}=r,l=new gs;l.use("*",async(p,f)=>{if(!Vr(p.req.header("host")))return p.text("Forbidden: untrusted Host",403);await f()}),l.use("*",async(p,f)=>{await f(),p.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),p.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let d=["/__fs/*","/__api/*","/__ai"],u=async(p,f)=>{if(!a){let g=new URL(p.req.url).pathname,v=g.startsWith("/__fs")?"the filesystem":g==="/__ai"?"AI (your API keys)":"server-side code (server.ts)";Jr(process.pid,v);let w=c?`
609
- ${c}`:"";return p.text(`Forbidden: this capability requires --trust.${w}`,403)}await f()},h=async(p,f)=>{let g=p.req.header("sec-fetch-site");if(g){if(g==="cross-site")return p.text("Forbidden: cross-site request",403)}else{let v=p.req.header("origin");if(v&&!Vr(v))return p.text("Forbidden: cross-origin request",403)}await f()};for(let p of d)l.use(p,u),l.use(p,h);l.use("/__log",h),l.post("/__log",async p=>{try{let{args:f}=await p.req.json();console.log(...f||[])}catch{}return p.json({ok:!0})}),l.get("/",p=>p.html(e())),l.post("/__fs/read",async p=>{try{let{path:f}=await p.req.json(),g=Nt(f,t),v=await Z.readFile(g);return new Response(new Uint8Array(v),{headers:{"Content-Type":"application/octet-stream"}})}catch(f){let g=et(f);return p.json({error:g},400)}}),l.post("/__fs/write",async p=>{try{let f=p.req.query("path");if(!f)return p.json({error:"Missing path"},400);let g=Nt(f,t);return await Z.mkdir(j.dirname(g),{recursive:!0}),await Z.writeFile(g,Buffer.from(await p.req.arrayBuffer())),p.json({success:!0})}catch(f){let g=et(f);return p.json({error:g},400)}});let b={log:console.log};l.post("/__api/:name",async p=>{try{let f=o?.(),g=p.req.param("name"),v=f?.[g]??b[g];if(!v||typeof v!="function")return p.json({error:`API function '${g}' not found`},404);let{args:w}=await p.req.json(),C=await v(...w||[]);return p.json({result:C})}catch(f){let g=et(f);return p.json({error:g},500)}}),l.post("/__ai",async p=>{try{let{messages:f,system:g,reasoning:v,provider:w,model:C,webSearch:J}=await p.req.json();if(!f||!Array.isArray(f)||f.length===0)return p.json({message:"messages array is required",code:"unknown",retryable:!1},400);let L=xs(w,C);if(typeof L=="string")return p.json({message:L,code:"unknown",retryable:!1},400);let ot=[...g?[{role:"system",content:g}]:[],...f.map(Me=>({role:Me.role,content:Me.content}))],ee=await kt(L,{model:L.model,messages:ot,stream:!0,reasoning:v??0,webSearch:J??!0});if(!ee.ok){let Me=await Tt(ee,L.protocol);return p.json(Me,ee.status)}let Jt=await Ct(ee,L.protocol);return Jt||console.warn("[tb.ai] Empty response from provider"),p.json({text:Jt})}catch(f){if(f instanceof D)return p.json({message:f.message,code:f.code,retryable:f.retryable},500);let g=et(f);return p.json({message:g,code:"unknown",retryable:!1},500)}}),l.get("/__models",async p=>{try{let f=await Rs();return p.json(f)}catch{return p.json([],200)}});let m=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],S=new Xe;if(l.get("/proxy/*",async p=>{let f=new URL(p.req.url),v=(f.pathname+f.search).slice(7),w=v.lastIndexOf("https://");return w===-1?p.text("Invalid proxy URL",400):O(p,v.slice(w))}),i){let p=`/local/${i.name}/`;l.get("/local/*",async f=>{let{pathname:g}=new URL(f.req.url);if(!g.startsWith(p))return f.text("Not Found",404);let v=decodeURIComponent(g.slice(p.length));try{let w=Nt(v,i.serveDir),C=await Z.readFile(w);return new Response(C,{headers:{"Content-Type":Es(w)}})}catch{return f.text("Not Found",404)}})}async function O(p,f){let g;try{g=new URL(f)}catch{return p.text("Invalid URL",400)}if(g.protocol!=="https:")return p.text("HTTPS only",400);if(!m.includes(g.hostname))return p.text("Host not allowed",403);let v=await S.get(f);if(v)return new Response(v.body,{status:200,headers:Mt(v.contentType,v.cacheControl)});try{let w=await fetch(f,{headers:{Accept:p.req.header("Accept")||"*/*"},redirect:"follow"});if(!w.ok)return p.text(`Upstream ${w.status}`,w.status);let C=w.headers.get("Content-Type")||void 0,J=w.headers.get("Cache-Control")||void 0;if(w.body){let[L,ot]=w.body.tee();return(async()=>{try{let ee=await new Response(ot).arrayBuffer();await S.set(f,{body:Buffer.from(ee),contentType:C,cacheControl:J})}catch{}})(),new Response(L,{status:w.status,headers:Mt(C,J)})}return new Response(null,{status:w.status,headers:Mt(C,J)})}catch(w){return p.text(`Proxy fetch failed: ${w instanceof Error?w.message:w}`,502)}}s&&l.get("/__reload",p=>bs(p,async f=>{let g=()=>{f.writeSSE({event:"reload",data:""})};for(s.on("reload",g),f.onAbort(()=>{s.removeListener("reload",g)});;)await f.sleep(3e4)}));let _=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;l.notFound(async p=>{if(p.req.method!=="GET")return p.text("Not Found",404);let f=new URL(p.req.url);return _.test(f.pathname)?O(p,"https://esm.sh"+f.pathname+f.search):p.text("Not Found",404)});let $=ys({fetch:l.fetch,port:n,hostname:Gr});return{port:n,close:()=>$.close()}}var Kr={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"};function xs(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=X(t)}catch{return`Unknown provider '${t}'.`}let o=Kr[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.`}var Ss="https://api.typebulb.com/api/models",Ps=1440*60*1e3,ue=null;async function Rs(){if(!ue||Date.now()-ue.fetchedAt>Ps){let r=await fetch(Ss);if(!r.ok)return ue?qr(ue.models):[];ue={models:await r.json(),fetchedAt:Date.now()}}return qr(ue.models)}function qr(r){let e=new Set(Object.entries(Kr).filter(([,t])=>!!process.env[t]).map(([t])=>t));return r.filter(t=>e.has(t.provider))}function Mt(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 Es(r){switch(j.extname(r).toLowerCase()){case".js":case".mjs":return"text/javascript";case".wasm":return"application/wasm";case".json":case".map":return"application/json";default:return"application/octet-stream"}}function Nt(r,e){let t=j.resolve(e,r),n=j.normalize(e),s=j.normalize(t);if(s!==n&&!s.startsWith(n+j.sep))throw new Error("Path traversal detected - access denied");return t}async function jt(r){let e=await import("net");return new Promise(t=>{let n=e.createServer();n.listen(r,Gr,()=>{let s=n.address(),o=typeof s=="object"&&s?s.port:r;n.close(()=>t(o))}),n.on("error",()=>{t(jt(r+1))})})}import ks from"open";async function Yr(r){await ks(r)}import Xr from"chokidar";var Qr={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Lt(r){let{bulbPath:e,emitter:t}=r,n=Xr.watch(e,Qr);return n.on("change",()=>{t.emit("reload")}),()=>n.close()}function Zr(r){let{dir:e,onChange:t,debounceMs:n=150}=r,s,o=Xr.watch(e,Qr);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,n)}),()=>{s&&clearTimeout(s),o.close()}}import*as k from"fs/promises";import*as E from"path";import*as pe from"path";var Ts=pe.join(We,"pkg"),_s=pe.join(We,"files"),Cs=pe.join(We,"negative.json"),rt=class{pkgMem=new Map;fileMem=new Map;negativeCache=new K(new ie(Cs));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await x();let t=await Y(en(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 tt(async()=>{await x(),await I(en(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await x();let t=await Ue(tn(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await tt(async()=>{await x(),await I(tn(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await tt(async()=>{await x(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return tt(()=>this.negativeCache.clearNegative(e))}};async function tt(r){try{await r()}catch{}}function en(r){return pe.join(Ts,F(r)+".json")}function tn(r){return pe.join(_s,F(r)+".txt")}var Bt;function Os(){return Bt||(Bt=vt({cache:new rt,cdnClient:Tr,packageService:qe,versionResolver:kr})),Bt}var rn="file:///node_modules/";async function nn(r){let e=Je(r.emitKey,"typecheck");await x(),await k.rm(e,{recursive:!0,force:!0}),await k.mkdir(e,{recursive:!0});let t=$s(r.jsxImportSource,r.dependencies),n=await Os().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 h=nt(u.path);if(!h||i.has(h))continue;i.add(h);let b=E.join(e,"node_modules",h);await k.mkdir(E.dirname(b),{recursive:!0}),await k.writeFile(b,u.content,"utf8")}let a={};for(let d of o)for(let u of d.shims){let h=nt(u.path);h&&(a[u.module]=[`./node_modules/${h}`])}for(let d of o){if(d.ambient)continue;let u=nt(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 h=nt(u.path);h&&c.add(`node_modules/${h}`)}if(r.local){delete a[r.local.name];let d=await Fs(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=Is(r.jsxImportSource,a,[...c]);return await k.writeFile(E.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
610
- `,"utf8"),await k.writeFile(E.join(e,"code.tsx"),r.code,"utf8"),await k.writeFile(E.join(e,"tb.d.ts"),gt,"utf8"),{dir:e}}function Is(r,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:Ds([...ht,...mt]),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 Ds(r){return r.filter(e=>!e.since).map(e=>As(e.name))}function As(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 $s(r,e){let t=r??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function nt(r){if(!r.startsWith(rn))return;let e=r.slice(rn.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function Fs(r,e){if(!r.typesAbs)return;let t=E.dirname(r.typesAbs),n=E.join(e,"node_modules",r.name);for(let s of await Ms(t)){let o=E.join(n,E.relative(t,s));await k.mkdir(E.dirname(o),{recursive:!0}),await k.copyFile(s,o)}return E.basename(r.typesAbs)}async function Ms(r){let e=[];async function t(n){let s=await k.readdir(n,{withFileTypes:!0});for(let o of s){let i=E.join(n,o.name);o.isDirectory()?await t(i):/\.d\.ts(\.map)?$/.test(o.name)&&e.push(i)}}return await t(r),e}import*as A from"fs/promises";import*as W from"path";import{existsSync as Ns}from"fs";var js="^22";async function sn(r){let e=Je(r.emitKey,"typecheck-server");await x(),await A.rm(e,{recursive:!0,force:!0}),await A.mkdir(e,{recursive:!0});let t=W.join(r.bulbDir,".typebulb"),n=Ye(r.server).filter(i=>i!==r.local?.name);await Ke([`@types/node@${js}`,...n],t,r.dependencies);let s=W.join(t,"node_modules"),o=W.join(e,"node_modules");return await Bs(s,o),await A.writeFile(W.join(e,"server.ts"),r.server,"utf8"),await A.writeFile(W.join(e,"tb.d.ts"),yt,"utf8"),await A.writeFile(W.join(e,"tsconfig.json"),JSON.stringify(Ls(r.local),null,2)+`
611
- `,"utf8"),{dir:e}}function Ls(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(W.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 Bs(r,e){if(!Ns(r)){await A.mkdir(e,{recursive:!0});return}await A.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await A.symlink(r,e,t)}import{readFileSync as Us,writeFileSync as Ws,mkdirSync as Js}from"fs";import{join as Hs}from"path";function on(){return Hs(Qe(),"trust.json")}function Ut(){try{let r=JSON.parse(Us(on(),"utf8"));return new Set(Array.isArray(r)?r:[])}catch{return new Set}}function Vs(r){Js(Qe(),{recursive:!0}),Ws(on(),JSON.stringify([...r]))}function an(r){return Ut().has(le(r))}function cn(r,e){let t=Ut(),n=le(r);(e?t.has(n):!t.has(n))||(e?t.add(n):t.delete(n),Vs(t))}function ln(){return[...Ut()]}var Gs="0.9.4";async function zs(r,e){let{bulb:t,config:n}=await Ce(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 sn({server:t.server,bulbDir:R.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 Ks(a);for(let d of c.split(/\r?\n/))d.trim()&&console.log(`${i} ${d}`);l!==0&&(o=!0)}o&&process.exit(1)}function Ks(r){return new Promise(e=>{let t=qs("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}))})}async function Ys(r,e,t){lt();let n=async()=>{let{bulb:s,config:o}=await Ce(r),i=R.dirname(r);o.env?.length&&fe(o.env,i),await Rt(s.server,i,t,o.dependencies)};if(console.log(`Running ${R.basename(r)}...`),await n(),e){console.log(`Watching for changes...
612
- `);let s=new Wt;s.on("reload",async()=>{try{console.log("Re-running..."),await n()}catch(o){console.error("Error:",o)}}),Lt({bulbPath:r,emitter:s})}}async function Xs(r,e,t,n){let s=process.cwd(),o=Ur(process.pid),i=e.watch?new Wt:void 0;lt(),console.log(`Loading ${R.basename(r)}...`);let{html:a,bulb:c,serverExports:l}=await Et(r,e.watch,e.trust,n),d=await jt(e.port),u=await zr({getHtml:()=>a,basePath:s,port:d,reloadEmitter:i,getServerExports:()=>l,localOverride:n?{name:n.name,serveDir:n.serveDir}:void 0,trusted:e.trust,trustHint:t}),h=`http://localhost:${d}`;await Wr({pid:process.pid,port:d,url:h,file:r,startedAt:Date.now(),trust:e.trust}),console.log(`
613
- ${c.name}`),console.log(` ${h}`),console.log(e.trust?" trust: granted (filesystem, AI, server.ts enabled)":` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
634
+ `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function At(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(`
635
+ `).trim();if(!n)return null;if(n==="[DONE]")return"done";try{return JSON.parse(n)}catch{return null}}async function Lr(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 h=At(s);h!==null&&h!=="done"&&e(h)}break}o=!0,s+=n.decode(l,{stream:!0});let{pos:p,len:d}=Nr(s);for(;p!==-1;){let h=s.slice(0,p);s=s.slice(p+d);let m=At(h);if(m==="done"){s="";break}m!==null&&e(m),{pos:p,len:d}=Nr(s)}}return{receivedAnyData:o}}async function $t(r,e){let t=e??(r.headers.get("X-Provider-Protocol")||"openai"),n=Q(t);if(!r.body)throw new Error("Response body is missing");let s=r.body.getReader(),o="";return await Lr(s,i=>{let a=n.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as Dt from"fs/promises";import*as De from"path";var Qe=class{async get(e){let t=$(e),n=De.join(Ce,t+".bin"),s=De.join(Ce,t+".json");try{let[o,i]=await Promise.all([Dt.readFile(n),Dt.readFile(s,"utf8")]),a=JSON.parse(i);return{body:o,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await x();let n=$(e),s=De.join(Ce,n+".bin"),o=De.join(Ce,n+".json"),i={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([I(s,t.body),I(o,JSON.stringify(i))])}};import{readdir as bs,readFile as Wr,writeFile as Jr,unlink as Me,mkdir as vs}from"fs/promises";import{mkdirSync as ws,writeFileSync as Br,appendFileSync as xs,readFileSync as Hr}from"fs";import*as ue from"path";import{join as Mt,resolve as gs}from"path";import{homedir as ys}from"os";function Ze(){let r=process.env.TYPEBULB_SERVERS_DIR;return r?Mt(r,".."):Mt(ys(),".typebulb")}function Z(){return process.env.TYPEBULB_SERVERS_DIR||Mt(Ze(),"servers")}function de(r){let e=gs(r);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}var Ur=1e6;function Ft(r){return ue.join(Z(),`${r}.json`)}function et(r){return ue.join(Z(),`${r}.log`)}function Vr(r){let e=et(r);try{ws(Z(),{recursive:!0}),Br(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(xs(e,c),s+=c.length,s>2*Ur){let l=Hr(e),p=l.subarray(Math.max(0,l.length-Ur));Br(e,p),s=p.length}}catch{o=!0}};return process.stdout.write=((a,...c)=>(i(a),t(a,...c))),process.stderr.write=((a,...c)=>(i(a),n(a,...c))),()=>{process.stdout.write=t,process.stderr.write=n}}function jt(r,e=0){try{let t=Hr(et(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 Ss(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function qr(r){await vs(Z(),{recursive:!0}),await Jr(Ft(r.pid),JSON.stringify(r))}async function zr(r,e){let t=Ft(r);try{let n=JSON.parse(await Wr(t,"utf8"));if(n.denied===e)return;n.denied=e,await Jr(t,JSON.stringify(n))}catch{}}async function Nt(r){await Me(Ft(r)).catch(()=>{}),await Me(et(r)).catch(()=>{})}async function Lt(){let r;try{r=await bs(Z())}catch{return[]}let e=[];return await Promise.all(r.map(async t=>{if(!t.endsWith(".json"))return;let n=ue.join(Z(),t),s;try{s=JSON.parse(await Wr(n,"utf8"))}catch{await Me(n).catch(()=>{});return}s&&typeof s.pid=="number"&&Ss(s.pid)?e.push(s):(await Me(n).catch(()=>{}),s?.pid&&await Me(et(s.pid)).catch(()=>{}))})),e.sort((t,n)=>t.startedAt-n.startedAt)}async function Gr(r){try{process.kill(r,"SIGTERM")}catch{}await Nt(r)}var Xr="127.0.0.1",ks=new Set(["localhost","127.0.0.1","::1"]);function Ts(r){if(r)try{return new URL(r.includes("://")?r:`http://${r}`).hostname}catch{return}}function Yr(r){let e=Ts(r);return!!e&&ks.has(e)}function tt(r){return r instanceof Error?r.message:"Unknown error"}async function Qr(r){let{getHtml:e,basePath:t,port:n,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c}=r,l=new Rs;l.use("*",async(u,f)=>{if(!Yr(u.req.header("host")))return u.text("Forbidden: untrusted Host",403);await f()}),l.use("*",async(u,f)=>{await f(),u.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),u.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let p=["/__fs/*","/__api/*","/__ai"],d=async(u,f)=>{if(!a){let y=new URL(u.req.url).pathname,w=y.startsWith("/__fs")?"the filesystem":y==="/__ai"?"AI (your API keys)":"server-side code (server.ts)";zr(process.pid,w);let v=c?`
636
+ ${c}`:"";return u.text(`Forbidden: this capability requires --trust.${v}`,403)}await f()},h=async(u,f)=>{let y=u.req.header("sec-fetch-site");if(y){if(y==="cross-site")return u.text("Forbidden: cross-site request",403)}else{let w=u.req.header("origin");if(w&&!Yr(w))return u.text("Forbidden: cross-origin request",403)}await f()};for(let u of p)l.use(u,d),l.use(u,h);l.use("/__log",h),l.post("/__log",async u=>{try{let{args:f}=await u.req.json();console.log(...f||[])}catch{}return u.json({ok:!0})}),l.get("/",u=>u.html(e())),l.post("/__fs/read",async u=>{try{let{path:f}=await u.req.json(),y=Ut(f,t),w=await ee.readFile(y);return new Response(new Uint8Array(w),{headers:{"Content-Type":"application/octet-stream"}})}catch(f){let y=tt(f);return u.json({error:y},400)}}),l.post("/__fs/write",async u=>{try{let f=u.req.query("path");if(!f)return u.json({error:"Missing path"},400);let y=Ut(f,t);return await ee.mkdir(F.dirname(y),{recursive:!0}),await ee.writeFile(y,Buffer.from(await u.req.arrayBuffer())),u.json({success:!0})}catch(f){let y=tt(f);return u.json({error:y},400)}});let m={log:console.log};l.post("/__api/:name",async u=>{try{let f=o?.(),y=u.req.param("name"),w=f?.[y]??m[y];if(!w||typeof w!="function")return u.json({error:`API function '${y}' not found`},404);let{args:v}=await u.req.json(),_=await w(...v||[]);return u.json({result:_})}catch(f){let y=tt(f);return u.json({error:y},500)}}),l.post("/__ai",async u=>{try{let{messages:f,system:y,reasoning:w,provider:v,model:_,webSearch:H}=await u.req.json();if(!f||!Array.isArray(f)||f.length===0)return u.json({message:"messages array is required",code:"unknown",retryable:!1},400);let N=_s(v,_);if(typeof N=="string")return u.json({message:N,code:"unknown",retryable:!1},400);let at=[...y?[{role:"system",content:y}]:[],...f.map(Fe=>({role:Fe.role,content:Fe.content}))],te=await It(N,{model:N.model,messages:at,stream:!0,reasoning:w??0,webSearch:H??!0});if(!te.ok){let Fe=await Ot(te,N.protocol);return u.json(Fe,te.status)}let Gt=await $t(te,N.protocol);return Gt||console.warn("[tb.ai] Empty response from provider"),u.json({text:Gt})}catch(f){if(f instanceof O)return u.json({message:f.message,code:f.code,retryable:f.retryable},500);let y=tt(f);return u.json({message:y,code:"unknown",retryable:!1},500)}}),l.get("/__models",async u=>{try{let f=await Os();return u.json(f)}catch{return u.json([],200)}});let g=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],S=new Qe;if(l.get("/proxy/*",async u=>{let f=new URL(u.req.url),w=(f.pathname+f.search).slice(7),v=w.lastIndexOf("https://");return v===-1?u.text("Invalid proxy URL",400):j(u,w.slice(v))}),i){let u=`/local/${i.name}/`;l.get("/local/*",async f=>{let{pathname:y}=new URL(f.req.url);if(!y.startsWith(u))return f.text("Not Found",404);let w=decodeURIComponent(y.slice(u.length));try{let v=Ut(w,i.serveDir),_=await ee.readFile(v);return new Response(_,{headers:{"Content-Type":As(v)}})}catch{return f.text("Not Found",404)}})}async function j(u,f){let y;try{y=new URL(f)}catch{return u.text("Invalid URL",400)}if(y.protocol!=="https:")return u.text("HTTPS only",400);if(!g.includes(y.hostname))return u.text("Host not allowed",403);let w=await S.get(f);if(w)return new Response(w.body,{status:200,headers:Bt(w.contentType,w.cacheControl)});try{let v=await fetch(f,{headers:{Accept:u.req.header("Accept")||"*/*"},redirect:"follow"});if(!v.ok)return u.text(`Upstream ${v.status}`,v.status);let _=v.headers.get("Content-Type")||void 0,H=v.headers.get("Cache-Control")||void 0;if(v.body){let[N,at]=v.body.tee();return(async()=>{try{let te=await new Response(at).arrayBuffer();await S.set(f,{body:Buffer.from(te),contentType:_,cacheControl:H})}catch{}})(),new Response(N,{status:v.status,headers:Bt(_,H)})}return new Response(null,{status:v.status,headers:Bt(_,H)})}catch(v){return u.text(`Proxy fetch failed: ${v instanceof Error?v.message:v}`,502)}}s&&l.get("/__reload",u=>Es(u,async f=>{let y=()=>{f.writeSSE({event:"reload",data:""})};for(s.on("reload",y),f.onAbort(()=>{s.removeListener("reload",y)});;)await f.sleep(3e4)}));let B=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;l.notFound(async u=>{if(u.req.method!=="GET")return u.text("Not Found",404);let f=new URL(u.req.url);return B.test(f.pathname)?j(u,"https://esm.sh"+f.pathname+f.search):u.text("Not Found",404)});let C=Ps({fetch:l.fetch,port:n,hostname:Xr});return{port:n,close:()=>C.close()}}var Zr={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"};function _s(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=Q(t)}catch{return`Unknown provider '${t}'.`}let o=Zr[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.`}var Cs="https://api.typebulb.com/api/models",Is=1440*60*1e3,pe=null;async function Os(){if(!pe||Date.now()-pe.fetchedAt>Is){let r=await fetch(Cs);if(!r.ok)return pe?Kr(pe.models):[];pe={models:await r.json(),fetchedAt:Date.now()}}return Kr(pe.models)}function Kr(r){let e=new Set(Object.entries(Zr).filter(([,t])=>!!process.env[t]).map(([t])=>t));return r.filter(t=>e.has(t.provider))}function Bt(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 As(r){switch(F.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 Ut(r,e){let t=F.resolve(e,r),n=F.normalize(e),s=F.normalize(t);if(s!==n&&!s.startsWith(n+F.sep))throw new Error("Path traversal detected - access denied");return t}async function Wt(r){let e=await import("net");return new Promise(t=>{let n=e.createServer();n.listen(r,Xr,()=>{let s=n.address(),o=typeof s=="object"&&s?s.port:r;n.close(()=>t(o))}),n.on("error",()=>{t(Wt(r+1))})})}import $s from"open";async function en(r){await $s(r)}import tn from"chokidar";var rn={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Jt(r){let{bulbPath:e,emitter:t}=r,n=tn.watch(e,rn);return n.on("change",()=>{t.emit("reload")}),()=>n.close()}function nn(r){let{dir:e,onChange:t,debounceMs:n=150}=r,s,o=tn.watch(e,rn);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,n)}),()=>{s&&clearTimeout(s),o.close()}}import*as k from"fs/promises";import*as E from"path";import*as fe from"path";var Ds=fe.join(We,"pkg"),Ms=fe.join(We,"files"),Fs=fe.join(We,"negative.json"),nt=class{pkgMem=new Map;fileMem=new Map;negativeCache=new K(new ae(Fs));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await x();let t=await X(sn(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 rt(async()=>{await x(),await I(sn(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await x();let t=await Ue(on(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await rt(async()=>{await x(),await I(on(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await rt(async()=>{await x(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return rt(()=>this.negativeCache.clearNegative(e))}};async function rt(r){try{await r()}catch{}}function sn(r){return fe.join(Ds,$(r)+".json")}function on(r){return fe.join(Ms,$(r)+".txt")}var Ht;function js(){return Ht||(Ht=Rt({cache:new nt,cdnClient:Or,packageService:qe,versionResolver:Ir})),Ht}var an="file:///node_modules/";async function cn(r){let e=Je(r.emitKey,"typecheck");await x(),await k.rm(e,{recursive:!0,force:!0}),await k.mkdir(e,{recursive:!0});let t=Us(r.jsxImportSource,r.dependencies),n=await js().resolve(r.code,r.dependencies,t),s=r.local?.name,o=s?n.filter(p=>p.pkg!==s):n,i=new Set;for(let p of o)for(let d of p.files){let h=st(d.path);if(!h||i.has(h))continue;i.add(h);let m=E.join(e,"node_modules",h);await k.mkdir(E.dirname(m),{recursive:!0}),await k.writeFile(m,d.content,"utf8")}let a={};for(let p of o)for(let d of p.shims){let h=st(d.path);h&&(a[d.module]=[`./node_modules/${h}`])}for(let p of o){if(p.ambient)continue;let d=st(p.mainPath);d&&(a[p.pkg]=[`./node_modules/${d}`])}let c=new Set;for(let p of o)for(let d of p.files){if(!d.ambient)continue;let h=st(d.path);h&&c.add(`node_modules/${h}`)}if(r.local){delete a[r.local.name];let p=await Ws(r.local,e);p?a[r.local.name]=[`./node_modules/${r.local.name}/${p}`]:console.warn(` local: '${r.local.name}' ships no type defs; check cannot type against it.`)}let l=Ns(r.jsxImportSource,a,[...c]);return await k.writeFile(E.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
637
+ `,"utf8"),await k.writeFile(E.join(e,"code.tsx"),r.code,"utf8"),await k.writeFile(E.join(e,"tb.d.ts"),vt,"utf8"),{dir:e}}function Ns(r,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:Ls([...yt,...bt]),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 Ls(r){return r.filter(e=>!e.since).map(e=>Bs(e.name))}function Bs(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 Us(r,e){let t=r??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function st(r){if(!r.startsWith(an))return;let e=r.slice(an.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function Ws(r,e){if(!r.typesAbs)return;let t=E.dirname(r.typesAbs),n=E.join(e,"node_modules",r.name);for(let s of await Js(t)){let o=E.join(n,E.relative(t,s));await k.mkdir(E.dirname(o),{recursive:!0}),await k.copyFile(s,o)}return E.basename(r.typesAbs)}async function Js(r){let e=[];async function t(n){let s=await k.readdir(n,{withFileTypes:!0});for(let o of s){let i=E.join(n,o.name);o.isDirectory()?await t(i):/\.d\.ts(\.map)?$/.test(o.name)&&e.push(i)}}return await t(r),e}import*as A from"fs/promises";import*as J from"path";import{existsSync as Hs}from"fs";var Vs="^22";async function ln(r){let e=Je(r.emitKey,"typecheck-server");await x(),await A.rm(e,{recursive:!0,force:!0}),await A.mkdir(e,{recursive:!0});let t=J.join(r.bulbDir,".typebulb"),n=Ke(r.server).filter(i=>i!==r.local?.name);await Ye([`@types/node@${Vs}`,...n],t,r.dependencies);let s=J.join(t,"node_modules"),o=J.join(e,"node_modules");return await zs(s,o),await A.writeFile(J.join(e,"server.ts"),r.server,"utf8"),await A.writeFile(J.join(e,"tb.d.ts"),wt,"utf8"),await A.writeFile(J.join(e,"tsconfig.json"),JSON.stringify(qs(r.local),null,2)+`
638
+ `,"utf8"),{dir:e}}function qs(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(J.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 zs(r,e){if(!Hs(r)){await A.mkdir(e,{recursive:!0});return}await A.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await A.symlink(r,e,t)}import{readFileSync as Gs,writeFileSync as Ys,mkdirSync as Ks}from"fs";import{join as Xs}from"path";function dn(){return Xs(Ze(),"trust.json")}function Vt(){try{let r=JSON.parse(Gs(dn(),"utf8"));return new Set(Array.isArray(r)?r:[])}catch{return new Set}}function Qs(r){Ks(Ze(),{recursive:!0}),Ys(dn(),JSON.stringify([...r]))}function qt(r){return Vt().has(de(r))}function un(r,e){let t=Vt(),n=de(r);(e?t.has(n):!t.has(n))||(e?t.add(n):t.delete(n),Qs(t))}function pn(){return[...Vt()]}import*as he from"path";import{fileURLToPath as Zs}from"url";var eo={claude:{file:"claude.bulb.md",srcEnv:"TYPEBULB_CLAUDE_SRC"}};function ot(r){let e=eo[r];if(!e)return;let t=e.srcEnv?process.env[e.srcEnv]:void 0;return t?he.resolve(t):he.join(he.dirname(Zs(import.meta.url)),"bulbs",e.file)}var ro="0.9.6";async function no(r,e){let{bulb:t,config:n}=await le(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 cn({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 ln({server:t.server,bulbDir:P.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 oo(a);for(let p of c.split(/\r?\n/))p.trim()&&console.log(`${i} ${p}`);l!==0&&(o=!0)}o&&process.exit(1)}async function so(r,e){let{bulb:t}=await le(r),n=Ct(t);if(qt(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.)")}function oo(r){return new Promise(e=>{let t=to("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}))})}async function io(r,e,t,n,s){let o=ut(t),i=!1,a=async()=>{let{bulb:c,config:l}=await le(r);i||(pt(o,r,c.server),i=!0),await Tt(c.server,s,n,l.dependencies)};if(console.log(`Running ${P.basename(r)}...`),await a(),e){console.log(`Watching for changes...
639
+ `);let c=new zt;c.on("reload",async()=>{try{console.log("Re-running..."),await a()}catch(l){console.error("Error:",l)}}),Jt({bulbPath:r,emitter:c})}}async function ao(r,e,t,n,s){let o=process.cwd(),i=Vr(process.pid),a=e.watch?new zt:void 0,c=ut(e.mode);console.log(`Loading ${P.basename(r)}...`);let{html:l,bulb:p,serverExports:d}=await _t(r,e.watch,e.trust,n,s);pt(c,r,p.server);let h=await Wt(e.port),m=await Qr({getHtml:()=>l,basePath:o,port:h,reloadEmitter:a,getServerExports:()=>d,localOverride:n?{name:n.name,serveDir:n.serveDir}:void 0,trusted:e.trust,trustHint:t}),g=`http://localhost:${h}`,S=e.trust?void 0:Ct(p);await qr({pid:process.pid,port:h,url:g,file:r,startedAt:Date.now(),trust:e.trust,predicted:S}),console.log(`
640
+ ${p.name}`),console.log(` ${g}`),e.trust?console.log(" trust: granted (filesystem, AI, server.ts enabled)"):console.log(S?` trust: sandboxed \u2014 this bulb appears to use ${S}; re-run with --trust to enable it:
641
+ ${t}
642
+ `:` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
614
643
  `),e.watch&&console.log(` Watching for changes...
615
- `);let b,m;if(e.watch&&i){let O=new Wt;if(O.on("reload",async()=>{try{console.log("Recompiling...");let _=await Et(r,!0,e.trust,n);a=_.html,l=_.serverExports,i.emit("reload"),console.log(`Done. Browser reloading...
616
- `)}catch(_){console.error("Compile error:",_)}}),b=Lt({bulbPath:r,emitter:O}),n){let{name:_,serveDir:$}=n;m=Zr({dir:$,onChange:()=>{console.log(`Local package '${_}' changed. Browser reloading...
617
- `),i.emit("reload")}})}}e.open&&await Yr(h);let S=async()=>{console.log(`
618
- Shutting down...`),u.close(),b?.(),m?.(),o(),await $t(process.pid);let O=R.join(R.dirname(r),".typebulb","server.mjs");await st.rm(O,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",S),process.on("SIGTERM",S)}function Qs(r,e){return/^\d+$/.test(e)?r.find(t=>t.pid===parseInt(e,10)):r.find(t=>le(t.file)===le(e))}function dn(r,e){for(let t of r)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function un(r,e){if(!r.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),dn(r,t=>console.log(t)),console.log(`
619
- `+e)}function pn(r,e,t){let n=Qs(r,e);if(n)return n;console.error(`No running server for '${e}'.`),r.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),dn(r,s=>console.error(s))):console.error("No bulb servers are running."),process.exit(1)}async function Zs(r,e){let t=await Ft();if(!r){un(t,"Run `typebulb logs <file|pid>` to print one server's console.");return}let n=pn(t,r,"logs"),s=At(n.pid),o=s.text;if(e.lines&&e.lines>0){let i=o.split(`
644
+ `);let j,B;if(e.watch&&a){let u=new zt;if(u.on("reload",async()=>{try{console.log("Recompiling...");let f=await _t(r,!0,e.trust,n,s);l=f.html,d=f.serverExports,a.emit("reload"),console.log(`Done. Browser reloading...
645
+ `)}catch(f){console.error("Compile error:",f)}}),j=Jt({bulbPath:r,emitter:u}),n){let{name:f,serveDir:y}=n;B=nn({dir:y,onChange:()=>{console.log(`Local package '${f}' changed. Browser reloading...
646
+ `),a.emit("reload")}})}}e.open&&await en(g);let C=async()=>{console.log(`
647
+ Shutting down...`),m.close(),j?.(),B?.(),i(),await Nt(process.pid);let u=P.join(P.dirname(r),".typebulb","server.mjs");await it.rm(u,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",C),process.on("SIGTERM",C)}function co(r,e){return/^\d+$/.test(e)?r.find(t=>t.pid===parseInt(e,10)):r.find(t=>de(t.file)===de(e))}function fn(r,e){for(let t of r)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function hn(r,e){if(!r.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),fn(r,t=>console.log(t)),console.log(`
648
+ `+e)}function mn(r,e,t){let n=co(r,e);if(n)return n;console.error(`No running server for '${e}'.`),r.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),fn(r,s=>console.error(s))):console.error("No bulb servers are running."),process.exit(1)}async function lo(r,e){let t=await Lt();if(!r){hn(t,"Run `typebulb logs <file|pid>` to print one server's console.");return}let n=mn(t,ot(r)??r,"logs"),s=jt(n.pid),o=s.text;if(e.lines&&e.lines>0){let i=o.split(`
620
649
  `);i.length&&i[i.length-1]===""&&i.pop(),o=i.slice(-e.lines).join(`
621
650
  `)}if(process.stdout.write(o),o&&!o.endsWith(`
622
651
  `)&&process.stdout.write(`
623
- `),e.follow){let i=s.offset,a=setInterval(()=>{let l=At(n.pid,i);i=l.offset,l.text&&process.stdout.write(l.text)},500),c=()=>{clearInterval(a),process.exit(0)};process.on("SIGINT",c),process.on("SIGTERM",c),await new Promise(()=>{})}}async function eo(r){let e=await Ft();if(!r){un(e,"Run `typebulb stop <file|pid>` to stop one.");return}let t=pn(e,r,"stop");await Hr(t.pid),console.log(`Stopped ${R.basename(t.file)} (pid ${t.pid}, ${t.url}).`)}async function to(r,e){if(!r){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let n=ln();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=R.resolve(r);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),cn(t,e),console.log(e?`Trusted ${R.basename(t)} \u2014 runs with fs / AI / server.ts (no --trust needed).`:`Untrusted ${R.basename(t)} \u2014 runs Restricted.`),console.log(` ${t}`)}async function ro(){let r=Qt(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${Gs}`),process.exit(0)),r.help&&(Zt(),process.exit(0)),r.subcommand==="logs"){await Zs(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="stop"){await eo(r.file||void 0);return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await to(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let a=await Ar(process.cwd());a||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=a}else e=R.resolve(r.file);try{await st.access(e)}catch{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 t=!r.noTrust&&an(e);t&&!r.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||t;let n=r.file&&r.file!=="."?r.file:R.relative(process.cwd(),e)||R.basename(e),s=`npx typebulb --trust ${n.includes(" ")?`"${n}"`:n}`,o;try{o=await Ce(e)}catch{}let i;if(r.local){o&&!(r.local.name in(o.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),o&&(!o.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{i=await Yt(r.local)}catch(a){console.error(a instanceof Error?a.message:String(a)),process.exit(1)}console.log(`replace: ${i.name} \u2192 ${R.relative(process.cwd(),i.dir)||"."}`)}if(r.subcommand==="check"){await zs(e,i);return}if(o&&o.bulb.server&&(!o.bulb.code||r.server)){r.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
624
- ${s}`),process.exit(1)),await Ys(e,r.watch,i);return}await Xs(e,r,s,i)}ro().catch(r=>{console.error("Error:",r.message),process.exit(1)});
652
+ `),e.follow){let i=s.offset,a=setInterval(()=>{let l=jt(n.pid,i);i=l.offset,l.text&&process.stdout.write(l.text)},500),c=()=>{clearInterval(a),process.exit(0)};process.on("SIGINT",c),process.on("SIGTERM",c),await new Promise(()=>{})}}async function uo(r){let e=await Lt();if(!r){hn(e,"Run `typebulb stop <file|pid>` to stop one.");return}let t=mn(e,ot(r)??r,"stop");await Gr(t.pid),console.log(`Stopped ${P.basename(t.file)} (pid ${t.pid}, ${t.url}).`)}async function po(r,e){if(!r){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let n=pn();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=P.resolve(r);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),un(t,e),console.log(e?`Trusted ${P.basename(t)} \u2014 runs with fs / AI / server.ts (no --trust needed).`:`Untrusted ${P.basename(t)} \u2014 runs Restricted.`),console.log(` ${t}`)}async function fo(){let r=nr(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${ro}`),process.exit(0)),r.help&&(sr(),process.exit(0)),r.subcommand==="logs"){await lo(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="stop"){await uo(r.file||void 0);return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await po(r.file||void 0,r.subcommand==="trust");return}let e,t=!1;if(!r.file||r.file==="."){let l=await jr(process.cwd());l||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=l}else e=P.resolve(r.file);if(!await it.access(e).then(()=>!0,()=>!1)){let l=ot(r.file);l?(e=l,t=!0):(console.error(`File not found: ${e}`),process.exit(1))}e.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1));let s=r.file&&r.file!=="."?r.file:P.relative(process.cwd(),e)||P.basename(e),o=`npx typebulb --trust ${s.includes(" ")?`"${s}"`:s}`;if(r.subcommand==="predict"){await so(e,o);return}if(t)r.trust=!r.noTrust,r.trust&&console.log("trust: granted (built-in bulb)");else{let l=!r.noTrust&&qt(e);l&&!r.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||l}let i;try{i=await le(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 tr(r.local)}catch(l){console.error(l instanceof Error?l.message:String(l)),process.exit(1)}console.log(`replace: ${a.name} \u2192 ${P.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await no(e,a);return}let c=t?process.cwd():P.dirname(e);if(process.env.TYPEBULB_BULB_PATH=e,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:
653
+ ${o}`),process.exit(1)),await io(e,r.watch,r.mode,a,c);return}await ao(e,r,o,a,c)}fo().catch(r=>{console.error("Error:",r.message),process.exit(1)});