typebulb 0.61.7 → 0.61.9

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.
@@ -312,8 +312,10 @@ body {
312
312
  centres this box, so the extra height never unbalances the row. */
313
313
  line-height: 1.3;
314
314
  /* The band's core leans from the accent toward --fg, so it stands off muted and body text alike:
315
- brighter than the accent in dark, deeper in light. */
316
- background-image: linear-gradient(100deg, currentColor 25%, var(--accent) 40%, color-mix(in srgb, var(--accent) 60%, var(--fg)) 50%, var(--accent) 60%, currentColor 75%) !important;
315
+ brighter than the accent in dark, deeper in light. The ends rest dimmer than currentColor, so the
316
+ band shows by brightness: a hovered link is already the accent, the same colour as the band. */
317
+ --shimmer-rest: color-mix(in srgb, currentColor 55%, transparent);
318
+ background-image: linear-gradient(100deg, var(--shimmer-rest) 25%, var(--accent) 40%, color-mix(in srgb, var(--accent) 60%, var(--fg)) 50%, var(--accent) 60%, var(--shimmer-rest) 75%) !important;
317
319
  -webkit-background-clip: text;
318
320
  background-clip: text;
319
321
  -webkit-text-fill-color: transparent;
package/dist/index.js CHANGED
@@ -295,7 +295,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
295
295
  })();`});var ee=k(()=>{Si();_l();Cp();Np();gu();Ig();Ug();Jg();Wg();Hg();Yg();ki()});function Te(n){return n.length>5e4?n.slice(0,5e4)+`
296
296
  \u2026[${n.length-5e4} more characters truncated]`:n}function Ne(n){let e=n.replace(bT,"").split(`
297
297
  `).map(i=>i.trim()).filter(Boolean),t=e[0];if(!t)return"";let r=t.length>300?t.slice(0,300).trimEnd()+"\u2026":t,s=e.length-1;return s>0?`${r} (+${s} line${s===1?"":"s"})`:r}var Se,bT,To,ys=k(()=>{"use strict";Se=(n,e,t=e+"s")=>`${n} ${n===1?e:t}`;bT=/\u001b\[[0-9;]*m/g;To=(n,e)=>`![pasted image](data:${e||"image/png"};base64,${n})`});import{closeSync as Gg,existsSync as wT,fstatSync as vT,openSync as Xg,readdirSync as ST,readSync as Qg,statSync as kT}from"fs";import{join as xT}from"path";function xu(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=Buffer.alloc(e),s=Qg(t,r,0,e,0);return{text:r.subarray(0,s).toString("utf8"),bytes:s}}finally{Gg(t)}}function Oo(n,e){let t;try{t=Xg(n,"r")}catch{return}try{let r=vT(t).size,s=Math.min(e,r),i=Buffer.alloc(s),o=Qg(t,i,0,s,r-s);return{text:i.subarray(0,o).toString("utf8"),partial:r>s}}finally{Gg(t)}}function Po(n){if(!wT(n))return[];let e;try{e=ST(n)}catch{return[]}let t=[];for(let r of e){if(!r.endsWith(".jsonl"))continue;let s=xT(n,r);try{let i=kT(s);i.isFile()&&t.push({sessionId:r.slice(0,-6),file:s,mtime:i.mtimeMs})}catch{}}return t}var Co=k(()=>{"use strict"});var Bt,_o=k(()=>{"use strict";Bt=class{ensureHarnessSupport(){}childBriefs=!0;forRead(){return this}}});import{openSync as ET,readSync as AT,closeSync as TT,statSync as ny,readdirSync as ry,readFileSync as sy,existsSync as OT}from"fs";import{join as cn}from"path";import{homedir as PT}from"os";function CT(n){return n.replace(/[^a-zA-Z0-9]/g,"-")}function RT(n,e,t){let r=cn(Eu(n,e),t,_T),s;try{s=ry(r)}catch{return[]}let i=zT(n,t),o=[];for(let a of s){if(!a.endsWith(".jsonl"))continue;let l=cn(r,a),c;try{c=ny(l)}catch{continue}let f=a.slice(0,-6),d={};try{d=JSON.parse(sy(cn(r,`${f}.meta.json`),"utf8"))}catch{}let u=$T(l,c.size,c.mtimeMs);o.push({id:f.startsWith("agent-")?f.slice(6):f,file:l,mtime:c.mtimeMs,started:c.birthtimeMs||void 0,tokens:u.tokens,running:!!u.running&&(i===void 0||c.mtimeMs>=i),label:d.description??"",kind:d.agentType===IT?void 0:d.agentType,model:d.model,spawnId:d.toolUseId,parentId:d.parentAgentId,depth:d.spawnDepth??1,stopped:!!d.stoppedByUser})}return o}function $T(n,e,t){let r=Zg.get(n);if(r&&r.size===e&&r.mtime===t)return{tokens:r.tokens,running:r.running};let s={};for(let i of NT){let o=Oo(n,i);if(!o)break;let a=o.text.split(`
