broods 0.43.1 → 0.43.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.
@@ -0,0 +1,19 @@
1
+ import{convertToModelMessages as et,generateId as rt,getToolName as H,isToolUIPart as x,readUIMessageStream as st}from"ai";var K=String.fromCharCode(27);new RegExp(`${K}\\[[0-?]*[ -/]*[@-~]`,"g");var w=new RegExp(`^${K}\\[[0-?]*[ -/]*[@-~]`);function h(t){let e=0,r=0;while(r<t.length){let s=t.slice(r).match(w);if(s){r+=s[0].length;continue}let n=t.codePointAt(r);if(n==null)break;let i=String.fromCodePoint(n);e+=j(n),r+=i.length}return e}function g(t,e){if(e<=0)return"";let r="",s=0,n=0;while(n<t.length&&s<e){let i=t.slice(n).match(w);if(i){r+=i[0],n+=i[0].length;continue}let o=t.codePointAt(n);if(o==null)break;let u=String.fromCodePoint(o),l=j(o);if(l>0&&s+l>e)break;r+=u,n+=u.length,s+=l}while(n<t.length){let i=t.slice(n).match(w);if(!i)break;r+=i[0],n+=i[0].length}return r}function j(t){if(t===9)return 4;if(t<32||t>=127&&t<160)return 0;if(nt(t))return 0;return at(t)?2:1}function nt(t){return t>=768&&t<=879||t>=1155&&t<=1161||t>=1425&&t<=1469||t===1471||t>=1473&&t<=1474||t>=1476&&t<=1477||t===1479||t>=1552&&t<=1562||t>=1611&&t<=1631||t===1648||t>=1750&&t<=1756||t>=1759&&t<=1764||t>=1767&&t<=1768||t>=1770&&t<=1773||t===1809||t>=1840&&t<=1866||t>=1958&&t<=1968||t>=2027&&t<=2035||t>=2070&&t<=2073||t>=2075&&t<=2083||t>=2085&&t<=2087||t>=2089&&t<=2093||t>=2137&&t<=2139||t>=2259&&t<=2306||t===2362||t===2364||t>=2369&&t<=2376||t===2381||t>=2385&&t<=2391||t===8205||t>=65024&&t<=65039||t>=917760&&t<=917999}function at(t){return t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=128591||t>=129280&&t<=129535||t>=131072&&t<=262141)}function m(t,{multiline:e=!1}={}){let r="";for(let s of t){let n=s.charCodeAt(0);if(s===`
2
+ `&&e)r+=`
3
+ `;else if(s==="\t")r+=" ";else if(n<32||n>=127&&n<=159)r+=`\\u${n.toString(16).padStart(4,"0")}`;else r+=s}return r}var d={bold:"\x1B[1m",boldOff:"\x1B[22m",italic:"\x1B[3m",italicOff:"\x1B[23m"},it="─";function ot(t){let e=m(t,{multiline:!0}).split(`
4
+ `),r=[];for(let s=0;s<e.length;s+=1){let n=ut(e,s);if(n!=null){r.push(...pt(n)),s=n.endIndex-1;continue}r.push(lt(e[s]??""))}return r.join(`
5
+ `)}function lt(t){if(t.startsWith("### "))return p(`▶ ${t.slice(4)}`);if(t.startsWith("## "))return p(`■ ${t.slice(3)}`);if(t.startsWith("# "))return p(`█ ${t.slice(2)}`);let e=t.match(/^(\s*)[-+*]\s+(.*)$/);if(e){let[,r,s=""]=e;return p(`${r}•${s.length>0?` ${s}`:""}`)}if(/^\d+\. /.test(t))return p(t.replace(/^(\d+)\. /,"$1. "));if(t.startsWith("> "))return p(`│ ${t.slice(2)}`);return p(t)}function p(t){return t.replace(/`([^`]+)`/g,"$1").replace(/\*\*([^*\n]+)\*\*/g,`${d.bold}$1${d.boldOff}`).replace(/__([^_\n]+)__/g,`${d.bold}$1${d.boldOff}`).replace(/\*([^*\n]+)\*/g,`${d.italic}$1${d.italicOff}`).replace(/_([^_\n]+)_/g,`${d.italic}$1${d.italicOff}`)}function ut(t,e){let r=T(t[e]??"");if(r==null||r.length<2)return;let s=T(t[e+1]??"");if(s==null||s.length!==r.length)return;let n=ct(s);if(n==null)return;let i=[],o=e+2;while(o<t.length){let u=T(t[o]??"");if(u==null)break;i.push(dt(u,r.length)),o+=1}return{alignments:n,endIndex:o,header:r,rows:i}}function T(t){if(!t.includes("|"))return;let e=t.trim();if(e.startsWith("|"))e=e.slice(1);if(e.endsWith("|")&&!e.endsWith("\\|"))e=e.slice(0,-1);let r=[],s="";for(let n=0;n<e.length;n+=1){let i=e[n],o=e[n+1];if(i==="\\"&&o==="|"){s+="|",n+=1;continue}if(i==="|"){r.push(s.trim()),s="";continue}s+=i}return r.push(s.trim()),r}function ct(t){let e=[];for(let r of t){let s=r.match(/^(:)?-{3,}(:)?$/);if(s==null)return;let[,n,i]=s;e.push(n!=null&&i!=null?"center":i!=null?"right":"left")}return e}function dt(t,e){return Array.from({length:e},(r,s)=>t[s]??"")}function pt(t){let e=t.header.map((i)=>`${d.bold}${p(i)}${d.boldOff}`),r=t.rows.map((i)=>i.map(p)),s=[e,...r],n=t.alignments.map((i,o)=>Math.max(3,...s.map((u)=>h(u[o]??""))));return[R(e,n,t.alignments),n.map((i)=>it.repeat(i)).join(" "),...r.map((i)=>R(i,n,t.alignments))]}function R(t,e,r){return t.map((s,n)=>ht(s,e[n]??0,r[n]??"left")).join(" ")}function ht(t,e,r){let s=Math.max(0,e-h(t));if(r==="right")return`${" ".repeat(s)}${t}`;if(r==="center"){let n=Math.floor(s/2),i=s-n;return`${" ".repeat(n)}${t}${" ".repeat(i)}`}return`${t}${" ".repeat(s)}`}var J="─";function ft(t){let e=Math.max(20,t.width),r=Math.max(8,t.height)-3-2,s=t.visibleBodyLines.slice(0,r);while(s.length<r)s.push("");return[A(e,t.title,t.rightTitle),...s.map((n)=>U(n,e)),B(e),A(e,t.inputActive?"Input":"Status"),U(t.inputActive?`> ${m(t.input)}${t.inputCursorVisible===!1?" ":"█"}`:m(t.status??"Streaming... ↑/↓ scroll · Ctrl+C quit"),e),B(e)].join(`
6
+ `)}function A(t,e,r){e=m(e),r=r==null?void 0:m(r);let s=Math.max(0,t-2),n=e?g(` ${e} `,s):"",i=r?g(` ${r} `,Math.max(0,s-h(n))):"",o=Math.max(0,s-h(n)-h(i));return`┌${n}${J.repeat(o)}${i}┐`}function B(t){return`└${J.repeat(t-2)}┘`}function U(t,e){let r=e-4,s=g(t,r);return`│ ${s}${" ".repeat(Math.max(0,r-h(s)))} │`}var y="\x1B",mt=`${y}[H`,gt=`${y}[2J`,yt=`${y}[2K`,vt=`${y}[?2026h`,bt=`${y}[?2026l`,xt=class{#e;#r;#i;#c=!1;#d=!1;constructor(t,e){this.#r=t.write.bind(t),this.#e=e?.useSynchronizedUpdates??!0,t.write=(r,s,n)=>{if(!this.#c)this.#d=!0;return this.#r(r,s,n)}}present(t){let e=Tt(t),r=this.#i&&!this.#d?St(this.#i,e):`${mt}${gt}${t}`;if(this.#i=e,this.#d=!1,r.length===0)return;this.#k(r)}reset(){this.#i=void 0}#k(t){this.#c=!0;try{if(!this.#e){this.#r(t);return}this.#r(`${vt}${t}${bt}`)}finally{this.#c=!1}}};function Tt(t){return{lines:t.split(`
7
+ `)}}function St(t,e){let r="",s=Math.max(t.lines.length,e.lines.length);for(let n=0;n<s;n++){let i=e.lines[n];if(t.lines[n]===i)continue;r+=`${y}[${n+1};1H${yt}${i??""}`}return r}var kt="outputTokensPerSecond",c={reset:"\x1B[0m",dim:"\x1B[2m",user:"\x1B[96m",assistant:"\x1B[92m",reasoning:"\x1B[94m",tool:"\x1B[95m",error:"\x1B[91m"},wt={user:{color:c.user,border:"─"},assistant:{color:c.assistant,border:"─"},reasoning:{color:c.reasoning,border:"·"},tool:{color:c.tool,border:"─"},error:{color:c.error,border:"─"}},Mt=500,$t=new Intl.Segmenter(void 0,{granularity:"grapheme"}),f="↑/↓ · PgUp/PgDn · Esc/Ctrl+C",Ct="↑/↓ · PgUp/PgDn · q/Esc/Ctrl+C",v=`Processing input... ${f}`,L=`Processing tool results... ${f}`,S=`Streaming... ${f}`,O=`Executing tools... ${f}`,M=class{#e;#r;#i;#c;#d;#k;#N;#n=[];#u="";#g=!1;#p=0;#I="";#s=S;#w=!1;#a=!1;#h;#E;#f;#y;#v=!0;#b;#o;#x;#R;constructor(t){this.#e=t?.input??process.stdin,this.#r=t?.output??process.stdout,this.#i=t?.frameBuffer??new xt(this.#r),this.#c=t?.tools??"auto-collapsed",this.#d=t?.reasoning??"auto-collapsed",this.#k=t?.responseStatistics??kt,this.#N=t?.contextSize,this.#E=t?.contextSize}async readPrompt(t){return this.#A(t),this.#g=!0,this.#u=t?.initialPrompt??"",this.#s=`Type a prompt and press Enter · ${f}`,this.#K(),this.#t(),await new Promise((e,r)=>{this.#o=(s)=>{let n=b(s);switch(n.type){case"character":this.#u+=n.value,this.#U(),this.#t();break;case"backspace":this.#u=Qt(this.#u),this.#U(),this.#t();break;case"enter":{let i=this.#u;this.#g=!1,this.#C(),this.#s=v,this.#F(i),this.#u="",this.#t(),this.#l(),e(i);break}case"up":case"down":this.#T(n.type);break;case"page-up":case"page-down":this.#$(n.type);break;case"ctrl-l":this.#S();break;case"escape":case"ctrl-c":this.#C(),this.#B(),r(k())}},this.#M()})}async renderStream(t,e){this.#A(e),this.#g=!1,this.#s=v,this.#j(e?.submittedPrompt),this.#a=!1,this.#h=void 0,this.#f=void 0,this.#y=void 0;let r={tools:e?.tools??this.#c,reasoning:e?.reasoning??this.#d,responseStatistics:e?.responseStatistics??this.#k};this.#t();let s=new Promise((o)=>{this.#R=o});this.#o=(o)=>this.#H(o),this.#M();let n,i=Nt(this.#G(t.uiMessageStream));try{let o=st({message:t.message,stream:i,onError:(u)=>this.#q("Error",Et(u))});for await(let u of It(o,s)){if(this.#a)break;n=u,this.#D(u,r)}if(!this.#a&&n&&this.#f!=null)this.#D(n,r)}finally{if(this.#R=void 0,this.#a)t.abort?.();if(this.#l(),this.#s=this.#a?"Interrupted":e?.continueSession?`Done · Enter another prompt · ${f}`:`Done · ${Ct}`,this.#t(),await this.#Z(e),this.#a||!e?.continueSession)this.#B()}if(this.#a)throw k();return n}async readToolApproval(t,e){return this.#A(e),this.#g=!1,this.#s=`Approve ${Wt(t)}? y/n · ${f}`,this.#a=!1,this.#t(),await new Promise((r,s)=>{this.#o=(n)=>{let i=b(n);switch(i.type){case"character":{let o=i.value.toLowerCase();if(o==="y")this.#s=`Approved · ${v}`,this.#l(),this.#t(),r({approved:!0});else if(o==="n")this.#s=`Denied · ${v}`,this.#l(),this.#t(),r({approved:!1,reason:"Denied by user."});break}case"up":case"down":this.#T(i.type);break;case"page-up":case"page-down":this.#$(i.type);break;case"ctrl-l":this.#S();break;case"escape":case"ctrl-c":this.#a=!0,this.#B(),s(k())}},this.#M()})}#A(t){if(this.#I=t?.title??this.#I,this.#E=t?.contextSize??this.#N,this.#w)return;if(this.#w=!0,this.#i.reset(),this.#r.write("\x1B[?1049h\x1B[?25l"),this.#e.isTTY)this.#e.setRawMode?.(!0),this.#e.resume();this.#x=()=>this.#S(),this.#r.on("resize",this.#x)}#B(){if(this.#l(),this.#C(),!this.#w)return;if(this.#e.isTTY)this.#e.setRawMode?.(!1),this.#e.pause();if(this.#x)this.#r.off("resize",this.#x),this.#x=void 0;this.#r.write("\x1B[?25h\x1B[?1049l"),this.#i.reset(),this.#w=!1}#M(){if(this.#o)this.#e.on("data",this.#o)}#l(){if(this.#o)this.#e.off("data",this.#o),this.#o=void 0}#H(t){let e=b(t);switch(e.type){case"up":case"down":this.#T(e.type);break;case"page-up":case"page-down":this.#$(e.type);break;case"ctrl-l":this.#S();break;case"escape":case"ctrl-c":this.#a=!0,this.#R?.()}}#T(t,e=1){let r=t==="up"?e:-e;this.#p=this.#_(this.#p+r),this.#t()}#$(t){this.#T(t==="page-up"?"up":"down",this.#W())}#K(){this.#C(),this.#U(),this.#b=setInterval(()=>{this.#v=!this.#v,this.#t()},Mt),this.#b.unref?.()}#C(){if(this.#b)clearInterval(this.#b),this.#b=void 0;this.#v=!0}#U(){this.#v=!0}#j(t){if(t==null)return;let e=this.#n.at(-1);if(e?.kind==="user"&&e.content===t)return;this.#F(t)}#F(t){let e=this.#m();this.#n.push({kind:"user",title:"User",content:t}),this.#O(e)}#D(t,e){let r=this.#m(),s=new Set,n=Kt(t.metadata);this.#h=n.totalTokens??this.#h,this.#f=n.outputTokens??this.#f,this.#y=n.outputTokensPerSecond??this.#y;for(let[i,o]of t.parts.entries()){let u=zt(t.id,i);switch(o.type){case"text":{let l=o.text.trim();if(l.length===0)break;s.add(u),this.#L({id:u,kind:"assistant",title:"Assistant",rightTitle:Gt({totalTokens:this.#h,outputTokens:this.#f,outputTokensPerSecond:this.#y},e.responseStatistics),content:l});break}case"reasoning":{let l=o.text.trim();if(e.reasoning==="hidden"||l.length===0)break;s.add(u),this.#L({id:u,kind:"reasoning",title:"Reasoning",content:l,collapsed:W(t,i,e.reasoning,e)});break}default:if(x(o)){if(e.tools==="hidden")break;s.add(u),this.#L({id:u,...Rt(o,{mode:e.tools,collapsed:W(t,i,e.tools,e)})})}}}this.#J(t.id,s),this.#O(r)}#L(t){let e=t.id?this.#n.find((r)=>r.id===t.id):void 0;if(e){let r=e.cache;e.kind=t.kind,e.title=t.title,e.rightTitle=t.rightTitle,e.content=t.content,e.collapsed=t.collapsed,e.cache=r&&G(t,r)?r:void 0;return}this.#n.push(t)}#J(t,e){let r=`${t}:`;this.#n=this.#n.filter((s)=>s.id==null||!s.id.startsWith(r)||e.has(s.id))}async*#G(t){let e=!1;for await(let r of Ft(t)){let s=Ut(r,{hasPendingToolResults:e});if(r.type==="start-step")e=!1;else if(Lt(r))e=!0;if(s&&this.#s!==s)this.#s=s,this.#t();else if(Bt(r)&&this.#s!==S)this.#s=S,this.#t();if(r.type==="error")this.#q("Error",r.errorText);if(r.type==="finish"){let n=Ht(r);this.#h=n.totalTokens,this.#f=n.outputTokens,this.#y=n.outputTokensPerSecond}yield r}}#q(t,e){let r=this.#m();this.#n.push({kind:"error",title:t,content:e}),this.#O(r)}#O(t){if(this.#p!==0){let e=this.#m()-t;this.#p=this.#_(this.#p+e)}this.#t()}#t(){let t=ft({width:this.#z(),height:this.#V(),title:this.#I,rightTitle:Z(this.#h,this.#E),visibleBodyLines:this.#Y(),input:this.#u,inputActive:this.#g,inputCursorVisible:this.#v,status:this.#s});this.#i.present(t)}#S(){this.#i.reset(),this.#t()}#Y(){if(this.#n.length===0)return["Waiting for input..."];let t=this.#W(),e=this.#m(),r=Math.max(0,e-t-this.#p),s=r+t,n=[],i=0;for(let o of this.#n){let u=N(o,this.#z()-4),l=i+u.length;if(l>r&&i<s)n.push(...u.slice(Math.max(0,r-i),s-i));if(n.length>=t)break;i=l}return n}#_(t){let e=Math.max(0,this.#m()-this.#W());return Math.min(Math.max(0,t),e)}#m(){if(this.#n.length===0)return 1;let t=0;for(let e of this.#n)t+=N(e,this.#z()-4).length;return t}#W(){return Math.max(1,this.#V()-5)}#z(){return Math.max(20,this.#r.columns??80)}#V(){return Math.max(8,this.#r.rows??24)}async#Z(t){if(t?.waitForExit===!1||!this.#e.isTTY||this.#a)return;await new Promise((e)=>{this.#o=(r)=>{let s=b(r);switch(s.type){case"up":case"down":this.#T(s.type);break;case"page-up":case"page-down":this.#$(s.type);break;case"ctrl-l":this.#S();break;case"escape":this.#l(),e();break;case"character":if(s.value==="q")this.#l(),e();break;case"ctrl-c":this.#l(),process.exitCode=130,e()}},this.#M()})}};function k(){return Error("Interrupted")}async function*It(t,e){let r=t[Symbol.asyncIterator](),s=e.then(()=>({done:!0,value:void 0}));while(!0){let n=await Promise.race([r.next(),s]);if(n.done)break;yield n.value}}function Et(t){if(t instanceof Error)return t.message;if(typeof t==="string")return t;return JSON.stringify(t)}function Rt(t,e){let r=H(t),s=`Tool · ${t.title??r}`,n="input"in t?t.input:void 0,i=n===void 0?"Input: (streaming...)":`Input:
8
+ ${z(n)}`,o=Ot(t);if(e.collapsed)return{kind:"tool",title:s,rightTitle:o,content:"",collapsed:!0};switch(t.state){case"input-streaming":return{kind:"tool",title:s,rightTitle:o,content:i};case"input-available":return{kind:"tool",title:s,rightTitle:o,content:i};case"approval-requested":return{kind:"tool",title:s,rightTitle:o,content:i};case"approval-responded":return{kind:"tool",title:s,rightTitle:o,content:i};case"output-available":return{kind:"tool",title:s,rightTitle:o,content:`${i}
9
+
10
+ Output:
11
+ ${z(t.output)}`};case"output-error":return{kind:"error",title:`Tool Error · ${t.title??r}`,rightTitle:o,content:`${i}
12
+
13
+ Error:
14
+ ${t.errorText}`};case"output-denied":return{kind:"error",title:`Tool Denied · ${t.title??r}`,rightTitle:o,content:`${i}
15
+
16
+ Reason: ${t.approval.reason??"denied"}`}}}function W(t,e,r,s){switch(r){case"collapsed":return!0;case"auto-collapsed":return t.parts.slice(e+1).some((n)=>At(n,s));case"full":case"hidden":return!1}}function At(t,e){switch(t.type){case"text":return t.text.trim().length>0;case"reasoning":return e.reasoning!=="hidden"&&t.text.trim().length>0;default:return x(t)&&e.tools!=="hidden"}}function Bt(t){switch(t.type){case"text-start":case"text-delta":case"reasoning-start":case"reasoning-delta":case"tool-input-start":case"tool-input-delta":return!0;default:return!1}}function Ut(t,{hasPendingToolResults:e}){switch(t.type){case"start-step":return e?L:v;case"tool-output-available":case"tool-output-error":case"tool-output-denied":return L;case"tool-input-available":return O;case"tool-approval-response":return t.approved?O:void 0;default:return}}function Lt(t){switch(t.type){case"tool-output-available":case"tool-output-error":case"tool-output-denied":return!0;default:return!1}}function Ot(t){switch(t.state){case"input-streaming":return"waiting";case"approval-requested":return"approval requested";case"input-available":return"executing";case"approval-responded":return t.approval.approved?"executing":"denied";case"output-available":case"output-error":return"done";case"output-denied":return"denied"}}function z(t){if(typeof t==="string")return t;return JSON.stringify(t,null,2)}function Wt(t){return`tool ${t.title??t.toolName}`}function zt(t,e){return`${t}:${e}`}function Nt(t){if(t instanceof ReadableStream)return t;return new ReadableStream({async start(e){try{for await(let r of t)e.enqueue(r);e.close()}catch(r){e.error(r)}}})}async function*Ft(t){if(t instanceof ReadableStream){let e=t.getReader();try{while(!0){let{done:r,value:s}=await e.read();if(r)return;yield s}}finally{e.releaseLock()}return}yield*t}function N(t,e){if(t.cache&&G(t,t.cache,e))return t.cache.lines;let r=Dt(t,e);return t.cache={width:e,kind:t.kind,title:t.title,rightTitle:t.rightTitle,content:t.content,collapsed:t.collapsed===!0,lines:r},r}function G(t,e,r=e.width){return e.width===r&&e.kind===t.kind&&e.title===t.title&&e.rightTitle===t.rightTitle&&e.content===t.content&&e.collapsed===(t.collapsed===!0)}function Dt(t,e){let r=wt[t.kind],s=Math.max(1,e-4),n=` ${m(t.title)} `,i=t.rightTitle?` ${m(t.rightTitle)} `:"";if(t.collapsed){let a=Math.max(0,e-2-n.length-i.length);return[`${r.color}╭${n}${r.border.repeat(a)}${i}╮${c.reset}`,`${r.color}╰${r.border.repeat(Math.max(0,e-2))}╯${c.reset}`]}let o=Math.max(0,e-2-n.length-i.length),u=`${r.color}╭${n}${r.border.repeat(o)}${i}╮${c.reset}`,l=`${r.color}╰${r.border.repeat(Math.max(0,e-2))}╯${c.reset}`;return[u,...(t.content.length>0?ot(t.content):c.dim+"(streaming...)"+c.reset).split(`
17
+ `).flatMap((a)=>_t(a,s)).map((a)=>qt(a,s,r.color)),l]}function qt(t,e,r){let s=g(t,e),n=" ".repeat(Math.max(0,e-h(s)));return`${r}│${c.reset} ${s}${n} ${r}│${c.reset}`}function _t(t,e){if(t.length===0)return[""];let r=[],s=t;while(h(s)>e){let n=Vt(s,e);r.push(s.slice(0,n).trimEnd()),s=s.slice(n).trimStart()}return r.push(s),r}function Vt(t,e){let r=g(t,e+1).lastIndexOf(" ");if(r>0)return r;return g(t,e).length}function Ht(t){let e="usage"in t?t.usage:void 0,r="messageMetadata"in t?t.messageMetadata?.usage:void 0,s="messageMetadata"in t?t.messageMetadata?.performance:void 0;return{totalTokens:Y(e??r),outputTokens:I(e??r),outputTokensPerSecond:s?.outputTokensPerSecond}}function Kt(t){let e=t;return{totalTokens:Y(e?.usage),outputTokens:I(e?.usage),outputTokensPerSecond:e?.performance?.outputTokensPerSecond}}function Y(t){let e=t?.totalTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;let r=jt(t),s=I(t);if(r!=null&&s!=null)return r+s}function jt(t){let e=t?.inputTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;return t?.promptTokens}function I(t){let e=t?.outputTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;return t?.completionTokens}function Z(t,e){if(t==null)return;let r=`${t.toLocaleString()} ${t===1?"token":"tokens"}`,s=Jt(t,e);return s==null?r:`${r} ${s}`}function Jt(t,e){if(e==null||e<=0||!Number.isFinite(e))return;return`${Math.round(t/e*100).toLocaleString()}%`}function Gt(t,e){if(e==="outputTokensPerSecond")return Yt(t.outputTokensPerSecond);return Z(t.outputTokens)}function Yt(t){if(t==null)return;return`${Zt(t)} tok/s`}function Zt(t){return Number.isInteger(t)?t.toLocaleString():t.toLocaleString(void 0,{maximumFractionDigits:1})}function Qt(t){let e=0;for(let{index:r}of $t.segment(t))e=r;return t.slice(0,e)}function b(t){let e=t.toString("utf8");switch(e){case"\f":return{type:"ctrl-l"};case"\x03":return{type:"ctrl-c"};case"\x1B":return{type:"escape"};case"\r":case`
18
+ `:return{type:"enter"};case"":case"\b":return{type:"backspace"};case"\x1B[A":return{type:"up"};case"\x1B[B":return{type:"down"};case"\x1B[5~":return{type:"page-up"};case"\x1B[6~":return{type:"page-down"};default:if(e>=" "&&e!=="")return{type:"character",value:e};return{type:"ignore"}}}var Xt="outputTokensPerSecond",Pt=class{constructor(t){this.chatId=rt(),this.agent=t.agent,this.transport=t.transport,this.renderer=ee(t)??te(t),this.title=t.title,this.tools=t.tools??"auto-collapsed",this.reasoning=t.reasoning??"auto-collapsed",this.responseStatistics=t.responseStatistics??Xt,this.contextSize=t.contextSize,this.sandbox=t.sandbox}async run(){let t=this.title,e=[],r=0,s=()=>`message-${++r}`,n,i=!1,o=!1;while(!0){if(!o){if(n==null){if(!this.renderer.readPrompt){if(i)return;throw Error("No prompt was provided and the renderer does not support prompt input.")}try{n=await this.renderer.readPrompt({title:t})}catch(l){if(V(l))return;throw l}if(n==null)return}e.push(ne(s(),n)),i=!0}let u=await this.streamMessages([...e],s);try{let l=await this.renderer.renderStream(u,{title:t,submittedPrompt:n,continueSession:Boolean(this.renderer.readPrompt),tools:this.tools,reasoning:this.reasoning,responseStatistics:this.responseStatistics,contextSize:this.contextSize,waitForExit:!1});if(l&&l.parts.length>0){let a=ae(l);if(a.length>0){if(!this.renderer.readToolApproval)throw Error("Tool approval was requested, but the renderer does not support tool approval input.");for(let E of a)ie(l,E,await this.renderer.readToolApproval(E,{title:t}));D(e,l,o),o=!0,n=void 0;continue}D(e,l,o)}}catch(l){if(V(l))return;throw l}o=!1,n=void 0}}async streamMessages(t,e){let r=new AbortController,s=()=>r.abort();if(this.transport)return{uiMessageStream:await this.transport.sendMessages({trigger:"submit-message",chatId:this.chatId,messageId:void 0,messages:t,abortSignal:r.signal}),message:C(t),abort:s};let n=this.agent;return{uiMessageStream:re((await n.stream({prompt:await et(t,{tools:n.tools}),abortSignal:r.signal,options:void 0,experimental_sandbox:this.sandbox})).fullStream,e,t),message:C(t),abort:s}}};function te(t){return t.tools===void 0&&t.reasoning===void 0&&t.responseStatistics===void 0&&t.contextSize===void 0?new M:new M({tools:t.tools,reasoning:t.reasoning,responseStatistics:t.responseStatistics,contextSize:t.contextSize})}function ee(t){if(t.renderer)return t.renderer;if(!t.screen&&!t.userInput)return;return new M({tools:t.tools,reasoning:t.reasoning,responseStatistics:t.responseStatistics,contextSize:t.contextSize,input:t.userInput,output:t.screen})}async function*re(t,e,r=[]){let s=new Set,n=new Set,i=new Set,o,u,l=!1;yield{type:"start",messageId:C(r)?.id??e()};for await(let a of t)switch(a.type){case"text-start":s.add(a.id),yield{type:"text-start",id:a.id,providerMetadata:a.providerMetadata};break;case"text-delta":if(!s.has(a.id))s.add(a.id),yield{type:"text-start",id:a.id,providerMetadata:a.providerMetadata};yield{type:"text-delta",id:a.id,delta:a.text,providerMetadata:a.providerMetadata};break;case"text-end":s.delete(a.id),yield{type:"text-end",id:a.id,providerMetadata:a.providerMetadata};break;case"reasoning-start":n.add(a.id),yield{type:"reasoning-start",id:a.id,providerMetadata:a.providerMetadata};break;case"reasoning-delta":if(!n.has(a.id))n.add(a.id),yield{type:"reasoning-start",id:a.id,providerMetadata:a.providerMetadata};yield{type:"reasoning-delta",id:a.id,delta:a.text,providerMetadata:a.providerMetadata};break;case"reasoning-end":n.delete(a.id),yield{type:"reasoning-end",id:a.id,providerMetadata:a.providerMetadata};break;case"tool-input-start":yield{type:"tool-input-start",toolCallId:a.id,toolName:a.toolName,providerExecuted:a.providerExecuted,providerMetadata:a.providerMetadata,toolMetadata:a.toolMetadata,dynamic:a.dynamic,title:a.title};break;case"tool-input-delta":yield{type:"tool-input-delta",toolCallId:a.id,inputTextDelta:a.delta};break;case"tool-call":i.add(a.toolCallId),yield{type:"tool-input-available",toolCallId:a.toolCallId,toolName:a.toolName,input:a.input,providerExecuted:a.providerExecuted,providerMetadata:a.providerMetadata,toolMetadata:a.toolMetadata,dynamic:a.dynamic,title:a.title};break;case"tool-approval-request":if(!i.has(a.toolCall.toolCallId))i.add(a.toolCall.toolCallId),yield{type:"tool-input-available",toolCallId:a.toolCall.toolCallId,toolName:a.toolCall.toolName,input:a.toolCall.input,providerExecuted:a.toolCall.providerExecuted,providerMetadata:a.toolCall.providerMetadata,toolMetadata:a.toolCall.toolMetadata,dynamic:a.toolCall.dynamic,title:a.toolCall.title};yield{type:"tool-approval-request",approvalId:a.approvalId,toolCallId:a.toolCall.toolCallId,isAutomatic:a.isAutomatic};break;case"tool-approval-response":yield{type:"tool-approval-response",approvalId:a.approvalId,approved:a.approved,reason:a.reason,providerExecuted:a.providerExecuted};break;case"tool-result":yield{type:"tool-output-available",toolCallId:a.toolCallId,output:a.output,providerExecuted:a.providerExecuted,providerMetadata:a.providerMetadata,toolMetadata:a.toolMetadata,dynamic:a.dynamic,preliminary:a.preliminary};break;case"tool-error":yield{type:"tool-output-error",toolCallId:a.toolCallId,errorText:q(a.error),providerExecuted:a.providerExecuted,providerMetadata:a.providerMetadata,toolMetadata:a.toolMetadata,dynamic:a.dynamic};break;case"tool-output-denied":yield{type:"tool-output-denied",toolCallId:a.toolCallId};break;case"source":if(a.sourceType==="url")yield{type:"source-url",sourceId:a.id,url:a.url,title:a.title,providerMetadata:a.providerMetadata};else yield{type:"source-document",sourceId:a.id,mediaType:a.mediaType,title:a.title,filename:a.filename,providerMetadata:a.providerMetadata};break;case"file":yield{type:"file",url:_(a.file.mediaType,a.file.base64),mediaType:a.file.mediaType,providerMetadata:a.providerMetadata};break;case"reasoning-file":yield{type:"reasoning-file",url:_(a.file.mediaType,a.file.base64),mediaType:a.file.mediaType,providerMetadata:a.providerMetadata};break;case"start-step":yield{type:"start-step"};break;case"finish-step":o=a.usage,u=a.performance,yield{type:"finish-step"};break;case"finish":yield*F(s,n),l=!0,yield{type:"finish",finishReason:a.finishReason,messageMetadata:se(o??a.totalUsage,u)};break;case"abort":yield{type:"abort",reason:a.reason};break;case"error":yield{type:"error",errorText:q(a.error)}}if(!l)yield*F(s,n),yield{type:"finish"}}function se(t,e){if(t?.totalTokens==null&&t?.outputTokens==null&&e?.outputTokensPerSecond==null)return;return{...t?.totalTokens==null&&t?.outputTokens==null?{}:{usage:{...t.totalTokens==null?{}:{totalTokens:t.totalTokens},...t.outputTokens==null?{}:{outputTokens:t.outputTokens}}},...e?.outputTokensPerSecond==null?{}:{performance:{outputTokensPerSecond:e.outputTokensPerSecond}}}}function*F(t,e){for(let r of t)yield{type:"text-end",id:r};t.clear();for(let r of e)yield{type:"reasoning-end",id:r};e.clear()}function ne(t,e){return{id:t,role:"user",parts:[{type:"text",text:e}]}}function D(t,e,r){if(r&&t.at(-1)?.role==="assistant"){t[t.length-1]=e;return}t.push(e)}function C(t){let e=t.at(-1);return e?.role==="assistant"?e:void 0}function ae(t){let e=[];for(let[r,s]of t.parts.entries()){if(!x(s)||s.state!=="approval-requested"||s.approval.isAutomatic===!0)continue;e.push({approvalId:s.approval.id,toolCallId:s.toolCallId,toolName:H(s),title:s.title,input:s.input,providerExecuted:s.providerExecuted,messageId:t.id,partIndex:r})}return e}function ie(t,e,r){let s=t.parts[e.partIndex];if(!s||!x(s)||s.toolCallId!==e.toolCallId)throw Error(`Could not find tool approval request ${e.approvalId}.`);s.state="approval-responded",s.approval={id:e.approvalId,approved:r.approved,...r.reason?{reason:r.reason}:{}}}function q(t){if(t instanceof Error)return t.message;if(typeof t==="string")return t;return JSON.stringify(t)}function _(t,e){return`data:${t};base64,${e}`}function V(t){return t instanceof Error&&t.message==="Interrupted"}async function Q(t){await new Pt(t).run()}import{convertToModelMessages as oe,generateId as X,toTextStream as le,toUIMessageStream as ue}from"ai";async function be(t){if(t.prompt!==void 0)ce(t.prompt);await Q({title:`broods · ${t.agent.name}`,tools:"full",transport:new P(t.client,t.agent)})}async function xe(t){let e=le({stream:tt(t.client.stream(t.agent,{input:t.prompt}),void 0,()=>{})});for await(let r of e)process.stdout.write(r);process.stdout.write(`
19
+ `)}async function ce(t){let e=process.stdin.listenerCount("data"),r=Date.now()+1e4;while(process.stdin.listenerCount("data")<=e){if(Date.now()>r)return;await new Promise((s)=>setTimeout(s,20))}process.stdin.emit("data",Buffer.from(t)),process.stdin.emit("data",Buffer.from("\r"))}class P{client;agent;conversationKey=`tui-${X()}`;sentApprovals=new Set;sentUserTurns=0;constructor(t,e){this.client=t;this.agent=e}async reconnectToStream(){return null}async sendMessages(t){let e=this.pendingEvents(await oe(t.messages));if(e.events.length===0)throw Error("Nothing new to send: the agent already saw this turn.");let r=this.client.stream(this.agent,{conversationKey:this.conversationKey,events:e.events});return ue({stream:tt(r,t.abortSignal,e.commit),originalMessages:t.messages,generateMessageId:X,sendSources:!0})}pendingEvents(t){let e=[],r=[],s=0;for(let n of t){if(n.role==="user"){if(s+=1,s>this.sentUserTurns)e.push(n);continue}if(n.role!=="tool")continue;for(let i of n.content)if(i.type==="tool-approval-response"&&!this.sentApprovals.has(i.approvalId))r.push(i)}if(r.length>0)e.push({role:"tool",content:r});return{events:e,commit:()=>{this.sentUserTurns=s;for(let n of r)this.sentApprovals.add(n.approvalId)}}}}function de(t){return new Promise((e)=>{if(!t)return;let r=()=>e({done:!0,value:void 0});if(t.aborted)r();else t.addEventListener("abort",r,{once:!0})})}function tt(t,e,r){let s=!1,n=()=>void t.return(void 0);return new ReadableStream({pull:async function(i){let o=await Promise.race([t.next(),de(e)]);if(e?.aborted){n(),i.close();return}if(!s)s=!0,r();if(o.done)i.close();else i.enqueue(o.value)},cancel:n})}export{be as runAgentTui,xe as streamAgentText};
package/dist/cli/index.js CHANGED
@@ -86,7 +86,7 @@ ${o.map((s)=>` ${on(t?.[s]??s)}: ids.${e}[${JSON.stringify(s)}],`).join(`
86
86
  Check the browser tab and the dashboard logs for an error. If the browser shows
87
87
  404 on /cli-auth/start, deploy the dashboard build that includes CLI auth or pass
88
88
  --dashboard-url for the environment you deployed. Other common causes are missing
89
- cliAuth Convex functions or no active API account (Settings -> API Access).`)),n)});try{return await Promise.race([e,o])}finally{if(t)clearTimeout(t)}}import{existsSync as yt}from"node:fs";import{mkdir as Lr,readFile as Nr,writeFile as Mr}from"node:fs/promises";import{dirname as vt,join as mn,resolve as Br,sep as ue}from"node:path";import{fileURLToPath as Gr}from"node:url";var je={name:"broods",version:"0.43.1",description:"CLI + TypeScript SDK for the broods agent platform.",keywords:["agents","ai","broods","cli","sdk"],homepage:"https://github.com/beeblastco/broods#readme",bugs:{url:"https://github.com/beeblastco/broods/issues"},license:"MIT",repository:{type:"git",url:"git+https://github.com/beeblastco/broods.git",directory:"packages/broods"},bin:{broods:"dist/cli/index.js"},files:["dist","README.md","LICENSE.md"],type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",typesVersions:{"*":{account:["./dist/account.d.ts"]}},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./account":{types:"./dist/account.d.ts",import:"./dist/account.js"}},scripts:{build:"bun scripts/build.ts && rollup -c rollup.dts.config.mjs && rm -rf .dts-temp",check:"tsc --noEmit","pack:check":"bun run build && publint && attw --pack .",prepublishOnly:"bun run build",test:"bun test"},dependencies:{"@modelcontextprotocol/client":"^2.0.0",esbuild:"^0.28.2"},devDependencies:{"@ai-sdk/tui":"1.0.121","@arethetypeswrong/cli":"^0.18.5","@chat-adapter/discord":"^4.38.1","@chat-adapter/github":"^4.38.1","@chat-adapter/slack":"^4.38.1","@chat-adapter/telegram":"^4.38.1","@modelcontextprotocol/server":"2.0.0","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.120",publint:"^0.3.23",rollup:"^4.62.4","rollup-plugin-dts":"^6.5.1",typescript:"^7.0.2",zod:"^4.4.3"},peerDependencies:{ai:"^7.0.120"},engines:{node:">=22.15"}};var fn=mn(vt(A),"update-check.json"),Wr=86400000,Fr="https://registry.npmjs.org/broods/latest",Kr=2000,Hr=[["bun.lock","bun"],["bun.lockb","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"]];function hn(e,n){let t=pn(e),o=pn(n);for(let r=0;r<3;r+=1){let s=t[r]??0,i=o[r]??0;if(s!==i)return s>i}return!wt(e)&&wt(n)}async function bn(e={}){let n=await zr(),t=e.maxAgeMs??Wr;if(n&&Date.now()-n.checkedAt<t)return n.latest;let o=await Vr();if(o===null)return n?.latest??null;return await Jr({checkedAt:Date.now(),latest:o}),o}function Pe(e){return pn(e)[0]??0}function kt(e=Br(process.cwd()),n=Gr(import.meta.url),t=je.version){let o=`${ue}node_modules${ue}`,r=n.indexOf(o),s=r===-1?null:n.slice(0,r),i=s===null?n.startsWith(`${e}${ue}`):e===s||e.startsWith(`${s}${ue}`),a=n.includes(`${ue}.bun${ue}install${ue}global${ue}`),c=s??e,d=i?Yr(c):a?"bun":"npm",l=d==="npm"?"install":"add",p=d==="pnpm"&&yt(mn(c,"pnpm-workspace.yaml"))?["-w"]:[],u=`broods@${Pe(t)}`;return{manager:d,global:!i,command:d,cwd:i?c:e,args:i?[l,...p,u]:[l,"-g",u]}}async function Vr(){try{let e=await fetch(Fr,{signal:AbortSignal.timeout(Kr),headers:{accept:"application/json"}});if(!e.ok)return null;let n=await e.json();return typeof n.version==="string"?n.version:null}catch{return null}}function wt(e){return e.includes("-")}async function zr(){try{let e=JSON.parse(await Nr(fn,"utf8"));if(typeof e.latest!=="string")return null;if(typeof e.checkedAt!=="number")return null;return{checkedAt:e.checkedAt,latest:e.latest}}catch{return null}}function Yr(e){return Hr.find(([t])=>yt(mn(e,t)))?.[1]??"npm"}function pn(e){let[n]=e.trim().replace(/^v/,"").split("-");return(n??"").split(".").slice(0,3).map((t)=>Number.parseInt(t,10)||0)}async function Jr(e){try{await Lr(vt(fn),{recursive:!0}),await Mr(fn,`${JSON.stringify(e)}
89
+ cliAuth Convex functions or no active API account (Settings -> API Access).`)),n)});try{return await Promise.race([e,o])}finally{if(t)clearTimeout(t)}}import{existsSync as yt}from"node:fs";import{mkdir as Lr,readFile as Nr,writeFile as Mr}from"node:fs/promises";import{dirname as vt,join as mn,resolve as Br,sep as ue}from"node:path";import{fileURLToPath as Gr}from"node:url";var je={name:"broods",version:"0.43.2",description:"CLI + TypeScript SDK for the broods agent platform.",keywords:["agents","ai","broods","cli","sdk"],homepage:"https://github.com/beeblastco/broods#readme",bugs:{url:"https://github.com/beeblastco/broods/issues"},license:"MIT",repository:{type:"git",url:"git+https://github.com/beeblastco/broods.git",directory:"packages/broods"},bin:{broods:"dist/cli/index.js"},files:["dist","README.md","LICENSE.md"],type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",typesVersions:{"*":{account:["./dist/account.d.ts"]}},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./account":{types:"./dist/account.d.ts",import:"./dist/account.js"}},scripts:{build:"bun scripts/build.ts && rollup -c rollup.dts.config.mjs && rm -rf .dts-temp",check:"tsc --noEmit","pack:check":"bun run build && publint && attw --pack .",prepublishOnly:"bun run build",test:"bun test"},dependencies:{"@modelcontextprotocol/client":"^2.0.0",esbuild:"^0.28.2"},devDependencies:{"@ai-sdk/tui":"1.0.128","@arethetypeswrong/cli":"^0.18.5","@chat-adapter/discord":"^4.38.1","@chat-adapter/github":"^4.38.1","@chat-adapter/slack":"^4.38.1","@chat-adapter/telegram":"^4.38.1","@modelcontextprotocol/server":"2.0.0","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.127",publint:"^0.3.23",rollup:"^4.62.4","rollup-plugin-dts":"^6.5.1",typescript:"^7.0.2",zod:"^4.4.3"},peerDependencies:{ai:"^7.0.127"},engines:{node:">=22.15"}};var fn=mn(vt(A),"update-check.json"),Wr=86400000,Fr="https://registry.npmjs.org/broods/latest",Kr=2000,Hr=[["bun.lock","bun"],["bun.lockb","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"]];function hn(e,n){let t=pn(e),o=pn(n);for(let r=0;r<3;r+=1){let s=t[r]??0,i=o[r]??0;if(s!==i)return s>i}return!wt(e)&&wt(n)}async function bn(e={}){let n=await zr(),t=e.maxAgeMs??Wr;if(n&&Date.now()-n.checkedAt<t)return n.latest;let o=await Vr();if(o===null)return n?.latest??null;return await Jr({checkedAt:Date.now(),latest:o}),o}function Pe(e){return pn(e)[0]??0}function kt(e=Br(process.cwd()),n=Gr(import.meta.url),t=je.version){let o=`${ue}node_modules${ue}`,r=n.indexOf(o),s=r===-1?null:n.slice(0,r),i=s===null?n.startsWith(`${e}${ue}`):e===s||e.startsWith(`${s}${ue}`),a=n.includes(`${ue}.bun${ue}install${ue}global${ue}`),c=s??e,d=i?Yr(c):a?"bun":"npm",l=d==="npm"?"install":"add",p=d==="pnpm"&&yt(mn(c,"pnpm-workspace.yaml"))?["-w"]:[],u=`broods@${Pe(t)}`;return{manager:d,global:!i,command:d,cwd:i?c:e,args:i?[l,...p,u]:[l,"-g",u]}}async function Vr(){try{let e=await fetch(Fr,{signal:AbortSignal.timeout(Kr),headers:{accept:"application/json"}});if(!e.ok)return null;let n=await e.json();return typeof n.version==="string"?n.version:null}catch{return null}}function wt(e){return e.includes("-")}async function zr(){try{let e=JSON.parse(await Nr(fn,"utf8"));if(typeof e.latest!=="string")return null;if(typeof e.checkedAt!=="number")return null;return{checkedAt:e.checkedAt,latest:e.latest}}catch{return null}}function Yr(e){return Hr.find(([t])=>yt(mn(e,t)))?.[1]??"npm"}function pn(e){let[n]=e.trim().replace(/^v/,"").split("-");return(n??"").split(".").slice(0,3).map((t)=>Number.parseInt(t,10)||0)}async function Jr(e){try{await Lr(vt(fn),{recursive:!0}),await Mr(fn,`${JSON.stringify(e)}
90
90
  `,"utf8")}catch{}}var St=`---
91
91
  name: broods
92
92
  description: Work on a broods account alongside a developer from Claude Code or a development agent. Covers onboarding and sign-in, creating a broods project, defining and deploying agents and their resources with the CLI, and integrating a deployed agent into existing code with the SDK. Use when asked to set up broods, create or work on a broods project, create or manage agents or any account resource, or call a deployed agent from application code.
@@ -380,13 +380,13 @@ ${ne("stage")}`);let i=h(),a=b(e,"--dashboard-url")??i.dashboardUrl??Z,c=Je(e),d
380
380
 
381
381
  ${ne("env")}`);if(a&&!t)throw Error(`broods env ${n} needs a variable name.
382
382
 
383
- ${ne("env")}`);let{manifest:c,config:d}=await ae({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),l=await J(b(e,"--base-url")??d.baseUrl),p=new L({baseUrl:l.baseUrl,token:l.token}),u=`${c.project}/${c.stage}`;if(i){await Zs(p,c,u);return}if(o){let y=await p.listEnv(c.project,c.stage);if(y.length===0){console.log(`No environment variables set for ${u}.`);return}console.log(`Environment variables for ${u} (values hidden):`);for(let R of y)console.log(` ${R.name}`);return}if(s){let y=await p.getEnv(c.project,c.stage,t);if(y===null){console.error(`${t} is not set for ${u}`),process.exitCode=1;return}console.log(y);return}if(r){await p.removeEnv(c.project,c.stage,t),M(`Removed ${t} from ${u}`);return}let m=await ht(t);await p.setEnv(c.project,c.stage,t,m),M(`Stored ${t} for ${u}`)}async function Zs(e,n,t){let o=await Rn(e,n);if(o.length===0){console.log('No env("NAME") references in this project.');return}let r=await Bt(e,n,o);if(r.length>0)un(r);let s=Ve(o,"synced").length;console.log(r.length>0?`${s} other referenced variable(s) already in step with ${t}.`:`${s} referenced variable(s) already in step with ${t}.`);let i=Ve(o,"stage-only");if(i.length>0)console.log(`${i.length} referenced variable(s) live only on ${t}: ${i.join(", ")}`);let a=Ve(o,"unresolved");if(a.length>0)x(`${a.length} referenced variable(s) with no value here or on ${t}: ${a.join(", ")}. Put them in .env.local, or run \`broods env set <NAME>\`.`)}function On(e){if(I(e,"--all"))return"DEBUG";let n=b(e,"--level");if(n===void 0&&I(e,"--level"))throw Error("Missing value for --level. Use DEBUG, INFO, WARN, or ERROR.");if(!n)return"WARN";let t=n.toUpperCase();if(t==="DEBUG")return"DEBUG";if(t==="INFO")return"INFO";if(t==="WARN"||t==="WARNING")return"WARN";if(t==="ERROR")return"ERROR";throw Error(`Unknown log level: ${n}. Use DEBUG, INFO, WARN, or ERROR.`)}async function Xs(e){h();let n=b(e,"--project")??process.env.BROODS_PROJECT,t=b(e,"--stage")??v();if(!n)throw Error("Project name is required. Pass --project <name> or set BROODS_PROJECT in .env.local.");if(!t)throw Error("Stage name is required. Pass --stage <name> or set BROODS_STAGE in .env.local.");return{project:n,stage:t}}async function qe(e){let n=await Xs(e),t=h(),o=await _e(b(e,"--dashboard-url")??t.dashboardUrl??Z,b(e,"--base-url")),r=new L({baseUrl:o.baseUrl,token:o.token}),s=await r.mintStageSession(n.project,n.stage),i=async()=>{if(s.expiresAt-Date.now()<ls)s=await r.mintStageSession(n.project,n.stage);return s.token};return{baseUrl:process.env.BROODS_BASE_URL??process.env.BROODS_HOST??k,credential:i,project:s.projectSlug,stage:s.stageSlug}}function Gt(e){return e==="WARN"?" (--all for INFO too)":""}function Cn(e){let n=new Date(e.ts).toISOString().slice(11,23),t=e.level.padEnd(5),o=cs(e.message);return`${n} ${t} ${e.eventType} ${o}`}async function Qs(e){let n=await qe(e),{project:t,stage:o}=n,r=On(e),s=new AbortController,i=()=>s.abort();process.on("SIGINT",i),console.log(`Streaming live logs for ${t}/${o} [${r}+]`+Gt(r)+", Ctrl+C to stop");try{for await(let a of Be(n,{backfill:0,minLevel:r,signal:s.signal}))console.log(Cn(a))}catch(a){if(!s.signal.aborted)console.error(a instanceof Error?a.message:String(a)),process.exitCode=1}finally{process.off("SIGINT",i)}}async function ei(e){if(I(e,"--doctor")){await ni(I(e,"--request"));return}let n=de(e)[0];if(!n){console.log(he("machine",e));return}let{runMachineDaemon:t}=await import("../chunk-kv5jt2qt.js"),{baseUrl:o,credential:r}=await qe(e),s=j(b(e,"--cwd")??process.cwd()),i=I(e,"--computer"),a=b(e,"--mcp"),c=I(e,"--force"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Connecting ${n} to ${o} (cwd ${s}${i?", computer use on":""}), Ctrl+C to stop`);try{await t({baseUrl:o,computer:i,credential:r,cwd:s,force:c,log:(p)=>console.log(p),mcpFile:a?j(a):void 0,sandbox:n,signal:d.signal})}catch(p){console.error(p instanceof Error?p.message:String(p)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function ni(e){try{let{startDesktop:n}=await import("../chunk-5tnnqapc.js"),{display:t,driver:o,permissions:r}=await n(e);o.stop();let s=(i)=>i?"granted":"missing";if(console.log(`screenshot frame ${t.width}x${t.height} (scale ${t.scale.toFixed(2)})`),console.log(`screen recording ${s(r.screenRecording)}`),console.log(`accessibility ${s(r.accessibility)}`),!r.screenRecording||!r.accessibility)console.log(e?"Approve the prompts, or add this terminal under System Settings > Privacy & Security, then run again.":"Run `broods machine --doctor --request` to show the macOS prompts."),process.exitCode=1}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exitCode=1}}async function ti(e){let n=await qe(e),{project:t,stage:o}=n,r=b(e,"--sandbox");if(I(e,"--sandbox")&&!G(r))throw Error("--sandbox needs the instance log id, the UUID shown in the dashboard Instances sheet.");let s=r?"DEBUG":On(e),i=Number(b(e,"--limit")??b(e,"-n")??100),a=I(e,"--json"),c=new AbortController,d=()=>c.abort();process.on("SIGINT",d),console.log(`Logs for ${t}/${o}`+(r?` sandbox ${r}`:"")+` [${s}+]`+Gt(s)+` (backfill ${i}), Ctrl+C to stop`);try{for await(let l of Be(n,{backfill:i,minLevel:s,...r?{sandboxId:r}:{},signal:c.signal}))if(a)console.log(JSON.stringify(l));else console.log(Cn(l))}catch(l){if(!c.signal.aborted)console.error(l instanceof Error?l.message:String(l)),process.exitCode=1}finally{process.off("SIGINT",d)}}async function oi(e){let[n,t]=de(e);if(!n){console.log(he("agent",e));return}if(n==="list"||n==="ls"){await ri(e);return}if(n==="get"){await si(t,e);return}throw Error(`Unknown agent subcommand: ${n}
383
+ ${ne("env")}`);let{manifest:c,config:d}=await ae({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),l=await J(b(e,"--base-url")??d.baseUrl),p=new L({baseUrl:l.baseUrl,token:l.token}),u=`${c.project}/${c.stage}`;if(i){await Zs(p,c,u);return}if(o){let y=await p.listEnv(c.project,c.stage);if(y.length===0){console.log(`No environment variables set for ${u}.`);return}console.log(`Environment variables for ${u} (values hidden):`);for(let R of y)console.log(` ${R.name}`);return}if(s){let y=await p.getEnv(c.project,c.stage,t);if(y===null){console.error(`${t} is not set for ${u}`),process.exitCode=1;return}console.log(y);return}if(r){await p.removeEnv(c.project,c.stage,t),M(`Removed ${t} from ${u}`);return}let m=await ht(t);await p.setEnv(c.project,c.stage,t,m),M(`Stored ${t} for ${u}`)}async function Zs(e,n,t){let o=await Rn(e,n);if(o.length===0){console.log('No env("NAME") references in this project.');return}let r=await Bt(e,n,o);if(r.length>0)un(r);let s=Ve(o,"synced").length;console.log(r.length>0?`${s} other referenced variable(s) already in step with ${t}.`:`${s} referenced variable(s) already in step with ${t}.`);let i=Ve(o,"stage-only");if(i.length>0)console.log(`${i.length} referenced variable(s) live only on ${t}: ${i.join(", ")}`);let a=Ve(o,"unresolved");if(a.length>0)x(`${a.length} referenced variable(s) with no value here or on ${t}: ${a.join(", ")}. Put them in .env.local, or run \`broods env set <NAME>\`.`)}function On(e){if(I(e,"--all"))return"DEBUG";let n=b(e,"--level");if(n===void 0&&I(e,"--level"))throw Error("Missing value for --level. Use DEBUG, INFO, WARN, or ERROR.");if(!n)return"WARN";let t=n.toUpperCase();if(t==="DEBUG")return"DEBUG";if(t==="INFO")return"INFO";if(t==="WARN"||t==="WARNING")return"WARN";if(t==="ERROR")return"ERROR";throw Error(`Unknown log level: ${n}. Use DEBUG, INFO, WARN, or ERROR.`)}async function Xs(e){h();let n=b(e,"--project")??process.env.BROODS_PROJECT,t=b(e,"--stage")??v();if(!n)throw Error("Project name is required. Pass --project <name> or set BROODS_PROJECT in .env.local.");if(!t)throw Error("Stage name is required. Pass --stage <name> or set BROODS_STAGE in .env.local.");return{project:n,stage:t}}async function qe(e){let n=await Xs(e),t=h(),o=await _e(b(e,"--dashboard-url")??t.dashboardUrl??Z,b(e,"--base-url")),r=new L({baseUrl:o.baseUrl,token:o.token}),s=await r.mintStageSession(n.project,n.stage),i=async()=>{if(s.expiresAt-Date.now()<ls)s=await r.mintStageSession(n.project,n.stage);return s.token};return{baseUrl:process.env.BROODS_BASE_URL??process.env.BROODS_HOST??k,credential:i,project:s.projectSlug,stage:s.stageSlug}}function Gt(e){return e==="WARN"?" (--all for INFO too)":""}function Cn(e){let n=new Date(e.ts).toISOString().slice(11,23),t=e.level.padEnd(5),o=cs(e.message);return`${n} ${t} ${e.eventType} ${o}`}async function Qs(e){let n=await qe(e),{project:t,stage:o}=n,r=On(e),s=new AbortController,i=()=>s.abort();process.on("SIGINT",i),console.log(`Streaming live logs for ${t}/${o} [${r}+]`+Gt(r)+", Ctrl+C to stop");try{for await(let a of Be(n,{backfill:0,minLevel:r,signal:s.signal}))console.log(Cn(a))}catch(a){if(!s.signal.aborted)console.error(a instanceof Error?a.message:String(a)),process.exitCode=1}finally{process.off("SIGINT",i)}}async function ei(e){if(I(e,"--doctor")){await ni(I(e,"--request"));return}let n=de(e)[0];if(!n){console.log(he("machine",e));return}let{runMachineDaemon:t}=await import("../chunk-hg7wmd0j.js"),{baseUrl:o,credential:r}=await qe(e),s=j(b(e,"--cwd")??process.cwd()),i=I(e,"--computer"),a=b(e,"--mcp"),c=I(e,"--force"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Connecting ${n} to ${o} (cwd ${s}${i?", computer use on":""}), Ctrl+C to stop`);try{await t({baseUrl:o,computer:i,credential:r,cwd:s,force:c,log:(p)=>console.log(p),mcpFile:a?j(a):void 0,sandbox:n,signal:d.signal})}catch(p){console.error(p instanceof Error?p.message:String(p)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function ni(e){try{let{startDesktop:n}=await import("../chunk-5tnnqapc.js"),{display:t,driver:o,permissions:r}=await n(e);o.stop();let s=(i)=>i?"granted":"missing";if(console.log(`screenshot frame ${t.width}x${t.height} (scale ${t.scale.toFixed(2)})`),console.log(`screen recording ${s(r.screenRecording)}`),console.log(`accessibility ${s(r.accessibility)}`),!r.screenRecording||!r.accessibility)console.log(e?"Approve the prompts, or add this terminal under System Settings > Privacy & Security, then run again.":"Run `broods machine --doctor --request` to show the macOS prompts."),process.exitCode=1}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exitCode=1}}async function ti(e){let n=await qe(e),{project:t,stage:o}=n,r=b(e,"--sandbox");if(I(e,"--sandbox")&&!G(r))throw Error("--sandbox needs the instance log id, the UUID shown in the dashboard Instances sheet.");let s=r?"DEBUG":On(e),i=Number(b(e,"--limit")??b(e,"-n")??100),a=I(e,"--json"),c=new AbortController,d=()=>c.abort();process.on("SIGINT",d),console.log(`Logs for ${t}/${o}`+(r?` sandbox ${r}`:"")+` [${s}+]`+Gt(s)+` (backfill ${i}), Ctrl+C to stop`);try{for await(let l of Be(n,{backfill:i,minLevel:s,...r?{sandboxId:r}:{},signal:c.signal}))if(a)console.log(JSON.stringify(l));else console.log(Cn(l))}catch(l){if(!c.signal.aborted)console.error(l instanceof Error?l.message:String(l)),process.exitCode=1}finally{process.off("SIGINT",d)}}async function oi(e){let[n,t]=de(e);if(!n){console.log(he("agent",e));return}if(n==="list"||n==="ls"){await ri(e);return}if(n==="get"){await si(t,e);return}throw Error(`Unknown agent subcommand: ${n}
384
384
 
385
385
  ${ne("agent")}`)}async function Wt(e){let{manifest:n,config:t}=await ae({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),o=await J(b(e,"--base-url")??t.baseUrl),r=await new L({baseUrl:o.baseUrl,token:o.token}).getManifest(n.project,n.stage),s=n.resources.filter((i)=>i.kind==="agent").map((i)=>({name:i.name,config:i.config??{},agentId:r?.ids.agents[i.name]}));return{manifest:n,agents:s}}async function ri(e){let{manifest:n,agents:t}=await Wt(e);if(t.length===0){console.log(`No agents declared in ${n.project}/${n.stage}.`);return}console.log(`Agents in ${n.project}/${n.stage}:`);for(let o of t){let r=Ft(o.config),s=o.config.publicAccess===!0?"public":"private",i=o.agentId?o.agentId:"not deployed";console.log(` ${o.name} [${s}] ${r} (${i})`)}}async function si(e,n){if(!e)throw Error(`Missing agent name.
386
386
 
387
387
  ${ne("agent")}`);let{manifest:t,agents:o}=await Wt(n),r=o.find((u)=>u.name===e);if(!r)throw Error(`Unknown local agent: ${e}`);let s=r.config,i=[s.sandboxes].flat().filter((u)=>typeof u==="string").map((u,m)=>m===0?`${u} (default)`:u),a=Array.isArray(s.workspaces)?s.workspaces.map((u)=>typeof u==="string"?u:u.name).filter(Boolean):[],c=ge(s.tools)?Object.keys(s.tools):[],d=ge(s.channels)?Object.keys(s.channels):[],l=ge(s.subagent)&&Array.isArray(s.subagent.allowed)?s.subagent.allowed.map((u)=>typeof u==="string"?u:u.name).filter(Boolean):[],p=ge(s.hooks)&&Array.isArray(s.hooks.webhooks)?s.hooks.webhooks.filter(ge):[];if(console.log(`Agent: ${r.name}`),console.log(` Project/Stage: ${t.project}/${t.stage}`),console.log(` Deployed id: ${r.agentId??"not deployed"}`),console.log(` Public access: ${s.publicAccess===!0?"public (SSE/WebSocket enabled)":"private (secured by default)"}`),console.log(` Model: ${Ft(s)}`),console.log(` Sandboxes: ${i.length>0?i.join(", "):"none"}`),console.log(` Workspaces: ${a.length>0?a.join(", "):"none"}`),console.log(` Tools: ${c.length>0?c.join(", "):"none"}`),console.log(` Subagents: ${l.length>0?l.join(", "):"none"}`),console.log(` Channels: ${d.length>0?d.join(", "):"none"}`),p.length>0)console.log(" Webhooks:"),p.forEach((u,m)=>{let y=Array.isArray(u.events)&&u.events.length>0?u.events.join(", "):"all events",R=u.enabled===!1?"disabled":"enabled";console.log(` [${m}] ${R} → ${u.url??"none"} (${y})`)})}function Ft(e){let n=ge(e.model)?e.model:{},t=typeof n.provider==="string"?n.provider:void 0,o=typeof n.modelId==="string"?n.modelId:void 0;if(t&&o)return`${t}/${o}`;return o??t??"unconfigured model"}async function ii(e){let[n,...t]=de(e);if(!n)throw Error(`Missing agent name.
388
388
 
389
- ${ne("run")}`);let o=t.join(" "),r=Boolean(process.stdin.isTTY&&process.stdout.isTTY);if(!r&&!o)throw Error("A prompt is required when output is redirected: broods run <agent> <prompt>. Run it in a terminal to chat without one.");let{manifest:s,config:i}=await ae({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),a=await J(b(e,"--base-url")??i.baseUrl),c=s.resources.find((C)=>C.kind==="agent"&&C.name===n);if(!c)throw Error(`Unknown local agent: ${n}`);let l=(await new L({baseUrl:a.baseUrl,token:a.token}).getManifest(s.project,s.stage))?.ids.agents[n];if(!l)throw Error(`Agent ${n} is not synced yet. Run broods dev --once or broods deploy first.`);let p=await new L({baseUrl:a.baseUrl,token:a.token}).getRuntimeKey(s.project,s.stage).catch(()=>null);if(p?.apiKey)await ve("BROODS_API_KEY",p.apiKey);if(c.config.publicAccess!==!0)x(`Agent "${n}" does not set publicAccess: true. The public endpoint is secured by default; if the deployed agent has not enabled it, this run will be refused.`);let u=new U({baseUrl:b(e,"--base-url")??process.env.BROODS_BASE_URL??process.env.BROODS_HOST??a.baseUrl,...p?.apiKey?{apiKey:p.apiKey}:{}}),m={kind:"agent",name:n,id:l,project:s.project,stage:s.stage,...p?.endpointId?{endpointId:p.endpointId}:{},...p?.projectSlug?{projectSlug:p.projectSlug}:{},...p?.stageSlug?{stageSlug:p.stageSlug}:{}},{runAgentTui:y,streamAgentText:R}=await import("../chunk-6en45n1d.js");try{if(r){await y({client:u,agent:m,...o?{prompt:o}:{}});return}await R({client:u,agent:m,prompt:o})}catch(C){if((C instanceof Error?C.message:String(C)).includes("public_access_disabled"))throw Error(`Agent "${n}" is not publicly accessible (secured by default). Set publicAccess: true in its config and redeploy, or enable Public access in the dashboard.`);throw C}}async function ze(e,n,t){try{await me(e,n,{flag:t?"w":"wx"})}catch(o){if(o.code==="EEXIST")return;throw o}}async function Kt(){let e=j(process.cwd(),".gitignore"),n=await ke(e);if(n.split(/\r?\n/).some((r)=>[".env.local","/.env.local",".env*.local",".env.*",".env*"].includes(r.trim())))return;let o=n?`${n.trimEnd()}
389
+ ${ne("run")}`);let o=t.join(" "),r=Boolean(process.stdin.isTTY&&process.stdout.isTTY);if(!r&&!o)throw Error("A prompt is required when output is redirected: broods run <agent> <prompt>. Run it in a terminal to chat without one.");let{manifest:s,config:i}=await ae({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),a=await J(b(e,"--base-url")??i.baseUrl),c=s.resources.find((C)=>C.kind==="agent"&&C.name===n);if(!c)throw Error(`Unknown local agent: ${n}`);let l=(await new L({baseUrl:a.baseUrl,token:a.token}).getManifest(s.project,s.stage))?.ids.agents[n];if(!l)throw Error(`Agent ${n} is not synced yet. Run broods dev --once or broods deploy first.`);let p=await new L({baseUrl:a.baseUrl,token:a.token}).getRuntimeKey(s.project,s.stage).catch(()=>null);if(p?.apiKey)await ve("BROODS_API_KEY",p.apiKey);if(c.config.publicAccess!==!0)x(`Agent "${n}" does not set publicAccess: true. The public endpoint is secured by default; if the deployed agent has not enabled it, this run will be refused.`);let u=new U({baseUrl:b(e,"--base-url")??process.env.BROODS_BASE_URL??process.env.BROODS_HOST??a.baseUrl,...p?.apiKey?{apiKey:p.apiKey}:{}}),m={kind:"agent",name:n,id:l,project:s.project,stage:s.stage,...p?.endpointId?{endpointId:p.endpointId}:{},...p?.projectSlug?{projectSlug:p.projectSlug}:{},...p?.stageSlug?{stageSlug:p.stageSlug}:{}},{runAgentTui:y,streamAgentText:R}=await import("../chunk-m7ws7kqc.js");try{if(r){await y({client:u,agent:m,...o?{prompt:o}:{}});return}await R({client:u,agent:m,prompt:o})}catch(C){if((C instanceof Error?C.message:String(C)).includes("public_access_disabled"))throw Error(`Agent "${n}" is not publicly accessible (secured by default). Set publicAccess: true in its config and redeploy, or enable Public access in the dashboard.`);throw C}}async function ze(e,n,t){try{await me(e,n,{flag:t?"w":"wx"})}catch(o){if(o.code==="EEXIST")return;throw o}}async function Kt(){let e=j(process.cwd(),".gitignore"),n=await ke(e);if(n.split(/\r?\n/).some((r)=>[".env.local","/.env.local",".env*.local",".env.*",".env*"].includes(r.trim())))return;let o=n?`${n.trimEnd()}
390
390
  .env*.local
391
391
  `:`.env*.local
392
392
  `;await me(e,o,"utf8")}async function Ht(){let e=j(process.cwd(),S,".gitignore"),n=await ke(e),o=["_generated",".cache"].filter((s)=>!n.split(/\r?\n/).some((i)=>i.trim()===s));if(o.length===0)return;let r=n?n.trimEnd()+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "broods",
3
- "version": "0.43.1",
3
+ "version": "0.43.2",
4
4
  "description": "CLI + TypeScript SDK for the broods agent platform.",
5
5
  "keywords": [
6
6
  "agents",
@@ -59,7 +59,7 @@
59
59
  "esbuild": "^0.28.2"
60
60
  },
61
61
  "devDependencies": {
62
- "@ai-sdk/tui": "1.0.121",
62
+ "@ai-sdk/tui": "1.0.128",
63
63
  "@arethetypeswrong/cli": "^0.18.5",
64
64
  "@chat-adapter/discord": "^4.38.1",
65
65
  "@chat-adapter/github": "^4.38.1",
@@ -68,7 +68,7 @@
68
68
  "@modelcontextprotocol/server": "2.0.0",
69
69
  "@types/bun": "^1.3.14",
70
70
  "@typescript/typescript6": "6.0.2",
71
- "ai": "^7.0.120",
71
+ "ai": "^7.0.127",
72
72
  "publint": "^0.3.23",
73
73
  "rollup": "^4.62.4",
74
74
  "rollup-plugin-dts": "^6.5.1",
@@ -76,7 +76,7 @@
76
76
  "zod": "^4.4.3"
77
77
  },
78
78
  "peerDependencies": {
79
- "ai": "^7.0.120"
79
+ "ai": "^7.0.127"
80
80
  },
81
81
  "engines": {
82
82
  "node": ">=22.15"
@@ -1,19 +0,0 @@
1
- import{getToolName as St,isToolUIPart as J,readUIMessageStream as wt}from"ai";import{convertToModelMessages as te,generateId as ee,getToolName as re,isToolUIPart as Q}from"ai";var H=String.fromCharCode(27),ve=new RegExp(`${H}\\[[0-?]*[ -/]*[@-~]`,"g"),M=new RegExp(`^${H}\\[[0-?]*[ -/]*[@-~]`);function h(t){let e=0,r=0;while(r<t.length){let s=t.slice(r).match(M);if(s){r+=s[0].length;continue}let a=t.codePointAt(r);if(a==null)break;let i=String.fromCodePoint(a);e+=K(a),r+=i.length}return e}function v(t,e){if(e<=0)return"";let r="",s=0,a=0;while(a<t.length&&s<e){let i=t.slice(a).match(M);if(i){r+=i[0],a+=i[0].length;continue}let o=t.codePointAt(a);if(o==null)break;let u=String.fromCodePoint(o),l=K(o);if(l>0&&s+l>e)break;r+=u,a+=u.length,s+=l}while(a<t.length){let i=t.slice(a).match(M);if(!i)break;r+=i[0],a+=i[0].length}return r}function K(t){if(t===9)return 4;if(t<32||t>=127&&t<160)return 0;if(at(t))return 0;return nt(t)?2:1}function at(t){return t>=768&&t<=879||t>=1155&&t<=1161||t>=1425&&t<=1469||t===1471||t>=1473&&t<=1474||t>=1476&&t<=1477||t===1479||t>=1552&&t<=1562||t>=1611&&t<=1631||t===1648||t>=1750&&t<=1756||t>=1759&&t<=1764||t>=1767&&t<=1768||t>=1770&&t<=1773||t===1809||t>=1840&&t<=1866||t>=1958&&t<=1968||t>=2027&&t<=2035||t>=2070&&t<=2073||t>=2075&&t<=2083||t>=2085&&t<=2087||t>=2089&&t<=2093||t>=2137&&t<=2139||t>=2259&&t<=2306||t===2362||t===2364||t>=2369&&t<=2376||t===2381||t>=2385&&t<=2391||t===8205||t>=65024&&t<=65039||t>=917760&&t<=917999}function nt(t){return t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=128591||t>=129280&&t<=129535||t>=131072&&t<=262141)}function g(t,{multiline:e=!1}={}){let r="";for(let s of t){let a=s.charCodeAt(0);if(s===`
2
- `&&e)r+=`
3
- `;else if(s==="\t")r+=" ";else if(a<32||a>=127&&a<=159)r+=`\\u${a.toString(16).padStart(4,"0")}`;else r+=s}return r}var d={bold:"\x1B[1m",boldOff:"\x1B[22m",italic:"\x1B[3m",italicOff:"\x1B[23m"},it="─";function ot(t){let e=g(t,{multiline:!0}).split(`
4
- `),r=[];for(let s=0;s<e.length;s+=1){let a=ut(e,s);if(a!=null){r.push(...pt(a)),s=a.endIndex-1;continue}r.push(lt(e[s]??""))}return r.join(`
5
- `)}function lt(t){if(t.startsWith("### "))return p(`▶ ${t.slice(4)}`);if(t.startsWith("## "))return p(`■ ${t.slice(3)}`);if(t.startsWith("# "))return p(`█ ${t.slice(2)}`);let e=t.match(/^(\s*)[-+*]\s+(.*)$/);if(e){let[,r,s=""]=e;return p(`${r}•${s.length>0?` ${s}`:""}`)}if(/^\d+\. /.test(t))return p(t.replace(/^(\d+)\. /,"$1. "));if(t.startsWith("> "))return p(`│ ${t.slice(2)}`);return p(t)}function p(t){return t.replace(/`([^`]+)`/g,"$1").replace(/\*\*([^*\n]+)\*\*/g,`${d.bold}$1${d.boldOff}`).replace(/__([^_\n]+)__/g,`${d.bold}$1${d.boldOff}`).replace(/\*([^*\n]+)\*/g,`${d.italic}$1${d.italicOff}`).replace(/_([^_\n]+)_/g,`${d.italic}$1${d.italicOff}`)}function ut(t,e){let r=k(t[e]??"");if(r==null||r.length<2)return;let s=k(t[e+1]??"");if(s==null||s.length!==r.length)return;let a=ct(s);if(a==null)return;let i=[],o=e+2;while(o<t.length){let u=k(t[o]??"");if(u==null)break;i.push(dt(u,r.length)),o+=1}return{alignments:a,endIndex:o,header:r,rows:i}}function k(t){if(!t.includes("|"))return;let e=t.trim();if(e.startsWith("|"))e=e.slice(1);if(e.endsWith("|")&&!e.endsWith("\\|"))e=e.slice(0,-1);let r=[],s="";for(let a=0;a<e.length;a+=1){let i=e[a],o=e[a+1];if(i==="\\"&&o==="|"){s+="|",a+=1;continue}if(i==="|"){r.push(s.trim()),s="";continue}s+=i}return r.push(s.trim()),r}function ct(t){let e=[];for(let r of t){let s=r.match(/^(:)?-{3,}(:)?$/);if(s==null)return;let[,a,i]=s;e.push(a!=null&&i!=null?"center":i!=null?"right":"left")}return e}function dt(t,e){return Array.from({length:e},(r,s)=>t[s]??"")}function pt(t){let e=t.header.map((i)=>`${d.bold}${p(i)}${d.boldOff}`),r=t.rows.map((i)=>i.map(p)),s=[e,...r],a=t.alignments.map((i,o)=>Math.max(3,...s.map((u)=>h(u[o]??""))));return[E(e,a,t.alignments),a.map((i)=>it.repeat(i)).join(" "),...r.map((i)=>E(i,a,t.alignments))]}function E(t,e,r){return t.map((s,a)=>ht(s,e[a]??0,r[a]??"left")).join(" ")}function ht(t,e,r){let s=Math.max(0,e-h(t));if(r==="right")return`${" ".repeat(s)}${t}`;if(r==="center"){let a=Math.floor(s/2),i=s-a;return`${" ".repeat(a)}${t}${" ".repeat(i)}`}return`${t}${" ".repeat(s)}`}var j="─";function ft(t){let e=Math.max(20,t.width),r=Math.max(8,t.height),s=3,i=r-3-2,o=t.visibleBodyLines.slice(0,i);while(o.length<i)o.push("");return[A(e,t.title,t.rightTitle),...o.map((l)=>U(l,e)),R(e),A(e,t.inputActive?"Input":"Status"),U(t.inputActive?`> ${g(t.input)}${t.inputCursorVisible===!1?" ":"█"}`:g(t.status??"Streaming... ↑/↓ scroll · Ctrl+C quit"),e),R(e)].join(`
6
- `)}function A(t,e,r){e=g(e),r=r==null?void 0:g(r);let s=Math.max(0,t-2),a=e?v(` ${e} `,s):"",i=r?v(` ${r} `,Math.max(0,s-h(a))):"",o=Math.max(0,s-h(a)-h(i));return`┌${a}${j.repeat(o)}${i}┐`}function R(t){return`└${j.repeat(t-2)}┘`}function U(t,e){let r=e-4,s=v(t,r),a=" ".repeat(Math.max(0,r-h(s)));return`│ ${s}${a} │`}var y="\x1B",mt=`${y}[H`,gt=`${y}[2J`,vt=`${y}[2K`,yt=`${y}[?2026h`,bt=`${y}[?2026l`,xt=class{#e;#r;#i;#c=!1;#d=!1;constructor(t,e){this.#r=t.write.bind(t),this.#e=e?.useSynchronizedUpdates??!0,t.write=(r,s,a)=>{if(!this.#c)this.#d=!0;return this.#r(r,s,a)}}present(t){let e=Tt(t),r=this.#i&&!this.#d?kt(this.#i,e):`${mt}${gt}${t}`;if(this.#i=e,this.#d=!1,r.length===0)return;this.#S(r)}reset(){this.#i=void 0}#S(t){this.#c=!0;try{if(!this.#e){this.#r(t);return}this.#r(`${yt}${t}${bt}`)}finally{this.#c=!1}}};function Tt(t){return{lines:t.split(`
7
- `)}}function kt(t,e){let r="",s=Math.max(t.lines.length,e.lines.length);for(let a=0;a<s;a++){let i=e.lines[a];if(t.lines[a]===i)continue;r+=`${y}[${a+1};1H${vt}${i??""}`}return r}var Mt="outputTokensPerSecond",c={reset:"\x1B[0m",dim:"\x1B[2m",user:"\x1B[96m",assistant:"\x1B[92m",reasoning:"\x1B[94m",tool:"\x1B[95m",error:"\x1B[91m"},$t={user:{color:c.user,border:"─"},assistant:{color:c.assistant,border:"─"},reasoning:{color:c.reasoning,border:"·"},tool:{color:c.tool,border:"─"},error:{color:c.error,border:"─"}},Ct=500,It=new Intl.Segmenter(void 0,{granularity:"grapheme"}),m="↑/↓ · PgUp/PgDn · Esc/Ctrl+C",Bt="↑/↓ · PgUp/PgDn · q/Esc/Ctrl+C",b=`Processing input... ${m}`,L=`Processing tool results... ${m}`,S=`Streaming... ${m}`,O=`Executing tools... ${m}`,C=class{#e;#r;#i;#c;#d;#S;#F;#a=[];#u="";#g=!1;#p=0;#I="";#s=S;#w=!1;#n=!1;#h;#B;#f;#v;#y=!0;#b;#o;#x;#E;constructor(t){this.#e=t?.input??process.stdin,this.#r=t?.output??process.stdout,this.#i=t?.frameBuffer??new xt(this.#r),this.#c=t?.tools??"auto-collapsed",this.#d=t?.reasoning??"auto-collapsed",this.#S=t?.responseStatistics??Mt,this.#F=t?.contextSize,this.#B=t?.contextSize}async readPrompt(t){return this.#A(t),this.#g=!0,this.#u=t?.initialPrompt??"",this.#s=`Type a prompt and press Enter · ${m}`,this.#K(),this.#t(),await new Promise((e,r)=>{this.#o=(s)=>{let a=T(s);switch(a.type){case"character":this.#u+=a.value,this.#U(),this.#t();break;case"backspace":this.#u=Pt(this.#u),this.#U(),this.#t();break;case"enter":{let i=this.#u;this.#g=!1,this.#C(),this.#s=b,this.#N(i),this.#u="",this.#t(),this.#l(),e(i);break}case"up":case"down":this.#T(a.type);break;case"page-up":case"page-down":this.#$(a.type);break;case"ctrl-l":this.#k();break;case"escape":case"ctrl-c":this.#C(),this.#R(),r(w());break;case"ignore":break}},this.#M()})}async renderStream(t,e){this.#A(e),this.#g=!1,this.#s=b,this.#j(e?.submittedPrompt),this.#n=!1,this.#h=void 0,this.#f=void 0,this.#v=void 0;let r={tools:e?.tools??this.#c,reasoning:e?.reasoning??this.#d,responseStatistics:e?.responseStatistics??this.#S};this.#t();let s=new Promise((o)=>{this.#E=o});this.#o=(o)=>this.#H(o),this.#M();let a,i=Dt(this.#G(t.uiMessageStream));try{let o=wt({message:t.message,stream:i,onError:(u)=>this.#q("Error",At(u))});for await(let u of Et(o,s)){if(this.#n)break;a=u,this.#D(u,r)}if(!this.#n&&a&&this.#f!=null)this.#D(a,r)}finally{if(this.#E=void 0,this.#n)t.abort?.();if(this.#l(),this.#s=this.#n?"Interrupted":e?.continueSession?`Done · Enter another prompt · ${m}`:`Done · ${Bt}`,this.#t(),await this.#Z(e),this.#n||!e?.continueSession)this.#R()}if(this.#n)throw w();return a}async readToolApproval(t,e){return this.#A(e),this.#g=!1,this.#s=`Approve ${Ft(t)}? y/n · ${m}`,this.#n=!1,this.#t(),await new Promise((r,s)=>{this.#o=(a)=>{let i=T(a);switch(i.type){case"character":{let o=i.value.toLowerCase();if(o==="y")this.#s=`Approved · ${b}`,this.#l(),this.#t(),r({approved:!0});else if(o==="n")this.#s=`Denied · ${b}`,this.#l(),this.#t(),r({approved:!1,reason:"Denied by user."});break}case"up":case"down":this.#T(i.type);break;case"page-up":case"page-down":this.#$(i.type);break;case"ctrl-l":this.#k();break;case"escape":case"ctrl-c":this.#n=!0,this.#R(),s(w());break;default:break}},this.#M()})}#A(t){if(this.#I=t?.title??this.#I,this.#B=t?.contextSize??this.#F,this.#w)return;if(this.#w=!0,this.#i.reset(),this.#r.write("\x1B[?1049h\x1B[?25l"),this.#e.isTTY)this.#e.setRawMode?.(!0),this.#e.resume();this.#x=()=>this.#k(),this.#r.on("resize",this.#x)}#R(){if(this.#l(),this.#C(),!this.#w)return;if(this.#e.isTTY)this.#e.setRawMode?.(!1),this.#e.pause();if(this.#x)this.#r.off("resize",this.#x),this.#x=void 0;this.#r.write("\x1B[?25h\x1B[?1049l"),this.#i.reset(),this.#w=!1}#M(){if(this.#o)this.#e.on("data",this.#o)}#l(){if(this.#o)this.#e.off("data",this.#o),this.#o=void 0}#H(t){let e=T(t);switch(e.type){case"up":case"down":this.#T(e.type);break;case"page-up":case"page-down":this.#$(e.type);break;case"ctrl-l":this.#k();break;case"escape":case"ctrl-c":this.#n=!0,this.#E?.();break;default:break}}#T(t,e=1){let r=t==="up"?e:-e;this.#p=this.#_(this.#p+r),this.#t()}#$(t){this.#T(t==="page-up"?"up":"down",this.#W())}#K(){this.#C(),this.#U(),this.#b=setInterval(()=>{this.#y=!this.#y,this.#t()},Ct),this.#b.unref?.()}#C(){if(this.#b)clearInterval(this.#b),this.#b=void 0;this.#y=!0}#U(){this.#y=!0}#j(t){if(t==null)return;let e=this.#a.at(-1);if(e?.kind==="user"&&e.content===t)return;this.#N(t)}#N(t){let e=this.#m();this.#a.push({kind:"user",title:"User",content:t}),this.#O(e)}#D(t,e){let r=this.#m(),s=new Set,a=Jt(t.metadata);this.#h=a.totalTokens??this.#h,this.#f=a.outputTokens??this.#f,this.#v=a.outputTokensPerSecond??this.#v;for(let[i,o]of t.parts.entries()){let u=Nt(t.id,i);switch(o.type){case"text":{let l=o.text.trim();if(l.length===0)break;s.add(u),this.#L({id:u,kind:"assistant",title:"Assistant",rightTitle:Zt({totalTokens:this.#h,outputTokens:this.#f,outputTokensPerSecond:this.#v},e.responseStatistics),content:l});break}case"reasoning":{let l=o.text.trim();if(e.reasoning==="hidden"||l.length===0)break;s.add(u),this.#L({id:u,kind:"reasoning",title:"Reasoning",content:l,collapsed:W(t,i,e.reasoning,e)});break}default:if(J(o)){if(e.tools==="hidden")break;s.add(u),this.#L({id:u,...Rt(o,{mode:e.tools,collapsed:W(t,i,e.tools,e)})})}break}}this.#J(t.id,s),this.#O(r)}#L(t){let e=t.id?this.#a.find((r)=>r.id===t.id):void 0;if(e){let r=e.cache;e.kind=t.kind,e.title=t.title,e.rightTitle=t.rightTitle,e.content=t.content,e.collapsed=t.collapsed,e.cache=r&&G(t,r)?r:void 0;return}this.#a.push(t)}#J(t,e){let r=`${t}:`;this.#a=this.#a.filter((s)=>s.id==null||!s.id.startsWith(r)||e.has(s.id))}async*#G(t){let e=!1;for await(let r of qt(t)){let s=Ot(r,{hasPendingToolResults:e});if(r.type==="start-step")e=!1;else if(Wt(r))e=!0;if(s&&this.#s!==s)this.#s=s,this.#t();else if(Lt(r)&&this.#s!==S)this.#s=S,this.#t();if(r.type==="error")this.#q("Error",r.errorText);if(r.type==="finish"){let a=jt(r);this.#h=a.totalTokens,this.#f=a.outputTokens,this.#v=a.outputTokensPerSecond}yield r}}#q(t,e){let r=this.#m();this.#a.push({kind:"error",title:t,content:e}),this.#O(r)}#O(t){if(this.#p!==0){let e=this.#m()-t;this.#p=this.#_(this.#p+e)}this.#t()}#t(){let t=ft({width:this.#z(),height:this.#V(),title:this.#I,rightTitle:Z(this.#h,this.#B),visibleBodyLines:this.#Y(),input:this.#u,inputActive:this.#g,inputCursorVisible:this.#y,status:this.#s});this.#i.present(t)}#k(){this.#i.reset(),this.#t()}#Y(){if(this.#a.length===0)return["Waiting for input..."];let t=this.#W(),e=this.#m(),r=Math.max(0,e-t-this.#p),s=r+t,a=[],i=0;for(let o of this.#a){let u=F(o,this.#z()-4),l=i+u.length;if(l>r&&i<s)a.push(...u.slice(Math.max(0,r-i),s-i));if(a.length>=t)break;i=l}return a}#_(t){let e=Math.max(0,this.#m()-this.#W());return Math.min(Math.max(0,t),e)}#m(){if(this.#a.length===0)return 1;let t=0;for(let e of this.#a)t+=F(e,this.#z()-4).length;return t}#W(){return Math.max(1,this.#V()-5)}#z(){return Math.max(20,this.#r.columns??80)}#V(){return Math.max(8,this.#r.rows??24)}async#Z(t){if(t?.waitForExit===!1||!this.#e.isTTY||this.#n)return;await new Promise((e)=>{this.#o=(r)=>{let s=T(r);switch(s.type){case"up":case"down":this.#T(s.type);break;case"page-up":case"page-down":this.#$(s.type);break;case"ctrl-l":this.#k();break;case"escape":this.#l(),e();break;case"character":if(s.value==="q")this.#l(),e();break;case"ctrl-c":this.#l(),process.exitCode=130,e();break;default:break}},this.#M()})}};function w(){return Error("Interrupted")}async function*Et(t,e){let r=t[Symbol.asyncIterator](),s=e.then(()=>({done:!0,value:void 0}));while(!0){let a=await Promise.race([r.next(),s]);if(a.done)break;yield a.value}}function At(t){if(t instanceof Error)return t.message;if(typeof t==="string")return t;return JSON.stringify(t)}function Rt(t,e){let r=St(t),s=`Tool · ${t.title??r}`,a="input"in t?t.input:void 0,i=a===void 0?"Input: (streaming...)":`Input:
8
- ${z(a)}`,o=zt(t);if(e.collapsed)return{kind:"tool",title:s,rightTitle:o,content:"",collapsed:!0};switch(t.state){case"input-streaming":return{kind:"tool",title:s,rightTitle:o,content:i};case"input-available":return{kind:"tool",title:s,rightTitle:o,content:i};case"approval-requested":return{kind:"tool",title:s,rightTitle:o,content:i};case"approval-responded":return{kind:"tool",title:s,rightTitle:o,content:i};case"output-available":return{kind:"tool",title:s,rightTitle:o,content:`${i}
9
-
10
- Output:
11
- ${z(t.output)}`};case"output-error":return{kind:"error",title:`Tool Error · ${t.title??r}`,rightTitle:o,content:`${i}
12
-
13
- Error:
14
- ${t.errorText}`};case"output-denied":return{kind:"error",title:`Tool Denied · ${t.title??r}`,rightTitle:o,content:`${i}
15
-
16
- Reason: ${t.approval.reason??"denied"}`}}}function W(t,e,r,s){switch(r){case"collapsed":return!0;case"auto-collapsed":return t.parts.slice(e+1).some((a)=>Ut(a,s));case"full":case"hidden":return!1}}function Ut(t,e){switch(t.type){case"text":return t.text.trim().length>0;case"reasoning":return e.reasoning!=="hidden"&&t.text.trim().length>0;default:return J(t)&&e.tools!=="hidden"}}function Lt(t){switch(t.type){case"text-start":case"text-delta":case"reasoning-start":case"reasoning-delta":case"tool-input-start":case"tool-input-delta":return!0;default:return!1}}function Ot(t,{hasPendingToolResults:e}){switch(t.type){case"start-step":return e?L:b;case"tool-output-available":case"tool-output-error":case"tool-output-denied":return L;case"tool-input-available":return O;case"tool-approval-response":return t.approved?O:void 0;default:return}}function Wt(t){switch(t.type){case"tool-output-available":case"tool-output-error":case"tool-output-denied":return!0;default:return!1}}function zt(t){switch(t.state){case"input-streaming":return"waiting";case"approval-requested":return"approval requested";case"input-available":return"executing";case"approval-responded":return t.approval.approved?"executing":"denied";case"output-available":case"output-error":return"done";case"output-denied":return"denied"}}function z(t){if(typeof t==="string")return t;return JSON.stringify(t,null,2)}function Ft(t){return`tool ${t.title??t.toolName}`}function Nt(t,e){return`${t}:${e}`}function Dt(t){if(t instanceof ReadableStream)return t;return new ReadableStream({async start(e){try{for await(let r of t)e.enqueue(r);e.close()}catch(r){e.error(r)}}})}async function*qt(t){if(t instanceof ReadableStream){let e=t.getReader();try{while(!0){let{done:r,value:s}=await e.read();if(r)return;yield s}}finally{e.releaseLock()}return}yield*t}function F(t,e){if(t.cache&&G(t,t.cache,e))return t.cache.lines;let r=_t(t,e);return t.cache={width:e,kind:t.kind,title:t.title,rightTitle:t.rightTitle,content:t.content,collapsed:t.collapsed===!0,lines:r},r}function G(t,e,r=e.width){return e.width===r&&e.kind===t.kind&&e.title===t.title&&e.rightTitle===t.rightTitle&&e.content===t.content&&e.collapsed===(t.collapsed===!0)}function _t(t,e){let r=$t[t.kind],s=Math.max(1,e-4),a=` ${g(t.title)} `,i=t.rightTitle?` ${g(t.rightTitle)} `:"";if(t.collapsed){let f=Math.max(0,e-2-a.length-i.length),rt=`${r.color}╭${a}${r.border.repeat(f)}${i}╮${c.reset}`,st=`${r.color}╰${r.border.repeat(Math.max(0,e-2))}╯${c.reset}`;return[rt,st]}let o=Math.max(0,e-2-a.length-i.length),u=`${r.color}╭${a}${r.border.repeat(o)}${i}╮${c.reset}`,l=`${r.color}╰${r.border.repeat(Math.max(0,e-2))}╯${c.reset}`,x=(t.content.length>0?ot(t.content):c.dim+"(streaming...)"+c.reset).split(`
17
- `).flatMap((f)=>Ht(f,s));return[u,...x.map((f)=>Vt(f,s,r.color)),l]}function Vt(t,e,r){let s=v(t,e),a=" ".repeat(Math.max(0,e-h(s)));return`${r}│${c.reset} ${s}${a} ${r}│${c.reset}`}function Ht(t,e){if(t.length===0)return[""];let r=[],s=t;while(h(s)>e){let a=Kt(s,e);r.push(s.slice(0,a).trimEnd()),s=s.slice(a).trimStart()}return r.push(s),r}function Kt(t,e){let s=v(t,e+1).lastIndexOf(" ");if(s>0)return s;return v(t,e).length}function jt(t){let e="usage"in t?t.usage:void 0,r="messageMetadata"in t?t.messageMetadata?.usage:void 0,s="messageMetadata"in t?t.messageMetadata?.performance:void 0;return{totalTokens:Y(e??r),outputTokens:B(e??r),outputTokensPerSecond:s?.outputTokensPerSecond}}function Jt(t){let e=t;return{totalTokens:Y(e?.usage),outputTokens:B(e?.usage),outputTokensPerSecond:e?.performance?.outputTokensPerSecond}}function Y(t){let e=t?.totalTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;let r=Gt(t),s=B(t);if(r!=null&&s!=null)return r+s}function Gt(t){let e=t?.inputTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;return t?.promptTokens}function B(t){let e=t?.outputTokens;if(typeof e==="number")return e;if(typeof e?.total==="number")return e.total;return t?.completionTokens}function Z(t,e){if(t==null)return;let r=`${t.toLocaleString()} ${t===1?"token":"tokens"}`,s=Yt(t,e);return s==null?r:`${r} ${s}`}function Yt(t,e){if(e==null||e<=0||!Number.isFinite(e))return;return`${Math.round(t/e*100).toLocaleString()}%`}function Zt(t,e){if(e==="outputTokensPerSecond")return Qt(t.outputTokensPerSecond);return Z(t.outputTokens)}function Qt(t){if(t==null)return;return`${Xt(t)} tok/s`}function Xt(t){return Number.isInteger(t)?t.toLocaleString():t.toLocaleString(void 0,{maximumFractionDigits:1})}function Pt(t){let e=0;for(let{index:r}of It.segment(t))e=r;return t.slice(0,e)}function T(t){let e=t.toString("utf8");switch(e){case"\f":return{type:"ctrl-l"};case"\x03":return{type:"ctrl-c"};case"\x1B":return{type:"escape"};case"\r":case`
18
- `:return{type:"enter"};case"":case"\b":return{type:"backspace"};case"\x1B[A":return{type:"up"};case"\x1B[B":return{type:"down"};case"\x1B[5~":return{type:"page-up"};case"\x1B[6~":return{type:"page-down"};default:if(e>=" "&&e!=="")return{type:"character",value:e};return{type:"ignore"}}}var se="outputTokensPerSecond",ae=class{constructor(t){this.chatId=ee(),this.agent=t.agent,this.transport=t.transport,this.renderer=ie(t)??ne(t),this.title=t.title,this.tools=t.tools??"auto-collapsed",this.reasoning=t.reasoning??"auto-collapsed",this.responseStatistics=t.responseStatistics??se,this.contextSize=t.contextSize,this.sandbox=t.sandbox}async run(){let t=this.title,e=[],r=0,s=()=>`message-${++r}`,a,i=!1,o=!1;while(!0){if(!o){if(a==null){if(!this.renderer.readPrompt){if(i)return;throw Error("No prompt was provided and the renderer does not support prompt input.")}try{a=await this.renderer.readPrompt({title:t})}catch(l){if(V(l))return;throw l}if(a==null)return}e.push(ue(s(),a)),i=!0}let u=await this.streamMessages([...e],s);try{let l=await this.renderer.renderStream(u,{title:t,submittedPrompt:a,continueSession:Boolean(this.renderer.readPrompt),tools:this.tools,reasoning:this.reasoning,responseStatistics:this.responseStatistics,contextSize:this.contextSize,waitForExit:!1});if(l&&l.parts.length>0){let n=ce(l);if(n.length>0){if(!this.renderer.readToolApproval)throw Error("Tool approval was requested, but the renderer does not support tool approval input.");for(let x of n){let f=await this.renderer.readToolApproval(x,{title:t});de(l,x,f)}D(e,l,o),o=!0,a=void 0;continue}D(e,l,o)}}catch(l){if(V(l))return;throw l}o=!1,a=void 0}}async streamMessages(t,e){let r=new AbortController,s=()=>r.abort();if(this.transport)return{uiMessageStream:await this.transport.sendMessages({trigger:"submit-message",chatId:this.chatId,messageId:void 0,messages:t,abortSignal:r.signal}),message:I(t),abort:s};let a=this.agent,i=await a.stream({prompt:await te(t,{tools:a.tools}),abortSignal:r.signal,options:void 0,experimental_sandbox:this.sandbox});return{uiMessageStream:oe(i.fullStream,e,t),message:I(t),abort:s}}};function ne(t){return t.tools===void 0&&t.reasoning===void 0&&t.responseStatistics===void 0&&t.contextSize===void 0?new C:new C({tools:t.tools,reasoning:t.reasoning,responseStatistics:t.responseStatistics,contextSize:t.contextSize})}function ie(t){if(t.renderer)return t.renderer;if(!t.screen&&!t.userInput)return;return new C({tools:t.tools,reasoning:t.reasoning,responseStatistics:t.responseStatistics,contextSize:t.contextSize,input:t.userInput,output:t.screen})}async function*oe(t,e,r=[]){let s=new Set,a=new Set,i=new Set,o,u,l=!1;yield{type:"start",messageId:I(r)?.id??e()};for await(let n of t)switch(n.type){case"text-start":s.add(n.id),yield{type:"text-start",id:n.id,providerMetadata:n.providerMetadata};break;case"text-delta":if(!s.has(n.id))s.add(n.id),yield{type:"text-start",id:n.id,providerMetadata:n.providerMetadata};yield{type:"text-delta",id:n.id,delta:n.text,providerMetadata:n.providerMetadata};break;case"text-end":s.delete(n.id),yield{type:"text-end",id:n.id,providerMetadata:n.providerMetadata};break;case"reasoning-start":a.add(n.id),yield{type:"reasoning-start",id:n.id,providerMetadata:n.providerMetadata};break;case"reasoning-delta":if(!a.has(n.id))a.add(n.id),yield{type:"reasoning-start",id:n.id,providerMetadata:n.providerMetadata};yield{type:"reasoning-delta",id:n.id,delta:n.text,providerMetadata:n.providerMetadata};break;case"reasoning-end":a.delete(n.id),yield{type:"reasoning-end",id:n.id,providerMetadata:n.providerMetadata};break;case"tool-input-start":yield{type:"tool-input-start",toolCallId:n.id,toolName:n.toolName,providerExecuted:n.providerExecuted,providerMetadata:n.providerMetadata,toolMetadata:n.toolMetadata,dynamic:n.dynamic,title:n.title};break;case"tool-input-delta":yield{type:"tool-input-delta",toolCallId:n.id,inputTextDelta:n.delta};break;case"tool-call":i.add(n.toolCallId),yield{type:"tool-input-available",toolCallId:n.toolCallId,toolName:n.toolName,input:n.input,providerExecuted:n.providerExecuted,providerMetadata:n.providerMetadata,toolMetadata:n.toolMetadata,dynamic:n.dynamic,title:n.title};break;case"tool-approval-request":if(!i.has(n.toolCall.toolCallId))i.add(n.toolCall.toolCallId),yield{type:"tool-input-available",toolCallId:n.toolCall.toolCallId,toolName:n.toolCall.toolName,input:n.toolCall.input,providerExecuted:n.toolCall.providerExecuted,providerMetadata:n.toolCall.providerMetadata,toolMetadata:n.toolCall.toolMetadata,dynamic:n.toolCall.dynamic,title:n.toolCall.title};yield{type:"tool-approval-request",approvalId:n.approvalId,toolCallId:n.toolCall.toolCallId,isAutomatic:n.isAutomatic};break;case"tool-approval-response":yield{type:"tool-approval-response",approvalId:n.approvalId,approved:n.approved,reason:n.reason,providerExecuted:n.providerExecuted};break;case"tool-result":yield{type:"tool-output-available",toolCallId:n.toolCallId,output:n.output,providerExecuted:n.providerExecuted,providerMetadata:n.providerMetadata,toolMetadata:n.toolMetadata,dynamic:n.dynamic,preliminary:n.preliminary};break;case"tool-error":yield{type:"tool-output-error",toolCallId:n.toolCallId,errorText:q(n.error),providerExecuted:n.providerExecuted,providerMetadata:n.providerMetadata,toolMetadata:n.toolMetadata,dynamic:n.dynamic};break;case"tool-output-denied":yield{type:"tool-output-denied",toolCallId:n.toolCallId};break;case"source":if(n.sourceType==="url")yield{type:"source-url",sourceId:n.id,url:n.url,title:n.title,providerMetadata:n.providerMetadata};else yield{type:"source-document",sourceId:n.id,mediaType:n.mediaType,title:n.title,filename:n.filename,providerMetadata:n.providerMetadata};break;case"file":yield{type:"file",url:_(n.file.mediaType,n.file.base64),mediaType:n.file.mediaType,providerMetadata:n.providerMetadata};break;case"reasoning-file":yield{type:"reasoning-file",url:_(n.file.mediaType,n.file.base64),mediaType:n.file.mediaType,providerMetadata:n.providerMetadata};break;case"start-step":yield{type:"start-step"};break;case"finish-step":o=n.usage,u=n.performance,yield{type:"finish-step"};break;case"finish":yield*N(s,a),l=!0,yield{type:"finish",finishReason:n.finishReason,messageMetadata:le(o??n.totalUsage,u)};break;case"abort":yield{type:"abort",reason:n.reason};break;case"error":yield{type:"error",errorText:q(n.error)};break}if(!l)yield*N(s,a),yield{type:"finish"}}function le(t,e){if(t?.totalTokens==null&&t?.outputTokens==null&&e?.outputTokensPerSecond==null)return;return{...t?.totalTokens==null&&t?.outputTokens==null?{}:{usage:{...t.totalTokens==null?{}:{totalTokens:t.totalTokens},...t.outputTokens==null?{}:{outputTokens:t.outputTokens}}},...e?.outputTokensPerSecond==null?{}:{performance:{outputTokensPerSecond:e.outputTokensPerSecond}}}}function*N(t,e){for(let r of t)yield{type:"text-end",id:r};t.clear();for(let r of e)yield{type:"reasoning-end",id:r};e.clear()}function ue(t,e){return{id:t,role:"user",parts:[{type:"text",text:e}]}}function D(t,e,r){if(r&&t.at(-1)?.role==="assistant"){t[t.length-1]=e;return}t.push(e)}function I(t){let e=t.at(-1);return e?.role==="assistant"?e:void 0}function ce(t){let e=[];for(let[r,s]of t.parts.entries()){if(!Q(s)||s.state!=="approval-requested"||s.approval.isAutomatic===!0)continue;e.push({approvalId:s.approval.id,toolCallId:s.toolCallId,toolName:re(s),title:s.title,input:s.input,providerExecuted:s.providerExecuted,messageId:t.id,partIndex:r})}return e}function de(t,e,r){let s=t.parts[e.partIndex];if(!s||!Q(s)||s.toolCallId!==e.toolCallId)throw Error(`Could not find tool approval request ${e.approvalId}.`);s.state="approval-responded",s.approval={id:e.approvalId,approved:r.approved,...r.reason?{reason:r.reason}:{}}}function q(t){if(t instanceof Error)return t.message;if(typeof t==="string")return t;return JSON.stringify(t)}function _(t,e){return`data:${t};base64,${e}`}function V(t){return t instanceof Error&&t.message==="Interrupted"}async function X(t){await new ae(t).run()}import{convertToModelMessages as pe,generateId as P,toTextStream as he,toUIMessageStream as fe}from"ai";async function $e(t){if(t.prompt!==void 0)me(t.prompt);await X({title:`broods · ${t.agent.name}`,tools:"full",transport:new tt(t.client,t.agent)})}async function Ce(t){let e=he({stream:et(t.client.stream(t.agent,{input:t.prompt}),void 0,()=>{})});for await(let r of e)process.stdout.write(r);process.stdout.write(`
19
- `)}async function me(t){let e=process.stdin.listenerCount("data"),r=Date.now()+1e4;while(process.stdin.listenerCount("data")<=e){if(Date.now()>r)return;await new Promise((s)=>setTimeout(s,20))}process.stdin.emit("data",Buffer.from(t)),process.stdin.emit("data",Buffer.from("\r"))}class tt{client;agent;conversationKey=`tui-${P()}`;sentApprovals=new Set;sentUserTurns=0;constructor(t,e){this.client=t;this.agent=e}async reconnectToStream(){return null}async sendMessages(t){let e=this.pendingEvents(await pe(t.messages));if(e.events.length===0)throw Error("Nothing new to send: the agent already saw this turn.");let r=this.client.stream(this.agent,{conversationKey:this.conversationKey,events:e.events});return fe({stream:et(r,t.abortSignal,e.commit),originalMessages:t.messages,generateMessageId:P,sendSources:!0})}pendingEvents(t){let e=[],r=[],s=0;for(let a of t){if(a.role==="user"){if(s+=1,s>this.sentUserTurns)e.push(a);continue}if(a.role!=="tool")continue;for(let i of a.content)if(i.type==="tool-approval-response"&&!this.sentApprovals.has(i.approvalId))r.push(i)}if(r.length>0)e.push({role:"tool",content:r});return{events:e,commit:()=>{this.sentUserTurns=s;for(let a of r)this.sentApprovals.add(a.approvalId)}}}}function ge(t){return new Promise((e)=>{if(!t)return;let r=()=>e({done:!0,value:void 0});if(t.aborted)r();else t.addEventListener("abort",r,{once:!0})})}function et(t,e,r){let s=!1,a=()=>void t.return(void 0);return new ReadableStream({pull:async function(i){let o=await Promise.race([t.next(),ge(e)]);if(e?.aborted){a(),i.close();return}if(!s)s=!0,r();if(o.done)i.close();else i.enqueue(o.value)},cancel:a})}export{$e as runAgentTui,Ce as streamAgentText};
File without changes