typebulb 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,65 @@
1
1
  #!/usr/bin/env node
2
- import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S from"path";import{pathToFileURL as Jn}from"url";import{execFile as Vn,spawn as qn}from"child_process";import{promisify as Gn}from"util";import{EventEmitter as Rt}from"events";var Tr={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 Tt(s){try{let e=s.split(`
3
- `),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 n=_r(r);if(!n)return null;let i=new Map;for(;t<e.length;){let a=e[t]?.trim()?.match(/^\*\*(.+)\*\*$/);if(a){let l=a[1].trim();for(t++;t<e.length&&e[t]?.trim()==="";)t++;let c=e[t]?.match(/^(`{3,})(\w*)\s*$/);if(!c){t++;continue}let d=c[1];t++;let p=[];for(;t<e.length&&!e[t]?.match(new RegExp(`^${d}\\s*$`));)p.push(e[t]),t++;t++,i.set(l,p.join(`
4
- `))}else t++}return{frontmatter:n,files:i}}catch{return null}}function _r(s){let e={};for(let t of s){let r=t.indexOf(":");if(r===-1)continue;let n=t.slice(0,r).trim(),i=t.slice(r+1).trim();switch(n){case"format":e.format=i;break;case"name":e.name=Cr(i);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function Cr(s){return s.startsWith('"')&&s.endsWith('"')?s.slice(1,-1).replace(/\\"/g,'"'):s.startsWith("'")&&s.endsWith("'")?s.slice(1,-1):s}function _t(s){let e=t=>s.files.get(Tr[t].path)||"";return{name:s.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 Ir(s){try{return JSON.parse(s),!0}catch{}return!!(/^\s*<[\s\S]*>/.test(s)||/^---\s*$/m.test(s)||/^\w[\w\s]*:[ \t]/m.test(s))}function Ct(s){let e=s.trim();return e?Ir(e)?[e]:s.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function It(s){if(!s.trim())return{};try{return JSON.parse(s)}catch{return{}}}import{transform as Or}from"sucrase";function Ke(s,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:r}=Or(s,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:r}}catch(r){return{code:"",error:String(r)}}}var ce="https://esm.sh",le="https://cdn.jsdelivr.net/npm/",Ye="https://data.jsdelivr.com/v1/package/npm/";function Ot(s){let e=(s||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var g=class s{constructor(e,t,r){let n=typeof e=="string"?s.parse(e):e;this.name=n.name,this.version=Z(t??n.version),this.subpath=Z(r??n.subpath)}static parse(e){let t=Ot(e||"");if(!t.length)return new s({name:""});if(t[0].startsWith("@")){let n=t[0],[i,o]=Dt(t[1]??""),a=Z(t.slice(2).join("/"));return new s({name:`${n}/${i}`,version:o,subpath:a})}else{let[n,i]=Dt(t[0]),o=Z(t.slice(1).join("/"));return new s({name:n,version:i,subpath:o})}}static fromUrl(e){try{let t=new URL(e),r=new URL(ce).host,n=new URL(le).host;if(t.host===r){let i=Ot(t.pathname.replace(/^\/v\d+\//,"/"));if(!i.length)return;let o=i[0].startsWith("@")?`${i[0]}/${i[1]??""}`:i[0];return s.parse(o)}if(t.host===n){let i=t.pathname.split("/npm/")[1];if(!i)return;let o=i.split("/")[0]||"";return s.parse(o)}return}catch{return}}static versionFromUrl(e){return s.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 s.parse(e).name}withVersion(e){return new s({name:this.name,version:Z(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://")}},Z=s=>s&&s.length?s:void 0,Dt=s=>{let e=s.indexOf("@");return e<0?[s,void 0]:[s.slice(0,e),Z(s.slice(e+1))]};async function C(s){try{return await s()}catch{return}}var de=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=ce,this.jsDelivrBase=le,this.jsDelivrMeta=Ye,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 g(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:n=!1,external:i}=t,o=new URLSearchParams({target:r});return n&&o.append("bundle",""),i?.length&&o.append("external",i.join(",")),`${this.esmHost}/${e}?${o.toString()}`}async pinEsmUrl(e,t="es2022"){let r=this.buildEsmUrl(e,{target:t}),n=await C(()=>this.http.head(r));return n?.ok?n.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 n=await this.tryResolveFromUrls([this.buildEsmUrl(e),`${this.esmHost}/${e}`]);return this.pinCache.set(e,{value:n,ts:t}),n}async tryResolveFromUrls(e){for(let t of e){let r=await C(()=>this.http.head(t)),n=this.parseVersionFromUrl(r?.url||t);if(n)return n}}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 C(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(e)}`));if(!r?.versions?.length){await this.cache.recordNegative(e);return}await this.cache.clearNegative(e);let n=r.distTags&&Object.keys(r.distTags).length?r.distTags:void 0;return await this.cache.setIndex(e,r.versions,n),r}parseVersionFromUrl(e){let t=g.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:p,peerDependenciesMeta:m}=r;return{name:e,version:t,dependencies:d,peerDependencies:p,peerDependenciesMeta:m}}let n=this.packageJson(new g(`${e}@${t}`)),i=await C(()=>this.http.getJson(n));if(!i)return;let o=d=>d&&Object.keys(d).length?d:void 0,a=o(i.dependencies),l=o(i.peerDependencies),c=o(i.peerDependenciesMeta);return await this.cache.setMeta(e,t,a,l,c),{name:e,version:t,dependencies:a,peerDependencies:l,peerDependenciesMeta:c}}};var At=s=>s.startsWith("@types/"),pe=s=>Object.keys(s?.peerDependencies||{}).filter(e=>!At(e)),Xe=s=>Object.keys(s?.dependencies||{}).filter(e=>!At(e)),Dr=s=>pe(s).filter(e=>!s?.peerDependenciesMeta?.[e]?.optional),ue=class{constructor(e){this.cdn=e}async resolve(e,t){let r=await this.fetchMeta(e),{allRoots:n,autoAddedPeers:i}=await this.expandWithPeers(r,t),o=this.computeFlags(n);return{allRoots:n,flags:o,autoAddedPeers:i}}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(i=>[i.name,i])),n=[];for(let i of e)for(let o of Dr(i.meta))!r.has(o)&&!n.some(a=>a.name===o)&&n.push({name:o,requiredBy:i.name});for(let{name:i,requiredBy:o}of n)try{let a=await t(i),l=await this.cdn.fetchPackageMeta(i,a);r.set(i,{name:i,version:a,meta:l})}catch(a){console.warn(`[typebulb] Failed to resolve peer "${i}" for "${o}":`,a)}return{allRoots:[...r.values()],autoAddedPeers:n.filter(i=>r.has(i.name))}}computeFlags(e){let t=new Set(e.flatMap(i=>pe(i.meta))),r=new Map;for(let i of e)for(let o of Xe(i.meta))r.set(o,(r.get(o)||0)+1);let n=new Set([...r.entries()].filter(([,i])=>i>=2).map(([i])=>i));return new Map(e.map(i=>[i.name,{isPeerRoot:t.has(i.name),hasPeers:pe(i.meta).length>0,isSharedDep:n.has(i.name)}]))}};var he=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 C(()=>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 n=await C(()=>this.cdn.fetchVersionsIndex(e));if(n?.versions?.length){let o=this.selectVersionFromIndex(n.versions,t,n.distTags);if(o){if(this.semver.isExactVersion(o))return await this.cache.setPinnedExact(e,t,o),o}else{console.warn("[versionResolver] Invalidating stale versions cache for",e,"- range",t,"not satisfied"),await this.cache.invalidateVersionsCache(e);let a=await C(()=>this.cdn.fetchVersionsIndex(e));if(a?.versions?.length){let l=this.selectVersionFromIndex(a.versions,t,a.distTags);if(l&&this.semver.isExactVersion(l))return await this.cache.setPinnedExact(e,t,l),l}}}let i=await this.cdn.resolveExactVersion(`${e}@${t}`);if(i&&this.semver.isExactVersion(i))return await this.cache.setPinnedExact(e,t,i),i}async effectivePackage(e,t){let r=new g(e),n=r.root(),i=t[n],o=i?await C(()=>this.cache.getPinnedExact(n,i))??await C(()=>this.resolveExactForRoot(n,i)):void 0;return{effectivePackage:o?r.withVersion(o).format():e,root:n,range:i,pinned:o}}};import{init as Ar,parse as Mr}from"es-module-lexer";var ee=class s{constructor(e,t,r,n){this.version=e,this.cdn=t,this.peer=r,this.cache=n}extractImportsSync(e){let t=new Set;for(let r of s.importPatterns){r.lastIndex=0;for(let n of e.matchAll(r))g.isBare(n[1])&&t.add(n[1])}return Array.from(t)}async extractImports(e){let t=new Set,r=n=>{g.isBare(n)&&t.add(n)};try{await Ar;let[n]=Mr(e);n.forEach(i=>r(e.slice(i.s,i.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,r){let n=(await this.extractImports(e)).filter(p=>!r?.has(g.rootOf(p))),i=[...new Set(n.map(g.rootOf))],o=await Promise.all(i.map(async p=>({name:p,version:await this.resolveVersion(p,t)}))),{allRoots:a,flags:l,autoAddedPeers:c}=await this.peer.resolve(o,p=>this.resolveVersion(p,t)),d=this.buildEntries([...n,...c.map(p=>p.name)],a,l,t);return{importMap:{imports:Object.fromEntries(d)},prefetchUrls:d.map(([,p])=>p)}}async resolveVersion(e,t){let r=t[e],n=r?`${e}@${r}`:e,i=await this.version.resolveExactForRoot(e,r);if(!i){let o=await C(()=>this.cdn.pinEsmUrl(n));if(!o)throw new Error(`Cannot resolve ${n}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);i=g.versionFromUrl(o),i&&r&&await C(()=>this.cache.setPinnedExact(e,r,i))}if(!i)throw new Error(`Cannot resolve ${n}: no concrete version found.`);return i}buildEntries(e,t,r,n){let i=new Map(t.map(f=>[f.name,f])),o=f=>{let R=i.get(g.rootOf(f));return new g(f).withPreferredVersion(R.version,n[R.name]).format()},a=new Set([...r.entries()].filter(([,f])=>f.isPeerRoot||f.isSharedDep).map(([f])=>f)),l=new Set(e.filter(f=>f!==g.rootOf(f)).map(g.rootOf)),c=[],d=new Set,p=new Set(e.filter(f=>f===g.rootOf(f))),m=new Set;for(let f of e){let R=g.rootOf(f),v=i.get(R),{isPeerRoot:E,hasPeers:ae,isSharedDep:u}=r.get(R),h=l.has(R),y=f!==R,b=!(E||u)&&(h||!ae),I=this.singletonDepsOf(v,a),W=y&&p.has(R);W&&m.add(R);let L=W?[...I,R]:I.length?I:void 0;c.push([f,this.cdn.buildEsmUrl(o(f),{bundle:b,external:L})]),d.add(f)}let w=new Set([...a,...m]);for(let f of w)i.has(f)&&(d.has(f)||c.push([f,this.cdn.buildEsmUrl(o(f),{})]),c.push([`${f}/`,`${this.cdn.esmHost}/${o(f)}/`]));return c}singletonDepsOf(e,t){return[...new Set([...pe(e.meta),...Xe(e.meta)])].filter(r=>t.has(r))}};ee.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as Mt,satisfies as $r,maxSatisfying as Qe,major as Fr,prerelease as jr,rsort as Nr,valid as Lr}from"semver";var Oe=class{cmp(e,t){return e===t?0:Mt(e,t)?1:Mt(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!$r(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let r=Qe(e,t,{includePrerelease:!0});return r===null?void 0:r}pickLatest(e){return e?.length?Nr(e)[0]:void 0}selectBestVersion(e,t){if(!e?.length)return;let r=t?.range?.trim()||"*",n=t?.preferStable??!0,i=t?.distTags?.latest;if(i&&e.includes(i)&&this.satisfies(r,i))return i;if(n){let a=Qe(e,r,{includePrerelease:!1});if(a)return a}return Qe(e,r,{includePrerelease:!0})??void 0}majorOf(e){return Fr(e)}isPrerelease(e){return jr(e)!==null}isExactVersion(e){return Lr(e)!==null}},q=new Oe;function $t(s,e){let t=new de(s,e),r=new ue(t),n=new he(s,t,q);return{packageService:new ee(n,t,r,s),versionResolver:n,cdnClient:t,peerResolver:r}}import*as Yt from"fs/promises";import*as F from"path";var Ze=[{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"}],et=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var Ft=`
2
+ import*as Qe from"fs/promises";import*as k from"path";import{spawn as us}from"child_process";import{EventEmitter as It}from"events";import*as Mt from"fs/promises";import{existsSync as ee,readFileSync as Jr}from"fs";import*as P from"path";import{pathToFileURL as Vr}from"url";import{resolve as tt}from"resolve.exports";import{init as Ft,parse as jt}from"es-module-lexer";function Nt(s,e){let t=P.join(s,"package.json");try{return JSON.parse(Jr(t,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${t}`)}}var et=["browser","import","default"],$t=["node","import","default"];function Lt(s){let e=s.indexOf("=");if(e===-1)throw new Error(`--replace must be <name>=<path> (got '${s}')`);let t=s.slice(0,e).trim(),r=s.slice(e+1).trim();if(!t)throw new Error(`--replace missing package name (got '${s}')`);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 Bt(s){let{name:e,dir:t}=s;if(!ee(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let r=Nt(t,e),n=qr(r,e),i=P.resolve(t,n);if(!ee(i))throw new Error(`--replace package '${e}' entry not found on disk: ${i} \u2014 did you build it (e.g. \`pnpm run build\`)?`);let o=P.dirname(i),a=`/local/${e}/${P.basename(i)}`,c=zr(r,t);return await Gr(e,i,o),{name:e,dir:t,entryAbs:i,serveDir:o,entryUrl:a,typesAbs:c}}function qr(s,e){if(s.exports!==void 0){let r;try{r=tt(s,".",{browser:!0,conditions:et})}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${et.join(", ")}): ${i instanceof Error?i.message:i}`)}let n=rt(r);if(!n)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${et.join(", ")}); too complex to override.`);return n}let t=s.module??s.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function zr(s,e){if(s.exports!==void 0)try{let r=tt(s,".",{conditions:["types"]}),n=rt(r);if(n){let i=P.resolve(e,n);if(ee(i))return i}}catch{}let t=s.types??s.typings;if(t){let r=P.resolve(e,t);if(ee(r))return r}}function rt(s){if(typeof s=="string")return s;if(Array.isArray(s))return s.find(e=>typeof e=="string")}async function Gr(s,e,t){await Ft;let r=P.normalize(t),n=new Set,i=[e];for(;i.length;){let o=i.shift();if(n.has(o))continue;n.add(o);let a;try{a=await Mt.readFile(o,"utf8")}catch{continue}let c,l;try{[c,,,l]=jt(a,o)}catch{continue}if(o===e&&!l)throw new Error(`override package '${s}' 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 p=d.n;if(p&&!p.startsWith("node:")){if(p.startsWith("./")||p.startsWith("../")||p.startsWith("/")){let h=Kr(o,p,r);h&&!n.has(h)&&i.push(h);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${s} externalizes '${p}'`)}}}}function Kr(s,e,t){let r=e.replace(/[?#].*$/,""),n=P.resolve(P.dirname(s),r),i=[n,n+".js",n+".mjs",P.join(n,"index.js"),P.join(n,"index.mjs")];for(let o of i)if(P.normalize(o).startsWith(t)&&ee(o))return o}function Yr(s,e,t){let r=Nt(s,e),n;if(r.exports!==void 0)try{n=rt(tt(r,t,{conditions:$t}))}catch(o){throw new Error(`--replace package '${e}' "exports" does not resolve a node entry for '${t}' (conditions: ${$t.join(", ")}): ${o instanceof Error?o.message:o}`)}else t==="."&&(n=r.main??r.module);if(!n)throw new Error(`--replace package '${e}' has no node export for '${t}'.`);let i=P.resolve(s,n);if(!ee(i))throw new Error(`--replace package '${e}' built file not found: ${i} \u2014 did you build it (e.g. \`pnpm run build\`)?`);return Vr(i).href}async function Ut(s,e){await Ft;let t;try{[t]=jt(s)}catch{return s}let r="",n=0;for(let i of t){if(i.d!==-1)continue;let o=i.n;if(!o||o!==e.name&&!o.startsWith(e.name+"/"))continue;let a=o===e.name?".":"."+o.slice(e.name.length),c=Yr(e.dir,e.name,a);r+=s.slice(n,i.s)+c,n=i.e}return r+s.slice(n)}function Wt(s){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,help:!1,version:!1};s[0]==="check"&&(e.subcommand="check",s=s.slice(1));for(let t=0;t<s.length;t++){let r=s[t];if(r==="--help"||r==="-h")e.help=!0;else if(r==="--version"||r==="-V")e.version=!0;else if(r==="--no-watch")e.watch=!1;else if(r==="--no-open")e.open=!1;else if(r==="--server")e.server=!0;else if(r==="--trust")e.trust=!0;else if(r==="--port"||r==="-p"){let n=s[++t],i=parseInt(n,10);isNaN(i)&&(console.error(`Invalid port: ${n}`),process.exit(1)),e.port=i}else if(r==="--replace"||r.startsWith("--replace=")){let n=r.startsWith("--replace=")?r.slice(10):s[++t]??"";try{let i=Lt(n);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 r.startsWith("-")||(e.file=r)}return e}function Ht(){console.log(`
3
+ typebulb - Local bulb runner for Typebulb
4
+
5
+ Usage:
6
+ typebulb [file.bulb.md] Run a bulb (defaults to .bulb.md in cwd)
7
+ typebulb check [file.bulb.md] Type-check a bulb without running it
8
+
9
+ Options:
10
+ --no-watch Disable hot reload (watch is on by default)
11
+ -p, --port <port> Use a specific port (default: 3000)
12
+ --no-open Don't auto-open browser
13
+ --trust Grant privileged capabilities (filesystem, AI,
14
+ and server.ts). Without it a bulb runs sandboxed:
15
+ tb.fs / tb.ai / tb.server are blocked and the page
16
+ shows the exact --trust command to unlock them.
17
+ --server Run server.ts only, no web server (needs --trust)
18
+ --replace <name>=<path> Replace a declared dependency with a local built
19
+ package folder instead of a CDN (dev only).
20
+ Applies to both run and check. Watched for
21
+ rebuilds under --watch; --no-watch freezes it.
22
+ e.g. --replace tensorgrad=../tensorgrad
23
+ -V, --version Show version number
24
+ -h, --help Show this help message
25
+
26
+ Filesystem API:
27
+ Bulbs can read and write local files via tb.fs:
28
+ await tb.fs.read('file.txt') // UTF-8 text (throws on non-UTF-8)
29
+ await tb.fs.readBytes('image.png') // raw bytes (Uint8Array)
30
+ await tb.fs.write('output.html', content) // text or bytes
31
+
32
+ Server API:
33
+ Add a **server.ts** section to run Node.js code server-side.
34
+ Exported functions become callable from the browser:
35
+ // in **server.ts**: export async function query(sql) { ... }
36
+ // in **code.tsx**: const rows = await tb.server.query(sql)
37
+ .env and .env.local are auto-loaded from the working directory.
38
+
39
+ Built-in server functions (available without a **server.ts** section):
40
+ tb.server.log(...) Print to the CLI's stdout
41
+
42
+ AI API:
43
+ Bulbs can call AI providers via tb.ai(). Set API keys in .env:
44
+ ANTHROPIC_API_KEY=sk-ant-...
45
+ OPENAI_API_KEY=sk-...
46
+ GOOGLE_API_KEY=AIza...
47
+ OPENROUTER_API_KEY=sk-or-...
48
+ Set provider and model (required):
49
+ TB_AI_PROVIDER=anthropic
50
+ TB_AI_MODEL=claude-haiku-4-5-20251001
51
+ Both can be overridden per-call: tb.ai({ provider: "openai", model: "gpt-4o", ... })
52
+ Optional reasoning depth (0=min, 1=low, 2=med, 3=max):
53
+ tb.ai({ ..., reasoning: 2 })
54
+
55
+ Examples:
56
+ typebulb my-editor.bulb.md
57
+ typebulb --no-watch --port 8080 my-editor.bulb.md
58
+ typebulb .
59
+ `)}import{readFileSync as Xr}from"fs";import*as Jt from"path";function nt(){de([".env",".env.local"],process.cwd(),!0)}function de(s,e,t=!1){for(let r of s){let n=Jt.resolve(e,r);try{let i=Xr(n,"utf-8");for(let o of i.split(`
60
+ `)){let a=o.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 z from"fs/promises";import*as ae from"path";import{pathToFileURL as Fn}from"url";var Qr={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 Vt(s){try{let e=s.split(`
61
+ `),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 n=Zr(r);if(!n)return null;let i=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 p=[];for(;t<e.length&&!e[t]?.match(new RegExp(`^${d}\\s*$`));)p.push(e[t]),t++;t++,i.set(c,p.join(`
62
+ `))}else t++}return{frontmatter:n,files:i}}catch{return null}}function Zr(s){let e={};for(let t of s){let r=t.indexOf(":");if(r===-1)continue;let n=t.slice(0,r).trim(),i=t.slice(r+1).trim();switch(n){case"format":e.format=i;break;case"name":e.name=en(i);break}}return!e.format?.startsWith("typebulb")||!e.name?null:e}function en(s){return s.startsWith('"')&&s.endsWith('"')?s.slice(1,-1).replace(/\\"/g,'"'):s.startsWith("'")&&s.endsWith("'")?s.slice(1,-1):s}function qt(s){let e=t=>s.files.get(Qr[t].path)||"";return{name:s.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 tn(s){try{return JSON.parse(s),!0}catch{}return!!(/^\s*<[\s\S]*>/.test(s)||/^---\s*$/m.test(s)||/^\w[\w\s]*:[ \t]/m.test(s))}function zt(s){let e=s.trim();return e?tn(e)?[e]:s.split(/\n\n\n+/).map(t=>t.trim()).filter(Boolean):[]}function Gt(s){if(!s.trim())return{};try{return JSON.parse(s)}catch{return{}}}import{transform as rn}from"sucrase";function st(s,e={}){let t=e.serverOnly?["typescript"]:["typescript","jsx"];try{let{code:r}=rn(s,{transforms:t,jsxRuntime:"automatic",jsxImportSource:e.jsxImportSource||"react",production:!0});return{code:r}}catch(r){return{code:"",error:String(r)}}}var pe="https://esm.sh",ue="https://cdn.jsdelivr.net/npm/",it="https://data.jsdelivr.com/v1/package/npm/";function Kt(s){let e=(s||"").replace(/^\/+/,"").replace(/\/+$/,"");return e?e.split("/"):[]}var g=class s{constructor(e,t,r){let n=typeof e=="string"?s.parse(e):e;this.name=n.name,this.version=te(t??n.version),this.subpath=te(r??n.subpath)}static parse(e){let t=Kt(e||"");if(!t.length)return new s({name:""});if(t[0].startsWith("@")){let n=t[0],[i,o]=Yt(t[1]??""),a=te(t.slice(2).join("/"));return new s({name:`${n}/${i}`,version:o,subpath:a})}else{let[n,i]=Yt(t[0]),o=te(t.slice(1).join("/"));return new s({name:n,version:i,subpath:o})}}static fromUrl(e){try{let t=new URL(e),r=new URL(pe).host,n=new URL(ue).host;if(t.host===r){let i=Kt(t.pathname.replace(/^\/v\d+\//,"/"));if(!i.length)return;let o=i[0].startsWith("@")?`${i[0]}/${i[1]??""}`:i[0];return s.parse(o)}if(t.host===n){let i=t.pathname.split("/npm/")[1];if(!i)return;let o=i.split("/")[0]||"";return s.parse(o)}return}catch{return}}static versionFromUrl(e){return s.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 s.parse(e).name}withVersion(e){return new s({name:this.name,version:te(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://")}},te=s=>s&&s.length?s:void 0,Yt=s=>{let e=s.indexOf("@");return e<0?[s,void 0]:[s.slice(0,e),te(s.slice(e+1))]};async function _(s){try{return await s()}catch{return}}var he=class{constructor(e,t){this.cache=e,this.http=t,this.esmHost=pe,this.jsDelivrBase=ue,this.jsDelivrMeta=it,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 g(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:n=!1,external:i}=t,o=new URLSearchParams({target:r});return n&&o.append("bundle",""),i?.length&&o.append("external",i.join(",")),`${this.esmHost}/${e}?${o.toString()}`}async pinEsmUrl(e,t="es2022"){let r=this.buildEsmUrl(e,{target:t}),n=await _(()=>this.http.head(r));return n?.ok?n.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 n=await this.tryResolveFromUrls([this.buildEsmUrl(e),`${this.esmHost}/${e}`]);return this.pinCache.set(e,{value:n,ts:t}),n}async tryResolveFromUrls(e){for(let t of e){let r=await _(()=>this.http.head(t)),n=this.parseVersionFromUrl(r?.url||t);if(n)return n}}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 _(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(e)}`));if(!r?.versions?.length){await this.cache.recordNegative(e);return}await this.cache.clearNegative(e);let n=r.distTags&&Object.keys(r.distTags).length?r.distTags:void 0;return await this.cache.setIndex(e,r.versions,n),r}parseVersionFromUrl(e){let t=g.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:p,peerDependenciesMeta:h}=r;return{name:e,version:t,dependencies:d,peerDependencies:p,peerDependenciesMeta:h}}let n=this.packageJson(new g(`${e}@${t}`)),i=await _(()=>this.http.getJson(n));if(!i)return;let o=d=>d&&Object.keys(d).length?d:void 0,a=o(i.dependencies),c=o(i.peerDependencies),l=o(i.peerDependenciesMeta);return await this.cache.setMeta(e,t,a,c,l),{name:e,version:t,dependencies:a,peerDependencies:c,peerDependenciesMeta:l}}};var Xt=s=>s.startsWith("@types/"),fe=s=>Object.keys(s?.peerDependencies||{}).filter(e=>!Xt(e)),ot=s=>Object.keys(s?.dependencies||{}).filter(e=>!Xt(e)),nn=s=>fe(s).filter(e=>!s?.peerDependenciesMeta?.[e]?.optional),me=class{constructor(e){this.cdn=e}async resolve(e,t){let r=await this.fetchMeta(e),{allRoots:n,autoAddedPeers:i}=await this.expandWithPeers(r,t),o=this.computeFlags(n);return{allRoots:n,flags:o,autoAddedPeers:i}}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(i=>[i.name,i])),n=[];for(let i of e)for(let o of nn(i.meta))!r.has(o)&&!n.some(a=>a.name===o)&&n.push({name:o,requiredBy:i.name});for(let{name:i,requiredBy:o}of n)try{let a=await t(i),c=await this.cdn.fetchPackageMeta(i,a);r.set(i,{name:i,version:a,meta:c})}catch(a){console.warn(`[typebulb] Failed to resolve peer "${i}" for "${o}":`,a)}return{allRoots:[...r.values()],autoAddedPeers:n.filter(i=>r.has(i.name))}}computeFlags(e){let t=new Set(e.flatMap(i=>fe(i.meta))),r=new Map;for(let i of e)for(let o of ot(i.meta))r.set(o,(r.get(o)||0)+1);let n=new Set([...r.entries()].filter(([,i])=>i>=2).map(([i])=>i));return new Map(e.map(i=>[i.name,{isPeerRoot:t.has(i.name),hasPeers:fe(i.meta).length>0,isSharedDep:n.has(i.name)}]))}};var ge=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 _(()=>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 n=await _(()=>this.cdn.fetchVersionsIndex(e));if(n?.versions?.length){let o=this.selectVersionFromIndex(n.versions,t,n.distTags);if(o){if(this.semver.isExactVersion(o))return await this.cache.setPinnedExact(e,t,o),o}else{console.warn("[versionResolver] Invalidating stale versions cache for",e,"- range",t,"not satisfied"),await this.cache.invalidateVersionsCache(e);let a=await _(()=>this.cdn.fetchVersionsIndex(e));if(a?.versions?.length){let c=this.selectVersionFromIndex(a.versions,t,a.distTags);if(c&&this.semver.isExactVersion(c))return await this.cache.setPinnedExact(e,t,c),c}}}let i=await this.cdn.resolveExactVersion(`${e}@${t}`);if(i&&this.semver.isExactVersion(i))return await this.cache.setPinnedExact(e,t,i),i}async effectivePackage(e,t){let r=new g(e),n=r.root(),i=t[n],o=i?await _(()=>this.cache.getPinnedExact(n,i))??await _(()=>this.resolveExactForRoot(n,i)):void 0;return{effectivePackage:o?r.withVersion(o).format():e,root:n,range:i,pinned:o}}};import{init as sn,parse as on}from"es-module-lexer";var re=class s{constructor(e,t,r,n){this.version=e,this.cdn=t,this.peer=r,this.cache=n}extractImportsSync(e){let t=new Set;for(let r of s.importPatterns){r.lastIndex=0;for(let n of e.matchAll(r))g.isBare(n[1])&&t.add(n[1])}return Array.from(t)}async extractImports(e){let t=new Set,r=n=>{g.isBare(n)&&t.add(n)};try{await sn;let[n]=on(e);n.forEach(i=>r(e.slice(i.s,i.e).trim()))}catch{return this.extractImportsSync(e)}return Array.from(t)}async buildImportMap(e,t,r){let n=(await this.extractImports(e)).filter(p=>!r?.has(g.rootOf(p))),i=[...new Set(n.map(g.rootOf))],o=await Promise.all(i.map(async p=>({name:p,version:await this.resolveVersion(p,t)}))),{allRoots:a,flags:c,autoAddedPeers:l}=await this.peer.resolve(o,p=>this.resolveVersion(p,t)),d=this.buildEntries([...n,...l.map(p=>p.name)],a,c,t);return{importMap:{imports:Object.fromEntries(d)},prefetchUrls:d.map(([,p])=>p)}}async resolveVersion(e,t){let r=t[e],n=r?`${e}@${r}`:e,i=await this.version.resolveExactForRoot(e,r);if(!i){let o=await _(()=>this.cdn.pinEsmUrl(n));if(!o)throw new Error(`Cannot resolve ${n}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);i=g.versionFromUrl(o),i&&r&&await _(()=>this.cache.setPinnedExact(e,r,i))}if(!i)throw new Error(`Cannot resolve ${n}: no concrete version found.`);return i}buildEntries(e,t,r,n){let i=new Map(t.map(m=>[m.name,m])),o=m=>{let v=i.get(g.rootOf(m));return new g(m).withPreferredVersion(v.version,n[v.name]).format()},a=new Set([...r.entries()].filter(([,m])=>m.isPeerRoot||m.isSharedDep).map(([m])=>m)),c=new Set(e.filter(m=>m!==g.rootOf(m)).map(g.rootOf)),l=[],d=new Set,p=new Set(e.filter(m=>m===g.rootOf(m))),h=new Set;for(let m of e){let v=g.rootOf(m),T=i.get(v),{isPeerRoot:W,hasPeers:L,isSharedDep:u}=r.get(v),f=c.has(v),y=m!==v,b=!(W||u)&&(f||!L),C=this.singletonDepsOf(T,a),H=y&&p.has(v);H&&h.add(v);let j=H?[...C,v]:C.length?C:void 0;l.push([m,this.cdn.buildEsmUrl(o(m),{bundle:b,external:j})]),d.add(m)}let w=new Set([...a,...h]);for(let m of w)i.has(m)&&(d.has(m)||l.push([m,this.cdn.buildEsmUrl(o(m),{})]),l.push([`${m}/`,`${this.cdn.esmHost}/${o(m)}/`]));return l}singletonDepsOf(e,t){return[...new Set([...fe(e.meta),...ot(e.meta)])].filter(r=>t.has(r))}};re.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];import{gt as Qt,satisfies as an,maxSatisfying as at,major as cn,prerelease as ln,rsort as dn,valid as pn}from"semver";var $e=class{cmp(e,t){return e===t?0:Qt(e,t)?1:Qt(t,e)?-1:0}satisfies(e,t){return!e||!e.trim()?!0:!!an(t,e,{includePrerelease:!0})}pickMaxSatisfying(e,t){if(!e?.length)return;let r=at(e,t,{includePrerelease:!0});return r===null?void 0:r}pickLatest(e){return e?.length?dn(e)[0]:void 0}selectBestVersion(e,t){if(!e?.length)return;let r=t?.range?.trim()||"*",n=t?.preferStable??!0,i=t?.distTags?.latest;if(i&&e.includes(i)&&this.satisfies(r,i))return i;if(n){let a=at(e,r,{includePrerelease:!1});if(a)return a}return at(e,r,{includePrerelease:!0})??void 0}majorOf(e){return cn(e)}isPrerelease(e){return ln(e)!==null}isExactVersion(e){return pn(e)!==null}},G=new $e;function Zt(s,e){let t=new he(s,e),r=new me(t),n=new ge(s,t,G);return{packageService:new re(n,t,r,s),versionResolver:n,cdnClient:t,peerResolver:r}}import*as fr from"fs/promises";import*as $ from"path";var ct=[{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"}],lt=[{name:"dom"},{name:"dom.iterable"},{name:"dom.asynciterable"}];var er=`
5
63
  /**
6
64
  * Get raw data chunk from the Data tab.
7
65
  * @param index - Chunk index (0-based). Separate chunks with 2 blank lines.
@@ -12,7 +70,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
12
70
  * @param index - Chunk index (0-based)
13
71
  * @throws If chunk is not valid JSON/JSON-ish
14
72
  */
15
- json<T = unknown>(index: number): T;`,jt=`
73
+ json<T = unknown>(index: number): T;`,tr=`
16
74
  /**
17
75
  * Get the insight data produced by the inference layer.
18
76
  *
@@ -21,7 +79,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
21
79
  *
22
80
  * @returns The parsed insight JSON, or undefined if no insight is available
23
81
  */
24
- insight<T = unknown>(): T | undefined;`,Nt=`
82
+ insight<T = unknown>(): T | undefined;`,rr=`
25
83
  /**
26
84
  * General-purpose AI call.
27
85
  *
@@ -38,7 +96,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
38
96
  model?: string;
39
97
  /** Enable/disable web search. Default: on for BYOK, always off for free model. */
40
98
  webSearch?: boolean;
41
- }): Promise<{ text: string }>;`,Lt=`
99
+ }): Promise<{ text: string }>;`,nr=`
42
100
  /**
43
101
  * Returns AI models available to the current user.
44
102
  * Models are filtered by the user's configured API keys.
@@ -53,7 +111,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
53
111
  friendlyName: string;
54
112
  /** Provider display name, e.g. "Anthropic" */
55
113
  providerName: string;
56
- }>>;`,Br="\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;",Bt=`
114
+ }>>;`,un="\n /**\n * The bulb's theme override (`<html data-theme>`).\n *\n * - Get: the current override \u2014 `'dark'` | `'light'`, or `undefined` when\n * following the OS preference.\n * - Set `'dark'`/`'light'` to force and persist it (per-bulb); set\n * `undefined` to clear the override and follow the OS again.\n *\n * Drives `<html data-theme>`, so render off `html[data-theme=\"\u2026\"]` selectors\n * (or observe the attribute) rather than reading `tb.theme`.\n */\n theme: 'light' | 'dark' | undefined;",sr=`
57
115
  /**
58
116
  * The mode this bulb is running in.
59
117
  *
@@ -63,7 +121,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
63
121
  * - \`'embedded'\` \u2014 Running as a bulb embedded inside another bulb (sandboxed,
64
122
  * client-only: AI, filesystem, and server RPC are unavailable)
65
123
  */
66
- mode: 'local' | 'editor' | 'published' | 'embedded';`,Ut=`
124
+ mode: 'local' | 'editor' | 'published' | 'embedded';`,ir=`
67
125
  /**
68
126
  * Local filesystem access (CLI only).
69
127
  *
@@ -77,7 +135,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
77
135
  readBytes(path: string): Promise<Uint8Array>;
78
136
  /** Write text or raw bytes to a file. Creates parent directories if needed. */
79
137
  write(path: string, content: string | Uint8Array): Promise<boolean>;
80
- };`,Ur=`
138
+ };`,hn=`
81
139
  /**
82
140
  * Server-side function proxy. The built-in \`log\` prints to CLI stdout
83
141
  * (falls back to console.log on web). On the server side, this object only
@@ -85,7 +143,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
85
143
  */
86
144
  server: {
87
145
  log(...args: any[]): Promise<void>;
88
- };`,Wr=`
146
+ };`,fn=`
89
147
  /**
90
148
  * Async value inspector for tensor-like objects.
91
149
  *
@@ -152,7 +210,7 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
152
210
  *
153
211
  * @returns The full canonical URL
154
212
  */
155
- url(): Promise<string>;`,Hr=`
213
+ url(): Promise<string>;`,mn=`
156
214
  /**
157
215
  * Server-side function proxy.
158
216
  *
@@ -160,23 +218,23 @@ import*as M from"fs/promises";import{readFileSync as Hn}from"fs";import*as S fro
160
218
  * \`tb.server.log(...)\` is a built-in that prints to CLI stdout (falls back to console.log on web).
161
219
  * User exports override built-ins of the same name.
162
220
  */
163
- server: Record<string, (...args: any[]) => Promise<any>>;`,tt=`
221
+ server: Record<string, (...args: any[]) => Promise<any>>;`,dt=`
164
222
  /**
165
223
  * Typebulb utilities namespace.
166
224
  * Type \`tb.\` to discover available helpers.
167
225
  */
168
- declare const tb: {${Ft}${Wr}${jt}${Hr}${Nt}${Ut}${Lt}${Br}${Bt}
226
+ declare const tb: {${er}${fn}${tr}${mn}${rr}${ir}${nr}${un}${sr}
169
227
  };
170
- `,rt=`
228
+ `,pt=`
171
229
  /**
172
230
  * Typebulb utilities namespace (server-side).
173
231
  * Type \`tb.\` to discover available helpers.
174
232
  */
175
- declare const tb: {${Ft}${jt}${Nt}${Ut}${Ur}${Lt}${Bt}
233
+ declare const tb: {${er}${tr}${rr}${ir}${hn}${nr}${sr}
176
234
  };
177
- `;var G=class{constructor(e){this.store=e}async isNegative(e){let t=await De(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let r=((await De(()=>this.store.get(e)))?.attempts||0)+1;await De(()=>this.store.set(e,{until:Date.now()+Jr(r),attempts:r}))}async clearNegative(e){await De(()=>this.store.delete(e))}};function Jr(s){return Math.min(9e5*Math.pow(2,Math.max(0,s-1)),864e5)}async function De(s){try{return await s()}catch{return}}import Yr from"p-limit";import{resolve as Wt}from"resolve.exports";var te=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},me=["index.d.ts","index.d.mts"],fe=/\.d\.(ts|mts)$/i;function nt(s){if(fe.test(s))return!0;try{return new URL(s,"file://").search.includes("dts")}catch{return s.includes("?")&&s.includes("dts")}}function Ae(s){return[`${s}.d.ts`,`${s}.d.mts`]}async function ge(s,{retries:e=2,timeoutMs:t=15e3,init:r}={}){for(let n=0;n<=e;n++){let i=new AbortController,o=setTimeout(()=>i.abort(),t);try{let a=await fetch(s,{...r,signal:i.signal});if(Vr(a.status)&&n<e)continue;return a}catch{if(n<e)continue;return}finally{clearTimeout(o)}}}function Vr(s){return s===408||s===429||s>=500&&s<600}var ye=class extends te{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let r=this.cdnClient.packageJson(new g({name:e,version:t})),n=await ge(r);if(!n?.ok)return;let i;try{i=await n.json()}catch{return}if(i)return{pkg:i,baseDir:this.cdnClient.baseDir(new g({name:e,version:t??i.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 n=await t(r);if(n)return n}}async resolveFromSelected(e,t){if(e.kind==="types"){let n=this.cdnClient.normalizeRelative(e.path);if(!n||n==="/"||n===".")return this.tryUntilSuccess([...me],t);if(!fe.test(n)){let i=await this.tryUntilSuccess(this.declarationCandidatesFor(n),t);if(i)return i}return t(n)}let r=this.declarationCandidatesFor(e.path);return this.tryUntilSuccess([...me,...r],t)}toResolutionResult(e){return{kind:fe.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let r=t||".",n=e;try{let i=this.extractPathFromResult(Wt(n,r,{conditions:["types"]}));if(i)return i}catch{}try{return this.extractPathFromResult(Wt(n,r,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=g.parse(e),{pkg:r,baseDir:n}=await this.loadPackageAtVersionedRoot(t.name,t.version)||{};if(!r||!n)return;let i={name:t.name,version:t.version},o=new g(i).format(),a=new g({...i,subpath:t.subpath}).format(),l=p=>this.fetchCandidateFrom(n,t.name,p);if(t.subpath){let p=this.cdnClient.ensureLeadingDotSlash(t.subpath),m=this.resolveExportsPath(r,p);if(m){let f=await this.resolveFromSelected(this.toResolutionResult(m),l);if(f)return{...f,resolvedPkg:a}}let w=await this.tryUntilSuccess(this.declarationCandidatesFor(p),l);if(w)return{...w,resolvedPkg:a}}let c=r.types??r.typings;if(c){let p=await this.resolveFromSelected({kind:"types",path:c},l);if(p)return{...p,resolvedPkg:o}}let d=this.resolveExportsPath(r,".");if(d){let p=await this.resolveFromSelected(this.toResolutionResult(d),l);if(p)return{...p,resolvedPkg:o}}return}catch{return}}async fetchCandidateFrom(e,t,r){let n=this.cdnClient.normalizeRelative(r),i=new URL(n,e).toString(),o=await this.fetchDtsText(i);return o?{dts:o.dts,url:o.url,resolvedPkg:t}:void 0}declarationCandidatesFor(e){if(!e||e==="./"||e==="/")return[...me];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),r=Ae(t),n=t.endsWith("/")?t:`${t}/`;return r.push(...Ae(`${n}index`)),r}};import{gunzipSync as qr}from"fflate";var re=class{async fetchAndExtract(e,t){let r=this.getTarballUrl(e,t),n=await ge(r,{timeoutMs:3e4});if(!n?.ok)return new Map;let i=new Uint8Array(await n.arrayBuffer());return this.extractDtsFiles(i)}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=qr(e),n=new TextDecoder("utf-8"),i=0;for(;i<r.length-512;){let o=r.slice(i,i+512);if(o[0]===0)break;let a=o.slice(0,100),l=a.indexOf(0),c=n.decode(a.slice(0,l>0?l:100)).trim(),d=o.slice(124,136),p=n.decode(d).trim().replace(/\0/g,""),m=parseInt(p,8)||0,w=String.fromCharCode(o[156]);if(i+=512,(w==="0"||w==="\0")&&(c.endsWith(".d.ts")||c.endsWith(".d.mts"))){let f=r.slice(i,i+m);t.set(this.normalizeTarPath(c),n.decode(f))}i+=Math.ceil(m/512)*512}}catch{}return t}},Gr=new re;var we=class extends te{constructor(e,t,r,n=new re){super(e),this.cdnClient=t,this.cache=r,this.tarballFetcher=n}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 i=q.majorOf(r),o=e.filter(a=>q.majorOf(a)===i);if(o.length)return o.sort((a,l)=>q.cmp(l,a))[0]}let n=t?.latest;return n&&e.includes(n)?n:e[0]}catch{return e[0]}}async fetchFromVersionedRoot(e,t){let r=new g(e),n=r.version;if(!n)return;let i;try{i=await this.tarballFetcher.fetchAndExtract(r.name,n)}catch{return}if(!i||i.size===0)return;for(let[a,l]of i.entries()){let c=this.cdnClient.file(e,a);try{await this.cache.setCachedFile(c,l)}catch{}}let o=t.subpath?[t.subpath+".d.ts",t.subpath+"/index.d.ts"]:["index.d.ts"];for(let a of o){let l=i.get(a);if(l)return{dts:l,url:this.cdnClient.file(e,a),resolvedPkg:t.subpath?new g(t).format():t.name}}}async resolve(e){let t=g.parse(e);if(t.name)for(let r of this.typesNameCandidates(t.name)){let n=`@types/${r}`,i;try{i=await this.cdnClient.fetchVersionsIndex(n)}catch{continue}if(!i?.versions?.length)continue;let o=this.selectTypesVersion(i.versions,i.distTags,t.version),a=await this.fetchFromVersionedRoot(`${n}@${o}`,t);if(a)return a}}};var be=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=(n,i)=>(t.add(n[i]),null);return this.matchAll(e,/(import|export)\s+[^'"\n]*from\s*['"]([^'"\n]+)['"]/,n=>r(n,2)),this.matchAll(e,/export\s*\*\s*from\s*['"]([^'"\n]+)['"]/,n=>r(n,1)),Array.from(t)}matchAll(e,t,r){let n=[];try{let i=new RegExp(t.source,"g"),o;for(;o=i.exec(e);){let a=r(o);a!==null&&n.push(a)}}catch{}return n}isBare(e){return!(e.startsWith("./")||e.startsWith("../")||e.startsWith("file:")||e.startsWith("http://")||e.startsWith("https://"))}};var Ht="file:///node_modules",ve=class{constructor(){this.epoch=0,this.listeners=new Set}getEpoch(){return this.epoch}bumpEpoch(){this.epoch+=1;for(let e of this.listeners)try{e(this.epoch)}catch{}return this.epoch}onEpochChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}epochDir(){return`__tsepoch_${this.epoch}`}pathForMain(e){return`${Ht}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let r=zr(t);return`${Ht}/${this.epochDir()}/${e}/${r}`}};function zr(s){let e=s||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as Kr}from"lru-cache";function st(s){let e=new Kr({ttl:1e4,max:500}),t=new Map;return async function(n){try{if(await s.isNegative(n))return;let i=e.get(n);if(i&&Date.now()-i<1e4)return;let o=await s.getCachedFile(n);if(o)return{dts:o,url:n};let a=t.get(n);if(a)return a;let l=(async()=>{let c=await fetch(n,{cache:"no-store"});if(!c.ok){c.status===404&&(e.set(n,Date.now()),await s.recordNegative(n));return}let d=await c.text(),p=c.url||n;return await s.clearNegative(n),await s.setCachedFile(p,d),{dts:d,url:p}})();return t.set(n,l),await l.finally(()=>t.delete(n))}catch{return}}}var Me=class{constructor(e){this.inFlight=new Map,this.scanner=new be,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=st(e.cache),this.typescriptProvider=new ye(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new we(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new ve}withInFlight(e,t){let r=this.inFlight.get(e);if(r)return r;let n=t().finally(()=>this.inFlight.delete(e));return this.inFlight.set(e,n),n}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(n=>n.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 g(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 g(e).subpath===new g(t).subpath}async fetchRootDts(e,t){let{effectivePackage:r,root:n,pinned:i}=await this.versionResolver.effectivePackage(e,t),o=await this.cache.getCachedDts(r);if(o?.content){let l=o.url??this.cdnClient.file(i?`${n}@${i}`:n,"index.d.ts");return{dts:o.content,url:l,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 n=t.pathname.startsWith(e.pathname)?t.pathname.slice(e.pathname.length):`__deps__/${encodeURIComponent(t.toString()).replace(/%/g,"_")}.d.ts`;return this.virtualFs.pathFor(r,n)}computeEntryPath(e,t){if(!e)return{mainPath:this.virtualFs.pathForMain(t),packageRootUrl:void 0};let r=new URL(e),n=this.extractPackageRootUrl(r);return{mainPath:this.toVirtualPath(n,r,t),packageRootUrl:n}}async expandRelativeRefs(e,t,r,n,i=new Set,o){if(!i.has(t)&&(i.add(t),!(i.size>H.maxRelativeTypeRefs)))try{let a=new URL(t),l=new URL("./",a);o??(o=this.extractPackageRootUrl(a));let c=this.capArray(this.scanner.collectRelativeTypeRefs(e),H.maxRelativeTypeRefs);for(let d of c)await this.tryRelativeRef(d,l,o,r,n,i)}catch{}}async tryRelativeRef(e,t,r,n,i,o){try{let a=new URL(e,t),l=a.pathname+a.search,c=nt(l)?[l]:this.typescriptProvider.declarationCandidatesFor(l);for(let d of c){let m=new URL(d,a).toString();if(o.has(m))return;let w=await this.fetchDts(m);if(w?.dts){let f=this.toVirtualPath(r,new URL(w.url),n);this.pushFileIfNew(i,f,w.dts),await this.expandRelativeRefs(w.dts,w.url,n,i,o,r);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new g(e).name!==new g(t).name}async prefetchBareDeps(e,t,r,n,i){try{let o=this.capArray(this.scanner.collectBareModuleRefs(e),H.maxBareDeps).filter(c=>this.isDifferentPackage(c,t));if(!o.length)return;let a=new Set([t]),l=Yr(H.prefetchConcurrency);await Promise.all(o.map(c=>l(()=>this.prefetchBareDepsRecursive(c,r,n,H.maxBareDepth,a,i).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,r,n,i,o){if(n<=0||i.has(e))return;i.add(e);let a=await this.fetchRootDts(e,o);if(!a?.dts)return;let l=a.resolvedPkg||e,c=this.virtualFs.pathForMain(l);this.pushFileIfNew(t,c,a.dts),r.push({module:e,path:c}),a.url&&await this.expandRelativeRefs(a.dts,a.url,l,t);let d=this.capArray(this.scanner.collectBareModuleRefs(a.dts),H.maxBareDeps).filter(p=>!i.has(p));for(let p of d)await this.prefetchBareDepsRecursive(p,t,r,n-1,i,o)}async resolve(e,t,r){let n=await this.packageService.extractImports(e),i=r?[...n,...r]:n;return(await Promise.all(i.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 n=await this.fetchRootDts(e,t)??await this.trySubpathWithRootFallback(e,t);return n?this.buildDefFromContent(e,n,n.resolvedPkg||e,t):this.createStubDef(e)})}async buildDefFromContent(e,t,r,n){let{dts:i,url:o,resolvedPkg:a}=t,l=new g(a||r),c=l.version?`${l.name}@${l.version}`:l.name,{mainPath:d,packageRootUrl:p}=this.computeEntryPath(o,c),m=[{path:d,content:i}],w=[];o&&await this.expandRelativeRefs(i,o,c,m,void 0,p);let f=m.map(E=>E.content).join(`
178
- `);await this.prefetchBareDeps(f,c,m,w,n);let R=l.format(),v=e===R?[e]:[e,R];return w.push(...v.map(E=>({module:E,path:d}))),{pkg:e,mainPath:d,files:m,shims:w}}};function it(s){return new Me(s)}import*as B from"fs/promises";import*as U from"path";import*as qt from"os";import*as ot from"fs/promises";import*as Jt from"crypto";function $(s){return Jt.createHash("sha1").update(s).digest("hex")}async function z(s){try{return JSON.parse(await ot.readFile(s,"utf8"))}catch{return}}async function $e(s){try{return await ot.readFile(s,"utf8")}catch{return}}var Vt=1,J=U.join(qt.homedir(),".typebulb","cache"),xe=U.join(J,"packages"),Pe=U.join(J,"proxy"),Fe=U.join(J,"dts"),Xr=U.join(J,"emit"),at;function P(){return at||(at=Qr()),at}function je(s,e){return U.join(Xr,$(s),e)}async function Qr(){await B.mkdir(J,{recursive:!0});let s=U.join(J,"version.json");if((await Zr(s))?.version===Vt)return;let t=await B.readdir(J).catch(()=>[]);await Promise.all(t.map(r=>B.rm(U.join(J,r),{recursive:!0,force:!0}))),await B.writeFile(s,JSON.stringify({version:Vt})+`
179
- `,"utf8")}async function Zr(s){try{let e=await B.readFile(s,"utf8");return JSON.parse(e)}catch{return}}import*as V from"fs/promises";import*as Gt from"path";async function O(s,e){await V.mkdir(Gt.dirname(s),{recursive:!0});let t=`${s}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await V.writeFile(t,e,"utf8"),await V.rename(t,s).catch(async r=>{throw await V.rm(t,{force:!0}).catch(()=>{}),r})}var ne=class{constructor(e){this.filePath=e}mem;loadPromise;load(){return this.mem?Promise.resolve(this.mem):(this.loadPromise||(this.loadPromise=z(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 O(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var ct=F.join(xe,"indexes"),zt=F.join(xe,"pinned"),en=F.join(xe,"meta"),tn=F.join(xe,"negative.json"),se=Symbol("missing"),Le=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new G(new ne(tn));async getPinnedExact(e,t){let r=`${e}@${t}`,n=this.pinnedMem.get(r);if(n!==void 0)return n===se?void 0:n;await P();let i=await $e(F.join(zt,$(r)+".txt"));return this.pinnedMem.set(r,i??se),i}async setPinnedExact(e,t,r){let n=`${e}@${t}`;this.pinnedMem.set(n,r),await P(),await O(F.join(zt,$(n)+".txt"),r)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===se?void 0:t;await P();let r=await z(F.join(ct,Ne(e)+".json"));return this.indexMem.set(e,r??se),r}async setIndex(e,t,r){let n={versions:t,distTags:r,updatedAt:Date.now()};this.indexMem.set(e,n),await P(),await O(F.join(ct,Ne(e)+".json"),JSON.stringify(n))}async invalidateVersionsCache(e){this.indexMem.delete(e),await Yt.rm(F.join(ct,Ne(e)+".json"),{force:!0})}async isNegative(e){return await P(),this.negativeCache.isNegative(e)}async recordNegative(e){await P(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let r=`${e}@${t}`,n=this.metaMem.get(r);if(n!==void 0)return n===se?void 0:n;await P();let i=await z(Kt(e,t));return this.metaMem.set(r,i??se),i}async setMeta(e,t,r,n,i){let o={dependencies:r,peerDependencies:n,peerDependenciesMeta:i,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,o),await P(),await O(Kt(e,t),JSON.stringify(o))}};function Kt(s,e){return F.join(en,Ne(s),encodeURIComponent(e)+".json")}function Ne(s){return s.replace(/\//g,"__")}var Xt={async getJson(s){try{let e=await fetch(s,{redirect:"follow"});return e.ok?await e.json():void 0}catch{return}},async head(s){try{let e=await fetch(s,{method:"HEAD",redirect:"follow"});return{ok:e.ok,url:e.url}}catch{return}}};var rn=new Le,{packageService:Be,versionResolver:Qt,cdnClient:Zt,peerResolver:Gi}=$t(rn,Xt);var er=`
235
+ `;var K=class{constructor(e){this.store=e}async isNegative(e){let t=await Me(()=>this.store.get(e));return!!t&&t.until>Date.now()}async recordNegative(e){let r=((await Me(()=>this.store.get(e)))?.attempts||0)+1;await Me(()=>this.store.set(e,{until:Date.now()+gn(r),attempts:r}))}async clearNegative(e){await Me(()=>this.store.delete(e))}};function gn(s){return Math.min(9e5*Math.pow(2,Math.max(0,s-1)),864e5)}async function Me(s){try{return await s()}catch{return}}import Sn from"p-limit";import{resolve as or}from"resolve.exports";var ne=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 J={maxRelativeTypeRefs:500,maxBareDeps:8,maxBareDepth:3,prefetchConcurrency:4,negativeTtlMs:1e4},ye=["index.d.ts","index.d.mts"],we=/\.d\.(ts|mts)$/i;function ut(s){if(we.test(s))return!0;try{return new URL(s,"file://").search.includes("dts")}catch{return s.includes("?")&&s.includes("dts")}}function Fe(s){return[`${s}.d.ts`,`${s}.d.mts`]}async function be(s,{retries:e=2,timeoutMs:t=15e3,init:r}={}){for(let n=0;n<=e;n++){let i=new AbortController,o=setTimeout(()=>i.abort(),t);try{let a=await fetch(s,{...r,signal:i.signal});if(yn(a.status)&&n<e)continue;return a}catch{if(n<e)continue;return}finally{clearTimeout(o)}}}function yn(s){return s===408||s===429||s>=500&&s<600}var ve=class extends ne{constructor(e,t){super(e),this.cdnClient=t}async loadPackageAtVersionedRoot(e,t){let r=this.cdnClient.packageJson(new g({name:e,version:t})),n=await be(r);if(!n?.ok)return;let i;try{i=await n.json()}catch{return}if(i)return{pkg:i,baseDir:this.cdnClient.baseDir(new g({name:e,version:t??i.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 n=await t(r);if(n)return n}}async resolveFromSelected(e,t){if(e.kind==="types"){let n=this.cdnClient.normalizeRelative(e.path);if(!n||n==="/"||n===".")return this.tryUntilSuccess([...ye],t);if(!we.test(n)){let i=await this.tryUntilSuccess(this.declarationCandidatesFor(n),t);if(i)return i}return t(n)}let r=this.declarationCandidatesFor(e.path);return this.tryUntilSuccess([...ye,...r],t)}toResolutionResult(e){return{kind:we.test(e)?"types":"probe",path:e}}resolveExportsPath(e,t){let r=t||".",n=e;try{let i=this.extractPathFromResult(or(n,r,{conditions:["types"]}));if(i)return i}catch{}try{return this.extractPathFromResult(or(n,r,{browser:!0,conditions:["import","default","module","browser","node"]}))}catch{return}}async resolve(e){try{let t=g.parse(e),{pkg:r,baseDir:n}=await this.loadPackageAtVersionedRoot(t.name,t.version)||{};if(!r||!n)return;let i={name:t.name,version:t.version},o=new g(i).format(),a=new g({...i,subpath:t.subpath}).format(),c=p=>this.fetchCandidateFrom(n,t.name,p);if(t.subpath){let p=this.cdnClient.ensureLeadingDotSlash(t.subpath),h=this.resolveExportsPath(r,p);if(h){let m=await this.resolveFromSelected(this.toResolutionResult(h),c);if(m)return{...m,resolvedPkg:a}}let w=await this.tryUntilSuccess(this.declarationCandidatesFor(p),c);if(w)return{...w,resolvedPkg:a}}let l=r.types??r.typings;if(l){let p=await this.resolveFromSelected({kind:"types",path:l},c);if(p)return{...p,resolvedPkg:o}}let d=this.resolveExportsPath(r,".");if(d){let p=await this.resolveFromSelected(this.toResolutionResult(d),c);if(p)return{...p,resolvedPkg:o}}return}catch{return}}async fetchCandidateFrom(e,t,r){let n=this.cdnClient.normalizeRelative(r),i=new URL(n,e).toString(),o=await this.fetchDtsText(i);return o?{dts:o.dts,url:o.url,resolvedPkg:t}:void 0}declarationCandidatesFor(e){if(!e||e==="./"||e==="/")return[...ye];let t=e.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i,""),r=Fe(t),n=t.endsWith("/")?t:`${t}/`;return r.push(...Fe(`${n}index`)),r}};import{gunzipSync as wn}from"fflate";var se=class{async fetchAndExtract(e,t){let r=this.getTarballUrl(e,t),n=await be(r,{timeoutMs:3e4});if(!n?.ok)return new Map;let i=new Uint8Array(await n.arrayBuffer());return this.extractDtsFiles(i)}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=wn(e),n=new TextDecoder("utf-8"),i=0;for(;i<r.length-512;){let o=r.slice(i,i+512);if(o[0]===0)break;let a=o.slice(0,100),c=a.indexOf(0),l=n.decode(a.slice(0,c>0?c:100)).trim(),d=o.slice(124,136),p=n.decode(d).trim().replace(/\0/g,""),h=parseInt(p,8)||0,w=String.fromCharCode(o[156]);if(i+=512,(w==="0"||w==="\0")&&(l.endsWith(".d.ts")||l.endsWith(".d.mts"))){let m=r.slice(i,i+h);t.set(this.normalizeTarPath(l),n.decode(m))}i+=Math.ceil(h/512)*512}}catch{}return t}},bn=new se;var xe=class extends ne{constructor(e,t,r,n=new se){super(e),this.cdnClient=t,this.cache=r,this.tarballFetcher=n}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 i=G.majorOf(r),o=e.filter(a=>G.majorOf(a)===i);if(o.length)return o.sort((a,c)=>G.cmp(c,a))[0]}let n=t?.latest;return n&&e.includes(n)?n:e[0]}catch{return e[0]}}async fetchFromVersionedRoot(e,t){let r=new g(e),n=r.version;if(!n)return;let i;try{i=await this.tarballFetcher.fetchAndExtract(r.name,n)}catch{return}if(!i||i.size===0)return;for(let[a,c]of i.entries()){let l=this.cdnClient.file(e,a);try{await this.cache.setCachedFile(l,c)}catch{}}let o=t.subpath?[t.subpath+".d.ts",t.subpath+"/index.d.ts"]:["index.d.ts"];for(let a of o){let c=i.get(a);if(c)return{dts:c,url:this.cdnClient.file(e,a),resolvedPkg:t.subpath?new g(t).format():t.name}}}async resolve(e){let t=g.parse(e);if(t.name)for(let r of this.typesNameCandidates(t.name)){let n=`@types/${r}`,i;try{i=await this.cdnClient.fetchVersionsIndex(n)}catch{continue}if(!i?.versions?.length)continue;let o=this.selectTypesVersion(i.versions,i.distTags,t.version),a=await this.fetchFromVersionedRoot(`${n}@${o}`,t);if(a)return a}}};var Se=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=(n,i)=>(t.add(n[i]),null);return this.matchAll(e,/(import|export)\s+[^'"\n]*from\s*['"]([^'"\n]+)['"]/,n=>r(n,2)),this.matchAll(e,/export\s*\*\s*from\s*['"]([^'"\n]+)['"]/,n=>r(n,1)),Array.from(t)}matchAll(e,t,r){let n=[];try{let i=new RegExp(t.source,"g"),o;for(;o=i.exec(e);){let a=r(o);a!==null&&n.push(a)}}catch{}return n}isBare(e){return!(e.startsWith("./")||e.startsWith("../")||e.startsWith("file:")||e.startsWith("http://")||e.startsWith("https://"))}};var ar="file:///node_modules",Pe=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`${ar}/${this.epochDir()}/${e}/index.d.ts`}pathFor(e,t){let r=vn(t);return`${ar}/${this.epochDir()}/${e}/${r}`}};function vn(s){let e=s||"";return e.startsWith("./")?e.slice(2):e.replace(/^\/+/,"")}import{LRUCache as xn}from"lru-cache";function ht(s){let e=new xn({ttl:1e4,max:500}),t=new Map;return async function(n){try{if(await s.isNegative(n))return;let i=e.get(n);if(i&&Date.now()-i<1e4)return;let o=await s.getCachedFile(n);if(o)return{dts:o,url:n};let a=t.get(n);if(a)return a;let c=(async()=>{let l=await fetch(n,{cache:"no-store"});if(!l.ok){l.status===404&&(e.set(n,Date.now()),await s.recordNegative(n));return}let d=await l.text(),p=l.url||n;return await s.clearNegative(n),await s.setCachedFile(p,d),{dts:d,url:p}})();return t.set(n,c),await c.finally(()=>t.delete(n))}catch{return}}}var je=class{constructor(e){this.inFlight=new Map,this.scanner=new Se,this.cache=e.cache,this.cdnClient=e.cdnClient,this.versionResolver=e.versionResolver,this.packageService=e.packageService,this.fetchDts=ht(e.cache),this.typescriptProvider=new ve(this.fetchDts,e.cdnClient),this.definitelyTypedProvider=new xe(this.fetchDts,e.cdnClient,e.cache),this.virtualFs=new Pe}withInFlight(e,t){let r=this.inFlight.get(e);if(r)return r;let n=t().finally(()=>this.inFlight.delete(e));return this.inFlight.set(e,n),n}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(n=>n.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 g(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 g(e).subpath===new g(t).subpath}async fetchRootDts(e,t){let{effectivePackage:r,root:n,pinned:i}=await this.versionResolver.effectivePackage(e,t),o=await this.cache.getCachedDts(r);if(o?.content){let c=o.url??this.cdnClient.file(i?`${n}@${i}`:n,"index.d.ts");return{dts:o.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 n=t.pathname.startsWith(e.pathname)?t.pathname.slice(e.pathname.length):`__deps__/${encodeURIComponent(t.toString()).replace(/%/g,"_")}.d.ts`;return this.virtualFs.pathFor(r,n)}computeEntryPath(e,t){if(!e)return{mainPath:this.virtualFs.pathForMain(t),packageRootUrl:void 0};let r=new URL(e),n=this.extractPackageRootUrl(r);return{mainPath:this.toVirtualPath(n,r,t),packageRootUrl:n}}async expandRelativeRefs(e,t,r,n,i=new Set,o){if(!i.has(t)&&(i.add(t),!(i.size>J.maxRelativeTypeRefs)))try{let a=new URL(t),c=new URL("./",a);o??(o=this.extractPackageRootUrl(a));let l=this.capArray(this.scanner.collectRelativeTypeRefs(e),J.maxRelativeTypeRefs);for(let d of l)await this.tryRelativeRef(d,c,o,r,n,i)}catch{}}async tryRelativeRef(e,t,r,n,i,o){try{let a=new URL(e,t),c=a.pathname+a.search,l=ut(c)?[c]:this.typescriptProvider.declarationCandidatesFor(c);for(let d of l){let h=new URL(d,a).toString();if(o.has(h))return;let w=await this.fetchDts(h);if(w?.dts){let m=this.toVirtualPath(r,new URL(w.url),n);this.pushFileIfNew(i,m,w.dts),await this.expandRelativeRefs(w.dts,w.url,n,i,o,r);return}}}catch{}}isDifferentPackage(e,t){return e===t?!1:new g(e).name!==new g(t).name}ambientlyDeclares(e,t){for(let r of e.matchAll(/declare\s+module\s+['"]([^'"]+)['"]/g)){let n=r[1];if(n===t||n.endsWith("/*")&&t.startsWith(n.slice(0,-1)))return!0}return!1}markFileAmbient(e,t){let r=e.find(n=>n.path===t);r&&(r.ambient=!0)}async prefetchBareDeps(e,t,r,n,i){try{let o=this.capArray(this.scanner.collectBareModuleRefs(e),J.maxBareDeps).filter(l=>this.isDifferentPackage(l,t));if(!o.length)return;let a=new Set([t]),c=Sn(J.prefetchConcurrency);await Promise.all(o.map(l=>c(()=>this.prefetchBareDepsRecursive(l,r,n,J.maxBareDepth,a,i).catch(()=>{}))))}catch{}}async prefetchBareDepsRecursive(e,t,r,n,i,o){if(n<=0||i.has(e))return;i.add(e);let a=await this.fetchRootDts(e,o);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),J.maxBareDeps).filter(p=>!i.has(p));for(let p of d)await this.prefetchBareDepsRecursive(p,t,r,n-1,i,o)}async resolve(e,t,r){let n=await this.packageService.extractImports(e),i=r?[...n,...r]:n;return(await Promise.all(i.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 n=await this.fetchRootDts(e,t)??await this.trySubpathWithRootFallback(e,t);return n?this.buildDefFromContent(e,n,n.resolvedPkg||e,t):this.createStubDef(e)})}async buildDefFromContent(e,t,r,n){let{dts:i,url:o,resolvedPkg:a}=t,c=new g(a||r),l=c.version?`${c.name}@${c.version}`:c.name,{mainPath:d,packageRootUrl:p}=this.computeEntryPath(o,l),h=[{path:d,content:i}],w=[];o&&await this.expandRelativeRefs(i,o,l,h,void 0,p);let m=h.map(L=>L.content).join(`
236
+ `);await this.prefetchBareDeps(m,l,h,w,n);let v=c.format(),T=e===v?[e]:[e,v],W=T.some(L=>this.ambientlyDeclares(i,L));return W?this.markFileAmbient(h,d):w.push(...T.map(L=>({module:L,path:d}))),{pkg:e,mainPath:d,files:h,shims:w,ambient:W}}};function ft(s){return new je(s)}import*as N from"fs/promises";import*as B from"path";import*as dr from"os";import*as mt from"fs/promises";import*as cr from"crypto";function A(s){return cr.createHash("sha1").update(s).digest("hex")}async function Y(s){try{return JSON.parse(await mt.readFile(s,"utf8"))}catch{return}}async function Ne(s){try{return await mt.readFile(s,"utf8")}catch{return}}var lr=1,V=B.join(dr.homedir(),".typebulb","cache"),Re=B.join(V,"packages"),Ee=B.join(V,"proxy"),Le=B.join(V,"dts"),Pn=B.join(V,"emit"),gt;function S(){return gt||(gt=Rn()),gt}function Be(s,e){return B.join(Pn,A(s),e)}async function Rn(){await N.mkdir(V,{recursive:!0});let s=B.join(V,"version.json");if((await En(s))?.version===lr)return;let t=await N.readdir(V).catch(()=>[]);await Promise.all(t.map(r=>N.rm(B.join(V,r),{recursive:!0,force:!0}))),await N.writeFile(s,JSON.stringify({version:lr})+`
237
+ `,"utf8")}async function En(s){try{let e=await N.readFile(s,"utf8");return JSON.parse(e)}catch{return}}import*as q from"fs/promises";import*as pr from"path";async function O(s,e){await q.mkdir(pr.dirname(s),{recursive:!0});let t=`${s}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await q.writeFile(t,e,"utf8"),await q.rename(t,s).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 O(this.filePath,JSON.stringify(Object.fromEntries(e)))}};var yt=$.join(Re,"indexes"),ur=$.join(Re,"pinned"),kn=$.join(Re,"meta"),Tn=$.join(Re,"negative.json"),oe=Symbol("missing"),We=class{pinnedMem=new Map;indexMem=new Map;metaMem=new Map;negativeCache=new K(new ie(Tn));async getPinnedExact(e,t){let r=`${e}@${t}`,n=this.pinnedMem.get(r);if(n!==void 0)return n===oe?void 0:n;await S();let i=await Ne($.join(ur,A(r)+".txt"));return this.pinnedMem.set(r,i??oe),i}async setPinnedExact(e,t,r){let n=`${e}@${t}`;this.pinnedMem.set(n,r),await S(),await O($.join(ur,A(n)+".txt"),r)}async getIndex(e){let t=this.indexMem.get(e);if(t!==void 0)return t===oe?void 0:t;await S();let r=await Y($.join(yt,Ue(e)+".json"));return this.indexMem.set(e,r??oe),r}async setIndex(e,t,r){let n={versions:t,distTags:r,updatedAt:Date.now()};this.indexMem.set(e,n),await S(),await O($.join(yt,Ue(e)+".json"),JSON.stringify(n))}async invalidateVersionsCache(e){this.indexMem.delete(e),await fr.rm($.join(yt,Ue(e)+".json"),{force:!0})}async isNegative(e){return await S(),this.negativeCache.isNegative(e)}async recordNegative(e){await S(),await this.negativeCache.recordNegative(e)}async clearNegative(e){await this.negativeCache.clearNegative(e)}async getMeta(e,t){let r=`${e}@${t}`,n=this.metaMem.get(r);if(n!==void 0)return n===oe?void 0:n;await S();let i=await Y(hr(e,t));return this.metaMem.set(r,i??oe),i}async setMeta(e,t,r,n,i){let o={dependencies:r,peerDependencies:n,peerDependenciesMeta:i,updatedAt:Date.now()};this.metaMem.set(`${e}@${t}`,o),await S(),await O(hr(e,t),JSON.stringify(o))}};function hr(s,e){return $.join(kn,Ue(s),encodeURIComponent(e)+".json")}function Ue(s){return s.replace(/\//g,"__")}var mr={async getJson(s){try{let e=await fetch(s,{redirect:"follow"});return e.ok?await e.json():void 0}catch{return}},async head(s){try{let e=await fetch(s,{method:"HEAD",redirect:"follow"});return{ok:e.ok,url:e.url}}catch{return}}};var _n=new We,{packageService:He,versionResolver:gr,cdnClient:yr,peerResolver:vo}=Zt(_n,mr);var wr=`
180
238
  (() => {
181
239
  // Embedded (bulb-in-a-bulb): runs inside a sandboxed iframe with no parent
182
240
  // bridge, so privileged tb.* (AI, fs, server RPC) can't reach a host and would
@@ -360,12 +418,12 @@ declare const tb: {${Ft}${jt}${Nt}${Ut}${Ur}${Lt}${Bt}
360
418
  };
361
419
  }
362
420
  })();
363
- `;function tr(s){let{name:e,code:t,css:r,html:n,data:i,insight:o,importMap:a,watch:l,theme:c,trustHint:d}=s,p=n.trim()||'<div id="app"></div>',m=f=>f.replace(/<\/script/gi,"<\\/script"),w={imports:sn(a.imports)};return`<!DOCTYPE html>
421
+ `;function br(s){let{name:e,code:t,css:r,html:n,data:i,insight:o,importMap:a,watch:c,theme:l,trustHint:d}=s,p=n.trim()||'<div id="app"></div>',h=m=>m.replace(/<\/script/gi,"<\\/script"),w={imports:On(a.imports)};return`<!DOCTYPE html>
364
422
  <html>
365
423
  <head>
366
424
  <meta charset="utf-8">
367
425
  <meta name="viewport" content="width=device-width, initial-scale=1">
368
- <title>${lt(e)} - typebulb</title>
426
+ <title>${wt(e)} - typebulb</title>
369
427
  <script>
370
428
  // Theme engine. Sets html[data-theme] before stylesheets paint (no flash) and
371
429
  // exposes the tb.theme accessor via window.__tbTheme. The override is persisted
@@ -373,13 +431,13 @@ declare const tb: {${Ft}${jt}${Nt}${Ut}${Ur}${Lt}${Bt}
373
431
  // toggles the effective theme. See Specs/Theme.md.
374
432
  (function() {
375
433
  try {
376
- var KEY = ${m(JSON.stringify("tb-theme:"+e))};
434
+ var KEY = ${h(JSON.stringify("tb-theme:"+e))};
377
435
  var doc = document.documentElement;
378
436
  var mq = window.matchMedia('(prefers-color-scheme: dark)');
379
437
  var os = function() { return mq.matches ? 'dark' : 'light'; };
380
438
  // A host-forced theme (bulb-in-a-bulb) outranks the OS but not an explicit
381
439
  // in-iframe override, so the user can still toggle the embed independently.
382
- var FORCED = ${m(JSON.stringify(c??null))};
440
+ var FORCED = ${h(JSON.stringify(l??null))};
383
441
  var stored = function() {
384
442
  try { var v = localStorage.getItem(KEY); return (v === 'dark' || v === 'light') ? v : undefined; }
385
443
  catch (e) { return undefined; }
@@ -426,51 +484,79 @@ ${r}
426
484
  <body>
427
485
  ${p}
428
486
 
429
- ${i.length>0?`<script>window.__TB_DATA__ = ${m(JSON.stringify(i))};</script>`:""}
430
- ${o?`<script>window.__TB_INSIGHT__ = ${m(JSON.stringify(o))};</script>`:""}
431
- ${l?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
432
- ${d?`<script>window.__TB_EMBED_ERR__ = function (name) { return name + ' is blocked in sandboxed mode. Re-run with --trust to allow it:\\n ' + ${m(JSON.stringify(d))}; };</script>`:""}
487
+ ${i.length>0?`<script>window.__TB_DATA__ = ${h(JSON.stringify(i))};</script>`:""}
488
+ ${o?`<script>window.__TB_INSIGHT__ = ${h(JSON.stringify(o))};</script>`:""}
489
+ ${c?"<script>window.__TYPEBULB_WATCH__ = true;</script>":""}
490
+ ${d?`<script>window.__TB_EMBED_ERR__ = function (name) { return name + ' is blocked in sandboxed mode. Re-run with --trust to allow it:\\n ' + ${h(JSON.stringify(d))}; };</script>`:""}
433
491
 
434
492
  <script>
435
- ${er}
493
+ ${wr}
436
494
  </script>
437
495
 
438
- ${nn}
496
+ ${Cn}
439
497
 
440
498
  <script type="module">
441
- ${m(t)}
499
+ ${h(t)}
442
500
  </script>
443
501
  </body>
444
- </html>`}var nn=`<script>
502
+ </html>`}var Cn=`<script>
445
503
  (function () {
446
504
  if (window.parent === window) return;
447
- // Embedded: the host iframe owns sizing (auto-height below), so the document
448
- // must not scroll itself \u2014 otherwise sub-pixel rounding (the frame landing a
449
- // fraction shorter than content) leaves a phantom scrollbar. scrollHeight still
450
- // reports true content, so this is invisible to auto-height. A +1px report buffer
451
- // would seem simpler but runs away on full-bleed (height:100%) bulbs.
452
- document.documentElement.style.overflow = 'hidden';
505
+ var de = document.documentElement;
453
506
  var post = function (m) { try { parent.postMessage(m, '*'); } catch (e) {} };
454
- var sendHeight = function () {
455
- post({ __typebulbEmbed: true, kind: 'height', height: Math.ceil(document.documentElement.scrollHeight) });
507
+ // Overflow tracks fit, per axis. While content fits the frame, HIDE overflow: the
508
+ // sub-pixel gap (frame a fraction shorter than content) would otherwise flash a
509
+ // phantom scrollbar, and a full-bleed (height:100%) bulb \u2014 whose content equals the
510
+ // frame \u2014 must not scroll itself. When the host CAPS the frame (claude.bulb's inline
511
+ // mode caps height to a fraction of the viewport; a prose-column frame caps width),
512
+ // the content genuinely overflows, so ALLOW scroll on that axis to keep it reachable.
513
+ // Reported height is body.scrollHeight \u2014 the content's intrinsic extent: below the
514
+ // viewport for a short bulb (so the frame shrinks to it), tracking the frame for a
515
+ // full-bleed one (so it self-stabilises at the host's initial height).
516
+ //
517
+ // Coalesce to one rAF and only write an overflow value that actually changed: setting
518
+ // overflow adds/removes a scrollbar, which resizes the element and re-fires the
519
+ // observer \u2014 writing unconditionally ping-pongs (the "ResizeObserver loop" warning).
520
+ // The rAF + equality guard let it settle within a frame instead.
521
+ var raf = 0;
522
+ var apply = function () {
523
+ raf = 0;
524
+ var oy = de.scrollHeight > de.clientHeight + 1 ? 'auto' : 'hidden';
525
+ var ox = de.scrollWidth > de.clientWidth + 1 ? 'auto' : 'hidden';
526
+ if (de.style.overflowY !== oy) de.style.overflowY = oy;
527
+ if (de.style.overflowX !== ox) de.style.overflowX = ox;
528
+ post({ __typebulbEmbed: true, kind: 'height', height: Math.ceil(document.body.scrollHeight) });
456
529
  };
530
+ var update = function () { if (!raf) raf = requestAnimationFrame(apply); };
531
+ de.style.overflow = 'hidden';
457
532
  window.addEventListener('error', function (e) {
458
- post({ __typebulbEmbed: true, kind: 'error', message: String((e && e.message) || (e && e.error) || 'Error') });
533
+ var m = String((e && e.message) || (e && e.error) || 'Error');
534
+ // The benign "ResizeObserver loop completed\u2026" notice surfaces as a window error in
535
+ // some browsers; it's not a bulb fault, so don't forward it to the host as one.
536
+ if (m.indexOf('ResizeObserver') !== -1) return;
537
+ post({ __typebulbEmbed: true, kind: 'error', message: m });
459
538
  });
460
539
  window.addEventListener('unhandledrejection', function (e) {
461
540
  var r = e && e.reason;
462
541
  var msg = r && r.message ? r.message : (r == null ? 'Unhandled rejection' : r);
463
542
  post({ __typebulbEmbed: true, kind: 'error', message: String(msg) });
464
543
  });
465
- window.addEventListener('load', sendHeight);
466
- if (window.ResizeObserver) { try { new ResizeObserver(sendHeight).observe(document.documentElement); } catch (e) {} }
544
+ // Run at load (module mounted \u2192 real content, not the empty pre-mount body that would
545
+ // collapse the frame and snap back). Observe BOTH body (content growth) and the root
546
+ // element (the viewport \u2014 so a host resize/cap re-syncs overflow on the next frame).
547
+ window.addEventListener('load', function () {
548
+ update();
549
+ if (window.ResizeObserver) {
550
+ try { var ro = new ResizeObserver(update); ro.observe(document.body); ro.observe(de); } catch (e) {}
551
+ }
552
+ });
467
553
  })();
468
- </script>`;function rr(s){let{bulbHtml:e,name:t,watch:r}=s;return`<!DOCTYPE html>
554
+ </script>`;function vr(s){let{bulbHtml:e,name:t,watch:r}=s;return`<!DOCTYPE html>
469
555
  <html>
470
556
  <head>
471
557
  <meta charset="utf-8">
472
558
  <meta name="viewport" content="width=device-width, initial-scale=1">
473
- <title>${lt(t)} - typebulb</title>
559
+ <title>${wt(t)} - typebulb</title>
474
560
  <style>
475
561
  *, *::before, *::after { box-sizing: border-box; }
476
562
  body { margin: 0; }
@@ -491,7 +577,7 @@ ${m(t)}
491
577
  </style>
492
578
  </head>
493
579
  <body>
494
- <iframe id="tb-frame" sandbox="allow-scripts" srcdoc="${lt(e)}"></iframe>
580
+ <iframe id="tb-frame" sandbox="allow-scripts" srcdoc="${wt(e)}"></iframe>
495
581
  <pre id="tb-deny"></pre>
496
582
  <script>
497
583
  (function () {
@@ -517,87 +603,29 @@ ${m(t)}
517
603
  })();
518
604
  </script>
519
605
  </body>
520
- </html>`}function lt(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function sn(s){let e={};for(let[t,r]of Object.entries(s))e[t]=r.startsWith("https://")?"/proxy/"+r:r;return e}import{Hono as an}from"hono";import{serve as cn}from"@hono/node-server";import{streamSSE as ln}from"hono/streaming";import*as Y from"fs/promises";import*as N from"path";var D=class extends Error{constructor(e,t="unknown",r=!1){super(e),this.code=t,this.retryable=r}},j=class{getPath(e,t){return this.path}parseStreamChunk(e){return this.checkAndThrowError(e),this.parseProviderStreamChunk(e)}isReasoningEnabled(e){return e?.reasoning!==void 0&&e.reasoning>0}extractSystemMessages(e,t=`
606
+ </html>`}function wt(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function On(s){let e={};for(let[t,r]of Object.entries(s))e[t]=r.startsWith("https://")?"/proxy/"+r:r;return e}import*as Je from"fs/promises";import*as bt from"path";import{existsSync as xr}from"fs";import{execFile as Dn}from"child_process";import{promisify as In}from"util";var An=In(Dn);async function Ve(s,e){let t=s.filter(n=>!$n(n,e));if(t.length===0)return;await Je.mkdir(e,{recursive:!0});let r=bt.join(e,"package.json");xr(r)||await Je.writeFile(r,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${t.join(", ")}`),await An("npm",["install","--no-audit","--no-fund",...t],{cwd:e,shell:!0})}function $n(s,e){return xr(bt.join(e,"node_modules",Mn(s)))}function qe(s){let e=new Set,t=/\bimport\s+(?:[\s\S]*?\s+from\s+)?['"]([^./][^'"]*)['"]/g,r;for(;r=t.exec(s);){let n=r[1];if(n.includes(":"))continue;let i=n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0];e.add(i)}return[...e]}function Mn(s){if(s.startsWith("@")){let t=s.indexOf("/");if(t<0)return s;let r=s.indexOf("@",t+1);return r<0?s:s.slice(0,r)}let e=s.indexOf("@");return e<0?s:s.slice(0,e)}async function Sr(s){let t=(await z.readdir(s)).find(r=>r.endsWith(".bulb.md"));return t?ae.join(s,t):null}async function ke(s){let e=await z.readFile(s,"utf-8"),t=Vt(e);if(!t)throw new Error("Invalid .bulb.md file format");let r=qt(t);return{bulb:r,config:Gt(r.config)}}async function vt(s,e,t){let r=st(s,{serverOnly:!0});if(r.error)throw new Error(`Server compilation error: ${r.error}`);let n=r.code;t&&(n=await Ut(n,t));let i=ae.join(e,".typebulb");await z.mkdir(i,{recursive:!0});let o=qe(n);o.length>0&&await Ve(o,i);let a=ae.join(i,"server.mjs");return await z.writeFile(a,n,"utf-8"),await import(`${Fn(a).href}?t=${Date.now()}`)}async function xt(s,e,t,r,n){let{bulb:i,config:o}=await ke(s),a=zt(i.data),c=st(i.code,{jsxImportSource:o.jsxImportSource});c.error&&console.error("Compilation error:",c.error);let{importMap:l}=await He.buildImportMap(c.code,o.dependencies??{},n?new Set([n.name]):void 0);n&&(l.imports[n.name]=n.entryUrl);let d=br({name:i.name,code:c.code,css:i.css,html:i.html,data:a,insight:i.insight,importMap:l,watch:t?e:!1,trustHint:t?void 0:r}),p=t?d:vr({bulbHtml:d,name:i.name,watch:e}),h=ae.dirname(s);o.env?.length&&de(o.env,h);let w=null;return i.server&&t&&(w=await vt(i.server,h,n)),{html:p,bulb:i,serverExports:w}}import{Hono as Nn}from"hono";import{serve as Ln}from"@hono/node-server";import{streamSSE as Bn}from"hono/streaming";import*as Q from"fs/promises";import*as F from"path";var D=class extends Error{constructor(e,t="unknown",r=!1){super(e),this.code=t,this.retryable=r}},M=class{getPath(e,t){return this.path}parseStreamChunk(e){return this.checkAndThrowError(e),this.parseProviderStreamChunk(e)}isReasoningEnabled(e){return e?.reasoning!==void 0&&e.reasoning>0}extractSystemMessages(e,t=`
521
607
 
522
- `){let r=e.filter(n=>n.role==="system").map(n=>n.content);return{system:r.length?r.join(t):void 0,conversationMessages:e.filter(n=>n.role!=="system")}}parseJsonError(e,t,r=!1){if(!e)return{message:`HTTP ${t}`};try{let n=JSON.parse(e);if(n.error&&typeof n.error=="object"){let i={message:n.error.message||`HTTP ${t}`,type:n.error.type};return r&&(i.code=n.error.code),i}return n.message?{message:n.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",n=!!e.retryable;throw new D(t,r,n)}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 Se=class extends j{constructor(){super(...arguments),this.providerName="Anthropic",this.defaultBaseUrl="https://api.anthropic.com",this.path="/v1/messages"}buildHeaders(e){return{"x-api-key":e,"anthropic-version":"2023-06-01","Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,r,n){let{system:i,conversationMessages:o}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(o),stream:n};if(r?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),i&&(a.system=[{type:"text",text:i,cache_control:{type:"ephemeral"}}]),this.isReasoningEnabled(r)){let l=r.reasoning;if(this.isModernModel(t)){let c={0:"low",1:"low",2:"medium",3:"high"};a.thinking={type:"adaptive"},a.output_config={effort:c[l]}}else{let c={0:0,1:2048,2:4096,3:8192};a.thinking={type:"enabled",budget_tokens:c[l]}}}return a}parseError(e,t){return this.parseJsonError(e,t)}parseNonStreamingResponse(e){if(!this.isAnthropicResponse(e))return{text:""};let t=e.content.filter(n=>n.type==="text").map(n=>n.text).join(""),r=e.content.filter(n=>n.type==="thinking").map(n=>n.thinking).join(`
608
+ `){let r=e.filter(n=>n.role==="system").map(n=>n.content);return{system:r.length?r.join(t):void 0,conversationMessages:e.filter(n=>n.role!=="system")}}parseJsonError(e,t,r=!1){if(!e)return{message:`HTTP ${t}`};try{let n=JSON.parse(e);if(n.error&&typeof n.error=="object"){let i={message:n.error.message||`HTTP ${t}`,type:n.error.type};return r&&(i.code=n.error.code),i}return n.message?{message:n.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",n=!!e.retryable;throw new D(t,r,n)}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 Te=class extends M{constructor(){super(...arguments),this.providerName="Anthropic",this.defaultBaseUrl="https://api.anthropic.com",this.path="/v1/messages"}buildHeaders(e){return{"x-api-key":e,"anthropic-version":"2023-06-01","Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,r,n){let{system:i,conversationMessages:o}=this.extractSystemMessages(e),a={model:t,max_tokens:this.getMaxTokens(t),messages:this.withLastMessageCached(o),stream:n};if(r?.webSearch!==!1&&(a.tools=[{type:"web_search_20250305",name:"web_search"}]),i&&(a.system=[{type:"text",text:i,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(n=>n.type==="text").map(n=>n.text).join(""),r=e.content.filter(n=>n.type==="thinking").map(n=>n.thinking).join(`
523
609
 
524
- `);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,n)=>n===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 Re=class extends j{constructor(){super(...arguments),this.providerName="OpenAI",this.defaultBaseUrl="https://api.openai.com",this.path="/v1/responses",this.effortMap={0:"minimal",1:"low",2:"medium",3:"high"}}buildHeaders(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,r,n){let i=this.convertMessagesToInput(e),o={model:t,input:i,stream:n};return r?.webSearch!==!1&&(o.tools=[{type:"web_search"}]),this.isReasoningEnabled(r)&&(o.reasoning={effort:this.effortMap[r.reasoning],summary:"auto"}),o}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 n of e.output)n.type==="reasoning"&&n.summary&&(r=n.summary.map(i=>i.text).join(`
610
+ `);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,n)=>n===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 _e=class extends M{constructor(){super(...arguments),this.providerName="OpenAI",this.defaultBaseUrl="https://api.openai.com",this.path="/v1/responses",this.effortMap={0:"minimal",1:"low",2:"medium",3:"high"}}buildHeaders(e){return{Authorization:`Bearer ${e}`,"Content-Type":"application/json",Accept:"application/json"}}buildPayload(e,t,r,n){let i=this.convertMessagesToInput(e),o={model:t,input:i,stream:n};return r?.webSearch!==!1&&(o.tools=[{type:"web_search"}]),this.isReasoningEnabled(r)&&(o.reasoning={effort:this.effortMap[r.reasoning],summary:"auto"}),o}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 n of e.output)n.type==="reasoning"&&n.summary&&(r=n.summary.map(i=>i.text).join(`
525
611
  `)),!t&&n.type==="message"&&n.content&&(t=n.content.filter(i=>i.type==="output_text").map(i=>i.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 n=e.response?.error,i=n?.message||"Response failed",o=n?.code==="insufficient_quota"||n?.code==="rate_limit_exceeded";throw new D(i,o?"rate_limit":"unknown",o)}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(`
526
612
 
527
- `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var Ee=class extends j{constructor(){super(...arguments),this.providerName="Gemini",this.defaultBaseUrl="https://generativelanguage.googleapis.com",this.path="/v1beta/models"}getPath(e,t){return`/v1beta/models/${e}:${t?"streamGenerateContent":"generateContent"}${t?"?alt=sse":""}`}buildHeaders(e){return{"Content-Type":"application/json","x-goog-api-key":e}}buildPayload(e,t,r,n){let{system:i,conversationMessages:o}=this.extractSystemMessages(e,`
528
- `),l={contents:o.map(c=>({role:c.role==="assistant"?"model":"user",parts:[{text:c.content}]}))};return r?.webSearch!==!1&&(l.tools=[{google_search:{}}]),i&&(l.systemInstruction={role:"system",parts:[{text:i}]}),this.isReasoningEnabled(r)&&(l.generationConfig={temperature:.7+r.reasoning*.1}),l}parseError(e,t){if(!e)return{message:`HTTP ${t}`};try{let r=JSON.parse(e),n=Array.isArray(r)?r[0]?.error:r?.error;return n&&typeof n=="object"?{message:(n.message||`HTTP ${t}`).split(`
529
- `)[0],type:n.status,code:n.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,n="complete";return r==="MAX_TOKENS"?n="interrupted":(r==="SAFETY"||r==="RECITATION")&&(n="failed"),{text:t,status:n}}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 n=t;r=n.message||n.status||"Gemini returned an error"}else r="Gemini returned an error";throw new D(r)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new D(`Prompt blocked: ${t}`)}}};var ke=class extends j{constructor(){super(...arguments),this.providerName="OpenRouter",this.defaultBaseUrl="https://openrouter.ai/api",this.path="/api/v1/chat/completions",this.effortMap={0:"low",1:"low",2:"medium",3:"high"}}buildHeaders(e,t){let 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,n){let i={model:t,messages:e,stream:n};return r?.webSearch===!0&&(i.plugins=[{id:"web"}]),this.isReasoningEnabled(r)&&(i.reasoning={effort:this.effortMap[r.reasoning]}),i}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??"",n=t?.message?.reasoning??e.reasoning;return{text:r,reasoning:n}}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 n=r.content||void 0,i=r.reasoning||void 0;return!n&&!i?null:{text:n,reasoning:i}}hasChoices(e){return typeof e=="object"&&e!==null&&"choices"in e&&Array.isArray(e.choices)}};var on=new Map([["openai",new Re],["openrouter",new ke],["anthropic",new Se],["gemini",new Ee]]);function K(s){let e=on.get(s);if(!e)throw new Error(`Unsupported protocol: ${s}`);return e}async function dt(s,e){let t=K(s.protocol),r=t.getPath(e.model,e.stream),n=new URL(r,s.baseUrl).toString(),i=t.buildHeaders(s.apiKey,e.origin),o=t.buildPayload(e.messages,e.model,{reasoning:e.reasoning,webSearch:e.webSearch},e.stream);return e.modifyPayload?.(o),fetch(n,{method:"POST",headers:i,body:JSON.stringify(o),signal:e.signal})}async function pt(s,e){let t=K(e),r=await s.text().catch(()=>""),{message:n}=t.parseError(r,s.status),i=s.status,o="unknown";return i===429?o="rate_limit":i===413&&(o="context_exceeded"),{code:o,message:n,retryable:i===429}}function nr(s){let e=s.indexOf(`\r
613
+ `)}isResponsesApiEvent(e){return"type"in e&&typeof e.type=="string"}isResponsesApiResponse(e){return"object"in e&&e.object==="response"}};var Ce=class extends M{constructor(){super(...arguments),this.providerName="Gemini",this.defaultBaseUrl="https://generativelanguage.googleapis.com",this.path="/v1beta/models"}getPath(e,t){return`/v1beta/models/${e}:${t?"streamGenerateContent":"generateContent"}${t?"?alt=sse":""}`}buildHeaders(e){return{"Content-Type":"application/json","x-goog-api-key":e}}buildPayload(e,t,r,n){let{system:i,conversationMessages:o}=this.extractSystemMessages(e,`
614
+ `),c={contents:o.map(l=>({role:l.role==="assistant"?"model":"user",parts:[{text:l.content}]}))};return r?.webSearch!==!1&&(c.tools=[{google_search:{}}]),i&&(c.systemInstruction={role:"system",parts:[{text:i}]}),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),n=Array.isArray(r)?r[0]?.error:r?.error;return n&&typeof n=="object"?{message:(n.message||`HTTP ${t}`).split(`
615
+ `)[0],type:n.status,code:n.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,n="complete";return r==="MAX_TOKENS"?n="interrupted":(r==="SAFETY"||r==="RECITATION")&&(n="failed"),{text:t,status:n}}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 n=t;r=n.message||n.status||"Gemini returned an error"}else r="Gemini returned an error";throw new D(r)}if(this.isGeminiResponse(e)&&e.promptFeedback?.blockReason){let t=e.promptFeedback.blockReason;throw new D(`Prompt blocked: ${t}`)}}};var Oe=class extends M{constructor(){super(...arguments),this.providerName="OpenRouter",this.defaultBaseUrl="https://openrouter.ai/api",this.path="/api/v1/chat/completions",this.effortMap={0:"low",1:"low",2:"medium",3:"high"}}buildHeaders(e,t){let 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,n){let i={model:t,messages:e,stream:n};return r?.webSearch===!0&&(i.plugins=[{id:"web"}]),this.isReasoningEnabled(r)&&(i.reasoning={effort:this.effortMap[r.reasoning]}),i}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??"",n=t?.message?.reasoning??e.reasoning;return{text:r,reasoning:n}}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 n=r.content||void 0,i=r.reasoning||void 0;return!n&&!i?null:{text:n,reasoning:i}}hasChoices(e){return typeof e=="object"&&e!==null&&"choices"in e&&Array.isArray(e.choices)}};var jn=new Map([["openai",new _e],["openrouter",new Oe],["anthropic",new Te],["gemini",new Ce]]);function X(s){let e=jn.get(s);if(!e)throw new Error(`Unsupported protocol: ${s}`);return e}async function St(s,e){let t=X(s.protocol),r=t.getPath(e.model,e.stream),n=new URL(r,s.baseUrl).toString(),i=t.buildHeaders(s.apiKey,e.origin),o=t.buildPayload(e.messages,e.model,{reasoning:e.reasoning,webSearch:e.webSearch},e.stream);return e.modifyPayload?.(o),fetch(n,{method:"POST",headers:i,body:JSON.stringify(o),signal:e.signal})}async function Pt(s,e){let t=X(e),r=await s.text().catch(()=>""),{message:n}=t.parseError(r,s.status),i=s.status,o="unknown";return i===429?o="rate_limit":i===413&&(o="context_exceeded"),{code:o,message:n,retryable:i===429}}function Pr(s){let e=s.indexOf(`\r
530
616
  \r
531
617
  `),t=s.indexOf(`
532
618
 
533
- `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function ut(s){let t=s.split(/\r?\n/).filter(n=>n.startsWith("data:"));if(!t.length)return null;let r=t.map(n=>n.replace(/^data:\s?/,"")).join(`
534
- `).trim();if(!r)return null;if(r==="[DONE]")return"done";try{return JSON.parse(r)}catch{return null}}async function sr(s,e,t){let r=new TextDecoder,n="",i=!1,o=t?new Promise((a,l)=>{t.aborted&&l(new Error("Aborted")),t.addEventListener("abort",()=>l(new Error("Aborted")),{once:!0})}):null;for(;;){let a=o?await Promise.race([s.read(),o]):await s.read(),{done:l,value:c}=a;if(l){if(n.trim()){let m=ut(n);m!==null&&m!=="done"&&e(m)}break}i=!0,n+=r.decode(c,{stream:!0});let{pos:d,len:p}=nr(n);for(;d!==-1;){let m=n.slice(0,d);n=n.slice(d+p);let w=ut(m);if(w==="done"){n="";break}w!==null&&e(w),{pos:d,len:p}=nr(n)}}return{receivedAnyData:i}}async function ht(s,e){let t=e??(s.headers.get("X-Provider-Protocol")||"openai"),r=K(t);if(!s.body)throw new Error("Response body is missing");let n=s.body.getReader(),i="";return await sr(n,o=>{let a=r.parseStreamChunk(o);a?.text&&(i+=a.text)}),i}import*as mt from"fs/promises";import*as Te from"path";var Ue=class{async get(e){let t=$(e),r=Te.join(Pe,t+".bin"),n=Te.join(Pe,t+".json");try{let[i,o]=await Promise.all([mt.readFile(r),mt.readFile(n,"utf8")]),a=JSON.parse(o);return{body:i,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await P();let r=$(e),n=Te.join(Pe,r+".bin"),i=Te.join(Pe,r+".json"),o={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([O(n,t.body),O(i,JSON.stringify(o))])}};var ar="127.0.0.1",dn=new Set(["localhost","127.0.0.1","::1"]);function pn(s){if(s)try{return new URL(s.includes("://")?s:`http://${s}`).hostname}catch{return}}function ir(s){let e=pn(s);return!!e&&dn.has(e)}function We(s){return s instanceof Error?s.message:"Unknown error"}async function cr(s){let{getHtml:e,basePath:t,port:r,reloadEmitter:n,getServerExports:i,localOverride:o,trusted:a=!1,trustHint:l}=s,c=new an;c.use("*",async(u,h)=>{if(!ir(u.req.header("host")))return u.text("Forbidden: untrusted Host",403);await h()}),c.use("*",async(u,h)=>{await h(),u.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),u.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let d=["/__fs/*","/__api/*","/__ai"],p=async(u,h)=>{if(!a){let y=l?`
535
- ${l}`:"";return u.text(`Forbidden: this capability requires --trust.${y}`,403)}await h()},m=async(u,h)=>{let y=u.req.header("sec-fetch-site");if(y){if(y==="cross-site")return u.text("Forbidden: cross-site request",403)}else{let x=u.req.header("origin");if(x&&!ir(x))return u.text("Forbidden: cross-origin request",403)}await h()};for(let u of d)c.use(u,p),c.use(u,m);c.get("/",u=>u.html(e())),c.post("/__fs/read",async u=>{try{let{path:h}=await u.req.json(),y=gt(h,t),x=await Y.readFile(y);return new Response(new Uint8Array(x),{headers:{"Content-Type":"application/octet-stream"}})}catch(h){let y=We(h);return u.json({error:y},400)}}),c.post("/__fs/write",async u=>{try{let h=u.req.query("path");if(!h)return u.json({error:"Missing path"},400);let y=gt(h,t);return await Y.mkdir(N.dirname(y),{recursive:!0}),await Y.writeFile(y,Buffer.from(await u.req.arrayBuffer())),u.json({success:!0})}catch(h){let y=We(h);return u.json({error:y},400)}});let w={log:console.log};c.post("/__api/:name",async u=>{try{let h=i?.(),y=u.req.param("name"),x=h?.[y]??w[y];if(!x||typeof x!="function")return u.json({error:`API function '${y}' not found`},404);let{args:b}=await u.req.json(),I=await x(...b||[]);return u.json({result:I})}catch(h){let y=We(h);return u.json({error:y},500)}}),c.post("/__ai",async u=>{try{let{messages:h,system:y,reasoning:x,provider:b,model:I,webSearch:W}=await u.req.json();if(!h||!Array.isArray(h)||h.length===0)return u.json({message:"messages array is required",code:"unknown",retryable:!1},400);let L=un(b,I);if(typeof L=="string")return u.json({message:L,code:"unknown",retryable:!1},400);let ze=[...y?[{role:"system",content:y}]:[],...h.map(Ie=>({role:Ie.role,content:Ie.content}))],Q=await dt(L,{model:L.model,messages:ze,stream:!0,reasoning:x??0,webSearch:W??!0});if(!Q.ok){let Ie=await pt(Q,L.protocol);return u.json(Ie,Q.status)}let kt=await ht(Q,L.protocol);return kt||console.warn("[tb.ai] Empty response from provider"),u.json({text:kt})}catch(h){if(h instanceof D)return u.json({message:h.message,code:h.code,retryable:h.retryable},500);let y=We(h);return u.json({message:y,code:"unknown",retryable:!1},500)}}),c.get("/__models",async u=>{try{let h=await fn();return u.json(h)}catch{return u.json([],200)}});let f=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],R=new Ue;if(c.get("/proxy/*",async u=>{let h=new URL(u.req.url),x=(h.pathname+h.search).slice(7),b=x.lastIndexOf("https://");return b===-1?u.text("Invalid proxy URL",400):v(u,x.slice(b))}),o){let u=`/local/${o.name}/`;c.get("/local/*",async h=>{let{pathname:y}=new URL(h.req.url);if(!y.startsWith(u))return h.text("Not Found",404);let x=decodeURIComponent(y.slice(u.length));try{let b=gt(x,o.serveDir),I=await Y.readFile(b);return new Response(I,{headers:{"Content-Type":gn(b)}})}catch{return h.text("Not Found",404)}})}async function v(u,h){let y;try{y=new URL(h)}catch{return u.text("Invalid URL",400)}if(y.protocol!=="https:")return u.text("HTTPS only",400);if(!f.includes(y.hostname))return u.text("Host not allowed",403);let x=await R.get(h);if(x)return new Response(x.body,{status:200,headers:ft(x.contentType,x.cacheControl)});try{let b=await fetch(h,{headers:{Accept:u.req.header("Accept")||"*/*"},redirect:"follow"});if(!b.ok)return u.text(`Upstream ${b.status}`,b.status);let I=b.headers.get("Content-Type")||void 0,W=b.headers.get("Cache-Control")||void 0;if(b.body){let[L,ze]=b.body.tee();return(async()=>{try{let Q=await new Response(ze).arrayBuffer();await R.set(h,{body:Buffer.from(Q),contentType:I,cacheControl:W})}catch{}})(),new Response(L,{status:b.status,headers:ft(I,W)})}return new Response(null,{status:b.status,headers:ft(I,W)})}catch(b){return u.text(`Proxy fetch failed: ${b instanceof Error?b.message:b}`,502)}}n&&c.get("/__reload",u=>ln(u,async h=>{let y=()=>{h.writeSSE({event:"reload",data:""})};for(n.on("reload",y),h.onAbort(()=>{n.removeListener("reload",y)});;)await h.sleep(3e4)}));let E=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;c.notFound(async u=>{if(u.req.method!=="GET")return u.text("Not Found",404);let h=new URL(u.req.url);return E.test(h.pathname)?v(u,"https://esm.sh"+h.pathname+h.search):u.text("Not Found",404)});let ae=cn({fetch:c.fetch,port:r,hostname:ar});return{port:r,close:()=>ae.close()}}var lr={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"};function un(s,e){let t=s??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 n;try{n=K(t)}catch{return`Unknown provider '${t}'.`}let i=lr[t],o=process.env[i];return o?{apiKey:o,baseUrl:n.defaultBaseUrl,protocol:t,model:r,isFreeModel:!1}:`No API key for '${t}'. Set ${i} in your .env file.`}var hn="https://api.typebulb.com/api/models",mn=1440*60*1e3,ie=null;async function fn(){if(!ie||Date.now()-ie.fetchedAt>mn){let s=await fetch(hn);if(!s.ok)return ie?or(ie.models):[];ie={models:await s.json(),fetchedAt:Date.now()}}return or(ie.models)}function or(s){let e=new Set(Object.entries(lr).filter(([,t])=>!!process.env[t]).map(([t])=>t));return s.filter(t=>e.has(t.provider))}function ft(s,e){let t=new Headers;return s&&t.set("Content-Type",s),e&&t.set("Cache-Control",e),t.set("Access-Control-Allow-Origin","*"),t.set("Cross-Origin-Resource-Policy","cross-origin"),t}function gn(s){switch(N.extname(s).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 gt(s,e){let t=N.resolve(e,s),r=N.normalize(e),n=N.normalize(t);if(n!==r&&!n.startsWith(r+N.sep))throw new Error("Path traversal detected - access denied");return t}async function yt(s){let e=await import("net");return new Promise(t=>{let r=e.createServer();r.listen(s,ar,()=>{let n=r.address(),i=typeof n=="object"&&n?n.port:s;r.close(()=>t(i))}),r.on("error",()=>{t(yt(s+1))})})}import yn from"open";async function dr(s){await yn(s)}import pr from"chokidar";var ur={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function wt(s){let{bulbPath:e,emitter:t}=s,r=pr.watch(e,ur);return r.on("change",()=>{t.emit("reload")}),()=>r.close()}function hr(s){let{dir:e,onChange:t,debounceMs:r=150}=s,n,i=pr.watch(e,ur);return i.on("all",()=>{n&&clearTimeout(n),n=setTimeout(t,r)}),()=>{n&&clearTimeout(n),i.close()}}import*as _ from"fs/promises";import*as T from"path";import*as oe from"path";var wn=oe.join(Fe,"pkg"),bn=oe.join(Fe,"files"),vn=oe.join(Fe,"negative.json"),Je=class{pkgMem=new Map;fileMem=new Map;negativeCache=new G(new ne(vn));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await P();let t=await z(mr(e));return this.pkgMem.set(e,t),t}async setCachedDts(e,t,r){let n={content:t,url:r};this.pkgMem.set(e,n),await He(async()=>{await P(),await O(mr(e),JSON.stringify(n))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await P();let t=await $e(fr(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await He(async()=>{await P(),await O(fr(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await He(async()=>{await P(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return He(()=>this.negativeCache.clearNegative(e))}};async function He(s){try{await s()}catch{}}function mr(s){return oe.join(wn,$(s)+".json")}function fr(s){return oe.join(bn,$(s)+".txt")}var bt;function xn(){return bt||(bt=it({cache:new Je,cdnClient:Zt,packageService:Be,versionResolver:Qt})),bt}var gr="file:///node_modules/";async function yr(s){let e=je(s.emitKey,"typecheck");await P(),await _.rm(e,{recursive:!0,force:!0}),await _.mkdir(e,{recursive:!0});let t=En(s.jsxImportSource,s.dependencies),r=await xn().resolve(s.code,s.dependencies,t),n=s.local?.name,i=n?r.filter(c=>c.pkg!==n):r,o=new Set;for(let c of i)for(let d of c.files){let p=vt(d.path);if(!p||o.has(p))continue;o.add(p);let m=T.join(e,"node_modules",p);await _.mkdir(T.dirname(m),{recursive:!0}),await _.writeFile(m,d.content,"utf8")}let a={};for(let c of i)for(let d of c.shims){let p=vt(d.path);p&&(a[d.module]=[`./node_modules/${p}`])}for(let c of i){let d=vt(c.mainPath);d&&(a[c.pkg]=[`./node_modules/${d}`])}if(s.local){delete a[s.local.name];let c=await kn(s.local,e);c?a[s.local.name]=[`./node_modules/${s.local.name}/${c}`]:console.warn(` local: '${s.local.name}' ships no type defs; check cannot type against it.`)}let l=Pn(s.jsxImportSource,a);return await _.writeFile(T.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
536
- `,"utf8"),await _.writeFile(T.join(e,"code.tsx"),s.code,"utf8"),await _.writeFile(T.join(e,"tb.d.ts"),tt,"utf8"),{dir:e}}function Pn(s,e){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:Sn([...Ze,...et]),jsx:"react-jsx",jsxImportSource:s??"react",strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0,baseUrl:".",paths:e},include:["code.tsx","tb.d.ts"]}}function Sn(s){return s.filter(e=>!e.since).map(e=>Rn(e.name))}function Rn(s){return s.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 En(s,e){let t=s??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function vt(s){if(!s.startsWith(gr))return;let e=s.slice(gr.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function kn(s,e){if(!s.typesAbs)return;let t=T.dirname(s.typesAbs),r=T.join(e,"node_modules",s.name);for(let n of await Tn(t)){let i=T.join(r,T.relative(t,n));await _.mkdir(T.dirname(i),{recursive:!0}),await _.copyFile(n,i)}return T.basename(s.typesAbs)}async function Tn(s){let e=[];async function t(r){let n=await _.readdir(r,{withFileTypes:!0});for(let i of n){let o=T.join(r,i.name);i.isDirectory()?await t(o):/\.d\.ts(\.map)?$/.test(i.name)&&e.push(o)}}return await t(s),e}import*as A from"fs/promises";import*as X from"path";import{existsSync as An}from"fs";import*as Ve from"fs/promises";import*as xt from"path";import{existsSync as wr}from"fs";import{execFile as _n}from"child_process";import{promisify as Cn}from"util";var In=Cn(_n);async function qe(s,e){let t=s.filter(n=>!On(n,e));if(t.length===0)return;await Ve.mkdir(e,{recursive:!0});let r=xt.join(e,"package.json");wr(r)||await Ve.writeFile(r,JSON.stringify({name:"typebulb-server",private:!0})),console.log(` Installing: ${t.join(", ")}`),await In("npm",["install","--no-audit","--no-fund",...t],{cwd:e,shell:!0})}function On(s,e){return wr(xt.join(e,"node_modules",Dn(s)))}function Ge(s){let e=new Set,t=/\bimport\s+(?:[\s\S]*?\s+from\s+)?['"]([^./][^'"]*)['"]/g,r;for(;r=t.exec(s);){let n=r[1];if(n.startsWith("node:"))continue;let i=n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0];e.add(i)}return[...e]}function Dn(s){if(s.startsWith("@")){let t=s.indexOf("/");if(t<0)return s;let r=s.indexOf("@",t+1);return r<0?s:s.slice(0,r)}let e=s.indexOf("@");return e<0?s:s.slice(0,e)}var Mn="^22";async function br(s){let e=je(s.emitKey,"typecheck-server");await P(),await A.rm(e,{recursive:!0,force:!0}),await A.mkdir(e,{recursive:!0});let t=X.join(s.bulbDir,".typebulb"),r=Ge(s.server);await qe([`@types/node@${Mn}`,...r],t);let n=X.join(t,"node_modules"),i=X.join(e,"node_modules");return await Fn(n,i),await A.writeFile(X.join(e,"server.ts"),s.server,"utf8"),await A.writeFile(X.join(e,"tb.d.ts"),rt,"utf8"),await A.writeFile(X.join(e,"tsconfig.json"),JSON.stringify($n(),null,2)+`
537
- `,"utf8"),{dir:e}}function $n(){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"node",lib:["ES2023"],types:["node"],strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0},include:["server.ts","tb.d.ts"]}}async function Fn(s,e){if(!An(s)){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(s,e,t)}import*as St from"fs/promises";import{existsSync as _e}from"fs";import*as k from"path";import{resolve as vr}from"resolve.exports";import{init as jn,parse as Nn}from"es-module-lexer";var Pt=["browser","import","default"];function xr(s){let e=s.indexOf("=");if(e===-1)throw new Error(`--replace must be <name>=<path> (got '${s}')`);let t=s.slice(0,e).trim(),r=s.slice(e+1).trim();if(!t)throw new Error(`--replace missing package name (got '${s}')`);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:k.resolve(r)}}async function Pr(s){let{name:e,dir:t}=s;if(!_e(t))throw new Error(`--replace path for '${e}' does not exist: ${t}`);let r=k.join(t,"package.json"),n;try{n=JSON.parse(await St.readFile(r,"utf8"))}catch{throw new Error(`--replace package '${e}' has no readable package.json at ${r}`)}let i=Ln(n,e),o=k.resolve(t,i);if(!_e(o))throw new Error(`--replace package '${e}' entry not found on disk: ${o} \u2014 did you build it (e.g. \`pnpm run build\`)?`);let a=k.dirname(o),l=`/local/${e}/${k.basename(o)}`,c=Bn(n,t);return await Un(e,o,a),{name:e,dir:t,entryAbs:o,serveDir:a,entryUrl:l,typesAbs:c}}function Ln(s,e){if(s.exports!==void 0){let r;try{r=vr(s,".",{browser:!0,conditions:Pt})}catch(i){throw new Error(`--replace package '${e}' "exports" does not resolve a browser entry (conditions: ${Pt.join(", ")}): ${i instanceof Error?i.message:i}`)}let n=Sr(r);if(!n)throw new Error(`--replace package '${e}' "exports" did not resolve "." to a single file (conditions: ${Pt.join(", ")}); too complex to override.`);return n}let t=s.module??s.main;if(!t)throw new Error(`--replace package '${e}' has no "exports", "module", or "main" entry to resolve.`);return t}function Bn(s,e){if(s.exports!==void 0)try{let r=vr(s,".",{conditions:["types"]}),n=Sr(r);if(n){let i=k.resolve(e,n);if(_e(i))return i}}catch{}let t=s.types??s.typings;if(t){let r=k.resolve(e,t);if(_e(r))return r}}function Sr(s){if(typeof s=="string")return s;if(Array.isArray(s))return s.find(e=>typeof e=="string")}async function Un(s,e,t){await jn;let r=k.normalize(t),n=new Set,i=[e];for(;i.length;){let o=i.shift();if(n.has(o))continue;n.add(o);let a;try{a=await St.readFile(o,"utf8")}catch{continue}let l,c;try{[l,,,c]=Nn(a,o)}catch{continue}if(o===e&&!c)throw new Error(`override package '${s}' 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 l){if(d.d===-2)continue;let p=d.n;if(p&&!p.startsWith("node:")){if(p.startsWith("./")||p.startsWith("../")||p.startsWith("/")){let m=Wn(o,p,r);m&&!n.has(m)&&i.push(m);continue}throw new Error(`override package must ship self-contained (bundle its dependencies); ${s} externalizes '${p}'`)}}}}function Wn(s,e,t){let r=e.replace(/[?#].*$/,""),n=k.resolve(k.dirname(s),r),i=[n,n+".js",n+".mjs",k.join(n,"index.js"),k.join(n,"index.mjs")];for(let o of i)if(k.normalize(o).startsWith(t)&&_e(o))return o}var ha=Gn(Vn),zn="0.9.0";function Kn(s){let e={subcommand:"run",file:"",port:3e3,watch:!0,open:!0,server:!1,trust:!1,help:!1,version:!1};s[0]==="check"&&(e.subcommand="check",s=s.slice(1));for(let t=0;t<s.length;t++){let r=s[t];if(r==="--help"||r==="-h")e.help=!0;else if(r==="--version"||r==="-V")e.version=!0;else if(r==="--no-watch")e.watch=!1;else if(r==="--no-open")e.open=!1;else if(r==="--server")e.server=!0;else if(r==="--trust")e.trust=!0;else if(r==="--port"||r==="-p"){let n=s[++t],i=parseInt(n,10);isNaN(i)&&(console.error(`Invalid port: ${n}`),process.exit(1)),e.port=i}else if(r==="--replace"||r.startsWith("--replace=")){let n=r.startsWith("--replace=")?r.slice(10):s[++t]??"";try{let i=xr(n);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 r.startsWith("-")||(e.file=r)}return e}function Yn(){console.log(`
538
- typebulb - Local bulb runner for Typebulb
539
-
540
- Usage:
541
- typebulb [file.bulb.md] Run a bulb (defaults to .bulb.md in cwd)
542
- typebulb check [file.bulb.md] Type-check a bulb without running it
543
-
544
- Options:
545
- --no-watch Disable hot reload (watch is on by default)
546
- -p, --port <port> Use a specific port (default: 3000)
547
- --no-open Don't auto-open browser
548
- --trust Grant privileged capabilities (filesystem, AI,
549
- and server.ts). Without it a bulb runs sandboxed:
550
- tb.fs / tb.ai / tb.server are blocked and the page
551
- shows the exact --trust command to unlock them.
552
- --server Run server.ts only, no web server (needs --trust)
553
- --replace <name>=<path> Replace a declared dependency with a local built
554
- package folder instead of a CDN (dev only).
555
- Applies to both run and check. Watched for
556
- rebuilds under --watch; --no-watch freezes it.
557
- e.g. --replace tensorgrad=../tensorgrad
558
- -V, --version Show version number
559
- -h, --help Show this help message
560
-
561
- Filesystem API:
562
- Bulbs can read and write local files via tb.fs:
563
- await tb.fs.read('file.txt') // UTF-8 text (throws on non-UTF-8)
564
- await tb.fs.readBytes('image.png') // raw bytes (Uint8Array)
565
- await tb.fs.write('output.html', content) // text or bytes
566
-
567
- Server API:
568
- Add a **server.ts** section to run Node.js code server-side.
569
- Exported functions become callable from the browser:
570
- // in **server.ts**: export async function query(sql) { ... }
571
- // in **code.tsx**: const rows = await tb.server.query(sql)
572
- .env and .env.local are auto-loaded from the working directory.
573
-
574
- Built-in server functions (available without a **server.ts** section):
575
- tb.server.log(...) Print to the CLI's stdout
576
-
577
- AI API:
578
- Bulbs can call AI providers via tb.ai(). Set API keys in .env:
579
- ANTHROPIC_API_KEY=sk-ant-...
580
- OPENAI_API_KEY=sk-...
581
- GOOGLE_API_KEY=AIza...
582
- OPENROUTER_API_KEY=sk-or-...
583
- Set provider and model (required):
584
- TB_AI_PROVIDER=anthropic
585
- TB_AI_MODEL=claude-haiku-4-5-20251001
586
- Both can be overridden per-call: tb.ai({ provider: "openai", model: "gpt-4o", ... })
587
- Optional reasoning depth (0=min, 1=low, 2=med, 3=max):
588
- tb.ai({ ..., reasoning: 2 })
589
-
590
- Examples:
591
- typebulb my-editor.bulb.md
592
- typebulb --no-watch --port 8080 my-editor.bulb.md
593
- typebulb .
594
- `)}async function Xn(s){let t=(await M.readdir(s)).find(r=>r.endsWith(".bulb.md"));return t?S.join(s,t):null}function Er(){Et([".env",".env.local"],process.cwd(),!0)}function Et(s,e,t=!1){for(let r of s){let n=S.resolve(e,r);try{let i=Hn(n,"utf-8");for(let o of i.split(`
595
- `)){let a=o.trim();if(!a||a.startsWith("#"))continue;let l=a.indexOf("=");if(l===-1)continue;let c=a.slice(0,l).trim(),d=a.slice(l+1).trim();(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),process.env[c]??=d}}catch{t||console.warn(` Warning: env file not found: ${r}`)}}}async function kr(s,e){let t=Ke(s,{serverOnly:!0});if(t.error)throw new Error(`Server compilation error: ${t.error}`);let r=S.join(e,".typebulb");await M.mkdir(r,{recursive:!0});let n=Ge(t.code);n.length>0&&await qe(n,r);let i=S.join(r,"server.mjs");return await M.writeFile(i,t.code,"utf-8"),await import(`${Jn(i).href}?t=${Date.now()}`)}async function Ce(s){let e=await M.readFile(s,"utf-8"),t=Tt(e);if(!t)throw new Error("Invalid .bulb.md file format");let r=_t(t);return{bulb:r,config:It(r.config)}}async function Rr(s,e,t,r,n){let{bulb:i,config:o}=await Ce(s),a=Ct(i.data),l=Ke(i.code,{jsxImportSource:o.jsxImportSource});l.error&&console.error("Compilation error:",l.error);let{importMap:c}=await Be.buildImportMap(l.code,o.dependencies??{},n?new Set([n.name]):void 0);n&&(c.imports[n.name]=n.entryUrl);let d=tr({name:i.name,code:l.code,css:i.css,html:i.html,data:a,insight:i.insight,importMap:c,watch:t?e:!1,trustHint:t?void 0:r}),p=t?d:rr({bulbHtml:d,name:i.name,watch:e}),m=S.dirname(s);o.env?.length&&Et(o.env,m);let w=null;return i.server&&t&&(w=await kr(i.server,m)),{html:p,bulb:i,serverExports:w}}async function Qn(s,e){let{bulb:t,config:r}=await Ce(s);!t.code&&!t.server&&(console.error("Bulb has neither **code.tsx** nor **server.ts**; nothing to check."),process.exit(1));let n=[];if(t.code){let{dir:o}=await yr({code:t.code,dependencies:r.dependencies??{},jsxImportSource:r.jsxImportSource,emitKey:s,local:e});n.push({role:"client",dir:o})}if(t.server){let{dir:o}=await br({server:t.server,bulbDir:S.dirname(s),emitKey:s});n.push({role:"server",dir:o})}let i=!1;for(let{role:o,dir:a}of n){let{stdout:l,exitCode:c}=await Zn(a);for(let d of l.split(/\r?\n/))d.trim()&&console.log(`${o} ${d}`);c!==0&&(i=!0)}i&&process.exit(1)}function Zn(s){return new Promise(e=>{let t=qn("npx",["tsc","--noEmit"],{cwd:s,shell:!0}),r="";t.stdout?.on("data",n=>{r+=n.toString()}),t.stderr?.on("data",n=>{r+=n.toString()}),t.on("close",n=>e({stdout:r,exitCode:n??1}))})}async function es(s,e){Er();let t=async()=>{let{bulb:r,config:n}=await Ce(s),i=S.dirname(s);n.env?.length&&Et(n.env,i),await kr(r.server,i)};if(console.log(`Running ${S.basename(s)}...`),await t(),e){console.log(`Watching for changes...
596
- `);let r=new Rt;r.on("reload",async()=>{try{console.log("Re-running..."),await t()}catch(n){console.error("Error:",n)}}),wt({bulbPath:s,emitter:r})}}async function ts(){let s=Kn(process.argv.slice(2));s.version&&(console.log(`typebulb ${zn}`),process.exit(0)),s.help&&(Yn(),process.exit(0));let e;if(!s.file||s.file==="."){let v=await Xn(process.cwd());v||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=v}else e=S.resolve(s.file);try{await M.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=s.file&&s.file!=="."?s.file:S.relative(process.cwd(),e)||S.basename(e),r=`npx typebulb --trust ${t.includes(" ")?`"${t}"`:t}`,n;if(s.local){let v;try{v=await Ce(e)}catch{}v&&!(s.local.name in(v.config.dependencies??{}))&&(console.error(`--replace: '${s.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),v&&(!v.bulb.code||s.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{n=await Pr(s.local)}catch(E){console.error(E instanceof Error?E.message:String(E)),process.exit(1)}console.log(`replace: ${n.name} \u2192 ${S.relative(process.cwd(),n.dir)||"."}`)}if(s.subcommand==="check"){await Qn(e,n);return}try{let{bulb:v}=await Ce(e);if(v.server&&(!v.code||s.server)){s.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
597
- ${r}`),process.exit(1)),await es(e,s.watch);return}}catch{}let i=process.cwd(),o=s.watch?new Rt:void 0;Er(),console.log(`Loading ${S.basename(e)}...`);let{html:a,bulb:l,serverExports:c}=await Rr(e,s.watch,s.trust,r,n),d=await yt(s.port),p=await cr({getHtml:()=>a,basePath:i,port:d,reloadEmitter:o,getServerExports:()=>c,localOverride:n?{name:n.name,serveDir:n.serveDir}:void 0,trusted:s.trust,trustHint:r}),m=`http://localhost:${d}`;console.log(`
598
- ${l.name}`),console.log(` ${m}`),console.log(s.trust?" trust: granted (filesystem, AI, server.ts enabled)":` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
599
- `),s.watch&&console.log(` Watching for changes...
600
- `);let w,f;if(s.watch&&o){let v=new Rt;if(v.on("reload",async()=>{try{console.log("Recompiling...");let E=await Rr(e,!0,s.trust,r,n);a=E.html,c=E.serverExports,o.emit("reload"),console.log(`Done. Browser reloading...
601
- `)}catch(E){console.error("Compile error:",E)}}),w=wt({bulbPath:e,emitter:v}),n){let{name:E,serveDir:ae}=n;f=hr({dir:ae,onChange:()=>{console.log(`Local package '${E}' changed. Browser reloading...
602
- `),o.emit("reload")}})}}s.open&&await dr(m);let R=async()=>{console.log(`
603
- Shutting down...`),p.close(),w?.(),f?.();let v=S.join(S.dirname(e),".typebulb","server.mjs");await M.rm(v,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",R),process.on("SIGTERM",R)}ts().catch(s=>{console.error("Error:",s.message),process.exit(1)});
619
+ `);return e!==-1&&(t===-1||e<t)?{pos:e,len:4}:t!==-1?{pos:t,len:2}:{pos:-1,len:0}}function Rt(s){let t=s.split(/\r?\n/).filter(n=>n.startsWith("data:"));if(!t.length)return null;let r=t.map(n=>n.replace(/^data:\s?/,"")).join(`
620
+ `).trim();if(!r)return null;if(r==="[DONE]")return"done";try{return JSON.parse(r)}catch{return null}}async function Rr(s,e,t){let r=new TextDecoder,n="",i=!1,o=t?new Promise((a,c)=>{t.aborted&&c(new Error("Aborted")),t.addEventListener("abort",()=>c(new Error("Aborted")),{once:!0})}):null;for(;;){let a=o?await Promise.race([s.read(),o]):await s.read(),{done:c,value:l}=a;if(c){if(n.trim()){let h=Rt(n);h!==null&&h!=="done"&&e(h)}break}i=!0,n+=r.decode(l,{stream:!0});let{pos:d,len:p}=Pr(n);for(;d!==-1;){let h=n.slice(0,d);n=n.slice(d+p);let w=Rt(h);if(w==="done"){n="";break}w!==null&&e(w),{pos:d,len:p}=Pr(n)}}return{receivedAnyData:i}}async function Et(s,e){let t=e??(s.headers.get("X-Provider-Protocol")||"openai"),r=X(t);if(!s.body)throw new Error("Response body is missing");let n=s.body.getReader(),i="";return await Rr(n,o=>{let a=r.parseStreamChunk(o);a?.text&&(i+=a.text)}),i}import*as kt from"fs/promises";import*as De from"path";var ze=class{async get(e){let t=A(e),r=De.join(Ee,t+".bin"),n=De.join(Ee,t+".json");try{let[i,o]=await Promise.all([kt.readFile(r),kt.readFile(n,"utf8")]),a=JSON.parse(o);return{body:i,contentType:a.contentType,cacheControl:a.cacheControl}}catch{return}}async set(e,t){await S();let r=A(e),n=De.join(Ee,r+".bin"),i=De.join(Ee,r+".json"),o={url:e,contentType:t.contentType,cacheControl:t.cacheControl};await Promise.all([O(n,t.body),O(i,JSON.stringify(o))])}};var Tr="127.0.0.1",Un=new Set(["localhost","127.0.0.1","::1"]);function Wn(s){if(s)try{return new URL(s.includes("://")?s:`http://${s}`).hostname}catch{return}}function Er(s){let e=Wn(s);return!!e&&Un.has(e)}function Ge(s){return s instanceof Error?s.message:"Unknown error"}async function _r(s){let{getHtml:e,basePath:t,port:r,reloadEmitter:n,getServerExports:i,localOverride:o,trusted:a=!1,trustHint:c}=s,l=new Nn;l.use("*",async(u,f)=>{if(!Er(u.req.header("host")))return u.text("Forbidden: untrusted Host",403);await f()}),l.use("*",async(u,f)=>{await f(),u.res.headers.set("Cross-Origin-Opener-Policy","same-origin"),u.res.headers.set("Cross-Origin-Embedder-Policy","credentialless")});let d=["/__fs/*","/__api/*","/__ai"],p=async(u,f)=>{if(!a){let y=c?`
621
+ ${c}`:"";return u.text(`Forbidden: this capability requires --trust.${y}`,403)}await f()},h=async(u,f)=>{let y=u.req.header("sec-fetch-site");if(y){if(y==="cross-site")return u.text("Forbidden: cross-site request",403)}else{let x=u.req.header("origin");if(x&&!Er(x))return u.text("Forbidden: cross-origin request",403)}await f()};for(let u of d)l.use(u,p),l.use(u,h);l.get("/",u=>u.html(e())),l.post("/__fs/read",async u=>{try{let{path:f}=await u.req.json(),y=_t(f,t),x=await Q.readFile(y);return new Response(new Uint8Array(x),{headers:{"Content-Type":"application/octet-stream"}})}catch(f){let y=Ge(f);return u.json({error:y},400)}}),l.post("/__fs/write",async u=>{try{let f=u.req.query("path");if(!f)return u.json({error:"Missing path"},400);let y=_t(f,t);return await Q.mkdir(F.dirname(y),{recursive:!0}),await Q.writeFile(y,Buffer.from(await u.req.arrayBuffer())),u.json({success:!0})}catch(f){let y=Ge(f);return u.json({error:y},400)}});let w={log:console.log};l.post("/__api/:name",async u=>{try{let f=i?.(),y=u.req.param("name"),x=f?.[y]??w[y];if(!x||typeof x!="function")return u.json({error:`API function '${y}' not found`},404);let{args:b}=await u.req.json(),C=await x(...b||[]);return u.json({result:C})}catch(f){let y=Ge(f);return u.json({error:y},500)}}),l.post("/__ai",async u=>{try{let{messages:f,system:y,reasoning:x,provider:b,model:C,webSearch:H}=await u.req.json();if(!f||!Array.isArray(f)||f.length===0)return u.json({message:"messages array is required",code:"unknown",retryable:!1},400);let j=Hn(b,C);if(typeof j=="string")return u.json({message:j,code:"unknown",retryable:!1},400);let Ze=[...y?[{role:"system",content:y}]:[],...f.map(Ae=>({role:Ae.role,content:Ae.content}))],Z=await St(j,{model:j.model,messages:Ze,stream:!0,reasoning:x??0,webSearch:H??!0});if(!Z.ok){let Ae=await Pt(Z,j.protocol);return u.json(Ae,Z.status)}let At=await Et(Z,j.protocol);return At||console.warn("[tb.ai] Empty response from provider"),u.json({text:At})}catch(f){if(f instanceof D)return u.json({message:f.message,code:f.code,retryable:f.retryable},500);let y=Ge(f);return u.json({message:y,code:"unknown",retryable:!1},500)}}),l.get("/__models",async u=>{try{let f=await qn();return u.json(f)}catch{return u.json([],200)}});let m=["esm.sh","unpkg.com","cdn.jsdelivr.net","cdnjs.cloudflare.com"],v=new ze;if(l.get("/proxy/*",async u=>{let f=new URL(u.req.url),x=(f.pathname+f.search).slice(7),b=x.lastIndexOf("https://");return b===-1?u.text("Invalid proxy URL",400):T(u,x.slice(b))}),o){let u=`/local/${o.name}/`;l.get("/local/*",async f=>{let{pathname:y}=new URL(f.req.url);if(!y.startsWith(u))return f.text("Not Found",404);let x=decodeURIComponent(y.slice(u.length));try{let b=_t(x,o.serveDir),C=await Q.readFile(b);return new Response(C,{headers:{"Content-Type":zn(b)}})}catch{return f.text("Not Found",404)}})}async function T(u,f){let y;try{y=new URL(f)}catch{return u.text("Invalid URL",400)}if(y.protocol!=="https:")return u.text("HTTPS only",400);if(!m.includes(y.hostname))return u.text("Host not allowed",403);let x=await v.get(f);if(x)return new Response(x.body,{status:200,headers:Tt(x.contentType,x.cacheControl)});try{let b=await fetch(f,{headers:{Accept:u.req.header("Accept")||"*/*"},redirect:"follow"});if(!b.ok)return u.text(`Upstream ${b.status}`,b.status);let C=b.headers.get("Content-Type")||void 0,H=b.headers.get("Cache-Control")||void 0;if(b.body){let[j,Ze]=b.body.tee();return(async()=>{try{let Z=await new Response(Ze).arrayBuffer();await v.set(f,{body:Buffer.from(Z),contentType:C,cacheControl:H})}catch{}})(),new Response(j,{status:b.status,headers:Tt(C,H)})}return new Response(null,{status:b.status,headers:Tt(C,H)})}catch(b){return u.text(`Proxy fetch failed: ${b instanceof Error?b.message:b}`,502)}}n&&l.get("/__reload",u=>Bn(u,async f=>{let y=()=>{f.writeSSE({event:"reload",data:""})};for(n.on("reload",y),f.onAbort(()=>{n.removeListener("reload",y)});;)await f.sleep(3e4)}));let W=/^\/(v\d+\/|stable\/|node\/|gh\/|@[^/]+\/[^@/]+@|[^@/]+@)/;l.notFound(async u=>{if(u.req.method!=="GET")return u.text("Not Found",404);let f=new URL(u.req.url);return W.test(f.pathname)?T(u,"https://esm.sh"+f.pathname+f.search):u.text("Not Found",404)});let L=Ln({fetch:l.fetch,port:r,hostname:Tr});return{port:r,close:()=>L.close()}}var Cr={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",gemini:"GOOGLE_API_KEY",openrouter:"OPENROUTER_API_KEY"};function Hn(s,e){let t=s??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 n;try{n=X(t)}catch{return`Unknown provider '${t}'.`}let i=Cr[t],o=process.env[i];return o?{apiKey:o,baseUrl:n.defaultBaseUrl,protocol:t,model:r,isFreeModel:!1}:`No API key for '${t}'. Set ${i} in your .env file.`}var Jn="https://api.typebulb.com/api/models",Vn=1440*60*1e3,ce=null;async function qn(){if(!ce||Date.now()-ce.fetchedAt>Vn){let s=await fetch(Jn);if(!s.ok)return ce?kr(ce.models):[];ce={models:await s.json(),fetchedAt:Date.now()}}return kr(ce.models)}function kr(s){let e=new Set(Object.entries(Cr).filter(([,t])=>!!process.env[t]).map(([t])=>t));return s.filter(t=>e.has(t.provider))}function Tt(s,e){let t=new Headers;return s&&t.set("Content-Type",s),e&&t.set("Cache-Control",e),t.set("Access-Control-Allow-Origin","*"),t.set("Cross-Origin-Resource-Policy","cross-origin"),t}function zn(s){switch(F.extname(s).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 _t(s,e){let t=F.resolve(e,s),r=F.normalize(e),n=F.normalize(t);if(n!==r&&!n.startsWith(r+F.sep))throw new Error("Path traversal detected - access denied");return t}async function Ct(s){let e=await import("net");return new Promise(t=>{let r=e.createServer();r.listen(s,Tr,()=>{let n=r.address(),i=typeof n=="object"&&n?n.port:s;r.close(()=>t(i))}),r.on("error",()=>{t(Ct(s+1))})})}import Gn from"open";async function Or(s){await Gn(s)}import Dr from"chokidar";var Ir={persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}};function Ot(s){let{bulbPath:e,emitter:t}=s,r=Dr.watch(e,Ir);return r.on("change",()=>{t.emit("reload")}),()=>r.close()}function Ar(s){let{dir:e,onChange:t,debounceMs:r=150}=s,n,i=Dr.watch(e,Ir);return i.on("all",()=>{n&&clearTimeout(n),n=setTimeout(t,r)}),()=>{n&&clearTimeout(n),i.close()}}import*as E from"fs/promises";import*as R from"path";import*as le from"path";var Kn=le.join(Le,"pkg"),Yn=le.join(Le,"files"),Xn=le.join(Le,"negative.json"),Ye=class{pkgMem=new Map;fileMem=new Map;negativeCache=new K(new ie(Xn));async getCachedDts(e){if(this.pkgMem.has(e))return this.pkgMem.get(e);await S();let t=await Y($r(e));return this.pkgMem.set(e,t),t}async setCachedDts(e,t,r){let n={content:t,url:r};this.pkgMem.set(e,n),await Ke(async()=>{await S(),await O($r(e),JSON.stringify(n))})}async getCachedFile(e){if(this.fileMem.has(e))return this.fileMem.get(e);await S();let t=await Ne(Mr(e));return this.fileMem.set(e,t),t}async setCachedFile(e,t){this.fileMem.set(e,t),await Ke(async()=>{await S(),await O(Mr(e),t)})}isNegative(e){return this.negativeCache.isNegative(e)}async recordNegative(e){await Ke(async()=>{await S(),await this.negativeCache.recordNegative(e)})}clearNegative(e){return Ke(()=>this.negativeCache.clearNegative(e))}};async function Ke(s){try{await s()}catch{}}function $r(s){return le.join(Kn,A(s)+".json")}function Mr(s){return le.join(Yn,A(s)+".txt")}var Dt;function Qn(){return Dt||(Dt=ft({cache:new Ye,cdnClient:yr,packageService:He,versionResolver:gr})),Dt}var Fr="file:///node_modules/";async function jr(s){let e=Be(s.emitKey,"typecheck");await S(),await E.rm(e,{recursive:!0,force:!0}),await E.mkdir(e,{recursive:!0});let t=rs(s.jsxImportSource,s.dependencies),r=await Qn().resolve(s.code,s.dependencies,t),n=s.local?.name,i=n?r.filter(d=>d.pkg!==n):r,o=new Set;for(let d of i)for(let p of d.files){let h=Xe(p.path);if(!h||o.has(h))continue;o.add(h);let w=R.join(e,"node_modules",h);await E.mkdir(R.dirname(w),{recursive:!0}),await E.writeFile(w,p.content,"utf8")}let a={};for(let d of i)for(let p of d.shims){let h=Xe(p.path);h&&(a[p.module]=[`./node_modules/${h}`])}for(let d of i){if(d.ambient)continue;let p=Xe(d.mainPath);p&&(a[d.pkg]=[`./node_modules/${p}`])}let c=new Set;for(let d of i)for(let p of d.files){if(!p.ambient)continue;let h=Xe(p.path);h&&c.add(`node_modules/${h}`)}if(s.local){delete a[s.local.name];let d=await ns(s.local,e);d?a[s.local.name]=[`./node_modules/${s.local.name}/${d}`]:console.warn(` local: '${s.local.name}' ships no type defs; check cannot type against it.`)}let l=Zn(s.jsxImportSource,a,[...c]);return await E.writeFile(R.join(e,"tsconfig.json"),JSON.stringify(l,null,2)+`
622
+ `,"utf8"),await E.writeFile(R.join(e,"code.tsx"),s.code,"utf8"),await E.writeFile(R.join(e,"tb.d.ts"),dt,"utf8"),{dir:e}}function Zn(s,e,t=[]){return{compilerOptions:{target:"es2023",module:"esnext",moduleResolution:"bundler",lib:es([...ct,...lt]),jsx:"react-jsx",jsxImportSource:s??"react",strict:!0,noEmit:!0,skipLibCheck:!0,esModuleInterop:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0,baseUrl:".",paths:e},include:["code.tsx","tb.d.ts",...t]}}function es(s){return s.filter(e=>!e.since).map(e=>ts(e.name))}function ts(s){return s.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 rs(s,e){let t=s??("react"in e?"react":void 0);return t?[`${t}/jsx-runtime`,`${t}/jsx-dev-runtime`]:[]}function Xe(s){if(!s.startsWith(Fr))return;let e=s.slice(Fr.length),t=e.indexOf("/");if(!(t<0))return e.slice(t+1)}async function ns(s,e){if(!s.typesAbs)return;let t=R.dirname(s.typesAbs),r=R.join(e,"node_modules",s.name);for(let n of await ss(t)){let i=R.join(r,R.relative(t,n));await E.mkdir(R.dirname(i),{recursive:!0}),await E.copyFile(n,i)}return R.basename(s.typesAbs)}async function ss(s){let e=[];async function t(r){let n=await E.readdir(r,{withFileTypes:!0});for(let i of n){let o=R.join(r,i.name);i.isDirectory()?await t(o):/\.d\.ts(\.map)?$/.test(i.name)&&e.push(o)}}return await t(s),e}import*as I from"fs/promises";import*as U from"path";import{existsSync as is}from"fs";var os="^22";async function Nr(s){let e=Be(s.emitKey,"typecheck-server");await S(),await I.rm(e,{recursive:!0,force:!0}),await I.mkdir(e,{recursive:!0});let t=U.join(s.bulbDir,".typebulb"),r=qe(s.server).filter(o=>o!==s.local?.name);await Ve([`@types/node@${os}`,...r],t);let n=U.join(t,"node_modules"),i=U.join(e,"node_modules");return await cs(n,i),await I.writeFile(U.join(e,"server.ts"),s.server,"utf8"),await I.writeFile(U.join(e,"tb.d.ts"),pt,"utf8"),await I.writeFile(U.join(e,"tsconfig.json"),JSON.stringify(as(s.local),null,2)+`
623
+ `,"utf8"),{dir:e}}function as(s){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(s?.typesAbs){let t=i=>i.replace(/\\/g,"/"),r=t(U.dirname(s.typesAbs)),n=t(s.typesAbs).replace(/\.d\.ts$/,"");e.baseUrl=".",e.paths={[s.name]:[n],[`${s.name}/*`]:[`${r}/*`]}}return{compilerOptions:e,include:["server.ts","tb.d.ts"]}}async function cs(s,e){if(!is(s)){await I.mkdir(e,{recursive:!0});return}await I.rm(e,{recursive:!0,force:!0});let t=process.platform==="win32"?"junction":"dir";await I.symlink(s,e,t)}import{readdir as La,readFile as Ba,writeFile as ls,unlink as ds,mkdir as ps}from"fs/promises";import*as Ie from"path";import*as Lr from"os";function Br(){return process.env.TYPEBULB_SERVERS_DIR||Ie.join(Lr.homedir(),".typebulb","servers")}function Ur(s){return Ie.join(Br(),`${s}.json`)}async function Wr(s){await ps(Br(),{recursive:!0}),await ls(Ur(s.pid),JSON.stringify(s))}async function Hr(s){await ds(Ur(s)).catch(()=>{})}var hs="0.9.2";async function fs(s,e){let{bulb:t,config:r}=await ke(s);!t.code&&!t.server&&(console.error("Bulb has neither **code.tsx** nor **server.ts**; nothing to check."),process.exit(1));let n=[];if(t.code){let{dir:o}=await jr({code:t.code,dependencies:r.dependencies??{},jsxImportSource:r.jsxImportSource,emitKey:s,local:e});n.push({role:"client",dir:o})}if(t.server){let{dir:o}=await Nr({server:t.server,bulbDir:k.dirname(s),emitKey:s,local:e?{name:e.name,typesAbs:e.typesAbs}:void 0});n.push({role:"server",dir:o})}let i=!1;for(let{role:o,dir:a}of n){let{stdout:c,exitCode:l}=await ms(a);for(let d of c.split(/\r?\n/))d.trim()&&console.log(`${o} ${d}`);l!==0&&(i=!0)}i&&process.exit(1)}function ms(s){return new Promise(e=>{let t=us("npx",["tsc","--noEmit"],{cwd:s,shell:!0}),r="";t.stdout?.on("data",n=>{r+=n.toString()}),t.stderr?.on("data",n=>{r+=n.toString()}),t.on("close",n=>e({stdout:r,exitCode:n??1}))})}async function gs(s,e,t){nt();let r=async()=>{let{bulb:n,config:i}=await ke(s),o=k.dirname(s);i.env?.length&&de(i.env,o),await vt(n.server,o,t)};if(console.log(`Running ${k.basename(s)}...`),await r(),e){console.log(`Watching for changes...
624
+ `);let n=new It;n.on("reload",async()=>{try{console.log("Re-running..."),await r()}catch(i){console.error("Error:",i)}}),Ot({bulbPath:s,emitter:n})}}async function ys(s,e,t,r){let n=process.cwd(),i=e.watch?new It:void 0;nt(),console.log(`Loading ${k.basename(s)}...`);let{html:o,bulb:a,serverExports:c}=await xt(s,e.watch,e.trust,t,r),l=await Ct(e.port),d=await _r({getHtml:()=>o,basePath:n,port:l,reloadEmitter:i,getServerExports:()=>c,localOverride:r?{name:r.name,serveDir:r.serveDir}:void 0,trusted:e.trust,trustHint:t}),p=`http://localhost:${l}`;await Wr({pid:process.pid,port:l,url:p,file:s,startedAt:Date.now()}),console.log(`
625
+ ${a.name}`),console.log(` ${p}`),console.log(e.trust?" trust: granted (filesystem, AI, server.ts enabled)":` trust: sandboxed \u2014 re-run with --trust to enable filesystem / AI / server.ts
626
+ `),e.watch&&console.log(` Watching for changes...
627
+ `);let h,w;if(e.watch&&i){let v=new It;if(v.on("reload",async()=>{try{console.log("Recompiling...");let T=await xt(s,!0,e.trust,t,r);o=T.html,c=T.serverExports,i.emit("reload"),console.log(`Done. Browser reloading...
628
+ `)}catch(T){console.error("Compile error:",T)}}),h=Ot({bulbPath:s,emitter:v}),r){let{name:T,serveDir:W}=r;w=Ar({dir:W,onChange:()=>{console.log(`Local package '${T}' changed. Browser reloading...
629
+ `),i.emit("reload")}})}}e.open&&await Or(p);let m=async()=>{console.log(`
630
+ Shutting down...`),d.close(),h?.(),w?.(),await Hr(process.pid);let v=k.join(k.dirname(s),".typebulb","server.mjs");await Qe.rm(v,{force:!0}).catch(()=>{}),process.exit(0)};process.on("SIGINT",m),process.on("SIGTERM",m)}async function ws(){let s=Wt(process.argv.slice(2));s.version&&(console.log(`typebulb ${hs}`),process.exit(0)),s.help&&(Ht(),process.exit(0));let e;if(!s.file||s.file==="."){let o=await Sr(process.cwd());o||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=o}else e=k.resolve(s.file);try{await Qe.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=s.file&&s.file!=="."?s.file:k.relative(process.cwd(),e)||k.basename(e),r=`npx typebulb --trust ${t.includes(" ")?`"${t}"`:t}`,n;try{n=await ke(e)}catch{}let i;if(s.local){n&&!(s.local.name in(n.config.dependencies??{}))&&(console.error(`--replace: '${s.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),n&&(!n.bulb.code||s.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{i=await Bt(s.local)}catch(o){console.error(o instanceof Error?o.message:String(o)),process.exit(1)}console.log(`replace: ${i.name} \u2192 ${k.relative(process.cwd(),i.dir)||"."}`)}if(s.subcommand==="check"){await fs(e,i);return}if(n&&n.bulb.server&&(!n.bulb.code||s.server)){s.trust||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
631
+ ${r}`),process.exit(1)),await gs(e,s.watch,i);return}await ys(e,s,r,i)}ws().catch(s=>{console.error("Error:",s.message),process.exit(1)});
package/dist/render.d.ts CHANGED
@@ -12,8 +12,10 @@ export declare function renderBulb(source: string, opts?: { theme?: 'light' | 'd
12
12
  export interface BulbFrameOptions {
13
13
  /** Force light/dark. Omit to inherit the host's `data-theme` automatically. */
14
14
  theme?: 'light' | 'dark'
15
- /** Floor for auto-height; the frame grows past it but never shrinks below. Default 320. */
16
- minHeight?: number
15
+ /** Height shown before the embed reports its content height, and the height a
16
+ * full-bleed (`height:100%`) bulb settles at. Flow content settles above OR below
17
+ * this to its true height. Default 320. */
18
+ initialHeight?: number
17
19
  /** Ceiling for auto-height; bounds an absurd height from a buggy/hostile embed. Default 100000. */
18
20
  maxHeight?: number
19
21
  /** Called with a message when the embed throws at runtime (post-mount). */
package/dist/render.js CHANGED
@@ -402,27 +402,55 @@ ${x(s)}
402
402
  </html>`}var Cm=`<script>
403
403
  (function () {
404
404
  if (window.parent === window) return;
405
- // Embedded: the host iframe owns sizing (auto-height below), so the document
406
- // must not scroll itself \u2014 otherwise sub-pixel rounding (the frame landing a
407
- // fraction shorter than content) leaves a phantom scrollbar. scrollHeight still
408
- // reports true content, so this is invisible to auto-height. A +1px report buffer
409
- // would seem simpler but runs away on full-bleed (height:100%) bulbs.
410
- document.documentElement.style.overflow = 'hidden';
405
+ var de = document.documentElement;
411
406
  var post = function (m) { try { parent.postMessage(m, '*'); } catch (e) {} };
412
- var sendHeight = function () {
413
- post({ __typebulbEmbed: true, kind: 'height', height: Math.ceil(document.documentElement.scrollHeight) });
407
+ // Overflow tracks fit, per axis. While content fits the frame, HIDE overflow: the
408
+ // sub-pixel gap (frame a fraction shorter than content) would otherwise flash a
409
+ // phantom scrollbar, and a full-bleed (height:100%) bulb \u2014 whose content equals the
410
+ // frame \u2014 must not scroll itself. When the host CAPS the frame (claude.bulb's inline
411
+ // mode caps height to a fraction of the viewport; a prose-column frame caps width),
412
+ // the content genuinely overflows, so ALLOW scroll on that axis to keep it reachable.
413
+ // Reported height is body.scrollHeight \u2014 the content's intrinsic extent: below the
414
+ // viewport for a short bulb (so the frame shrinks to it), tracking the frame for a
415
+ // full-bleed one (so it self-stabilises at the host's initial height).
416
+ //
417
+ // Coalesce to one rAF and only write an overflow value that actually changed: setting
418
+ // overflow adds/removes a scrollbar, which resizes the element and re-fires the
419
+ // observer \u2014 writing unconditionally ping-pongs (the "ResizeObserver loop" warning).
420
+ // The rAF + equality guard let it settle within a frame instead.
421
+ var raf = 0;
422
+ var apply = function () {
423
+ raf = 0;
424
+ var oy = de.scrollHeight > de.clientHeight + 1 ? 'auto' : 'hidden';
425
+ var ox = de.scrollWidth > de.clientWidth + 1 ? 'auto' : 'hidden';
426
+ if (de.style.overflowY !== oy) de.style.overflowY = oy;
427
+ if (de.style.overflowX !== ox) de.style.overflowX = ox;
428
+ post({ __typebulbEmbed: true, kind: 'height', height: Math.ceil(document.body.scrollHeight) });
414
429
  };
430
+ var update = function () { if (!raf) raf = requestAnimationFrame(apply); };
431
+ de.style.overflow = 'hidden';
415
432
  window.addEventListener('error', function (e) {
416
- post({ __typebulbEmbed: true, kind: 'error', message: String((e && e.message) || (e && e.error) || 'Error') });
433
+ var m = String((e && e.message) || (e && e.error) || 'Error');
434
+ // The benign "ResizeObserver loop completed\u2026" notice surfaces as a window error in
435
+ // some browsers; it's not a bulb fault, so don't forward it to the host as one.
436
+ if (m.indexOf('ResizeObserver') !== -1) return;
437
+ post({ __typebulbEmbed: true, kind: 'error', message: m });
417
438
  });
418
439
  window.addEventListener('unhandledrejection', function (e) {
419
440
  var r = e && e.reason;
420
441
  var msg = r && r.message ? r.message : (r == null ? 'Unhandled rejection' : r);
421
442
  post({ __typebulbEmbed: true, kind: 'error', message: String(msg) });
422
443
  });
423
- window.addEventListener('load', sendHeight);
424
- if (window.ResizeObserver) { try { new ResizeObserver(sendHeight).observe(document.documentElement); } catch (e) {} }
444
+ // Run at load (module mounted \u2192 real content, not the empty pre-mount body that would
445
+ // collapse the frame and snap back). Observe BOTH body (content growth) and the root
446
+ // element (the viewport \u2014 so a host resize/cap re-syncs overflow on the next frame).
447
+ window.addEventListener('load', function () {
448
+ update();
449
+ if (window.ResizeObserver) {
450
+ try { var ro = new ResizeObserver(update); ro.observe(document.body); ro.observe(de); } catch (e) {}
451
+ }
452
+ });
425
453
  })();
426
454
  <\/script>`;function ym(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function _m(e){let t={};for(let[s,n]of Object.entries(e))t[s]=n.startsWith("https://")?"/proxy/"+n:n;return t}var Ir="https://esm.sh",xr="https://cdn.jsdelivr.net/npm/",si="https://data.jsdelivr.com/v1/package/npm/";function ac(e){let t=(e||"").replace(/^\/+/,"").replace(/\/+$/,"");return t?t.split("/"):[]}var oe=class e{constructor(t,s,n){let i=typeof t=="string"?e.parse(t):t;this.name=i.name,this.version=Nt(s??i.version),this.subpath=Nt(n??i.subpath)}static parse(t){let s=ac(t||"");if(!s.length)return new e({name:""});if(s[0].startsWith("@")){let i=s[0],[a,c]=cc(s[1]??""),p=Nt(s.slice(2).join("/"));return new e({name:`${i}/${a}`,version:c,subpath:p})}else{let[i,a]=cc(s[0]),c=Nt(s.slice(1).join("/"));return new e({name:i,version:a,subpath:c})}}static fromUrl(t){try{let s=new URL(t),n=new URL(Ir).host,i=new URL(xr).host;if(s.host===n){let a=ac(s.pathname.replace(/^\/v\d+\//,"/"));if(!a.length)return;let c=a[0].startsWith("@")?`${a[0]}/${a[1]??""}`:a[0];return e.parse(c)}if(s.host===i){let a=s.pathname.split("/npm/")[1];if(!a)return;let c=a.split("/")[0]||"";return e.parse(c)}return}catch{return}}static versionFromUrl(t){return e.fromUrl(t)?.version}format(){let t=this.version?`${this.name}@${this.version}`:this.name;return this.subpath?`${t}/${this.subpath}`:t}root(){return this.name}static rootOf(t){return e.parse(t).name}withVersion(t){return new e({name:this.name,version:Nt(t),subpath:this.subpath})}withPreferredVersion(t,s){let n=t||s;return n?this.withVersion(n):this}static isBare(t){if(!t||t.startsWith(".")||t.startsWith("/"))return!1;let s=t.toLowerCase();return!s.startsWith("http://")&&!s.startsWith("https://")}},Nt=e=>e&&e.length?e:void 0,cc=e=>{let t=e.indexOf("@");return t<0?[e,void 0]:[e.slice(0,t),Nt(e.slice(t+1))]};async function Ce(e){try{return await e()}catch{return}}var wr=class{constructor(t,s){this.cache=t,this.http=s,this.esmHost=Ir,this.jsDelivrBase=xr,this.jsDelivrMeta=si,this.pinMs=1e4,this.versionsIndexMs=1440*60*1e3,this.metaTtlMs=10080*60*1e3,this.pinCache=new Map}normalizeRelative(t){let s=t||"";return s.startsWith("./")?s.slice(2):s.replace(/^\/+/,"")}ensureLeadingDotSlash(t){return t.startsWith("./")?t:`./${t}`}baseDir(t){let s=typeof t=="string"?new oe(t):t;return`${this.jsDelivrBase}${s.name}${s.version?`@${s.version}`:""}/`}file(t,s){return new URL(this.normalizeRelative(s),this.baseDir(t)).toString()}packageJson(t){return this.file(t,"package.json")}buildEsmUrl(t,s={}){let{target:n="es2022",bundle:i=!1,external:a}=s,c=new URLSearchParams({target:n});return i&&c.append("bundle",""),a?.length&&c.append("external",a.join(",")),`${this.esmHost}/${t}?${c.toString()}`}async pinEsmUrl(t,s="es2022"){let n=this.buildEsmUrl(t,{target:s}),i=await Ce(()=>this.http.head(n));return i?.ok?i.url||n:void 0}async resolveExactVersion(t){let s=Date.now(),n=this.pinCache.get(t);if(n&&s-n.ts<this.pinMs)return n.value;let i=await this.tryResolveFromUrls([this.buildEsmUrl(t),`${this.esmHost}/${t}`]);return this.pinCache.set(t,{value:i,ts:s}),i}async tryResolveFromUrls(t){for(let s of t){let n=await Ce(()=>this.http.head(s)),i=this.parseVersionFromUrl(n?.url||s);if(i)return i}}async fetchVersionsIndex(t){if(await this.cache.isNegative(t))return;let s=await this.cache.getIndex(t);if(s&&Date.now()-s.updatedAt<this.versionsIndexMs)return{versions:s.versions,distTags:s.distTags};let n=await Ce(()=>this.http.getJson(`${this.jsDelivrMeta}${encodeURIComponent(t)}`));if(!n?.versions?.length){await this.cache.recordNegative(t);return}await this.cache.clearNegative(t);let i=n.distTags&&Object.keys(n.distTags).length?n.distTags:void 0;return await this.cache.setIndex(t,n.versions,i),n}parseVersionFromUrl(t){let s=oe.fromUrl(t)?.version;return s&&/\d+\.\d+\.\d+/.test(s)?s:void 0}async fetchPackageMeta(t,s){let n=await this.cache.getMeta(t,s);if(n&&Date.now()-n.updatedAt<this.metaTtlMs){let{dependencies:g,peerDependencies:E,peerDependenciesMeta:x}=n;return{name:t,version:s,dependencies:g,peerDependencies:E,peerDependenciesMeta:x}}let i=this.packageJson(new oe(`${t}@${s}`)),a=await Ce(()=>this.http.getJson(i));if(!a)return;let c=g=>g&&Object.keys(g).length?g:void 0,p=c(a.dependencies),h=c(a.peerDependencies),m=c(a.peerDependenciesMeta);return await this.cache.setMeta(t,s,p,h,m),{name:t,version:s,dependencies:p,peerDependencies:h,peerDependenciesMeta:m}}};var lc=e=>e.startsWith("@types/"),Cr=e=>Object.keys(e?.peerDependencies||{}).filter(t=>!lc(t)),ni=e=>Object.keys(e?.dependencies||{}).filter(t=>!lc(t)),bm=e=>Cr(e).filter(t=>!e?.peerDependenciesMeta?.[t]?.optional),yr=class{constructor(t){this.cdn=t}async resolve(t,s){let n=await this.fetchMeta(t),{allRoots:i,autoAddedPeers:a}=await this.expandWithPeers(n,s),c=this.computeFlags(i);return{allRoots:i,flags:c,autoAddedPeers:a}}async fetchMeta(t){return Promise.all(t.map(async({name:s,version:n})=>({name:s,version:n,meta:await this.cdn.fetchPackageMeta(s,n)})))}async expandWithPeers(t,s){let n=new Map(t.map(a=>[a.name,a])),i=[];for(let a of t)for(let c of bm(a.meta))!n.has(c)&&!i.some(p=>p.name===c)&&i.push({name:c,requiredBy:a.name});for(let{name:a,requiredBy:c}of i)try{let p=await s(a),h=await this.cdn.fetchPackageMeta(a,p);n.set(a,{name:a,version:p,meta:h})}catch(p){console.warn(`[typebulb] Failed to resolve peer "${a}" for "${c}":`,p)}return{allRoots:[...n.values()],autoAddedPeers:i.filter(a=>n.has(a.name))}}computeFlags(t){let s=new Set(t.flatMap(a=>Cr(a.meta))),n=new Map;for(let a of t)for(let c of ni(a.meta))n.set(c,(n.get(c)||0)+1);let i=new Set([...n.entries()].filter(([,a])=>a>=2).map(([a])=>a));return new Map(t.map(a=>[a.name,{isPeerRoot:s.has(a.name),hasPeers:Cr(a.meta).length>0,isSharedDep:i.has(a.name)}]))}};var _r=class{constructor(t,s,n){this.cache=t,this.cdn=s,this.semver=n}selectVersionFromIndex(t,s,n){return this.semver.selectBestVersion(t,{range:s,distTags:n})}async learnExactVersion(t){let s=await Ce(()=>this.cdn.fetchVersionsIndex(t));if(s?.versions?.length){let n=this.semver.selectBestVersion(s.versions,{distTags:s.distTags});if(n)return n}return this.cdn.resolveExactVersion(t)}async resolveExactForRoot(t,s){if(!s)return this.learnExactVersion(t);let n=await this.cache.getPinnedExact(t,s);if(n){if(this.semver.isExactVersion(n))return n;console.warn("[versionResolver] Rejecting invalid cached version for",t,":",n)}let i=await Ce(()=>this.cdn.fetchVersionsIndex(t));if(i?.versions?.length){let c=this.selectVersionFromIndex(i.versions,s,i.distTags);if(c){if(this.semver.isExactVersion(c))return await this.cache.setPinnedExact(t,s,c),c}else{console.warn("[versionResolver] Invalidating stale versions cache for",t,"- range",s,"not satisfied"),await this.cache.invalidateVersionsCache(t);let p=await Ce(()=>this.cdn.fetchVersionsIndex(t));if(p?.versions?.length){let h=this.selectVersionFromIndex(p.versions,s,p.distTags);if(h&&this.semver.isExactVersion(h))return await this.cache.setPinnedExact(t,s,h),h}}}let a=await this.cdn.resolveExactVersion(`${t}@${s}`);if(a&&this.semver.isExactVersion(a))return await this.cache.setPinnedExact(t,s,a),a}async effectivePackage(t,s){let n=new oe(t),i=n.root(),a=s[i],c=a?await Ce(()=>this.cache.getPinnedExact(i,a))??await Ce(()=>this.resolveExactForRoot(i,a)):void 0;return{effectivePackage:c?n.withVersion(c).format():t,root:i,range:a,pinned:c}}};var uc;(function(e){e[e.Static=1]="Static",e[e.Dynamic=2]="Dynamic",e[e.ImportMeta=3]="ImportMeta",e[e.StaticSourcePhase=4]="StaticSourcePhase",e[e.DynamicSourcePhase=5]="DynamicSourcePhase",e[e.StaticDeferPhase=6]="StaticDeferPhase",e[e.DynamicDeferPhase=7]="DynamicDeferPhase"})(uc||(uc={}));var Tm=new Uint8Array(new Uint16Array([1]).buffer)[0]===1;function oi(e,t="@"){if(!G)return ii.then((()=>oi(e)));let s=e.length+1,n=(G.__heap_base.value||G.__heap_base)+4*s-G.memory.buffer.byteLength;n>0&&G.memory.grow(Math.ceil(n/65536));let i=G.sa(s-1);if((Tm?Bm:Sm)(e,new Uint16Array(G.memory.buffer,i,s)),!G.parse())throw Object.assign(new Error(`Parse error ${t}:${e.slice(0,G.e()).split(`
427
455
  `).length}:${G.e()-e.lastIndexOf(`
428
- `,G.e()-1)}`),{idx:G.e()});let a=[],c=[];for(;G.ri();){let h=G.is(),m=G.ie(),g=G.it(),E=G.ai(),x=G.id(),I=G.ss(),C=G.se(),F;G.ip()&&(F=p(e.slice(x===-1?h-1:h,x===-1?m+1:m))),a.push({n:F,t:g,s:h,e:m,ss:I,se:C,d:x,a:E})}for(;G.re();){let h=G.es(),m=G.ee(),g=G.els(),E=G.ele(),x=e.slice(h,m),I=x[0],C=g<0?void 0:e.slice(g,E),F=C?C[0]:"";c.push({s:h,e:m,ls:g,le:E,n:I==='"'||I==="'"?p(x):x,ln:F==='"'||F==="'"?p(C):C})}function p(h){try{return(0,eval)(h)}catch{}}return[a,c,!!G.f(),!!G.ms()]}function Sm(e,t){let s=e.length,n=0;for(;n<s;){let i=e.charCodeAt(n);t[n++]=(255&i)<<8|i>>>8}}function Bm(e,t){let s=e.length,n=0;for(;n<s;)t[n]=e.charCodeAt(n++)}var G,Qm=()=>{return e="AGFzbQEAAAABKwhgAX8Bf2AEf39/fwBgAAF/YAAAYAF/AGADf39/AX9gAn9/AX9gA39/fwADMTAAAQECAgICAgICAgICAgICAgICAgIAAwMDBAQAAAUAAAAAAAMDAwAGAAAABwAGAgUEBQFwAQEBBQMBAAEGDwJ/AUHA8gALfwBBwPIACwd6FQZtZW1vcnkCAAJzYQAAAWUAAwJpcwAEAmllAAUCc3MABgJzZQAHAml0AAgCYWkACQJpZAAKAmlwAAsCZXMADAJlZQANA2VscwAOA2VsZQAPAnJpABACcmUAEQFmABICbXMAEwVwYXJzZQAUC19faGVhcF9iYXNlAwEKzkQwaAEBf0EAIAA2AoAKQQAoAtwJIgEgAEEBdGoiAEEAOwEAQQAgAEECaiIANgKECkEAIAA2AogKQQBBADYC4AlBAEEANgLwCUEAQQA2AugJQQBBADYC5AlBAEEANgL4CUEAQQA2AuwJIAEL0wEBA39BACgC8AkhBEEAQQAoAogKIgU2AvAJQQAgBDYC9AlBACAFQSRqNgKICiAEQSBqQeAJIAQbIAU2AgBBACgC1AkhBEEAKALQCSEGIAUgATYCACAFIAA2AgggBSACIAJBAmpBACAGIANGIgAbIAQgA0YiBBs2AgwgBSADNgIUIAVBADYCECAFIAI2AgQgBUEANgIgIAVBA0EBQQIgABsgBBs2AhwgBUEAKALQCSADRiICOgAYAkACQCACDQBBACgC1AkgA0cNAQtBAEEBOgCMCgsLXgEBf0EAKAL4CSIEQRBqQeQJIAQbQQAoAogKIgQ2AgBBACAENgL4CUEAIARBFGo2AogKQQBBAToAjAogBEEANgIQIAQgAzYCDCAEIAI2AgggBCABNgIEIAQgADYCAAsIAEEAKAKQCgsVAEEAKALoCSgCAEEAKALcCWtBAXULHgEBf0EAKALoCSgCBCIAQQAoAtwJa0EBdUF/IAAbCxUAQQAoAugJKAIIQQAoAtwJa0EBdQseAQF/QQAoAugJKAIMIgBBACgC3AlrQQF1QX8gABsLCwBBACgC6AkoAhwLHgEBf0EAKALoCSgCECIAQQAoAtwJa0EBdUF/IAAbCzsBAX8CQEEAKALoCSgCFCIAQQAoAtAJRw0AQX8PCwJAIABBACgC1AlHDQBBfg8LIABBACgC3AlrQQF1CwsAQQAoAugJLQAYCxUAQQAoAuwJKAIAQQAoAtwJa0EBdQsVAEEAKALsCSgCBEEAKALcCWtBAXULHgEBf0EAKALsCSgCCCIAQQAoAtwJa0EBdUF/IAAbCx4BAX9BACgC7AkoAgwiAEEAKALcCWtBAXVBfyAAGwslAQF/QQBBACgC6AkiAEEgakHgCSAAGygCACIANgLoCSAAQQBHCyUBAX9BAEEAKALsCSIAQRBqQeQJIAAbKAIAIgA2AuwJIABBAEcLCABBAC0AlAoLCABBAC0AjAoL3Q0BBX8jAEGA0ABrIgAkAEEAQQE6AJQKQQBBACgC2Ak2ApwKQQBBACgC3AlBfmoiATYCsApBACABQQAoAoAKQQF0aiICNgK0CkEAQQA6AIwKQQBBADsBlgpBAEEAOwGYCkEAQQA6AKAKQQBBADYCkApBAEEAOgD8CUEAIABBgBBqNgKkCkEAIAA2AqgKQQBBADoArAoCQAJAAkACQANAQQAgAUECaiIDNgKwCiABIAJPDQECQCADLwEAIgJBd2pBBUkNAAJAAkACQAJAAkAgAkGbf2oOBQEICAgCAAsgAkEgRg0EIAJBL0YNAyACQTtGDQIMBwtBAC8BmAoNASADEBVFDQEgAUEEakGCCEEKEC8NARAWQQAtAJQKDQFBAEEAKAKwCiIBNgKcCgwHCyADEBVFDQAgAUEEakGMCEEKEC8NABAXC0EAQQAoArAKNgKcCgwBCwJAIAEvAQQiA0EqRg0AIANBL0cNBBAYDAELQQEQGQtBACgCtAohAkEAKAKwCiEBDAALC0EAIQIgAyEBQQAtAPwJDQIMAQtBACABNgKwCkEAQQA6AJQKCwNAQQAgAUECaiIDNgKwCgJAAkACQAJAAkACQAJAIAFBACgCtApPDQAgAy8BACICQXdqQQVJDQYCQAJAAkACQAJAAkACQAJAAkACQCACQWBqDgoQDwYPDw8PBQECAAsCQAJAAkACQCACQaB/ag4KCxISAxIBEhISAgALIAJBhX9qDgMFEQYJC0EALwGYCg0QIAMQFUUNECABQQRqQYIIQQoQLw0QEBYMEAsgAxAVRQ0PIAFBBGpBjAhBChAvDQ8QFwwPCyADEBVFDQ4gASkABELsgISDsI7AOVINDiABLwEMIgNBd2oiAUEXSw0MQQEgAXRBn4CABHFFDQwMDQtBAEEALwGYCiIBQQFqOwGYCkEAKAKkCiABQQN0aiIBQQE2AgAgAUEAKAKcCjYCBAwNC0EALwGYCiIDRQ0JQQAgA0F/aiIDOwGYCkEALwGWCiICRQ0MQQAoAqQKIANB//8DcUEDdGooAgBBBUcNDAJAIAJBAnRBACgCqApqQXxqKAIAIgMoAgQNACADQQAoApwKQQJqNgIEC0EAIAJBf2o7AZYKIAMgAUEEajYCDAwMCwJAQQAoApwKIgEvAQBBKUcNAEEAKALwCSIDRQ0AIAMoAgQgAUcNAEEAQQAoAvQJIgM2AvAJAkAgA0UNACADQQA2AiAMAQtBAEEANgLgCQtBAEEALwGYCiIDQQFqOwGYCkEAKAKkCiADQQN0aiIDQQZBAkEALQCsChs2AgAgAyABNgIEQQBBADoArAoMCwtBAC8BmAoiAUUNB0EAIAFBf2oiATsBmApBACgCpAogAUH//wNxQQN0aigCAEEERg0EDAoLQScQGgwJC0EiEBoMCAsgAkEvRw0HAkACQCABLwEEIgFBKkYNACABQS9HDQEQGAwKC0EBEBkMCQsCQAJAAkACQEEAKAKcCiIBLwEAIgMQG0UNAAJAAkAgA0FVag4EAAkBAwkLIAFBfmovAQBBK0YNAwwICyABQX5qLwEAQS1GDQIMBwsgA0EpRw0BQQAoAqQKQQAvAZgKIgJBA3RqKAIEEBxFDQIMBgsgAUF+ai8BAEFQakH//wNxQQpPDQULQQAvAZgKIQILAkACQCACQf//A3EiAkUNACADQeYARw0AQQAoAqQKIAJBf2pBA3RqIgQoAgBBAUcNACABQX5qLwEAQe8ARw0BIAQoAgRBlghBAxAdRQ0BDAULIANB/QBHDQBBACgCpAogAkEDdGoiAigCBBAeDQQgAigCAEEGRg0ECyABEB8NAyADRQ0DIANBL0ZBAC0AoApBAEdxDQMCQEEAKAL4CSICRQ0AIAEgAigCAEkNACABIAIoAgRNDQQLIAFBfmohAUEAKALcCSECAkADQCABQQJqIgQgAk0NAUEAIAE2ApwKIAEvAQAhAyABQX5qIgQhASADECBFDQALIARBAmohBAsCQCADQf//A3EQIUUNACAEQX5qIQECQANAIAFBAmoiAyACTQ0BQQAgATYCnAogAS8BACEDIAFBfmoiBCEBIAMQIQ0ACyAEQQJqIQMLIAMQIg0EC0EAQQE6AKAKDAcLQQAoAqQKQQAvAZgKIgFBA3QiA2pBACgCnAo2AgRBACABQQFqOwGYCkEAKAKkCiADakEDNgIACxAjDAULQQAtAPwJQQAvAZYKQQAvAZgKcnJFIQIMBwsQJEEAQQA6AKAKDAMLECVBACECDAULIANBoAFHDQELQQBBAToArAoLQQBBACgCsAo2ApwKC0EAKAKwCiEBDAALCyAAQYDQAGokACACCxoAAkBBACgC3AkgAEcNAEEBDwsgAEF+ahAmC/4KAQZ/QQBBACgCsAoiAEEMaiIBNgKwCkEAKAL4CSECQQEQKSEDAkACQAJAAkACQAJAAkACQAJAQQAoArAKIgQgAUcNACADEChFDQELAkACQAJAAkACQAJAAkAgA0EqRg0AIANB+wBHDQFBACAEQQJqNgKwCkEBECkhA0EAKAKwCiEEA0ACQAJAIANB//8DcSIDQSJGDQAgA0EnRg0AIAMQLBpBACgCsAohAwwBCyADEBpBAEEAKAKwCkECaiIDNgKwCgtBARApGgJAIAQgAxAtIgNBLEcNAEEAQQAoArAKQQJqNgKwCkEBECkhAwsgA0H9AEYNA0EAKAKwCiIFIARGDQ8gBSEEIAVBACgCtApNDQAMDwsLQQAgBEECajYCsApBARApGkEAKAKwCiIDIAMQLRoMAgtBAEEAOgCUCgJAAkACQAJAAkACQCADQZ9/ag4MAgsEAQsDCwsLCwsFAAsgA0H2AEYNBAwKC0EAIARBDmoiAzYCsAoCQAJAAkBBARApQZ9/ag4GABICEhIBEgtBACgCsAoiBSkAAkLzgOSD4I3AMVINESAFLwEKECFFDRFBACAFQQpqNgKwCkEAECkaC0EAKAKwCiIFQQJqQbIIQQ4QLw0QIAUvARAiAkF3aiIBQRdLDQ1BASABdEGfgIAEcUUNDQwOC0EAKAKwCiIFKQACQuyAhIOwjsA5Ug0PIAUvAQoiAkF3aiIBQRdNDQYMCgtBACAEQQpqNgKwCkEAECkaQQAoArAKIQQLQQAgBEEQajYCsAoCQEEBECkiBEEqRw0AQQBBACgCsApBAmo2ArAKQQEQKSEEC0EAKAKwCiEDIAQQLBogA0EAKAKwCiIEIAMgBBACQQBBACgCsApBfmo2ArAKDwsCQCAEKQACQuyAhIOwjsA5Ug0AIAQvAQoQIEUNAEEAIARBCmo2ArAKQQEQKSEEQQAoArAKIQMgBBAsGiADQQAoArAKIgQgAyAEEAJBAEEAKAKwCkF+ajYCsAoPC0EAIARBBGoiBDYCsAoLQQAgBEEGajYCsApBAEEAOgCUCkEBECkhBEEAKAKwCiEDIAQQLCEEQQAoArAKIQIgBEHf/wNxIgFB2wBHDQNBACACQQJqNgKwCkEBECkhBUEAKAKwCiEDQQAhBAwEC0EAQQE6AIwKQQBBACgCsApBAmo2ArAKC0EBECkhBEEAKAKwCiEDAkAgBEHmAEcNACADQQJqQawIQQYQLw0AQQAgA0EIajYCsAogAEEBEClBABArIAJBEGpB5AkgAhshAwNAIAMoAgAiA0UNBSADQgA3AgggA0EQaiEDDAALC0EAIANBfmo2ArAKDAMLQQEgAXRBn4CABHFFDQMMBAtBASEECwNAAkACQCAEDgIAAQELIAVB//8DcRAsGkEBIQQMAQsCQAJAQQAoArAKIgQgA0YNACADIAQgAyAEEAJBARApIQQCQCABQdsARw0AIARBIHJB/QBGDQQLQQAoArAKIQMCQCAEQSxHDQBBACADQQJqNgKwCkEBECkhBUEAKAKwCiEDIAVBIHJB+wBHDQILQQAgA0F+ajYCsAoLIAFB2wBHDQJBACACQX5qNgKwCg8LQQAhBAwACwsPCyACQaABRg0AIAJB+wBHDQQLQQAgBUEKajYCsApBARApIgVB+wBGDQMMAgsCQCACQVhqDgMBAwEACyACQaABRw0CC0EAIAVBEGo2ArAKAkBBARApIgVBKkcNAEEAQQAoArAKQQJqNgKwCkEBECkhBQsgBUEoRg0BC0EAKAKwCiEBIAUQLBpBACgCsAoiBSABTQ0AIAQgAyABIAUQAkEAQQAoArAKQX5qNgKwCg8LIAQgA0EAQQAQAkEAIARBDGo2ArAKDwsQJQuFDAEKf0EAQQAoArAKIgBBDGoiATYCsApBARApIQJBACgCsAohAwJAAkACQAJAAkACQAJAAkAgAkEuRw0AQQAgA0ECajYCsAoCQEEBECkiAkHkAEYNAAJAIAJB8wBGDQAgAkHtAEcNB0EAKAKwCiICQQJqQZwIQQYQLw0HAkBBACgCnAoiAxAqDQAgAy8BAEEuRg0ICyAAIAAgAkEIakEAKALUCRABDwtBACgCsAoiAkECakGiCEEKEC8NBgJAQQAoApwKIgMQKg0AIAMvAQBBLkYNBwtBACEEQQAgAkEMajYCsApBASEFQQUhBkEBECkhAkEAIQdBASEIDAILQQAoArAKIgIpAAJC5YCYg9CMgDlSDQUCQEEAKAKcCiIDECoNACADLwEAQS5GDQYLQQAhBEEAIAJBCmo2ArAKQQIhCEEHIQZBASEHQQEQKSECQQEhBQwBCwJAAkACQAJAIAJB8wBHDQAgAyABTQ0AIANBAmpBoghBChAvDQACQCADLwEMIgRBd2oiB0EXSw0AQQEgB3RBn4CABHENAgsgBEGgAUYNAQtBACEHQQchBkEBIQQgAkHkAEYNAQwCC0EAIQRBACADQQxqIgI2ArAKQQEhBUEBECkhCQJAQQAoArAKIgYgAkYNAEHmACECAkAgCUHmAEYNAEEFIQZBACEHQQEhCCAJIQIMBAtBACEHQQEhCCAGQQJqQawIQQYQLw0EIAYvAQgQIEUNBAtBACEHQQAgAzYCsApBByEGQQEhBEEAIQVBACEIIAkhAgwCCyADIABBCmpNDQBBACEIQeQAIQICQCADKQACQuWAmIPQjIA5Ug0AAkACQCADLwEKIgRBd2oiB0EXSw0AQQEgB3RBn4CABHENAQtBACEIIARBoAFHDQELQQAhBUEAIANBCmo2ArAKQSohAkEBIQdBAiEIQQEQKSIJQSpGDQRBACADNgKwCkEBIQRBACEHQQAhCCAJIQIMAgsgAyEGQQAhBwwCC0EAIQVBACEICwJAIAJBKEcNAEEAKAKkCkEALwGYCiICQQN0aiIDQQAoArAKNgIEQQAgAkEBajsBmAogA0EFNgIAQQAoApwKLwEAQS5GDQRBAEEAKAKwCiIDQQJqNgKwCkEBECkhAiAAQQAoArAKQQAgAxABAkACQCAFDQBBACgC8AkhAQwBC0EAKALwCSIBIAY2AhwLQQBBAC8BlgoiA0EBajsBlgpBACgCqAogA0ECdGogATYCAAJAIAJBIkYNACACQSdGDQBBAEEAKAKwCkF+ajYCsAoPCyACEBpBAEEAKAKwCkECaiICNgKwCgJAAkACQEEBEClBV2oOBAECAgACC0EAQQAoArAKQQJqNgKwCkEBECkaQQAoAvAJIgMgAjYCBCADQQE6ABggA0EAKAKwCiICNgIQQQAgAkF+ajYCsAoPC0EAKALwCSIDIAI2AgQgA0EBOgAYQQBBAC8BmApBf2o7AZgKIANBACgCsApBAmo2AgxBAEEALwGWCkF/ajsBlgoPC0EAQQAoArAKQX5qNgKwCg8LAkAgBEEBcyACQfsAR3INAEEAKAKwCiECQQAvAZgKDQUDQAJAAkACQCACQQAoArQKTw0AQQEQKSICQSJGDQEgAkEnRg0BIAJB/QBHDQJBAEEAKAKwCkECajYCsAoLQQEQKSEDQQAoArAKIQICQCADQeYARw0AIAJBAmpBrAhBBhAvDQcLQQAgAkEIajYCsAoCQEEBECkiAkEiRg0AIAJBJ0cNBwsgACACQQAQKw8LIAIQGgtBAEEAKAKwCkECaiICNgKwCgwACwsCQAJAIAJBWWoOBAMBAQMACyACQSJGDQILQQAoArAKIQYLIAYgAUcNAEEAIABBCmo2ArAKDwsgAkEqRyAHcQ0DQQAvAZgKQf//A3ENA0EAKAKwCiECQQAoArQKIQEDQCACIAFPDQECQAJAIAIvAQAiA0EnRg0AIANBIkcNAQsgACADIAgQKw8LQQAgAkECaiICNgKwCgwACwsQJQsPC0EAIAJBfmo2ArAKDwtBAEEAKAKwCkF+ajYCsAoLRwEDf0EAKAKwCkECaiEAQQAoArQKIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqDgQBAAABAAsLQQAgAjYCsAoLmAEBA39BAEEAKAKwCiIBQQJqNgKwCiABQQZqIQFBACgCtAohAgNAAkACQAJAIAFBfGogAk8NACABQX5qLwEAIQMCQAJAIAANACADQSpGDQEgA0F2ag4EAgQEAgQLIANBKkcNAwsgAS8BAEEvRw0CQQAgAUF+ajYCsAoMAQsgAUF+aiEBC0EAIAE2ArAKDwsgAUECaiEBDAALC4gBAQR/QQAoArAKIQFBACgCtAohAgJAAkADQCABIgNBAmohASADIAJPDQEgAS8BACIEIABGDQICQCAEQdwARg0AIARBdmoOBAIBAQIBCyADQQRqIQEgAy8BBEENRw0AIANBBmogASADLwEGQQpGGyEBDAALC0EAIAE2ArAKECUPC0EAIAE2ArAKC2wBAX8CQAJAIABBX2oiAUEFSw0AQQEgAXRBMXENAQsgAEFGakH//wNxQQZJDQAgAEEpRyAAQVhqQf//A3FBB0lxDQACQCAAQaV/ag4EAQAAAQALIABB/QBHIABBhX9qQf//A3FBBElxDwtBAQsuAQF/QQEhAQJAIABBpglBBRAdDQAgAEGWCEEDEB0NACAAQbAJQQIQHSEBCyABC0YBA39BACEDAkAgACACQQF0IgJrIgRBAmoiAEEAKALcCSIFSQ0AIAAgASACEC8NAAJAIAAgBUcNAEEBDwsgBBAmIQMLIAMLgwEBAn9BASEBAkACQAJAAkACQAJAIAAvAQAiAkFFag4EBQQEAQALAkAgAkGbf2oOBAMEBAIACyACQSlGDQQgAkH5AEcNAyAAQX5qQbwJQQYQHQ8LIABBfmovAQBBPUYPCyAAQX5qQbQJQQQQHQ8LIABBfmpByAlBAxAdDwtBACEBCyABC7QDAQJ/QQAhAQJAAkACQAJAAkACQAJAAkACQAJAIAAvAQBBnH9qDhQAAQIJCQkJAwkJBAUJCQYJBwkJCAkLAkACQCAAQX5qLwEAQZd/ag4EAAoKAQoLIABBfGpByghBAhAdDwsgAEF8akHOCEEDEB0PCwJAAkACQCAAQX5qLwEAQY1/ag4DAAECCgsCQCAAQXxqLwEAIgJB4QBGDQAgAkHsAEcNCiAAQXpqQeUAECcPCyAAQXpqQeMAECcPCyAAQXxqQdQIQQQQHQ8LIABBfGpB3AhBBhAdDwsgAEF+ai8BAEHvAEcNBiAAQXxqLwEAQeUARw0GAkAgAEF6ai8BACICQfAARg0AIAJB4wBHDQcgAEF4akHoCEEGEB0PCyAAQXhqQfQIQQIQHQ8LIABBfmpB+AhBBBAdDwtBASEBIABBfmoiAEHpABAnDQQgAEGACUEFEB0PCyAAQX5qQeQAECcPCyAAQX5qQYoJQQcQHQ8LIABBfmpBmAlBBBAdDwsCQCAAQX5qLwEAIgJB7wBGDQAgAkHlAEcNASAAQXxqQe4AECcPCyAAQXxqQaAJQQMQHSEBCyABCzQBAX9BASEBAkAgAEF3akH//wNxQQVJDQAgAEGAAXJBoAFGDQAgAEEuRyAAEChxIQELIAELMAEBfwJAAkAgAEF3aiIBQRdLDQBBASABdEGNgIAEcQ0BCyAAQaABRg0AQQAPC0EBC04BAn9BACEBAkACQCAALwEAIgJB5QBGDQAgAkHrAEcNASAAQX5qQfgIQQQQHQ8LIABBfmovAQBB9QBHDQAgAEF8akHcCEEGEB0hAQsgAQveAQEEf0EAKAKwCiEAQQAoArQKIQECQAJAAkADQCAAIgJBAmohACACIAFPDQECQAJAAkAgAC8BACIDQaR/ag4FAgMDAwEACyADQSRHDQIgAi8BBEH7AEcNAkEAIAJBBGoiADYCsApBAEEALwGYCiICQQFqOwGYCkEAKAKkCiACQQN0aiICQQQ2AgAgAiAANgIEDwtBACAANgKwCkEAQQAvAZgKQX9qIgA7AZgKQQAoAqQKIABB//8DcUEDdGooAgBBA0cNAwwECyACQQRqIQAMAAsLQQAgADYCsAoLECULC3ABAn8CQAJAA0BBAEEAKAKwCiIAQQJqIgE2ArAKIABBACgCtApPDQECQAJAAkAgAS8BACIBQaV/ag4CAQIACwJAIAFBdmoOBAQDAwQACyABQS9HDQIMBAsQLhoMAQtBACAAQQRqNgKwCgwACwsQJQsLNQEBf0EAQQE6APwJQQAoArAKIQBBAEEAKAK0CkECajYCsApBACAAQQAoAtwJa0EBdTYCkAoLQwECf0EBIQECQCAALwEAIgJBd2pB//8DcUEFSQ0AIAJBgAFyQaABRg0AQQAhASACEChFDQAgAkEuRyAAECpyDwsgAQs9AQJ/QQAhAgJAQQAoAtwJIgMgAEsNACAALwEAIAFHDQACQCADIABHDQBBAQ8LIABBfmovAQAQICECCyACC2gBAn9BASEBAkACQCAAQV9qIgJBBUsNAEEBIAJ0QTFxDQELIABB+P8DcUEoRg0AIABBRmpB//8DcUEGSQ0AAkAgAEGlf2oiAkEDSw0AIAJBAUcNAQsgAEGFf2pB//8DcUEESSEBCyABC5wBAQN/QQAoArAKIQECQANAAkACQCABLwEAIgJBL0cNAAJAIAEvAQIiAUEqRg0AIAFBL0cNBBAYDAILIAAQGQwBCwJAAkAgAEUNACACQXdqIgFBF0sNAUEBIAF0QZ+AgARxRQ0BDAILIAIQIUUNAwwBCyACQaABRw0CC0EAQQAoArAKIgNBAmoiATYCsAogA0EAKAK0CkkNAAsLIAILMQEBf0EAIQECQCAALwEAQS5HDQAgAEF+ai8BAEEuRw0AIABBfGovAQBBLkYhAQsgAQumBAEBfwJAIAFBIkYNACABQSdGDQAQJQ8LQQAoArAKIQMgARAaIAAgA0ECakEAKAKwCkEAKALQCRABAkAgAkEBSA0AQQAoAvAJQQRBBiACQQFGGzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=",typeof Buffer<"u"?Buffer.from(e,"base64"):Uint8Array.from(atob(e),(t=>t.charCodeAt(0)));var e},ii=WebAssembly.compile(Qm()).then(WebAssembly.instantiate).then((({exports:e})=>{G=e}));var Rt=class e{constructor(t,s,n,i){this.version=t,this.cdn=s,this.peer=n,this.cache=i}extractImportsSync(t){let s=new Set;for(let n of e.importPatterns){n.lastIndex=0;for(let i of t.matchAll(n))oe.isBare(i[1])&&s.add(i[1])}return Array.from(s)}async extractImports(t){let s=new Set,n=i=>{oe.isBare(i)&&s.add(i)};try{await ii;let[i]=oi(t);i.forEach(a=>n(t.slice(a.s,a.e).trim()))}catch{return this.extractImportsSync(t)}return Array.from(s)}async buildImportMap(t,s,n){let i=(await this.extractImports(t)).filter(E=>!n?.has(oe.rootOf(E))),a=[...new Set(i.map(oe.rootOf))],c=await Promise.all(a.map(async E=>({name:E,version:await this.resolveVersion(E,s)}))),{allRoots:p,flags:h,autoAddedPeers:m}=await this.peer.resolve(c,E=>this.resolveVersion(E,s)),g=this.buildEntries([...i,...m.map(E=>E.name)],p,h,s);return{importMap:{imports:Object.fromEntries(g)},prefetchUrls:g.map(([,E])=>E)}}async resolveVersion(t,s){let n=s[t],i=n?`${t}@${n}`:t,a=await this.version.resolveExactForRoot(t,n);if(!a){let c=await Ce(()=>this.cdn.pinEsmUrl(i));if(!c)throw new Error(`Cannot resolve ${i}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);a=oe.versionFromUrl(c),a&&n&&await Ce(()=>this.cache.setPinnedExact(t,n,a))}if(!a)throw new Error(`Cannot resolve ${i}: no concrete version found.`);return a}buildEntries(t,s,n,i){let a=new Map(s.map(C=>[C.name,C])),c=C=>{let F=a.get(oe.rootOf(C));return new oe(C).withPreferredVersion(F.version,i[F.name]).format()},p=new Set([...n.entries()].filter(([,C])=>C.isPeerRoot||C.isSharedDep).map(([C])=>C)),h=new Set(t.filter(C=>C!==oe.rootOf(C)).map(oe.rootOf)),m=[],g=new Set,E=new Set(t.filter(C=>C===oe.rootOf(C))),x=new Set;for(let C of t){let F=oe.rootOf(C),S=a.get(F),{isPeerRoot:P,hasPeers:O,isSharedDep:W}=n.get(F),V=h.has(F),Y=C!==F,Ee=!(P||W)&&(V||!O),ie=this.singletonDepsOf(S,p),me=Y&&E.has(F);me&&x.add(F);let Ve=me?[...ie,F]:ie.length?ie:void 0;m.push([C,this.cdn.buildEsmUrl(c(C),{bundle:Ee,external:Ve})]),g.add(C)}let I=new Set([...p,...x]);for(let C of I)a.has(C)&&(g.has(C)||m.push([C,this.cdn.buildEsmUrl(c(C),{})]),m.push([`${C}/`,`${this.cdn.esmHost}/${c(C)}/`]));return m}singletonDepsOf(t,s){return[...new Set([...Cr(t.meta),...ni(t.meta)])].filter(n=>s.has(n))}};Rt.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];var ue=Pt(Zl(),1),Ss=class{cmp(t,s){return t===s?0:(0,ue.gt)(t,s)?1:(0,ue.gt)(s,t)?-1:0}satisfies(t,s){return!t||!t.trim()?!0:!!(0,ue.satisfies)(s,t,{includePrerelease:!0})}pickMaxSatisfying(t,s){if(!t?.length)return;let n=(0,ue.maxSatisfying)(t,s,{includePrerelease:!0});return n===null?void 0:n}pickLatest(t){return t?.length?(0,ue.rsort)(t)[0]:void 0}selectBestVersion(t,s){if(!t?.length)return;let n=s?.range?.trim()||"*",i=s?.preferStable??!0,a=s?.distTags?.latest;if(a&&t.includes(a)&&this.satisfies(n,a))return a;if(i){let p=(0,ue.maxSatisfying)(t,n,{includePrerelease:!1});if(p)return p}return(0,ue.maxSatisfying)(t,n,{includePrerelease:!0})??void 0}majorOf(t){return(0,ue.major)(t)}isPrerelease(t){return(0,ue.prerelease)(t)!==null}isExactVersion(t){return(0,ue.valid)(t)!==null}},bi=new Ss;function eu(e,t){let s=new wr(e,t),n=new yr(s),i=new _r(e,s,bi);return{packageService:new Rt(i,s,n,e),versionResolver:i,cdnClient:s,peerResolver:n}}var tu={async getJson(e){try{let t=await fetch(e,{redirect:"follow"});return t.ok?await t.json():void 0}catch{return}},async head(e){try{let t=await fetch(e,{method:"HEAD",redirect:"follow"});return{ok:t.ok,url:t.url}}catch{return}}};function bg(){let e=new Map,t=new Map,s=new Set,n=new Map;return{async getPinnedExact(i,a){return e.get(`${i}@${a}`)},async setPinnedExact(i,a,c){e.set(`${i}@${a}`,c)},async getIndex(i){return t.get(i)},async setIndex(i,a,c){t.set(i,{versions:a,distTags:c,updatedAt:Date.now()})},async invalidateVersionsCache(i){t.delete(i)},async isNegative(i){return s.has(i)},async recordNegative(i){s.add(i)},async clearNegative(i){s.delete(i)},async getMeta(i,a){return n.get(`${i}@${a}`)},async setMeta(i,a,c,p,h){n.set(`${i}@${a}`,{dependencies:c,peerDependencies:p,peerDependenciesMeta:h,updatedAt:Date.now()})}}}var{packageService:Tg}=eu(bg(),tu);async function Sg(e,t={}){let s=Si(e);if(!s)return{error:"Not a valid bulb (missing `---` frontmatter or a **code.tsx** block)."};let n=Bi(s);if(n.server.trim())return{error:"Nested bulbs are client-only; a **server.ts** block is not supported."};if(!n.code.trim())return{error:"Bulb has no **code.tsx** to run."};let i=vi(n.config),a=nc(n.code,{jsxImportSource:i.jsxImportSource});if(a.error)return{error:`Compile error: ${a.error}`};let c;try{({importMap:c}=await Tg.buildImportMap(a.code,i.dependencies??{}))}catch(h){return{error:`Dependency resolution failed: ${h instanceof Error?h.message:String(h)}`}}return{html:ic({name:n.name||"bulb",code:a.code,css:n.css,html:n.html,data:Qi(n.data),insight:n.insight,importMap:c,watch:!1,theme:t.theme})}}function Bg(){let e=document.documentElement.getAttribute("data-theme");return e==="dark"||e==="light"?e:void 0}async function Ay(e,t={}){let{html:s,error:n}=await Sg(e,{theme:t.theme??Bg()});if(n||!s)throw new Error(n??"Bulb produced no output.");let i=t.minHeight??320,a=t.maxHeight??1e5,c=document.createElement("iframe");c.setAttribute("sandbox","allow-scripts"),c.style.cssText=`display:block;width:100%;height:${i}px;border:0`,c.srcdoc=s;let p=h=>{if(h.source!==c.contentWindow)return;let m=h.data;!m||m.__typebulbEmbed!==!0||(m.kind==="height"&&typeof m.height=="number"&&Number.isFinite(m.height)?c.style.height=`${Math.min(a,Math.max(i,Math.ceil(m.height)))}px`:m.kind==="error"&&t.onError?.(String(m.message??"error")))};return window.addEventListener("message",p,t.signal?{signal:t.signal}:void 0),c}export{Ay as createBulbFrame,Sg as renderBulb};
456
+ `,G.e()-1)}`),{idx:G.e()});let a=[],c=[];for(;G.ri();){let h=G.is(),m=G.ie(),g=G.it(),E=G.ai(),x=G.id(),I=G.ss(),C=G.se(),F;G.ip()&&(F=p(e.slice(x===-1?h-1:h,x===-1?m+1:m))),a.push({n:F,t:g,s:h,e:m,ss:I,se:C,d:x,a:E})}for(;G.re();){let h=G.es(),m=G.ee(),g=G.els(),E=G.ele(),x=e.slice(h,m),I=x[0],C=g<0?void 0:e.slice(g,E),F=C?C[0]:"";c.push({s:h,e:m,ls:g,le:E,n:I==='"'||I==="'"?p(x):x,ln:F==='"'||F==="'"?p(C):C})}function p(h){try{return(0,eval)(h)}catch{}}return[a,c,!!G.f(),!!G.ms()]}function Sm(e,t){let s=e.length,n=0;for(;n<s;){let i=e.charCodeAt(n);t[n++]=(255&i)<<8|i>>>8}}function Bm(e,t){let s=e.length,n=0;for(;n<s;)t[n]=e.charCodeAt(n++)}var G,Qm=()=>{return e="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GzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=",typeof Buffer<"u"?Buffer.from(e,"base64"):Uint8Array.from(atob(e),(t=>t.charCodeAt(0)));var e},ii=WebAssembly.compile(Qm()).then(WebAssembly.instantiate).then((({exports:e})=>{G=e}));var Rt=class e{constructor(t,s,n,i){this.version=t,this.cdn=s,this.peer=n,this.cache=i}extractImportsSync(t){let s=new Set;for(let n of e.importPatterns){n.lastIndex=0;for(let i of t.matchAll(n))oe.isBare(i[1])&&s.add(i[1])}return Array.from(s)}async extractImports(t){let s=new Set,n=i=>{oe.isBare(i)&&s.add(i)};try{await ii;let[i]=oi(t);i.forEach(a=>n(t.slice(a.s,a.e).trim()))}catch{return this.extractImportsSync(t)}return Array.from(s)}async buildImportMap(t,s,n){let i=(await this.extractImports(t)).filter(E=>!n?.has(oe.rootOf(E))),a=[...new Set(i.map(oe.rootOf))],c=await Promise.all(a.map(async E=>({name:E,version:await this.resolveVersion(E,s)}))),{allRoots:p,flags:h,autoAddedPeers:m}=await this.peer.resolve(c,E=>this.resolveVersion(E,s)),g=this.buildEntries([...i,...m.map(E=>E.name)],p,h,s);return{importMap:{imports:Object.fromEntries(g)},prefetchUrls:g.map(([,E])=>E)}}async resolveVersion(t,s){let n=s[t],i=n?`${t}@${n}`:t,a=await this.version.resolveExactForRoot(t,n);if(!a){let c=await Ce(()=>this.cdn.pinEsmUrl(i));if(!c)throw new Error(`Cannot resolve ${i}: no matching version is published (the package or version may not exist, or the registry was unreachable).`);a=oe.versionFromUrl(c),a&&n&&await Ce(()=>this.cache.setPinnedExact(t,n,a))}if(!a)throw new Error(`Cannot resolve ${i}: no concrete version found.`);return a}buildEntries(t,s,n,i){let a=new Map(s.map(C=>[C.name,C])),c=C=>{let F=a.get(oe.rootOf(C));return new oe(C).withPreferredVersion(F.version,i[F.name]).format()},p=new Set([...n.entries()].filter(([,C])=>C.isPeerRoot||C.isSharedDep).map(([C])=>C)),h=new Set(t.filter(C=>C!==oe.rootOf(C)).map(oe.rootOf)),m=[],g=new Set,E=new Set(t.filter(C=>C===oe.rootOf(C))),x=new Set;for(let C of t){let F=oe.rootOf(C),S=a.get(F),{isPeerRoot:P,hasPeers:O,isSharedDep:W}=n.get(F),V=h.has(F),Y=C!==F,Ee=!(P||W)&&(V||!O),ie=this.singletonDepsOf(S,p),me=Y&&E.has(F);me&&x.add(F);let Ve=me?[...ie,F]:ie.length?ie:void 0;m.push([C,this.cdn.buildEsmUrl(c(C),{bundle:Ee,external:Ve})]),g.add(C)}let I=new Set([...p,...x]);for(let C of I)a.has(C)&&(g.has(C)||m.push([C,this.cdn.buildEsmUrl(c(C),{})]),m.push([`${C}/`,`${this.cdn.esmHost}/${c(C)}/`]));return m}singletonDepsOf(t,s){return[...new Set([...Cr(t.meta),...ni(t.meta)])].filter(n=>s.has(n))}};Rt.importPatterns=[/\bimport\s+(?:[^'";]*?from\s*)?['"]([^'"]+)['"]/g,/\bexport\s+[^'";]*?from\s*['"]([^'"]+)['"]/g];var ue=Pt(Zl(),1),Ss=class{cmp(t,s){return t===s?0:(0,ue.gt)(t,s)?1:(0,ue.gt)(s,t)?-1:0}satisfies(t,s){return!t||!t.trim()?!0:!!(0,ue.satisfies)(s,t,{includePrerelease:!0})}pickMaxSatisfying(t,s){if(!t?.length)return;let n=(0,ue.maxSatisfying)(t,s,{includePrerelease:!0});return n===null?void 0:n}pickLatest(t){return t?.length?(0,ue.rsort)(t)[0]:void 0}selectBestVersion(t,s){if(!t?.length)return;let n=s?.range?.trim()||"*",i=s?.preferStable??!0,a=s?.distTags?.latest;if(a&&t.includes(a)&&this.satisfies(n,a))return a;if(i){let p=(0,ue.maxSatisfying)(t,n,{includePrerelease:!1});if(p)return p}return(0,ue.maxSatisfying)(t,n,{includePrerelease:!0})??void 0}majorOf(t){return(0,ue.major)(t)}isPrerelease(t){return(0,ue.prerelease)(t)!==null}isExactVersion(t){return(0,ue.valid)(t)!==null}},bi=new Ss;function eu(e,t){let s=new wr(e,t),n=new yr(s),i=new _r(e,s,bi);return{packageService:new Rt(i,s,n,e),versionResolver:i,cdnClient:s,peerResolver:n}}var tu={async getJson(e){try{let t=await fetch(e,{redirect:"follow"});return t.ok?await t.json():void 0}catch{return}},async head(e){try{let t=await fetch(e,{method:"HEAD",redirect:"follow"});return{ok:t.ok,url:t.url}}catch{return}}};function bg(){let e=new Map,t=new Map,s=new Set,n=new Map;return{async getPinnedExact(i,a){return e.get(`${i}@${a}`)},async setPinnedExact(i,a,c){e.set(`${i}@${a}`,c)},async getIndex(i){return t.get(i)},async setIndex(i,a,c){t.set(i,{versions:a,distTags:c,updatedAt:Date.now()})},async invalidateVersionsCache(i){t.delete(i)},async isNegative(i){return s.has(i)},async recordNegative(i){s.add(i)},async clearNegative(i){s.delete(i)},async getMeta(i,a){return n.get(`${i}@${a}`)},async setMeta(i,a,c,p,h){n.set(`${i}@${a}`,{dependencies:c,peerDependencies:p,peerDependenciesMeta:h,updatedAt:Date.now()})}}}var{packageService:Tg}=eu(bg(),tu);async function Sg(e,t={}){let s=Si(e);if(!s)return{error:"Not a valid bulb (missing `---` frontmatter or a **code.tsx** block)."};let n=Bi(s);if(n.server.trim())return{error:"Nested bulbs are client-only; a **server.ts** block is not supported."};if(!n.code.trim())return{error:"Bulb has no **code.tsx** to run."};let i=vi(n.config),a=nc(n.code,{jsxImportSource:i.jsxImportSource});if(a.error)return{error:`Compile error: ${a.error}`};let c;try{({importMap:c}=await Tg.buildImportMap(a.code,i.dependencies??{}))}catch(h){return{error:`Dependency resolution failed: ${h instanceof Error?h.message:String(h)}`}}return{html:ic({name:n.name||"bulb",code:a.code,css:n.css,html:n.html,data:Qi(n.data),insight:n.insight,importMap:c,watch:!1,theme:t.theme})}}function Bg(){let e=document.documentElement.getAttribute("data-theme");return e==="dark"||e==="light"?e:void 0}async function Ay(e,t={}){let{html:s,error:n}=await Sg(e,{theme:t.theme??Bg()});if(n||!s)throw new Error(n??"Bulb produced no output.");let i=t.initialHeight??320,a=t.maxHeight??1e5,c=document.createElement("iframe");c.setAttribute("sandbox","allow-scripts"),c.style.cssText=`display:block;width:100%;height:${i}px;border:0`,c.srcdoc=s;let p=h=>{if(h.source!==c.contentWindow)return;let m=h.data;!m||m.__typebulbEmbed!==!0||(m.kind==="height"&&typeof m.height=="number"&&Number.isFinite(m.height)?c.style.height=`${Math.min(a,Math.max(0,Math.ceil(m.height)))}px`:m.kind==="error"&&t.onError?.(String(m.message??"error")))};return window.addEventListener("message",p,t.signal?{signal:t.signal}:void 0),c}export{Ay as createBulbFrame,Sg as renderBulb};
@@ -0,0 +1,23 @@
1
+ export interface BulbServer {
2
+ /** OS process id of the dev server. */
3
+ pid: number
4
+ /** Bound loopback port. */
5
+ port: number
6
+ /** http://localhost:<port>. */
7
+ url: string
8
+ /** Absolute path to the .bulb.md being served. */
9
+ file: string
10
+ /** Epoch ms the server began listening. */
11
+ startedAt: number
12
+ }
13
+
14
+ /** Launch (or re-attach to) a standalone `typebulb` dev server for `file`. Idempotent
15
+ * per file: a live server already serving it is returned, not re-spawned. Always silent
16
+ * (no console window); detached so it outlives the caller. */
17
+ export declare function launchBulbServer(file: string, opts?: { cwd?: string; open?: boolean }): Promise<BulbServer>
18
+
19
+ /** Every live dev server, oldest first. Dead entries are pruned on read. */
20
+ export declare function listBulbServers(): Promise<BulbServer[]>
21
+
22
+ /** Stop a server by pid (SIGTERM + deregister). Idempotent. */
23
+ export declare function stopBulbServer(pid: number): Promise<void>
@@ -0,0 +1 @@
1
+ import{spawn as l}from"child_process";import{readdir as f,readFile as w,writeFile as j,unlink as a,mkdir as R}from"fs/promises";import*as o from"path";import*as d from"os";function u(){return process.env.TYPEBULB_SERVERS_DIR||o.join(d.homedir(),".typebulb","servers")}function v(r){return o.join(u(),`${r}.json`)}function h(r){try{return process.kill(r,0),!0}catch(e){return e.code==="EPERM"}}async function S(r){await a(v(r)).catch(()=>{})}async function c(){let r;try{r=await f(u())}catch{return[]}let e=[];return await Promise.all(r.map(async t=>{if(!t.endsWith(".json"))return;let n=o.join(u(),t),i;try{i=JSON.parse(await w(n,"utf8"))}catch{await a(n).catch(()=>{});return}i&&typeof i.pid=="number"&&h(i.pid)?e.push(i):await a(n).catch(()=>{})})),e.sort((t,n)=>t.startedAt-n.startedAt)}async function y(r){try{process.kill(r,"SIGTERM")}catch{}await S(r)}var g=r=>new Promise(e=>setTimeout(e,r));async function B(r,e={}){let t=e.cwd??process.cwd(),n=o.resolve(t,r),i=(await c()).find(s=>s.file===n);if(i)return i;let p=["typebulb",r,...e.open===!1?["--no-open"]:[]];(process.platform==="win32"?l("cmd",["/c","start","","/b","npx",...p],{cwd:t,stdio:"ignore",windowsHide:!0}):l("npx",p,{cwd:t,detached:!0,stdio:"ignore"})).unref();let b=Date.now()+2e4;for(;Date.now()<b;){await g(150);let s=(await c()).find(m=>m.file===n);if(s)return s}throw new Error(`Launched ${o.basename(r)} but it did not register within 20s.`)}export{B as launchBulbServer,c as listBulbServers,y as stopBulbServer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typebulb",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Local bulb runner CLI for Typebulb",
5
5
  "license": "MIT",
6
6
  "engines": { "node": ">=18" },
@@ -14,6 +14,12 @@
14
14
  "browser": "./dist/render.js",
15
15
  "import": "./dist/render.js",
16
16
  "default": "./dist/render.js"
17
+ },
18
+ "./servers": {
19
+ "types": "./dist/servers.d.ts",
20
+ "node": "./dist/servers.js",
21
+ "import": "./dist/servers.js",
22
+ "default": "./dist/servers.js"
17
23
  }
18
24
  },
19
25
  "files": [