298
- `);o.partial&&a.shift();let l=[];for(let f of a)if(f.trim())try{l.push(JSON.parse(f))}catch{}if(!l.length&&o.partial)continue;let c;for(let f=l.length-1;f>=0&&!c;f--)l[f]?.type==="assistant"&&(c=l[f].message?.usage);s={tokens:c&&(c.input_tokens??0)+(c.output_tokens??0)+(c.cache_read_input_tokens??0)+(c.cache_creation_input_tokens??0),running:iy(l)};break}return Zg.set(n,{size:e,mtime:t,...s}),s}function iy(n){let e;for(let i of n)(i.type==="user"||i.type==="assistant")&&(e=i);if(!e)return!1;if(e.type==="user"){try{let i=e.message?.content,o=typeof i=="string"?i:Array.isArray(i)?i.filter(l=>l&&l.type==="text").map(l=>l.text??"").join(""):"";if(!(Array.isArray(i)&&i.some(l=>l&&l.type==="tool_result"))&&o.trim()&&jt(o)==="")return!1}catch{}return!0}let r=(Array.isArray(e.message?.content)?e.message.content:[]).filter(i=>i.type==="tool_use").map(i=>i.id);if(r.length===0)return!e.message?.stop_reason||e.message.stop_reason==="tool_use";let s=new Set;for(let i of n){let o=i.message?.content;if(Array.isArray(o))for(let a of o)a.type==="tool_result"&&a.tool_use_id&&s.add(a.tool_use_id)}return r.some(i=>i&&!s.has(i))}function Io(n){let e=n?.type==="image"?n.source:void 0;return e?.type==="base64"&&e.data?To(e.data,e.media_type):""}function Au(n){return typeof n=="string"?Te(n):Array.isArray(n)?n.map(e=>{if(typeof e=="string")return Te(e);let t=e;return typeof t?.text=="string"?Te(t.text):t?.content!=null?Au(t.content):Io(t)}).join(`
298
+ `);o.partial&&a.shift();let l=[];for(let f of a)if(f.trim())try{l.push(JSON.parse(f))}catch{}if(!l.length&&o.partial)continue;let c;for(let f=l.length-1;f>=0&&!c;f--)l[f]?.type==="assistant"&&(c=l[f].message?.usage);if(s={tokens:c?(c.input_tokens??0)+(c.output_tokens??0)+(c.cache_read_input_tokens??0)+(c.cache_creation_input_tokens??0):r?.tokens,running:iy(l)},!(s.tokens===void 0&&o.partial))break}return Zg.set(n,{size:e,mtime:t,...s}),s}function iy(n){let e;for(let i of n)(i.type==="user"||i.type==="assistant")&&(e=i);if(!e)return!1;if(e.type==="user"){try{let i=e.message?.content,o=typeof i=="string"?i:Array.isArray(i)?i.filter(l=>l&&l.type==="text").map(l=>l.text??"").join(""):"";if(!(Array.isArray(i)&&i.some(l=>l&&l.type==="tool_result"))&&o.trim()&&jt(o)==="")return!1}catch{}return!0}let r=(Array.isArray(e.message?.content)?e.message.content:[]).filter(i=>i.type==="tool_use").map(i=>i.id);if(r.length===0)return!e.message?.stop_reason||e.message.stop_reason==="tool_use";let s=new Set;for(let i of n){let o=i.message?.content;if(Array.isArray(o))for(let a of o)a.type==="tool_result"&&a.tool_use_id&&s.add(a.tool_use_id)}return r.some(i=>i&&!s.has(i))}function Io(n){let e=n?.type==="image"?n.source:void 0;return e?.type==="base64"&&e.data?To(e.data,e.media_type):""}function Au(n){return typeof n=="string"?Te(n):Array.isArray(n)?n.map(e=>{if(typeof e=="string")return Te(e);let t=e;return typeof t?.text=="string"?Te(t.text):t?.content!=null?Au(t.content):Io(t)}).join(`
299
299
  `):n==null?"":Te(JSON.stringify(n))}function LT(n){let e=n.trim();return!!e&&oy.some(t=>t.test(e))}function MT(n){let e=n.trim();return e?oy.some(t=>{let r=t.exec(e);return!!r&&r.index===0}):!0}function BT(n){return n.replace(DT,"")}function jT(n){let e=/^<command-name>([\s\S]*?)<\/command-name>/.exec(n)?.[1]?.trim();if(!e)return;let t=/<command-args>([\s\S]*?)<\/command-args>/.exec(n)?.[1]?.trim();return t?`${e} ${t}`:e}function jt(n){let e=BT(n).trim();return e?jT(e)??(LT(e)?"":e):""}function No(n){let e=FT.exec(n.trim());if(e)return{from:e[1],body:qT(e[2].replace(UT,""))}}function qT(n){let e=n.split(`
300
300
  `).filter(r=>r.trim()).map(r=>r.length-r.trimStart().length),t=e.length?Math.min(...e):0;return t?n.split(`
