typebulb 0.9.3 → 0.9.4

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.
Files changed (2) hide show
  1. package/dist/index.js +43 -43
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import*as nt from"fs/promises";import*as R from"path";import{spawn as Ws}from"child_process";import{EventEmitter as Wt}from"events";import*as Vt from"fs/promises";import{existsSync as te,readFileSync as un}from"fs";import*as P from"path";import{pathToFileURL as pn}from"url";import{resolve as it}from"resolve.exports";import{init as qt,parse as Gt}from"es-module-lexer";function zt(n,e){let t=P.join(n,"package.json");try{return JSON.parse(un(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var ot=["browser","import","default"],Ht=["node","import","default"];function Kt(n){let e=n.indexOf("=");if(e===-1)throw new Error(`--replace must be <name>=<path> (got '${n}')`);let t=n.slice(0,e).trim(),r=n.slice(e+1).trim();if(!t)throw new Error(`--replace missing package name (got '${n}')`);if(!r)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(r)}}async function Yt(n){let{name:e,dir:t}=n;if(!te(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let r=zt(t,e),s=fn(r,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=hn(r,t);return await mn(e,o,i),{name:e,dir:t,entryAbs:o,serveDir:i,entryUrl:a,typesAbs:c}}function fn(n,e){if(n.exports!==void 0){let r;try{r=it(n,".",{browser:!0,conditions:ot})}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${ot.join(", ")}): ${o instanceof Error?o.message:o}`)}let s=at(r);if(!s)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${ot.join(", ")}); too complex to override.`);return s}let t=n.module??n.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function hn(n,e){if(n.exports!==void 0)try{let r=it(n,".",{conditions:["types"]}),s=at(r);if(s){let o=P.resolve(e,s);if(te(o))return o}}catch{}let t=n.types??n.typings;if(t){let r=P.resolve(e,t);if(te(r))return r}}function at(n){if(typeof n=="string")return n;if(Array.isArray(n))return n.find(e=>typeof e=="string")}async function mn(n,e,t){await qt;let r=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 '${n}' 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=gn(i,u,r);h&&!s.has(h)&&o.push(h);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${n} externalizes '${u}'`)}}}}function gn(n,e,t){let r=e.replace(/[?#].*$/,""),s=P.resolve(P.dirname(n),r),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 yn(n,e,t){let r=zt(n,e),s;if(r.exports!==void 0)try{s=at(it(r,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=r.main??r.module);if(!s)throw new Error(`--replace package '${e}' has no node export for '${t}'.`);let o=P.resolve(n,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 pn(o).href}async function Xt(n,e){await qt;let t;try{[t]=Gt(n)}catch{return n}let r="",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=yn(e.dir,e.name,a);r+=n.slice(s,o.s)+c,s=o.e}return r+n.slice(s)}function Qt(n){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(n[0])&&(e.subcommand=n[0],n=n.slice(1));for(let r=0;r<n.length;r++){let s=n[r];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(n[++r],10);(isNaN(o)||o<0)&&(console.error(`Invalid --lines value: ${n[r]}`),process.exit(1)),e.lines=o}else if(s==="--port"||s==="-p"){let o=n[++r],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):n[++r]??"";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 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(`
3
3
  typebulb - Local bulb runner for Typebulb
4
4
 
5
5
  Usage:
@@ -71,10 +71,10 @@ Examples:
71
71
  typebulb my-editor.bulb.md
72
72
  typebulb --no-watch --port 8080 my-editor.bulb.md
73
73
  typebulb .
74
- `)}import{readFileSync as bn}from"fs";import*as er from"path";function ct(){fe([".env",".env.local"],process.cwd(),!0)}function fe(n,e,t=!1){for(let r of n){let s=er.resolve(e,r);try{let o=bn(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: ${r}`)}}}import*as G from"fs/promises";import*as ce from"path";import{pathToFileURL as ns}from"url";var wn={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(n){try{let e=n.split(`
76
- `),t=0;if(e[t]?.trim()!=="---")return null;t++;let r=[];for(;t<e.length&&e[t]?.trim()!=="---";)r.push(e[t]),t++;if(e[t]?.trim()!=="---")return null;t++;let s=vn(r);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 vn(n){let e={};for(let t of n){let r=t.indexOf(":");if(r===-1)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();switch(s){case"format":e.format=o;break;case"name":e.name=xn(o);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function xn(n){return n.startsWith('"')&&n.endsWith('"')?n.slice(1,-1).replace(/\\"/g,'"'):n.startsWith("'")&&n.endsWith("'")?n.slice(1,-1):n}function rr(n){let e=t=>n.files.get(wn[t].path)||"";return{name:n.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 Sn(n){try{return JSON.parse(n),!0}catch{}return!!(/^\s*<[\s\S]*>/.test(n)||/^---\s*$/m.test(n)||/^\w[\w\s]*:[ \t]/m.test(n))}function nr(n){let e=n.trim();return e?Sn(e)?[e]:n.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function sr(n){if(!n.trim())return{};try{return JSON.parse(n)}catch{return{}}}import{transform as Pn}from"sucrase";function lt(n,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:r}=Pn(n,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:r}}catch(r){return{code:"",error:String(r)}}}var he="https://esm.sh",me="https://cdn.jsdelivr.net/npm/",dt="https://data.jsdelivr.com/v1/package/npm/";function or(n){let e=(n||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var y=class n{constructor(e,t,r){let s=typeof e=="string"?n.parse(e):e;this.name=s.name,this.version=re(t??s.version),this.subpath=re(r??s.subpath)}static parse(e){let t=or(e||"");if(!t.length)return new n({name:""});if(t[0].startsWith("@")){let s=t[0],[o,i]=ir(t[1]??""),a=re(t.slice(2).join("/"));return new n({name:`${s}/${o}`,version:i,subpath:a})}else{let[s,o]=ir(t[0]),i=re(t.slice(1).join("/"));return new n({name:s,version:o,subpath:i})}}static fromUrl(e){try{let t=new URL(e),r=new URL(he).host,s=new URL(me).host;if(t.host===r){let o=or(t.pathname.replace(/^\/v\d+\//,"/"));if(!o.length)return;let i=o[0].startsWith("@")?`${o[0]}/${o[1]??""}`:o[0];return n.parse(i)}if(t.host===s){let o=t.pathname.split("/npm/")[1];if(!o)return;let i=o.split("/")[0]||"";return n.parse(i)}return}catch{return}}static versionFromUrl(e){return n.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 n.parse(e).name}withVersion(e){return new n({name:this.name,version:re(e),subpath:this.subpath})}withPreferredVersion(e,t){let r=e||t;return r?this.withVersion(r):this}static isBare(e){if(!e||e.startsWith(".")||e.startsWith("/"))return!1;let t=e.toLowerCase();return!t.startsWith("http://")&&!t.startsWith("https://")}},re=n=>n&&n.length?n:void 0,ir=n=>{let e=n.indexOf("@");return e<0?[n,void 0]:[n.slice(0,e),re(n.slice(e+1))]};async function T(n){try{return await n()}catch{return}}var ge=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=he,this.jsDelivrBase=me,this.jsDelivrMeta=dt,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:r="es2022",bundle:s=!1,external:o}=t,i=new URLSearchParams({target:r});return s&&i.append("bundle",""),o?.length&&i.append("external",o.join(",")),`${this.esmHost}/${e}?${i.toString()}`}async pinEsmUrl(e,t="es2022"){let r=this.buildEsmUrl(e,{target:t}),s=await T(()=>this.http.head(r));return s?.ok?s.url||r:void 0}async resolveExactVersion(e){let t=Date.now(),r=this.pinCache.get(e);if(r&&t-r.ts<this.pinMs)return r.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 r=await T(()=>this.http.head(t)),s=this.parseVersionFromUrl(r?.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 r=await T(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(e)}`));if(!r?.versions?.length){await this.cache.recordNegative(e);return}await this.cache.clearNegative(e);let s=r.distTags&&Object.keys(r.distTags).length?r.distTags:void 0;return await this.cache.setIndex(e,r.versions,s),r}parseVersionFromUrl(e){let t=y.fromUrl(e)?.version;return t&&/\d+\.\d+\.\d+/.test(t)?t:void 0}async fetchPackageMeta(e,t){let r=await this.cache.getMeta(e,t);if(r&&Date.now()-r.updatedAt<this.metaTtlMs){let{dependencies:d,peerDependencies:u,peerDependenciesMeta:h}=r;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=n=>n.startsWith("@types/"),ye=n=>Object.keys(n?.peerDependencies||{}).filter(e=>!ar(e)),ut=n=>Object.keys(n?.dependencies||{}).filter(e=>!ar(e)),Rn=n=>ye(n).filter(e=>!n?.peerDependenciesMeta?.[e]?.optional),be=class{constructor(e){this.cdn=e}async resolve(e,t){let r=await this.fetchMeta(e),{allRoots:s,autoAddedPeers:o}=await this.expandWithPeers(r,t),i=this.computeFlags(s);return{allRoots:s,flags:i,autoAddedPeers:o}}async fetchMeta(e){return Promise.all(e.map(async({name:t,version:r})=>({name:t,version:r,meta:await this.cdn.fetchPackageMeta(t,r)})))}async expandWithPeers(e,t){let r=new Map(e.map(o=>[o.name,o])),s=[];for(let o of e)for(let i of Rn(o.meta))!r.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);r.set(o,{name:o,version:a,meta:c})}catch(a){console.warn(`[typebulb] Failed to resolve peer "${o}" for "${i}":`,a)}return{allRoots:[...r.values()],autoAddedPeers:s.filter(o=>r.has(o.name))}}computeFlags(e){let t=new Set(e.flatMap(o=>ye(o.meta))),r=new Map;for(let o of e)for(let i of ut(o.meta))r.set(i,(r.get(i)||0)+1);let s=new Set([...r.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,r){this.cache=e,this.cdn=t,this.semver=r}selectVersionFromIndex(e,t,r){return this.semver.selectBestVersion(e,{range:t,distTags:r})}async learnExactVersion(e){let t=await T(()=>this.cdn.fetchVersionsIndex(e));if(t?.versions?.length){let r=this.semver.selectBestVersion(t.versions,{distTags:t.distTags});if(r)return r}return this.cdn.resolveExactVersion(e)}async resolveExactForRoot(e,t){if(!t)return this.learnExactVersion(e);let r=await this.cache.getPinnedExact(e,t);if(r){if(this.semver.isExactVersion(r))return r;console.warn("[versionResolver] Rejecting invalid cached version for",e,":",r)}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 r=new y(e),s=r.root(),o=t[s],i=o?await T(()=>this.cache.getPinnedExact(s,o))??await T(()=>this.resolveExactForRoot(s,o)):void 0;return{effectivePackage:i?r.withVersion(i).format():e,root:s,range:o,pinned:i}}};import{init as En,parse as kn}from"es-module-lexer";var ne=class n{constructor(e,t,r,s){this.version=e,this.cdn=t,this.peer=r,this.cache=s}extractImportsSync(e){let t=new Set;for(let r of n.importPatterns){r.lastIndex=0;for(let s of e.matchAll(r))y.isBare(s[1])&&t.add(s[1])}return Array.from(t)}async extractImports(e){let t=new Set,r=s=>{y.isBare(s)&&t.add(s)};try{await En;let[s]=kn(e);s.forEach(o=>r(e.slice(o.s,o.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,r){let s=(await this.extractImports(e)).filter(u=>!r?.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 r=t[e],s=r?`${e}@${r}`:e,o=await this.version.resolveExactForRoot(e,r);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&&r&&await T(()=>this.cache.setPinnedExact(e,r,o))}if(!o)throw new Error(`Cannot resolve ${s}: no concrete version found.`);return o}buildEntries(e,t,r,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([...r.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}=r.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),...ut(e.meta)])].filter(r=>t.has(r))}};ne.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as cr,satisfies as Tn,maxSatisfying as pt,major as _n,prerelease as Cn,rsort as On,valid as In}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:!!Tn(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let r=pt(e,t,{includePrerelease:!0});return r===null?void 0:r}pickLatest(e){return e?.length?On(e)[0]:void 0}selectBestVersion(e,t){if(!e?.length)return;let r=t?.range?.trim()||"*",s=t?.preferStable??!0,o=t?.distTags?.latest;if(o&&e.includes(o)&&this.satisfies(r,o))return o;if(s){let a=pt(e,r,{includePrerelease:!1});if(a)return a}return pt(e,r,{includePrerelease:!0})??void 0}majorOf(e){return _n(e)}isPrerelease(e){return Cn(e)!==null}isExactVersion(e){return In(e)!==null}},z=new Ne;function lr(n,e){let t=new ge(n,e),r=new be(t),s=new we(n,t,z);return{packageService:new ne(s,t,r,n),versionResolver:s,cdnClient:t,peerResolver:r}}import*as Rr from"fs/promises";import*as M from"path";var ft=[{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"}],ht=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var dr=`
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=`
78
78
  /**
79
79
  * Get raw data chunk from the Data tab.
80
80
  * @param index - Chunk index (0-based). Separate chunks with 2 blank lines.
@@ -126,7 +126,7 @@ Examples:
126
126
  friendlyName: string;
127
127
  /** Provider display name, e.g. "Anthropic" */
128
128
  providerName: string;
129
- }>>;`,An="\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=`
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=`
130
130
  /**
131
131
  * The mode this bulb is running in.
132
132
  *
@@ -150,7 +150,7 @@ Examples:
150
150
  readBytes(path: string): Promise<Uint8Array>;
151
151
  /** Write text or raw bytes to a file. Creates parent directories if needed. */
152
152
  write(path: string, content: string | Uint8Array): Promise<boolean>;
153
- };`,Dn=`
153
+ };`,Fn=`
154
154
  /**
155
155
  * Server-side function proxy. The built-in \`log\` prints to CLI stdout
156
156
  * (falls back to console.log on web). On the server side, this object only
@@ -158,7 +158,7 @@ Examples:
158
158
  */
159
159
  server: {
160
160
  log(...args: any[]): Promise<void>;
161
- };`,$n=`
161
+ };`,Mn=`
162
162
  /**
163
163
  * Async value inspector for tensor-like objects.
164
164
  *
@@ -225,7 +225,7 @@ Examples:
225
225
  *
226
226
  * @returns The full canonical URL
227
227
  */
228
- url(): Promise<string>;`,Fn=`
228
+ url(): Promise<string>;`,Nn=`
229
229
  /**
230
230
  * Server-side function proxy.
231
231
  *
@@ -233,23 +233,23 @@ Examples:
233
233
  * \`tb.server.log(...)\` is a built-in that prints to CLI stdout (falls back to console.log on web).
234
234
  * User exports override built-ins of the same name.
235
235
  */
236
- server: Record<string, (...args: any[]) => Promise<any>>;`,mt=`
236
+ server: Record<string, (...args: any[]) => Promise<any>>;`,gt=`
237
237
  /**
238
238
  * Typebulb utilities namespace.
239
239
  * Type \`tb.\` to discover available helpers.
240
240
  */
241
- declare const tb: {${dr}${$n}${ur}${Fn}${pr}${mr}${fr}${An}${hr}
241
+ declare const tb: {${dr}${Mn}${ur}${Nn}${pr}${mr}${fr}${$n}${hr}
242
242
  };
243
- `,gt=`
243
+ `,yt=`
244
244
  /**
245
245
  * Typebulb utilities namespace (server-side).
246
246
  * Type \`tb.\` to discover available helpers.
247
247
  */
248
- declare const tb: {${dr}${ur}${pr}${mr}${Dn}${fr}${hr}
248
+ declare const tb: {${dr}${ur}${pr}${mr}${Fn}${fr}${hr}
249
249
  };
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 r=((await je(()=>this.store.get(e)))?.attempts||0)+1;await je(()=>this.store.set(e,{until:Date.now()+Mn(r),attempts:r}))}async clearNegative(e){await je(()=>this.store.delete(e))}};function Mn(n){return Math.min(9e5*Math.pow(2,Math.max(0,n-1)),864e5)}async function je(n){try{return await n()}catch{return}}import Wn 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 r=await this.fetchDts(t);if(r&&(this.looksLikeDts(r.dts)||/\.(d\.ts|d\.mts)(?:[?#].*)?$/i.test(r.url)||/[?&]dts(?:[&#]|$)/i.test(r.url)))return r}}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 yt(n){if(xe.test(n))return!0;try{return new URL(n,"file://").search.includes("dts")}catch{return n.includes("?")&&n.includes("dts")}}function Le(n){return[`${n}.d.ts`,`${n}.d.mts`]}async function Se(n,{retries:e=2,timeoutMs:t=15e3,init:r}={}){for(let s=0;s<=e;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),t);try{let a=await fetch(n,{...r,signal:o.signal});if(Nn(a.status)&&s<e)continue;return a}catch{if(s<e)continue;return}finally{clearTimeout(i)}}}function Nn(n){return n===408||n===429||n>=500&&n<600}var Pe=class extends se{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let r=this.cdnClient.packageJson(new y({name:e,version:t})),s=await Se(r);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 r of e){let s=await t(r);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 r=this.declarationCandidatesFor(e.path);return this.tryUntilSuccess([...ve,...r],t)}toResolutionResult(e){return{kind:xe.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let r=t||".",s=e;try{let o=this.extractPathFromResult(gr(s,r,{conditions:["types"]}));if(o)return o}catch{}try{return this.extractPathFromResult(gr(s,r,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=y.parse(e),{pkg:r,baseDir:s}=await this.loadPackageAtVersionedRoot(t.name,t.version)||{};if(!r||!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(r,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=r.types??r.typings;if(l){let u=await this.resolveFromSelected({kind:"types",path:l},c);if(u)return{...u,resolvedPkg:i}}let d=this.resolveExportsPath(r,".");if(d){let u=await this.resolveFromSelected(this.toResolutionResult(d),c);if(u)return{...u,resolvedPkg:i}}return}catch{return}}async fetchCandidateFrom(e,t,r){let s=this.cdnClient.normalizeRelative(r),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,""),r=Le(t),s=t.endsWith("/")?t:`${t}/`;return r.push(...Le(`${s}index`)),r}};import{gunzipSync as jn}from"fflate";var oe=class{async fetchAndExtract(e,t){let r=this.getTarballUrl(e,t),s=await Se(r,{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\//,""),r=t.indexOf("/");return r>0?t.substring(r+1):t}extractDtsFiles(e){let t=new Map;try{let r=jn(e),s=new TextDecoder("utf-8"),o=0;for(;o<r.length-512;){let i=r.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=r.slice(o,o+h);t.set(this.normalizeTarPath(l),s.decode(m))}o+=Math.ceil(h/512)*512}}catch{}return t}},Ln=new oe;var Re=class extends se{constructor(e,t,r,s=new oe){super(e),this.cdnClient=t,this.cache=r,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,r){try{if(r){let o=z.majorOf(r),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 r=new y(e),s=r.version;if(!s)return;let o;try{o=await this.tarballFetcher.fetchAndExtract(r.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 r of this.typesNameCandidates(t.name)){let s=`@types/${r}`,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,r=(s,o)=>(t.add(s[o]),null);return this.matchAll(e,/(import|export)\s+[^'"\n]*from\s*['"]([^'"\n]+)['"]/,s=>r(s,2)),this.matchAll(e,/export\s*\*\s*from\s*['"]([^'"\n]+)['"]/,s=>r(s,1)),Array.from(t)}matchAll(e,t,r){let s=[];try{let o=new RegExp(t.source,"g"),i;for(;i=o.exec(e);){let a=r(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 r=Bn(t);return`${yr}/${this.epochDir()}/${e}/${r}`}};function Bn(n){let e=n||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as Un}from"lru-cache";function bt(n){let e=new Un({ttl:1e4,max:500}),t=new Map;return async function(s){try{if(await n.isNegative(s))return;let o=e.get(s);if(o&&Date.now()-o<1e4)return;let i=await n.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 n.recordNegative(s));return}let d=await l.text(),u=l.url||s;return await n.clearNegative(s),await n.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=bt(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 r=this.inFlight.get(e);if(r)return r;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,r){e.some(s=>s.path===t)||e.push({path:t,content:r})}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 r=new y(e);return r.subpath?this.fetchRootDts(r.name,t):void 0}async fetchViaProviders(e){for(let t of[this.typescriptProvider,this.definitelyTypedProvider])try{let r=await t.resolve(e);if(r?.dts)return r}catch{}}subpathsMatch(e,t){return new y(e).subpath===new y(t).subpath}async fetchRootDts(e,t){let{effectivePackage:r,root:s,pinned:o}=await this.versionResolver.effectivePackage(e,t),i=await this.cache.getCachedDts(r);if(i?.content){let c=i.url??this.cdnClient.file(o?`${s}@${o}`:s,"index.d.ts");return{dts:i.content,url:c,resolvedPkg:r}}let a;try{a=await this.fetchViaProviders(r)}catch{return}if(!(!a?.dts||!a.url)){try{await this.cache.setCachedFile(a.url,a.dts)}catch{}if(this.subpathsMatch(r,a.resolvedPkg||r)){try{await this.cache.setCachedDts(r,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,r){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(r,s)}computeEntryPath(e,t){if(!e)return{mainPath:this.virtualFs.pathForMain(t),packageRootUrl:void 0};let r=new URL(e),s=this.extractPackageRootUrl(r);return{mainPath:this.toVirtualPath(s,r,t),packageRootUrl:s}}async expandRelativeRefs(e,t,r,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,r,s,o)}catch{}}async tryRelativeRef(e,t,r,s,o,i){try{let a=new URL(e,t),c=a.pathname+a.search,l=yt(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(r,new URL(b.url),s);this.pushFileIfNew(o,m,b.dts),await this.expandRelativeRefs(b.dts,b.url,s,o,i,r);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new y(e).name!==new y(t).name}ambientlyDeclares(e,t){for(let r of e.matchAll(/declare\s+module\s+['"]([^'"]+)['"]/g)){let s=r[1];if(s===t||s.endsWith("/*")&&t.startsWith(s.slice(0,-1)))return!0}return!1}markFileAmbient(e,t){let r=e.find(s=>s.path===t);r&&(r.ambient=!0)}async prefetchBareDeps(e,t,r,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=Wn(H.prefetchConcurrency);await Promise.all(i.map(l=>c(()=>this.prefetchBareDepsRecursive(l,r,s,H.maxBareDepth,a,o).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,r,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):r.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,r,s-1,o,i)}async resolve(e,t,r){let s=await this.packageService.extractImports(e),o=r?[...s,...r]:s;return(await Promise.all(o.map(a=>this.resolveOne(a,t)))).filter(a=>!!a)}async resolveOne(e,t){let{effectivePackage:r}=await this.versionResolver.effectivePackage(e,t);return this.withInFlight(r,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,r,s){let{dts:o,url:i,resolvedPkg:a}=t,c=new y(a||r),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 wt(n){return new Be(n)}import*as B from"fs/promises";import*as U from"path";import*as vr from"os";import*as vt from"fs/promises";import*as br from"crypto";function F(n){return br.createHash("sha1").update(n).digest("hex")}async function Y(n){try{return JSON.parse(await vt.readFile(n,"utf8"))}catch{return}}async function Ue(n){try{return await vt.readFile(n,"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"),Jn=U.join(V,"emit"),xt;function x(){return xt||(xt=Hn()),xt}function Je(n,e){return U.join(Jn,F(n),e)}async function Hn(){await B.mkdir(V,{recursive:!0});let n=U.join(V,"version.json");if((await Vn(n))?.version===wr)return;let t=await B.readdir(V).catch(()=>[]);await Promise.all(t.map(r=>B.rm(U.join(V,r),{recursive:!0,force:!0}))),await B.writeFile(n,JSON.stringify({version:wr})+`
252
- `,"utf8")}async function Vn(n){try{let e=await B.readFile(n,"utf8");return JSON.parse(e)}catch{return}}import*as q from"fs/promises";import*as xr from"path";async function I(n,e){await q.mkdir(xr.dirname(n),{recursive:!0});let t=`${n}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await q.writeFile(t,e,"utf8"),await q.rename(t,n).catch(async r=>{throw await q.rm(t,{force:!0}).catch(()=>{}),r})}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 r=await this.load();r.set(e,t),await this.persist(r)}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 St=M.join(Te,"indexes"),Sr=M.join(Te,"pinned"),qn=M.join(Te,"meta"),Gn=M.join(Te,"negative.json"),ae=Symbol("missing"),Ve=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new K(new ie(Gn));async getPinnedExact(e,t){let r=`${e}@${t}`,s=this.pinnedMem.get(r);if(s!==void 0)return s===ae?void 0:s;await x();let o=await Ue(M.join(Sr,F(r)+".txt"));return this.pinnedMem.set(r,o??ae),o}async setPinnedExact(e,t,r){let s=`${e}@${t}`;this.pinnedMem.set(s,r),await x(),await I(M.join(Sr,F(s)+".txt"),r)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===ae?void 0:t;await x();let r=await Y(M.join(St,He(e)+".json"));return this.indexMem.set(e,r??ae),r}async setIndex(e,t,r){let s={versions:t,distTags:r,updatedAt:Date.now()};this.indexMem.set(e,s),await x(),await I(M.join(St,He(e)+".json"),JSON.stringify(s))}async invalidateVersionsCache(e){this.indexMem.delete(e),await Rr.rm(M.join(St,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 r=`${e}@${t}`,s=this.metaMem.get(r);if(s!==void 0)return s===ae?void 0:s;await x();let o=await Y(Pr(e,t));return this.metaMem.set(r,o??ae),o}async setMeta(e,t,r,s,o){let i={dependencies:r,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(n,e){return M.join(qn,He(n),encodeURIComponent(e)+".json")}function He(n){return n.replace(/\//g,"__")}var Er={async getJson(n){try{let e=await fetch(n,{redirect:"follow"});return e.ok?await e.json():void 0}catch{return}},async head(n){try{let e=await fetch(n,{method:"HEAD",redirect:"follow"});return{ok:e.ok,url:e.url}}catch{return}}};var zn=new Ve,{packageService:qe,versionResolver:kr,cdnClient:Tr,peerResolver:ea}=lr(zn,Er);var _r=`
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=`
253
253
  (() => {
254
254
  // Embedded (bulb-in-a-bulb): runs inside a sandboxed iframe with no parent
255
255
  // bridge, so privileged tb.* (AI, fs, server RPC) can't reach a host and would
@@ -459,12 +459,12 @@ declare const tb: {${dr}${ur}${pr}${mr}${Dn}${fr}${hr}
459
459
  };
460
460
  }
461
461
  })();
462
- `;function Cr(n){let{name:e,code:t,css:r,html:s,data:o,insight:i,importMap:a,watch:c,theme:l}=n,d=s.trim()||'<div id="app"></div>',u=b=>b.replace(/<\/script/gi,"<\\/script"),h={imports:Xn(a.imports)};return`<!DOCTYPE html>
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>
463
463
  <html>
464
464
  <head>
465
465
  <meta charset="utf-8">
466
466
  <meta name="viewport" content="width=device-width, initial-scale=1">
467
- <title>${Yn(e)} - typebulb</title>
467
+ <title>${Qn(e)} - typebulb</title>
468
468
  <script>
469
469
  // Theme engine. Sets html[data-theme] before stylesheets paint (no flash) and
470
470
  // exposes the tb.theme accessor via window.__tbTheme. The override is persisted
@@ -519,7 +519,7 @@ ${JSON.stringify(h,null,2)}
519
519
  html[data-theme="light"] { color-scheme: light; }
520
520
  </style>
521
521
  <style>
522
- ${r}
522
+ ${n}
523
523
  </style>
524
524
  </head>
525
525
  <body>
@@ -533,13 +533,13 @@ ${c?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
533
533
  ${_r}
534
534
  </script>
535
535
 
536
- ${Kn}
536
+ ${Xn}
537
537
 
538
538
  <script type="module">
539
539
  ${u(t)}
540
540
  </script>
541
541
  </body>
542
- </html>`}var Kn=`<script>
542
+ </html>`}var Xn=`<script>
543
543
  (function () {
544
544
  if (window.parent === window) return;
545
545
  var de = document.documentElement;
@@ -591,34 +591,34 @@ ${u(t)}
591
591
  }
592
592
  });
593
593
  })();
594
- </script>`;function Yn(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Xn(n){let e={};for(let[t,r]of Object.entries(n))e[t]=r.startsWith("https://")?"/proxy/"+r:r;return e}import*as Ge from"fs/promises";import*as Pt from"path";import{existsSync as Or}from"fs";import{execFile as Qn}from"child_process";import{promisify as Zn}from"util";var es=Zn(Qn);async function ze(n,e){let t=n.filter(s=>!ts(s,e));if(t.length===0)return;await Ge.mkdir(e,{recursive:!0});let r=Pt.join(e,"package.json");Or(r)||await Ge.writeFile(r,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${t.join(", ")}`),await es("npm",["install","--no-audit","--no-fund",...t],{cwd:e,shell:!0})}function ts(n,e){return Or(Pt.join(e,"node_modules",rs(n)))}function Ke(n){let e=new Set,t=/\bimport\s+(?:[\s\S]*?\s+from\s+)?['"]([^./][^'"]*)['"]/g,r;for(;r=t.exec(n);){let s=r[1];if(s.includes(":"))continue;let o=s.startsWith("@")?s.split("/").slice(0,2).join("/"):s.split("/")[0];e.add(o)}return[...e]}function rs(n){if(n.startsWith("@")){let t=n.indexOf("/");if(t<0)return n;let r=n.indexOf("@",t+1);return r<0?n:n.slice(0,r)}let e=n.indexOf("@");return e<0?n:n.slice(0,e)}async function Ir(n){let t=(await G.readdir(n)).find(r=>r.endsWith(".bulb.md"));return t?ce.join(n,t):null}async function Ce(n){let e=await G.readFile(n,"utf-8"),t=tr(e);if(!t)throw new Error("Invalid .bulb.md file format");let r=rr(t);return{bulb:r,config:sr(r.config)}}async function Rt(n,e,t){let r=lt(n,{serverOnly:!0});if(r.error)throw new Error(`Server compilation error: ${r.error}`);let s=r.code;t&&(s=await Xt(s,t));let o=ce.join(e,".typebulb");await G.mkdir(o,{recursive:!0});let i=Ke(s);i.length>0&&await ze(i,o);let a=ce.join(o,"server.mjs");return await G.writeFile(a,s,"utf-8"),await import(`${ns(a).href}?t=${Date.now()}`)}async function Et(n,e,t,r){let{bulb:s,config:o}=await Ce(n),i=nr(s.data),a=lt(s.code,{jsxImportSource:o.jsxImportSource});a.error&&console.error("Compilation error:",a.error);let{importMap:c}=await qe.buildImportMap(a.code,o.dependencies??{},r?new Set([r.name]):void 0);r&&(c.imports[r.name]=r.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(n);o.env?.length&&fe(o.env,d);let u=null;return s.server&&t&&(u=await Rt(s.server,d,r)),{html:l,bulb:s,serverExports:u}}import{Hono as ps}from"hono";import{serve as fs}from"@hono/node-server";import{streamSSE as hs}from"hono/streaming";import*as Z from"fs/promises";import*as j from"path";var A=class extends Error{constructor(e,t="unknown",r=!1){super(e),this.code=t,this.retryable=r}},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=`
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=`
595
595
 
596
- `){let r=e.filter(s=>s.role==="system").map(s=>s.content);return{system:r.length?r.join(t):void 0,conversationMessages:e.filter(s=>s.role!=="system")}}parseJsonError(e,t,r=!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 r&&(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,r=e.code||"unknown",s=!!e.retryable;throw new A(t,r,s)}if("error"in e&&e.error){let t=this.extractErrorMessage(e.error);throw new A(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,r,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(i),stream:s};if(r?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),o&&(a.system=[{type:"text",text:o,cache_control:{type:"ephemeral"}}]),this.isReasoningEnabled(r)){let c=r.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(""),r=e.content.filter(s=>s.type==="thinking").map(s=>s.thinking).join(`
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(`
597
597
 
598
- `);return{text:t,reasoning:r||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((r,s)=>s===t?{role:r.role,content:[{type:"text",text:r.content,cache_control:{type:"ephemeral"}}]}:r)}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,r,s){let o=this.convertMessagesToInput(e),i={model:t,input:o,stream:s};return r?.webSearch!==!1&&(i.tools=[{type:"web_search"}]),this.isReasoningEnabled(r)&&(i.reasoning={effort:this.effortMap[r.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||"",r;if(e.output&&Array.isArray(e.output))for(let s of e.output)s.type==="reasoning"&&s.summary&&(r=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:r}}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 A(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(`
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(`
600
600
 
601
- `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var Ae=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,r,s){let{system:o,conversationMessages:i}=this.extractSystemMessages(e,`
602
- `),c={contents:i.map(l=>({role:l.role==="assistant"?"model":"user",parts:[{text:l.content}]}))};return r?.webSearch!==!1&&(c.tools=[{google_search:{}}]),o&&(c.systemInstruction={role:"system",parts:[{text:o}]}),this.isReasoningEnabled(r)&&(c.generationConfig={temperature:.7+r.reasoning*.1}),c}parseError(e,t){if(!e)return{message:`HTTP ${t}`};try{let r=JSON.parse(e),s=Array.isArray(r)?r[0]?.error:r?.error;return s&&typeof s=="object"?{message:(s.message||`HTTP ${t}`).split(`
603
- `)[0],type:s.status,code:s.code?.toString()}:r.message?{message:r.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)||"",r=e.candidates?.[0]?.finishReason,s="complete";return r==="MAX_TOKENS"?s="interrupted":(r==="SAFETY"||r==="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(r=>r.text).filter(Boolean).join("")}checkGeminiError(e){if(typeof e=="object"&&e!==null&&"error"in e){let t=e.error,r;if(typeof t=="string")r=t;else if(typeof t=="object"&&t!==null){let s=t;r=s.message||s.status||"Gemini returned an error"}else r="Gemini returned an error";throw new A(r)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new A(`Prompt blocked: ${t}`)}}};var De=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 r={Authorization:`Bearer ${e}`,"x-api-key":e,"Content-Type":"application/json",Accept:"application/json","X-Title":"Typebulb"};return t&&(r["HTTP-Referer"]=t,r.Referer=t,r.Origin=t),r}buildPayload(e,t,r,s){let o={model:t,messages:e,stream:s};return r?.webSearch===!0&&(o.plugins=[{id:"web"}]),this.isReasoningEnabled(r)&&(o.reasoning={effort:this.effortMap[r.reasoning]}),o}parseError(e,t){return this.parseJsonError(e,t,!0)}parseNonStreamingResponse(e){if(!this.hasChoices(e))return{text:""};let t=e.choices[0],r=t?.message?.content??t?.text??"",s=t?.message?.reasoning??e.reasoning;return{text:r,reasoning:s}}parseProviderStreamChunk(e){if(!this.hasChoices(e))return null;let t=e.choices[0];if(!t)return null;let r=t.delta||t.message;if(!r)return null;let s=r.content||void 0,o=r.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 ss=new Map([["openai",new Ie],["openrouter",new De],["anthropic",new Oe],["gemini",new Ae]]);function X(n){let e=ss.get(n);if(!e)throw new Error(`Unsupported protocol: ${n}`);return e}async function kt(n,e){let t=X(n.protocol),r=t.getPath(e.model,e.stream),s=new URL(r,n.baseUrl).toString(),o=t.buildHeaders(n.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(n,e){let t=X(e),r=await n.text().catch(()=>""),{message:s}=t.parseError(r,n.status),o=n.status,i="unknown";return o===429?i="rate_limit":o===413&&(i="context_exceeded"),{code:i,message:s,retryable:o===429}}function Ar(n){let e=n.indexOf(`\r
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,`
602
+ `),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
604
604
  \r
605
- `),t=n.indexOf(`
606
-
607
- `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function _t(n){let t=n.split(/\r?\n/).filter(s=>s.startsWith("data:"));if(!t.length)return null;let r=t.map(s=>s.replace(/^data:\s?/,"")).join(`
608
- `).trim();if(!r)return null;if(r==="[DONE]")return"done";try{return JSON.parse(r)}catch{return null}}async function Dr(n,e,t){let r=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([n.read(),i]):await n.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+=r.decode(l,{stream:!0});let{pos:d,len:u}=Ar(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}=Ar(s)}}return{receivedAnyData:o}}async function Ct(n,e){let t=e??(n.headers.get("X-Provider-Protocol")||"openai"),r=X(t);if(!n.body)throw new Error("Response body is missing");let s=n.body.getReader(),o="";return await Dr(s,i=>{let a=r.parseStreamChunk(i);a?.text&&(o+=a.text)}),o}import*as Ot from"fs/promises";import*as $e from"path";var Ye=class{async get(e){let t=F(e),r=$e.join(_e,t+".bin"),s=$e.join(_e,t+".json");try{let[o,i]=await Promise.all([Ot.readFile(r),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 r=F(e),s=$e.join(_e,r+".bin"),o=$e.join(_e,r+".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 as,readFile as Mr,writeFile as Nr,unlink as Fe,mkdir as cs}from"fs/promises";import{mkdirSync as ls,writeFileSync as $r,appendFileSync as ds,readFileSync as jr}from"fs";import*as de from"path";import{join as It,resolve as os}from"path";import{homedir as is}from"os";function Xe(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?It(n,".."):It(is(),".typebulb")}function Q(){return process.env.TYPEBULB_SERVERS_DIR||It(Xe(),"servers")}function le(n){let e=os(n);return(process.platform==="win32"?e.toLowerCase():e).replace(/\\/g,"/")}var Fr=1e6;function At(n){return de.join(Q(),`${n}.json`)}function Qe(n){return de.join(Q(),`${n}.log`)}function Lr(n){let e=Qe(n);try{ls(Q(),{recursive:!0}),$r(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),r=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(ds(e,c),s+=c.length,s>2*Fr){let l=jr(e),d=l.subarray(Math.max(0,l.length-Fr));$r(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),r(a,...c))),()=>{process.stdout.write=t,process.stderr.write=r}}function Dt(n,e=0){try{let t=jr(Qe(n)),r=e>=0&&e<=t.length?e:0;return{text:t.subarray(r).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function us(n){try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}async function Br(n){await cs(Q(),{recursive:!0}),await Nr(At(n.pid),JSON.stringify(n))}async function Ur(n,e){let t=At(n);try{let r=JSON.parse(await Mr(t,"utf8"));if(r.denied===e)return;r.denied=e,await Nr(t,JSON.stringify(r))}catch{}}async function $t(n){await Fe(At(n)).catch(()=>{}),await Fe(Qe(n)).catch(()=>{})}async function Ft(){let n;try{n=await as(Q())}catch{return[]}let e=[];return await Promise.all(n.map(async t=>{if(!t.endsWith(".json"))return;let r=de.join(Q(),t),s;try{s=JSON.parse(await Mr(r,"utf8"))}catch{await Fe(r).catch(()=>{});return}s&&typeof s.pid=="number"&&us(s.pid)?e.push(s):(await Fe(r).catch(()=>{}),s?.pid&&await Fe(Qe(s.pid)).catch(()=>{}))})),e.sort((t,r)=>t.startedAt-r.startedAt)}async function Wr(n){try{process.kill(n,"SIGTERM")}catch{}await $t(n)}var Vr="127.0.0.1",ms=new Set(["localhost","127.0.0.1","::1"]);function gs(n){if(n)try{return new URL(n.includes("://")?n:`http://${n}`).hostname}catch{return}}function Jr(n){let e=gs(n);return!!e&&ms.has(e)}function Ze(n){return n instanceof Error?n.message:"Unknown error"}async function qr(n){let{getHtml:e,basePath:t,port:r,reloadEmitter:s,getServerExports:o,localOverride:i,trusted:a=!1,trustHint:c}=n,l=new ps;l.use("*",async(p,f)=>{if(!Jr(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)";Ur(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&&!Jr(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=Ze(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=Ze(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=Ze(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=ys(w,C);if(typeof L=="string")return p.json({message:L,code:"unknown",retryable:!1},400);let st=[...g?[{role:"system",content:g}]:[],...f.map(Me=>({role:Me.role,content:Me.content}))],ee=await kt(L,{model:L.model,messages:st,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 A)return p.json({message:f.message,code:f.code,retryable:f.retryable},500);let g=Ze(f);return p.json({message:g,code:"unknown",retryable:!1},500)}}),l.get("/__models",async p=>{try{let f=await vs();return p.json(f)}catch{return p.json([],200)}});let m=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],S=new Ye;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":xs(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,st]=w.body.tee();return(async()=>{try{let ee=await new Response(st).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=>hs(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 $=fs({fetch:l.fetch,port:r,hostname:Vr});return{port:r,close:()=>$.close()}}var Gr={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"};function ys(n,e){let t=n??process.env.TB_AI_PROVIDER,r=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(!r)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=Gr[t],i=process.env[o];return i?{apiKey:i,baseUrl:s.defaultBaseUrl,protocol:t,model:r,isFreeModel:!1}:`No API key for '${t}'. Set ${o} in your .env file.`}var bs="https://api.typebulb.com/api/models",ws=1440*60*1e3,ue=null;async function vs(){if(!ue||Date.now()-ue.fetchedAt>ws){let n=await fetch(bs);if(!n.ok)return ue?Hr(ue.models):[];ue={models:await n.json(),fetchedAt:Date.now()}}return Hr(ue.models)}function Hr(n){let e=new Set(Object.entries(Gr).filter(([,t])=>!!process.env[t]).map(([t])=>t));return n.filter(t=>e.has(t.provider))}function Mt(n,e){let t=new Headers;return n&&t.set("Content-Type",n),e&&t.set("Cache-Control",e),t.set("Access-Control-Allow-Origin","*"),t.set("Cross-Origin-Resource-Policy","cross-origin"),t}function xs(n){switch(j.extname(n).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(n,e){let t=j.resolve(e,n),r=j.normalize(e),s=j.normalize(t);if(s!==r&&!s.startsWith(r+j.sep))throw new Error("Path traversal detected - access denied");return t}async function jt(n){let e=await import("net");return new Promise(t=>{let r=e.createServer();r.listen(n,Vr,()=>{let s=r.address(),o=typeof s=="object"&&s?s.port:n;r.close(()=>t(o))}),r.on("error",()=>{t(jt(n+1))})})}import Ss from"open";async function zr(n){await Ss(n)}import Kr from"chokidar";var Yr={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Lt(n){let{bulbPath:e,emitter:t}=n,r=Kr.watch(e,Yr);return r.on("change",()=>{t.emit("reload")}),()=>r.close()}function Xr(n){let{dir:e,onChange:t,debounceMs:r=150}=n,s,o=Kr.watch(e,Yr);return o.on("all",()=>{s&&clearTimeout(s),s=setTimeout(t,r)}),()=>{s&&clearTimeout(s),o.close()}}import*as k from"fs/promises";import*as E from"path";import*as pe from"path";var Ps=pe.join(We,"pkg"),Rs=pe.join(We,"files"),Es=pe.join(We,"negative.json"),tt=class{pkgMem=new Map;fileMem=new Map;negativeCache=new K(new ie(Es));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await x();let t=await Y(Qr(e));return this.pkgMem.set(e,t),t}async setCachedDts(e,t,r){let s={content:t,url:r};this.pkgMem.set(e,s),await et(async()=>{await x(),await I(Qr(e),JSON.stringify(s))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await x();let t=await Ue(Zr(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await et(async()=>{await x(),await I(Zr(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await et(async()=>{await x(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return et(()=>this.negativeCache.clearNegative(e))}};async function et(n){try{await n()}catch{}}function Qr(n){return pe.join(Ps,F(n)+".json")}function Zr(n){return pe.join(Rs,F(n)+".txt")}var Bt;function ks(){return Bt||(Bt=wt({cache:new tt,cdnClient:Tr,packageService:qe,versionResolver:kr})),Bt}var en="file:///node_modules/";async function tn(n){let e=Je(n.emitKey,"typecheck");await x(),await k.rm(e,{recursive:!0,force:!0}),await k.mkdir(e,{recursive:!0});let t=Os(n.jsxImportSource,n.dependencies),r=await ks().resolve(n.code,n.dependencies,t),s=n.local?.name,o=s?r.filter(d=>d.pkg!==s):r,i=new Set;for(let d of o)for(let u of d.files){let h=rt(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=rt(u.path);h&&(a[u.module]=[`./node_modules/${h}`])}for(let d of o){if(d.ambient)continue;let u=rt(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=rt(u.path);h&&c.add(`node_modules/${h}`)}if(n.local){delete a[n.local.name];let d=await Is(n.local,e);d?a[n.local.name]=[`./node_modules/${n.local.name}/${d}`]:console.warn(` local: '${n.local.name}' ships no type defs; check cannot type against it.`)}let l=Ts(n.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"),n.code,"utf8"),await k.writeFile(E.join(e,"tb.d.ts"),mt,"utf8"),{dir:e}}function Ts(n,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:_s([...ft,...ht]),jsx:"react-jsx",jsxImportSource:n??"react",strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0,baseUrl:".",paths:e},include:["code.tsx","tb.d.ts",...t]}}function _s(n){return n.filter(e=>!e.since).map(e=>Cs(e.name))}function Cs(n){return n.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 Os(n,e){let t=n??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function rt(n){if(!n.startsWith(en))return;let e=n.slice(en.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function Is(n,e){if(!n.typesAbs)return;let t=E.dirname(n.typesAbs),r=E.join(e,"node_modules",n.name);for(let s of await As(t)){let o=E.join(r,E.relative(t,s));await k.mkdir(E.dirname(o),{recursive:!0}),await k.copyFile(s,o)}return E.basename(n.typesAbs)}async function As(n){let e=[];async function t(r){let s=await k.readdir(r,{withFileTypes:!0});for(let o of s){let i=E.join(r,o.name);o.isDirectory()?await t(i):/\.d\.ts(\.map)?$/.test(o.name)&&e.push(i)}}return await t(n),e}import*as D from"fs/promises";import*as W from"path";import{existsSync as Ds}from"fs";var $s="^22";async function rn(n){let e=Je(n.emitKey,"typecheck-server");await x(),await D.rm(e,{recursive:!0,force:!0}),await D.mkdir(e,{recursive:!0});let t=W.join(n.bulbDir,".typebulb"),r=Ke(n.server).filter(i=>i!==n.local?.name);await ze([`@types/node@${$s}`,...r],t);let s=W.join(t,"node_modules"),o=W.join(e,"node_modules");return await Ms(s,o),await D.writeFile(W.join(e,"server.ts"),n.server,"utf8"),await D.writeFile(W.join(e,"tb.d.ts"),gt,"utf8"),await D.writeFile(W.join(e,"tsconfig.json"),JSON.stringify(Fs(n.local),null,2)+`
611
- `,"utf8"),{dir:e}}function Fs(n){let e={target:"es2023",module:"esnext",moduleResolution:"node",lib:["ES2023"],types:["node"],strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0};if(n?.typesAbs){let t=o=>o.replace(/\\/g,"/"),r=t(W.dirname(n.typesAbs)),s=t(n.typesAbs).replace(/\.d\.ts$/,"");e.baseUrl=".",e.paths={[n.name]:[s],[`${n.name}/*`]:[`${r}/*`]}}return{compilerOptions:e,include:["server.ts","tb.d.ts"]}}async function Ms(n,e){if(!Ds(n)){await D.mkdir(e,{recursive:!0});return}await D.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await D.symlink(n,e,t)}import{readFileSync as Ns,writeFileSync as js,mkdirSync as Ls}from"fs";import{join as Bs}from"path";function nn(){return Bs(Xe(),"trust.json")}function Ut(){try{let n=JSON.parse(Ns(nn(),"utf8"));return new Set(Array.isArray(n)?n:[])}catch{return new Set}}function Us(n){Ls(Xe(),{recursive:!0}),js(nn(),JSON.stringify([...n]))}function sn(n){return Ut().has(le(n))}function on(n,e){let t=Ut(),r=le(n);(e?t.has(r):!t.has(r))||(e?t.add(r):t.delete(r),Us(t))}function an(){return[...Ut()]}var Js="0.9.3";async function Hs(n,e){let{bulb:t,config:r}=await Ce(n);!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 tn({code:t.code,dependencies:r.dependencies??{},jsxImportSource:r.jsxImportSource,emitKey:n,local:e});s.push({role:"client",dir:i})}if(t.server){let{dir:i}=await rn({server:t.server,bulbDir:R.dirname(n),emitKey:n,local:e?{name:e.name,typesAbs:e.typesAbs}:void 0});s.push({role:"server",dir:i})}let o=!1;for(let{role:i,dir:a}of s){let{stdout:c,exitCode:l}=await Vs(a);for(let d of c.split(/\r?\n/))d.trim()&&console.log(`${i} ${d}`);l!==0&&(o=!0)}o&&process.exit(1)}function Vs(n){return new Promise(e=>{let t=Ws("npx",["tsc","--noEmit"],{cwd:n,shell:!0}),r="";t.stdout?.on("data",s=>{r+=s.toString()}),t.stderr?.on("data",s=>{r+=s.toString()}),t.on("close",s=>e({stdout:r,exitCode:s??1}))})}async function qs(n,e,t){ct();let r=async()=>{let{bulb:s,config:o}=await Ce(n),i=R.dirname(n);o.env?.length&&fe(o.env,i),await Rt(s.server,i,t)};if(console.log(`Running ${R.basename(n)}...`),await r(),e){console.log(`Watching for changes...
612
- `);let s=new Wt;s.on("reload",async()=>{try{console.log("Re-running..."),await r()}catch(o){console.error("Error:",o)}}),Lt({bulbPath:n,emitter:s})}}async function Gs(n,e,t,r){let s=process.cwd(),o=Lr(process.pid),i=e.watch?new Wt:void 0;ct(),console.log(`Loading ${R.basename(n)}...`);let{html:a,bulb:c,serverExports:l}=await Et(n,e.watch,e.trust,r),d=await jt(e.port),u=await qr({getHtml:()=>a,basePath:s,port:d,reloadEmitter:i,getServerExports:()=>l,localOverride:r?{name:r.name,serveDir:r.serveDir}:void 0,trusted:e.trust,trustHint:t}),h=`http://localhost:${d}`;await Br({pid:process.pid,port:d,url:h,file:n,startedAt:Date.now(),trust:e.trust}),console.log(`
605
+ `),t=r.indexOf(`
606
+
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
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
614
614
  `),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(n,!0,e.trust,r);a=_.html,l=_.serverExports,i.emit("reload"),console.log(`Done. Browser reloading...
616
- `)}catch(_){console.error("Compile error:",_)}}),b=Lt({bulbPath:n,emitter:O}),r){let{name:_,serveDir:$}=r;m=Xr({dir:$,onChange:()=>{console.log(`Local package '${_}' changed. Browser reloading...
617
- `),i.emit("reload")}})}}e.open&&await zr(h);let S=async()=>{console.log(`
618
- Shutting down...`),u.close(),b?.(),m?.(),o(),await $t(process.pid);let O=R.join(R.dirname(n),".typebulb","server.mjs");await nt.rm(O,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",S),process.on("SIGTERM",S)}function zs(n,e){return/^\d+$/.test(e)?n.find(t=>t.pid===parseInt(e,10)):n.find(t=>le(t.file)===le(e))}function cn(n,e){for(let t of n)e(` ${t.url} pid ${t.pid} ${t.trust?"trusted":"restricted"} ${t.file}`)}function ln(n,e){if(!n.length){console.log("No running bulb servers.");return}console.log("Running bulb servers:"),cn(n,t=>console.log(t)),console.log(`
619
- `+e)}function dn(n,e,t){let r=zs(n,e);if(r)return r;console.error(`No running server for '${e}'.`),n.length?(console.error(`Running servers (try \`typebulb ${t} <file|pid>\`):`),cn(n,s=>console.error(s))):console.error("No bulb servers are running."),process.exit(1)}async function Ks(n,e){let t=await Ft();if(!n){ln(t,"Run `typebulb logs <file|pid>` to print one server's console.");return}let r=dn(t,n,"logs"),s=Dt(r.pid),o=s.text;if(e.lines&&e.lines>0){let i=o.split(`
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(`
620
620
  `);i.length&&i[i.length-1]===""&&i.pop(),o=i.slice(-e.lines).join(`
621
621
  `)}if(process.stdout.write(o),o&&!o.endsWith(`
622
622
  `)&&process.stdout.write(`
623
- `),e.follow){let i=s.offset,a=setInterval(()=>{let l=Dt(r.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 Ys(n){let e=await Ft();if(!n){ln(e,"Run `typebulb stop <file|pid>` to stop one.");return}let t=dn(e,n,"stop");await Wr(t.pid),console.log(`Stopped ${R.basename(t.file)} (pid ${t.pid}, ${t.url}).`)}async function Xs(n,e){if(!n){e||(console.error("Usage: typebulb untrust <file.bulb.md>"),process.exit(1));let r=an();if(!r.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 r)console.log(` ${s}`);return}let t=R.resolve(n);t.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),on(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 Qs(){let n=Qt(process.argv.slice(2));if(n.version&&(console.log(`typebulb ${Js}`),process.exit(0)),n.help&&(Zt(),process.exit(0)),n.subcommand==="logs"){await Ks(n.file||void 0,{follow:n.follow,lines:n.lines});return}if(n.subcommand==="stop"){await Ys(n.file||void 0);return}if(n.subcommand==="trust"||n.subcommand==="untrust"){await Xs(n.file||void 0,n.subcommand==="trust");return}let e;if(!n.file||n.file==="."){let a=await Ir(process.cwd());a||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=a}else e=R.resolve(n.file);try{await nt.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=!n.noTrust&&sn(e);t&&!n.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),n.trust=n.noTrust?!1:n.trust||t;let r=n.file&&n.file!=="."?n.file:R.relative(process.cwd(),e)||R.basename(e),s=`npx typebulb --trust ${r.includes(" ")?`"${r}"`:r}`,o;try{o=await Ce(e)}catch{}let i;if(n.local){o&&!(n.local.name in(o.config.dependencies??{}))&&(console.error(`--replace: '${n.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),o&&(!o.bulb.code||n.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{i=await Yt(n.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(n.subcommand==="check"){await Hs(e,i);return}if(o&&o.bulb.server&&(!o.bulb.code||n.server)){n.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
624
- ${s}`),process.exit(1)),await qs(e,n.watch,i);return}await Gs(e,n,s,i)}Qs().catch(n=>{console.error("Error:",n.message),process.exit(1)});
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)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typebulb",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Local bulb runner CLI for Typebulb",
5
5
  "license": "MIT",
6
6
  "engines": { "node": ">=18" },