301
301
  `).map(r=>r.slice(t)).join(`
@@ -314,7 +314,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
314
314
  `))if(t.trim())try{let r=JSON.parse(t);if(r.type==="turn_context"&&typeof r.payload?.model=="string")return r.payload.model}catch{}}var QT,ws,_u,nO,iO,oO,aO,lO,hO,bO,Mo,dy,Qn,vO,Ru=k(()=>{"use strict";ys();_o();Co();QT=["<permissions instructions>","<apps_instructions>","<plugins_instructions>","<skills_instructions>","<recommended_plugins>","<environment_context>","<node_repl_review_evidence>","# AGENTS.md instructions for "];ws=n=>!!n&&typeof n=="object"&&!Array.isArray(n),_u=n=>n==="shell_command"||n==="exec_command",nO=new Set(["max_output_tokens","yield_time_ms","timeout_ms"]);iO=/^(Get-Content|gc|cat|type|nl|bat|sed|head|tail)$/i,oO=/^-(Path|LiteralPath)$/i,aO=/^-(Encoding|TotalCount|Head|Tail|ReadCount|Delimiter)$/i,lO=/^(sed -n|head|tail|Select-Object|select)(\s|$)/i;hO={n:`
315
315
  `,t:" ",r:"\r",b:"\b",f:"\f",v:"\v",0:"\0"};bO=n=>n?n.replace(/\r?\n$/,"").split(`
316
316
  `).length:0;Mo=n=>{let e=XT(n);return process.platform==="win32"?e.toLowerCase():e},dy=12e4,Qn=class n extends Bt{constructor(t=Cu(ly(),".codex","sessions")){super();this.root=t}displayName="Codex Mirror";childBriefs=!1;#t=0;#l;#n=!1;#i;#h=0;#s=new Map;#d=new Map;#o=new Map;#c=new Map;detectsSelf(){return!!process.env.CODEX_THREAD_ID}forRead(){return new n(this.root)}callerSessionId(t){let r=process.env.CODEX_THREAD_ID;return r?this.listSessionFiles(t).find(s=>s.sessionId.endsWith(r))?.sessionId:void 0}detectsInstalled(){return GT(Cu(ly(),".codex"))}sessionsDir(t){return this.root}listSessionFiles(t){let r=Mo(t),s=[];for(let i of this.#u()){let o=0,a=0;try{let f=Lo(i);if(!f.isFile())continue;o=f.size,a=f.mtimeMs}catch{continue}let l=this.#s.get(i);if(l===void 0){if(l=fy(i),l===void 0)continue;this.#s.set(i,l)}if(l.subagent||Mo(l.cwd)!==r)continue;let c=ay(i,".jsonl");this.#o.set(c,i),s.push({sessionId:c,file:i,mtime:this.#e(i,o,a)})}return s}listChildren(t,r){let s=Mo(t),i=new Map,o,a;for(let f of this.#u()){let d=0,u=0,p;try{let v=Lo(f);if(!v.isFile())continue;d=v.size,u=v.mtimeMs,p=v.birthtimeMs||void 0}catch{continue}let m=this.#s.get(f);if(m===void 0){if(m=fy(f),m===void 0)continue;this.#s.set(f,m)}if(ay(f,".jsonl")===r&&(o=m.id,a=m.model),!m.spawn||Mo(m.cwd)!==s)continue;let{running:h,tokens:y}=this.#r(f,d,u);i.set(m.spawn.id,{file:f,mtime:this.#e(f,d,u),started:p,running:h,tokens:y,spawn:m.spawn,model:m.model})}if(!o)return[];let l=(f,d=new Set)=>{if(f.parent===o)return!0;if(d.has(f.id))return!1;d.add(f.id);let u=i.get(f.parent);return u?l(u.spawn,d):!1},c=[];for(let{file:f,mtime:d,started:u,running:p,tokens:m,spawn:h,model:y}of i.values())l(h)&&c.push({id:h.id,file:f,mtime:d,started:u,tokens:m,label:h.path.split("/").filter(Boolean).pop()??h.path,kind:h.role||void 0,model:y&&y!==a?y:void 0,parentId:i.has(h.parent)?h.parent:void 0,depth:h.depth,stopped:!1,running:p});return c}sessionsWorking(t){let r=new Set,s=Date.now();for(let{sessionId:i,file:o,mtime:a}of this.listSessionFiles(t)){if(s-a>=dy)continue;let l;try{let c=Lo(o);l=this.#r(o,c.size,c.mtimeMs)}catch{continue}l.running&&r.add(i)}return r}#e(t,r,s){return Math.max(s,this.#r(t,r,s).ms??0)}#r(t,r,s){let i=this.#d.get(t);if(i&&i.size===r&&i.mtime===s)return i;let o={size:r,mtime:s,...SO(t)};return this.#d.set(t,o),o}#u(){let t=[],r=s=>{try{return VT(s).map(i=>Cu(s,i))}catch{return[]}};for(let s of r(this.root))for(let i of r(s))for(let o of r(i))for(let a of r(o))a.endsWith(".jsonl")&&t.push(a);return t}parseEntry(t){let r;try{r=JSON.parse(t)}catch{return null}return!r||typeof r.type!="string"?null:r}idOf(t){return t.ord===void 0&&(this.#a(t),t.ord=String(this.#t++),t.parent=this.#l,this.#l=t.ord),t.ord}#a(t){let r=t.payload;if(t.type==="session_meta"){if(++this.#h===1){let s=typeof r?.source=="object"?r.source?.subagent?.thread_spawn:void 0;this.#i=s?.agent_path,this.#n=!!s}}else this.#h=0,this.#n&&r?.type==="agent_message"&&r.recipient===this.#i&&(this.#n=!1);t.inherited=this.#n}parentOf(t){return t.parent}timestampOf(t){return t.timestamp}isSidechain(t,r){return r==="child"&&!!t.inherited}isLeafType(t){return!0}isRecoveryNoise(t){return!1}apply(t,r){let s=[],i=t.payload;if(!i)return{events:s};let o=()=>{let a=Date.parse(t.timestamp??"");return!isNaN(a)&&a>=r};if(t.type==="response_item"){if(i.type==="message"){if(i.role==="user"){let a=Xn(i.content,!0).trim();a&&s.push({type:"user",text:a})}else if(i.role==="assistant"){let a=Xn(i.content,!1);a&&s.push({type:"assistant",text:a,thinking:"",tools:[],live:o()})}return{events:s}}if(i.type==="reasoning"){let a=Xn(i.summary,!1);return a&&s.push({type:"assistant",text:"",thinking:a,tools:[],live:o()}),{events:s}}if(i.type==="custom_tool_call"||i.type==="function_call"){let a=i.call_id??"",{pending:l,...c}=i.type==="custom_tool_call"?tO(i.name??"",i.input):{name:i.name??"",input:wO(i.arguments)};return l&&this.#c.set(a,l),s.push({type:"assistant",text:"",thinking:"",tools:[{id:a,...c}],live:o()}),{events:s}}if(i.type==="custom_tool_call_output"||i.type==="function_call_output"){let a=i.call_id??"",l=this.#c.get(a);return this.#c.delete(a),s.push({type:"tool_result",id:a,...gO(eO(i.output),l)}),{events:s}}return{events:s}}if(t.type==="event_msg"){if(i.type==="token_count"){let a=i.info?.last_token_usage;return a?{events:s,usage:gy(a)}:{events:s}}return{events:s}}return t.type==="turn_context"?{events:s,model:i.model}:{events:s}}chainWorking(t){let r=!1;for(let s of t){if(s.type!=="event_msg")continue;let i=s.payload?.type;i==="task_started"?r=!0:(i==="task_complete"||i==="turn_aborted")&&(r=!1)}return r}sessionAlive(t){let r=this.#o.get(t);if(!r)return;let s;try{let i=Lo(r);s=this.#e(r,i.size,i.mtimeMs)}catch{return}return Date.now()-s<dy}readPreview(t){for(let r of(xu(t,256*1024)?.text??"").split(`
317
- `))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Xn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.7"});var Py={};wi(Py,{agentViewerCommand:()=>By,bulbServerCommand:()=>Dy,clearServerLog:()=>Bu,findProjectViewer:()=>zo,isAlive:()=>er,isMirror:()=>ye,isProjectBulb:()=>Ju,isProjectMirror:()=>rr,launchAgentViewer:()=>Hu,launchBulbServer:()=>xs,listBulbServers:()=>Z,probePageCount:()=>Ku,readServerLog:()=>Ve,readWaitCursor:()=>Ho,recordDenial:()=>qu,registerServer:()=>Uu,relayOpen:()=>Wu,runMarker:()=>ju,serverLogPath:()=>nr,serversForBulb:()=>hn,sliceRunLog:()=>Fu,startServerLog:()=>ks,stopBulbServer:()=>tr,stopServer:()=>Ft,stopServersForBulb:()=>Yo,typebulbBinPath:()=>sr,unregisterServer:()=>pn,writeWaitCursor:()=>Ss});import{spawn as Cy}from"child_process";import{readdir as DO,readFile as Iy,writeFile as Ny,unlink as $u,mkdir as BO}from"fs/promises";import{mkdirSync as $y,writeFileSync as Ko,appendFileSync as jO,readFileSync as Lu}from"fs";import*as Oe from"path";import{fileURLToPath as FO}from"url";function Mu(n){return Oe.join(ht(),`${n}.json`)}function nr(n){return Oe.join(ht(),`${n}.log`)}function Du(n){return Oe.join(ht(),`${n}.wait.json`)}function Ly(n){try{let e=JSON.parse(Lu(Du(n),"utf8"));return e.cursors&&typeof e.cursors=="object"?e.cursors:{}}catch{return{}}}function Ho(n,e=""){let t=Ly(n)[e];return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Ss(n,e,t=""){try{$y(ht(),{recursive:!0});let r=Ly(n);r[t]=e,Ko(Du(n),JSON.stringify({cursors:r}))}catch{}}function ks(n){let e=nr(n);try{$y(ht(),{recursive:!0}),Ko(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),r=process.stderr.write.bind(process.stderr),s=0,i=!1,o=a=>{if(!i)try{let l=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(jO(e,l),s+=l.length,s>2*_y){let c=Lu(e),f=c.subarray(Math.max(0,c.length-_y));Ko(e,f),s=f.length}}catch{i=!0}};return process.stdout.write=((a,...l)=>(o(a),t(a,...l))),process.stderr.write=((a,...l)=>(o(a),r(a,...l))),()=>{process.stdout.write=t,process.stderr.write=r}}function Bu(n){try{Ko(nr(n),"")}catch{}}function Ve(n,e=0){try{let t=Lu(nr(n)),r=e>=0&&e<=t.length?e:0;return{text:t.subarray(r).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function ju(n){return`\u2500\u2500 run ${n} \u2500\u2500 ${new Date().toTimeString().slice(0,8)}`}function qO(n){let e=UO.exec(n);return e?Number(e[1]):void 0}function Fu(n,e){let t=n.split(`
317
+ `))if(!(!r.includes('"user_message"')&&!r.includes('"UserMessage"')))try{let s=JSON.parse(r);if(s?.type!=="event_msg")continue;let i=s.payload,a=((i?.type==="user_message"?i.message:i?.type==="item_completed"&&i.item?.type==="UserMessage"?Xn(i.item.content,!0):void 0)??"").replace(/\s+/g," ").trim();if(a)return a.slice(0,200)}catch{}return""}searchText(t){if(t?.type!=="response_item"||t.payload?.type!=="message")return"";let r=t.payload.role;return r!=="user"&&r!=="assistant"?"":Xn(t.payload.content,r==="user").replace(/\s+/g," ").trim()}},vO=[64*1024,1024*1024]});import{realpathSync as EO}from"fs";import{createHash as AO}from"crypto";import{join as Bo,resolve as TO}from"path";import{homedir as OO}from"os";function ze(){let n=process.env.TYPEBULB_SERVERS_DIR;return n?Bo(n,".."):Bo(OO(),".typebulb")}function pt(){yy||(yy=!0,console.error(`${ze()} not writable \u2014 continuing stateless: ports won't stick, caches stay cold, and typebulb logs/wait/send/stop may not see this run`))}function ht(){return process.env.TYPEBULB_SERVERS_DIR||Bo(ze(),"servers")}function by(n){let e=re(n),t=e.slice(e.lastIndexOf("/")+1).replace(/\.bulb\.md$/,"");return Bo(ze(),"canvas",`${t}-${vs(n)}.png`)}function vs(n){return AO("sha1").update(re(n)).digest("hex").slice(0,8)}function re(n){let e=TO(n),t=e;try{t=EO.native(e)}catch{}return(process.platform==="win32"?t.toLowerCase():t).replace(/\\/g,"/")}function wy(n,e){let t=re(n),r=re(e);return t.startsWith(r.endsWith("/")?r:r+"/")?!t.includes("/node_modules/"):!1}var yy,Ye=k(()=>{"use strict";yy=!1});import*as ky from"net";import{mkdir as PO,readFile as CO,writeFile as xy}from"fs/promises";import{existsSync as _O}from"fs";import{join as Ey}from"path";function Oy(){return Ey(ze(),"blocks")}function Iu(n){return Ey(Oy(),`${n}.json`)}function Fo(n){return new Promise(e=>{let t=ky.createServer();t.once("error",()=>e(!1)),t.listen(n,"127.0.0.1",()=>t.close(()=>e(!0)))})}async function $O(n){for(let e=n;e<65535;e++)if(await Fo(e))return e;throw new Error(`No free port found above ${n}`)}async function Nu(n){let{listBulbServers:e}=await Promise.resolve().then(()=>($e(),Py)),t=(await e()).find(s=>s.port===n),r=t?` (pid ${t.pid}, ${t.agent?`agent:${t.agent}`:t.file})`:"";console.error(`port ${n} in use${r}`),process.exit(1)}async function Uo(n){try{let e=JSON.parse(await CO(Iu(n),"utf8"));return e&&typeof e.cwd=="string"?{cwd:e.cwd,slots:e.slots??{},mirrors:e.mirrors??{}}:void 0}catch{return}}async function qo(n,e){try{return await xy(Iu(n),JSON.stringify(e,null,2)),!0}catch{return pt(),!1}}async function LO(n){let e=re(n);try{await PO(Oy(),{recursive:!0})}catch{return}let t=[];for(let o=0;o<Ty;o++)t.push(Ay+o*un);let r=await Promise.all(t.map(async o=>({base:o,block:await Uo(o)})));for(let{base:o,block:a}of r)if(a?.cwd===e)return o;let s={cwd:e,slots:{},mirrors:{}};for(let{base:o,block:a}of r){if(!a)try{return await xy(Iu(o),JSON.stringify(s,null,2),{flag:"wx"}),o}catch(l){if((await Uo(o))?.cwd===e)return o;l.code!=="EEXIST"&&pt();continue}if(!_O(a.cwd))return await qo(o,s)?o:void 0}let i=r.filter(o=>!!o.block).sort((o,a)=>vy(o.block)-vy(a.block))[0];if(i)return await qo(i.base,s)?i.base:void 0}function vy(n){return Object.values(n.slots).reduce((e,t)=>Math.max(e,t.usedAt??0),0)}async function MO(n,e){let t=await Uo(n)??{cwd:"",slots:{},mirrors:{}};if(e.kind==="mirror"){let i=t.mirrors[e.agent];if(i!==void 0)return i;let o=Sy(t),a=o.has(0)?IO:0;for(;a>jo&&o.has(a);)a--;return t.mirrors[e.agent]=a,await qo(n,t),a}let r=re(e.file),s=t.slots[r]?.offset;if(s===void 0){let i=Sy(t);for(s=jo;s<un&&i.has(s);)s++;if(s>=un){let o=Object.entries(t.slots).sort((a,l)=>(a[1].usedAt??0)-(l[1].usedAt??0))[0];s=o?o[1].offset:jo,o&&delete t.slots[o[0]]}}return t.slots[r]={offset:s,usedAt:Date.now()},await qo(n,t),s}function Sy(n){return new Set([...Object.values(n.mirrors),...Object.values(n.slots).map(e=>e.offset)])}async function Zn(n,e){let t=await LO(e);return t===void 0?void 0:t+await MO(t,n)}async function dn(n){let e=re(n);for(let t=0;t<Ty;t++){let r=await Uo(Ay+t*un);if(r?.cwd===e)return s=>r.slots[re(s)]?.usedAt??0}return()=>0}async function Jo(n){if(n.explicit!==void 0)return await Fo(n.explicit)||await Nu(n.explicit),n.target.kind==="bulb"&&await Zn(n.target,n.cwd),{port:n.explicit};let e=await Zn(n.target,n.cwd);if(e!==void 0){let r=e-e%un,s=Date.now()+NO;do{if(await Fo(e))return{port:e};await new Promise(i=>setTimeout(i,150))}while(Date.now()<s);for(let i=jo;i<un;i++){let o=r+i;if(o!==e&&await Fo(o))return{port:o,note:`(slot ${e} was busy)`}}}return{port:await $O(RO),note:e===void 0?"(no port block available)":"(this project's block was full)"}}var Ay,un,Ty,RO,jo,IO,NO,fn=k(()=>{"use strict";Ye();Ay=20100,un=100,Ty=19,RO=23e3,jo=1,IO=un-1,NO=3e3});var Le,Wo=k(()=>{"use strict";Le="0.61.9"});var Py={};wi(Py,{agentViewerCommand:()=>By,bulbServerCommand:()=>Dy,clearServerLog:()=>Bu,findProjectViewer:()=>zo,isAlive:()=>er,isMirror:()=>ye,isProjectBulb:()=>Ju,isProjectMirror:()=>rr,launchAgentViewer:()=>Hu,launchBulbServer:()=>xs,listBulbServers:()=>Z,probePageCount:()=>Ku,readServerLog:()=>Ve,readWaitCursor:()=>Ho,recordDenial:()=>qu,registerServer:()=>Uu,relayOpen:()=>Wu,runMarker:()=>ju,serverLogPath:()=>nr,serversForBulb:()=>hn,sliceRunLog:()=>Fu,startServerLog:()=>ks,stopBulbServer:()=>tr,stopServer:()=>Ft,stopServersForBulb:()=>Yo,typebulbBinPath:()=>sr,unregisterServer:()=>pn,writeWaitCursor:()=>Ss});import{spawn as Cy}from"child_process";import{readdir as DO,readFile as Iy,writeFile as Ny,unlink as $u,mkdir as BO}from"fs/promises";import{mkdirSync as $y,writeFileSync as Ko,appendFileSync as jO,readFileSync as Lu}from"fs";import*as Oe from"path";import{fileURLToPath as FO}from"url";function Mu(n){return Oe.join(ht(),`${n}.json`)}function nr(n){return Oe.join(ht(),`${n}.log`)}function Du(n){return Oe.join(ht(),`${n}.wait.json`)}function Ly(n){try{let e=JSON.parse(Lu(Du(n),"utf8"));return e.cursors&&typeof e.cursors=="object"?e.cursors:{}}catch{return{}}}function Ho(n,e=""){let t=Ly(n)[e];return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Ss(n,e,t=""){try{$y(ht(),{recursive:!0});let r=Ly(n);r[t]=e,Ko(Du(n),JSON.stringify({cursors:r}))}catch{}}function ks(n){let e=nr(n);try{$y(ht(),{recursive:!0}),Ko(e,"")}catch{return()=>{}}let t=process.stdout.write.bind(process.stdout),r=process.stderr.write.bind(process.stderr),s=0,i=!1,o=a=>{if(!i)try{let l=typeof a=="string"?Buffer.from(a,"utf8"):Buffer.from(a);if(jO(e,l),s+=l.length,s>2*_y){let c=Lu(e),f=c.subarray(Math.max(0,c.length-_y));Ko(e,f),s=f.length}}catch{i=!0}};return process.stdout.write=((a,...l)=>(o(a),t(a,...l))),process.stderr.write=((a,...l)=>(o(a),r(a,...l))),()=>{process.stdout.write=t,process.stderr.write=r}}function Bu(n){try{Ko(nr(n),"")}catch{}}function Ve(n,e=0){try{let t=Lu(nr(n)),r=e>=0&&e<=t.length?e:0;return{text:t.subarray(r).toString("utf8"),offset:t.length}}catch{return{text:"",offset:0}}}function ju(n){return`\u2500\u2500 run ${n} \u2500\u2500 ${new Date().toTimeString().slice(0,8)}`}function qO(n){let e=UO.exec(n);return e?Number(e[1]):void 0}function Fu(n,e){let t=n.split(`
318
318
  `),r=[];if(t.forEach((o,a)=>{let l=qO(o);l!==void 0&&r.push({id:l,idx:a})}),!r.length)return e==="latest"?n:"";let s=e==="latest"?r[r.length-1]:r.find(o=>o.id===e);if(!s)return"";let i=r.find(o=>o.idx>s.idx);return t.slice(s.idx,i?i.idx:t.length).join(`
319
319
  `)}function er(n){try{return process.kill(n,0),!0}catch(e){return e.code==="EPERM"}}async function Uu(n){try{await BO(ht(),{recursive:!0}),await Ny(Mu(n.pid),JSON.stringify({version:Le,...n}))}catch{pt()}}async function qu(n,e){let t=Mu(n);try{let r=JSON.parse(await Iy(t,"utf8"));if(r.denied===e)return;r.denied=e,await Ny(t,JSON.stringify(r))}catch{}}async function pn(n){await $u(Mu(n)).catch(()=>{}),await $u(nr(n)).catch(()=>{}),await $u(Du(n)).catch(()=>{})}function ye(n){return n.agent!=null}function rr(n,e){return ye(n)&&n.cwd!=null&&re(n.cwd)===re(e)}function Ju(n,e){return!ye(n)&&wy(n.file,e)}async function Z(n){let e;try{e=await DO(ht())}catch{return[]}let t=[];return await Promise.all(e.map(async s=>{if(!/^\d+\.json$/.test(s))return;let i=parseInt(s,10),o;try{o=JSON.parse(await Iy(Oe.join(ht(),s),"utf8"))}catch{await pn(i);return}o&&typeof o.pid=="number"&&er(o.pid)?t.push(o):await pn(i)})),(n?t.filter(s=>Ju(s,n)):t).sort((s,i)=>s.startedAt-i.startedAt)}async function zo(n,e){return(await Z()).find(t=>rr(t,n)&&(e?t.agent===e:!0))}async function Wu(n,e){let t=new URL(n).port,r=(await Z()).filter(a=>String(a.port)!==t),s=r.filter(a=>rr(a,e)),i=r.filter(a=>Ju(a,e)),o=0;for(let a of[...s,...i])try{let l=await fetch(`${a.url}/__open`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:n}),signal:AbortSignal.timeout(2e3)});if(!l.ok)continue;let{opened:c,pages:f}=await l.json();if(c)return{where:"editor",via:a.agent?"the agent mirror":`${Oe.basename(a.file)}'s page`};ye(a)&&(o+=f??0)}catch{}return o>0?{where:"external"}:void 0}async function tr(n){try{process.kill(n,"SIGTERM")}catch{}await pn(n)}async function Ku(n){try{let e=await fetch(`${n.url}/__pages`,{signal:AbortSignal.timeout(JO)});if(!e.ok)return;let{pages:t}=await e.json();return typeof t=="number"?t:void 0}catch{return}}async function Ft(n,e=ye(n)?"keep":"close"){try{let t=await fetch(`${n.url}/__stop`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pages:e}),signal:AbortSignal.timeout(Ry)});if(!t.ok)throw new Error(`/__stop ${t.status}`);let{closed:r=0,stuck:s=0}=await t.json(),i=Date.now()+Ry;for(;er(n.pid)&&Date.now()<i;)await My(100);return er(n.pid)?(await tr(n.pid),"killed"):(await pn(n.pid),{closed:r,stuck:s})}catch{return await tr(n.pid),"killed"}}function hn(n,e){let t=re(e);return n.filter(r=>!ye(r)&&r.pid!==process.pid&&re(r.file)===t)}async function Yo(n,e){let t=hn(await Z(),n);for(let r of t)await Ft(r,e!==void 0&&r.port===e?"keep":"close");return t}function WO(n,e,t){(process.platform==="win32"?Cy("cmd",["/c","start","","/b",n,...e],{cwd:t,stdio:"ignore",windowsHide:!0}):Cy(n,e,{cwd:t,detached:!0,stdio:"ignore"})).unref()}function sr(){return Oe.join(Oe.dirname(FO(import.meta.url)),"index.js")}function Dy(n,e={}){return{command:process.execPath,args:[sr(),...e.trust?["--trust"]:[],...e.mode?["--mode",e.mode]:[],n,...e.open===!1?["--no-open"]:[]]}}function By(n){return{command:process.execPath,args:[sr(),`agent:${n}`,"--no-open"]}}async function jy(n,e,t,r){let s=await n();if(s)return s;WO(e.command,e.args,t);let i=Date.now()+2e4;for(;Date.now()<i;){await My(150);let o=await n();if(o)return o}throw new Error(`Launched ${r} but it did not register within 20s.`)}async function xs(n,e={}){let t=e.cwd??process.cwd(),r=Oe.resolve(t,n),s=await Zn({kind:"bulb",file:r},t),[i]=await Yo(r,s),o={...e,mode:e.mode??i?.mode};return jy(async()=>hn(await Z(),r)[0],Dy(n,o),t,Oe.basename(n))}async function Hu(n,e=process.cwd()){return jy(()=>zo(e,n),By(n),e,`the ${n} mirror`)}var _y,UO,Ry,JO,My,$e=k(()=>{"use strict";Ye();fn();Wo();_y=1e6;UO=/^── run (\d+) ── /;Ry=6e3,JO=500;My=n=>new Promise(e=>setTimeout(e,n))});function ir(n){return{...xp(n),server:n.files.get("server.ts")??""}}function Vo(n){return!!n.server&&!n.code}var Es=k(()=>{"use strict";ee();ee()});function Go(n){let e=/^---[^\n]*\n([\s\S]*?)\n---/.exec(n),t=e?/^\s*name:\s*(.+?)\s*$/m.exec(e[1]):null;return t?t[1].replace(/^["']|["']$/g,""):void 0}function zu(n){return Yn(Go(n)??"bulb")||"bulb"}var Yu=k(()=>{"use strict";ee()});import{readdirSync as KO,readFileSync as HO,statSync as zO}from"fs";import{join as Fy,basename as YO}from"path";function qy(n,e,t){if(e>8)return t;let r;try{r=KO(n,{withFileTypes:!0})}catch{return t}for(let s of r)if(s.isDirectory()){if(s.name.startsWith(".")||s.name==="node_modules")continue;qy(Fy(n,s.name),e+1,t)}else s.isFile()&&s.name.endsWith(".bulb.md")&&t.push(Fy(n,s.name));return t}function VO(n,e){let t,r=!1;try{let s=HO(n,"utf8");t=Go(s.slice(0,1024));let i=We(s);r=!!i&&Vo(ir(i))}catch{}return{mtime:e,name:t??YO(n).replace(/\.bulb\.md$/,""),serverOnly:r}}function Xo(n){let e=new Map,t=qy(n,0,[]).map(r=>{let s=0;try{s=zO(r).mtimeMs}catch{}let i=s?Uy.get(r):void 0,o=i?.mtime===s?i:VO(r,s);return s&&e.set(r,o),{path:r,...o}});return Uy=e,t}var Uy,Jy=k(()=>{"use strict";ee();Es();Yu();Uy=new Map});function or(n){if(n.server.trim())return"server-side code (server.ts)";let e=n.code;if(/\btb\s*\.\s*fs\b/.test(e)||e.includes("/__fs"))return"the filesystem";if(/\btb\s*\.\s*ai\b/.test(e)||e.includes("/__ai")||n.infer.trim()||/\btb\s*\.\s*infer\b/.test(e))return"AI (your API keys)";if(/\btb\s*\.\s*server\s*\.\s*\w/.test(e)||e.includes("/__api"))return"server-side code (server.ts)"}var Qo=k(()=>{"use strict"});import{readFile as GO}from"fs/promises";async function Vu(n){try{let e=We(await GO(n,"utf-8"));return e?or(ir(e)):void 0}catch{return}}var Wy=k(()=>{"use strict";Es();Qo()});function Gu(n){let e=n.split(""),t=(i,o)=>{for(let a=i;a<o&&a<e.length;a++)e[a]!==`
320
320
  `&&(e[a]=" ")},r=0,s="";for(;r<n.length;){let i=n[r],o=n[r+1];if(i==="/"&&o==="/"){let a=r;for(;a<n.length&&n[a]!==`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typebulb",
3
- "version": "0.61.7",
3
+ "version": "0.61.9",
4
4
  "description": "Typebulb CLI to run single-file markdown apps called bulbs, either as standalone web apps or embedded in agent responses.",
5
5
  "keywords": [
6
6
  "bulb",