broods 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account.d.ts +2 -0
- package/dist/cli/index.js +1 -1
- package/dist/index.d.ts +3 -1
- package/package.json +1 -1
package/dist/account.d.ts
CHANGED
|
@@ -307,6 +307,8 @@ interface AgentTelegramChannelConfig {
|
|
|
307
307
|
webhookSecret?: string;
|
|
308
308
|
allowedChannelIds?: string[];
|
|
309
309
|
allowedUserIds?: string[];
|
|
310
|
+
/** Bot's @username, e.g. `tracy_bot`. Set it to answer only when the agent is mentioned. */
|
|
311
|
+
botUsername?: string;
|
|
310
312
|
reactionEmoji?: string;
|
|
311
313
|
trace?: "enabled" | "disabled";
|
|
312
314
|
partition?: ChannelPartition;
|
package/dist/cli/index.js
CHANGED
|
@@ -152,7 +152,7 @@ Reason: ${(a=e.approval.reason)!=null?a:"denied"}`}}}function Jp(e,t,r,n){switch
|
|
|
152
152
|
`).flatMap((p)=>Wx(p,n));return[i,...d.map((p)=>qx(p,n,r.color)),c]}function qx(e,t,r){let n=Bt(e,t),o=" ".repeat(Math.max(0,t-tt(n)));return`${r}│${me.reset} ${n}${o} ${r}│${me.reset}`}function Wx(e,t){if(e.length===0)return[""];let r=[],n=e;while(tt(n)>t){let o=Vx(n,t);r.push(n.slice(0,o).trimEnd()),n=n.slice(o).trimStart()}return r.push(n),r}function Vx(e,t){let n=Bt(e,t+1).lastIndexOf(" ");if(n>0)return n;return Bt(e,t).length}function Gx(e){var t,r;let n="usage"in e?e.usage:void 0,o="messageMetadata"in e?(t=e.messageMetadata)==null?void 0:t.usage:void 0,a="messageMetadata"in e?(r=e.messageMetadata)==null?void 0:r.performance:void 0;return{totalTokens:gf(n!=null?n:o),outputTokens:$a(n!=null?n:o),outputTokensPerSecond:a==null?void 0:a.outputTokensPerSecond}}function Jx(e){var t;let r=e;return{totalTokens:gf(r==null?void 0:r.usage),outputTokens:$a(r==null?void 0:r.usage),outputTokensPerSecond:(t=r==null?void 0:r.performance)==null?void 0:t.outputTokensPerSecond}}function gf(e){let t=e==null?void 0:e.totalTokens;if(typeof t==="number")return t;if(typeof(t==null?void 0:t.total)==="number")return t.total;let r=Kx(e),n=$a(e);if(r!=null&&n!=null)return r+n;return}function Kx(e){let t=e==null?void 0:e.inputTokens;if(typeof t==="number")return t;if(typeof(t==null?void 0:t.total)==="number")return t.total;return e==null?void 0:e.promptTokens}function $a(e){let t=e==null?void 0:e.outputTokens;if(typeof t==="number")return t;if(typeof(t==null?void 0:t.total)==="number")return t.total;return e==null?void 0:e.completionTokens}function vf(e,t){if(e==null)return;let r=`${e.toLocaleString()} ${e===1?"token":"tokens"}`,n=Hx(e,t);return n==null?r:`${r} ${n}`}function Hx(e,t){if(t==null||t<=0||!Number.isFinite(t))return;return`${Math.round(e/t*100).toLocaleString()}%`}function Yx(e,t){if(t==="outputTokensPerSecond")return Xx(e.outputTokensPerSecond);return vf(e.outputTokens)}function Xx(e){if(e==null)return;return`${Qx(e)} tok/s`}function Qx(e){return Number.isInteger(e)?e.toLocaleString():e.toLocaleString(void 0,{maximumFractionDigits:1})}function Tn(e){let t=e.toString("utf8");switch(t){case"\f":return{type:"ctrl-l"};case"\x03":return{type:"ctrl-c"};case"\x1B":return{type:"escape"};case"\r":case`
|
|
153
153
|
`: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(t>=" "&&t!=="")return{type:"character",value:t};return{type:"ignore"}}}var e_="outputTokensPerSecond",t_=class{constructor(e){this.chatId=jt();var t,r,n,o;this.agent=e.agent,this.transport=e.transport,this.renderer=(t=n_(e))!=null?t:r_(e),this.title=e.title,this.tools=(r=e.tools)!=null?r:"auto-collapsed",this.reasoning=(n=e.reasoning)!=null?n:"auto-collapsed",this.responseStatistics=(o=e.responseStatistics)!=null?o:e_,this.contextSize=e.contextSize,this.sandbox=e.sandbox}async run(){let e=this.title,t=[],r=0,n=()=>`message-${++r}`,o,a=!1,s=!1;while(!0){if(!s){if(o==null){if(!this.renderer.readPrompt){if(a)return;throw Error("No prompt was provided and the renderer does not support prompt input.")}try{o=await this.renderer.readPrompt({title:e})}catch(c){if(ef(c))return;throw c}if(o==null)return}t.push(s_(n(),o)),a=!0}let i=await this.streamMessages([...t],n);try{let c=await this.renderer.renderStream(i,{title:e,submittedPrompt:o,continueSession:Boolean(this.renderer.readPrompt),tools:this.tools,reasoning:this.reasoning,responseStatistics:this.responseStatistics,contextSize:this.contextSize,waitForExit:!1});if(c&&c.parts.length>0){let u=i_(c);if(u.length>0){if(!this.renderer.readToolApproval)throw Error("Tool approval was requested, but the renderer does not support tool approval input.");for(let d of u){let p=await this.renderer.readToolApproval(d,{title:e});l_(c,d,p)}Yp(t,c,s),s=!0,o=void 0;continue}Yp(t,c,s)}}catch(c){if(ef(c))return;throw c}s=!1,o=void 0}}async streamMessages(e,t){let r=new AbortController,n=()=>r.abort();if(this.transport)return{uiMessageStream:await this.transport.sendMessages({trigger:"submit-message",chatId:this.chatId,messageId:void 0,messages:e,abortSignal:r.signal}),message:_a(e),abort:n};let o=this.agent,a=await o.stream({prompt:await mn(e,{tools:o.tools}),abortSignal:r.signal,options:void 0,experimental_sandbox:this.sandbox});return{uiMessageStream:o_(a.fullStream,t,e),message:_a(e),abort:n}}};function r_(e){return e.tools===void 0&&e.reasoning===void 0&&e.responseStatistics===void 0&&e.contextSize===void 0?new xa:new xa({tools:e.tools,reasoning:e.reasoning,responseStatistics:e.responseStatistics,contextSize:e.contextSize})}function n_(e){if(e.renderer)return e.renderer;if(!e.screen&&!e.userInput)return;return new xa({tools:e.tools,reasoning:e.reasoning,responseStatistics:e.responseStatistics,contextSize:e.contextSize,input:e.userInput,output:e.screen})}async function*o_(e,t,r=[]){var n,o;let a=new Set,s=new Set,i=new Set,c,u,d=!1;yield{type:"start",messageId:(o=(n=_a(r))==null?void 0:n.id)!=null?o:t()};for await(let p of e)switch(p.type){case"text-start":a.add(p.id),yield{type:"text-start",id:p.id,providerMetadata:p.providerMetadata};break;case"text-delta":if(!a.has(p.id))a.add(p.id),yield{type:"text-start",id:p.id,providerMetadata:p.providerMetadata};yield{type:"text-delta",id:p.id,delta:p.text,providerMetadata:p.providerMetadata};break;case"text-end":a.delete(p.id),yield{type:"text-end",id:p.id,providerMetadata:p.providerMetadata};break;case"reasoning-start":s.add(p.id),yield{type:"reasoning-start",id:p.id,providerMetadata:p.providerMetadata};break;case"reasoning-delta":if(!s.has(p.id))s.add(p.id),yield{type:"reasoning-start",id:p.id,providerMetadata:p.providerMetadata};yield{type:"reasoning-delta",id:p.id,delta:p.text,providerMetadata:p.providerMetadata};break;case"reasoning-end":s.delete(p.id),yield{type:"reasoning-end",id:p.id,providerMetadata:p.providerMetadata};break;case"tool-input-start":yield{type:"tool-input-start",toolCallId:p.id,toolName:p.toolName,providerExecuted:p.providerExecuted,providerMetadata:p.providerMetadata,toolMetadata:p.toolMetadata,dynamic:p.dynamic,title:p.title};break;case"tool-input-delta":yield{type:"tool-input-delta",toolCallId:p.id,inputTextDelta:p.delta};break;case"tool-call":i.add(p.toolCallId),yield{type:"tool-input-available",toolCallId:p.toolCallId,toolName:p.toolName,input:p.input,providerExecuted:p.providerExecuted,providerMetadata:p.providerMetadata,toolMetadata:p.toolMetadata,dynamic:p.dynamic,title:p.title};break;case"tool-approval-request":if(!i.has(p.toolCall.toolCallId))i.add(p.toolCall.toolCallId),yield{type:"tool-input-available",toolCallId:p.toolCall.toolCallId,toolName:p.toolCall.toolName,input:p.toolCall.input,providerExecuted:p.toolCall.providerExecuted,providerMetadata:p.toolCall.providerMetadata,toolMetadata:p.toolCall.toolMetadata,dynamic:p.toolCall.dynamic,title:p.toolCall.title};yield{type:"tool-approval-request",approvalId:p.approvalId,toolCallId:p.toolCall.toolCallId,isAutomatic:p.isAutomatic};break;case"tool-approval-response":yield{type:"tool-approval-response",approvalId:p.approvalId,approved:p.approved,reason:p.reason,providerExecuted:p.providerExecuted};break;case"tool-result":yield{type:"tool-output-available",toolCallId:p.toolCallId,output:p.output,providerExecuted:p.providerExecuted,providerMetadata:p.providerMetadata,toolMetadata:p.toolMetadata,dynamic:p.dynamic,preliminary:p.preliminary};break;case"tool-error":yield{type:"tool-output-error",toolCallId:p.toolCallId,errorText:Xp(p.error),providerExecuted:p.providerExecuted,providerMetadata:p.providerMetadata,toolMetadata:p.toolMetadata,dynamic:p.dynamic};break;case"tool-output-denied":yield{type:"tool-output-denied",toolCallId:p.toolCallId};break;case"source":if(p.sourceType==="url")yield{type:"source-url",sourceId:p.id,url:p.url,title:p.title,providerMetadata:p.providerMetadata};else yield{type:"source-document",sourceId:p.id,mediaType:p.mediaType,title:p.title,filename:p.filename,providerMetadata:p.providerMetadata};break;case"file":yield{type:"file",url:Qp(p.file.mediaType,p.file.base64),mediaType:p.file.mediaType,providerMetadata:p.providerMetadata};break;case"reasoning-file":yield{type:"reasoning-file",url:Qp(p.file.mediaType,p.file.base64),mediaType:p.file.mediaType,providerMetadata:p.providerMetadata};break;case"start-step":yield{type:"start-step"};break;case"finish-step":c=p.usage,u=p.performance,yield{type:"finish-step"};break;case"finish":yield*Hp(a,s),d=!0,yield{type:"finish",finishReason:p.finishReason,messageMetadata:a_(c!=null?c:p.totalUsage,u)};break;case"abort":yield{type:"abort",reason:p.reason};break;case"error":yield{type:"error",errorText:Xp(p.error)};break}if(!d)yield*Hp(a,s),yield{type:"finish"}}function a_(e,t){if((e==null?void 0:e.totalTokens)==null&&(e==null?void 0:e.outputTokens)==null&&(t==null?void 0:t.outputTokensPerSecond)==null)return;return{...(e==null?void 0:e.totalTokens)==null&&(e==null?void 0:e.outputTokens)==null?{}:{usage:{...e.totalTokens==null?{}:{totalTokens:e.totalTokens},...e.outputTokens==null?{}:{outputTokens:e.outputTokens}}},...(t==null?void 0:t.outputTokensPerSecond)==null?{}:{performance:{outputTokensPerSecond:t.outputTokensPerSecond}}}}function*Hp(e,t){for(let r of e)yield{type:"text-end",id:r};e.clear();for(let r of t)yield{type:"reasoning-end",id:r};t.clear()}function s_(e,t){return{id:e,role:"user",parts:[{type:"text",text:t}]}}function Yp(e,t,r){var n;if(r&&((n=e.at(-1))==null?void 0:n.role)==="assistant"){e[e.length-1]=t;return}e.push(t)}function _a(e){let t=e.at(-1);return(t==null?void 0:t.role)==="assistant"?t:void 0}function i_(e){let t=[];for(let[r,n]of e.parts.entries()){if(!le(n)||n.state!=="approval-requested"||n.approval.isAutomatic===!0)continue;t.push({approvalId:n.approval.id,toolCallId:n.toolCallId,toolName:Qe(n),title:n.title,input:n.input,providerExecuted:n.providerExecuted,messageId:e.id,partIndex:r})}return t}function l_(e,t,r){let n=e.parts[t.partIndex];if(!n||!le(n)||n.toolCallId!==t.toolCallId)throw Error(`Could not find tool approval request ${t.approvalId}.`);n.state="approval-responded",n.approval={id:t.approvalId,approved:r.approved,...r.reason?{reason:r.reason}:{}}}function Xp(e){if(e instanceof Error)return e.message;if(typeof e==="string")return e;return JSON.stringify(e)}function Qp(e,t){return`data:${e};base64,${t}`}function ef(e){return e instanceof Error&&e.message==="Interrupted"}async function yf(e){await new t_(e).run()}async function bf(e){if(e.prompt!==void 0)c_(e.prompt);await yf({title:`broods · ${e.agent.name}`,tools:"full",transport:new xf(e.client,e.agent)})}async function wf(e){let t=Np({stream:_f(e.client.stream(e.agent,{input:e.prompt}),void 0,()=>{})});for await(let r of t)process.stdout.write(r);process.stdout.write(`
|
|
154
154
|
`)}async function c_(e){let t=process.stdin.listenerCount("data"),r=Date.now()+1e4;while(process.stdin.listenerCount("data")<=t){if(Date.now()>r)return;await new Promise((n)=>setTimeout(n,20))}process.stdin.emit("data",Buffer.from(e)),process.stdin.emit("data",Buffer.from("\r"))}class xf{client;agent;conversationKey=`tui-${jt()}`;sentApprovals=new Set;sentUserTurns=0;constructor(e,t){this.client=e;this.agent=t}async reconnectToStream(){return null}async sendMessages(e){let t=this.pendingEvents(await mn(e.messages));if(t.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:t.events});return Up({stream:_f(r,e.abortSignal,t.commit),originalMessages:e.messages,generateMessageId:jt,sendSources:!0})}pendingEvents(e){let t=[],r=[],n=0;for(let o of e){if(o.role==="user"){if(n+=1,n>this.sentUserTurns)t.push(o);continue}if(o.role!=="tool")continue;for(let a of o.content)if(a.type==="tool-approval-response"&&!this.sentApprovals.has(a.approvalId))r.push(a)}if(r.length>0)t.push({role:"tool",content:r});return{events:t,commit:()=>{this.sentUserTurns=n;for(let o of r)this.sentApprovals.add(o.approvalId)}}}}function _f(e,t,r){let n=!1,o=()=>void e.return(void 0);return new ReadableStream({pull:async function(a){let s=await Promise.race([e.next(),u_(t)]);if(t?.aborted){o(),a.close();return}if(!n)n=!0,r();if(s.done)a.close();else a.enqueue(s.value)},cancel:o})}function u_(e){return new Promise((t)=>{if(!e)return;let r=()=>t({done:!0,value:void 0});if(e.aborted)r();else e.addEventListener("abort",r,{once:!0})})}import{existsSync as Sf}from"node:fs";import{mkdir as d_,readFile as p_,writeFile as f_}from"node:fs/promises";import{dirname as Ef,join as Ma,resolve as m_,sep as at}from"node:path";import{fileURLToPath as h_}from"node:url";var Ra=Ma(Ef($n),"update-check.json"),g_=86400000,v_="https://registry.npmjs.org/broods/latest",y_=2000;function Aa(e,t){let r=If(e),n=If(t);for(let o=0;o<3;o+=1){let a=r[o]??0,s=n[o]??0;if(a!==s)return a>s}return!Tf(e)&&Tf(t)}async function Ca(e={}){let t=await x_(),r=e.maxAgeMs??g_;if(t&&Date.now()-t.checkedAt<r)return t.latest;let n=await b_();if(n===null)return t?.latest??null;return await __({checkedAt:Date.now(),latest:n}),n}function kf(e=m_(process.cwd()),t=h_(import.meta.url)){let r=`${at}node_modules${at}`,n=t.lastIndexOf(r),o=n===-1?null:t.slice(0,n),a=o===null?t.startsWith(`${e}${at}`):e===o||e.startsWith(`${o}${at}`),i=t.includes(`${at}.bun${at}install${at}global${at}`)||a&&w_(o??e)?"bun":"npm",c=i==="bun"?"add":"install";return{manager:i,global:!a,command:i,args:a?[c,"broods@latest"]:[c,"-g","broods@latest"]}}async function b_(){try{let e=await fetch(v_,{signal:AbortSignal.timeout(y_),headers:{accept:"application/json"}});if(!e.ok)return null;let t=await e.json();return typeof t.version==="string"?t.version:null}catch{return null}}function w_(e){return Sf(Ma(e,"bun.lock"))||Sf(Ma(e,"bun.lockb"))}function Tf(e){return e.includes("-")}async function x_(){try{let e=JSON.parse(await p_(Ra,"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 If(e){let[t]=e.trim().replace(/^v/,"").split("-");return(t??"").split(".").slice(0,3).map((r)=>Number.parseInt(r,10)||0)}async function __(e){try{await d_(Ef(Ra),{recursive:!0}),await f_(Ra,`${JSON.stringify(e)}
|
|
155
|
-
`,"utf8")}catch{}}var $f={name:"broods",version:"0.
|
|
155
|
+
`,"utf8")}catch{}}var $f={name:"broods",version:"0.22.0",description:"CLI + TypeScript SDK for the broods agent platform.",type:"module",license:"MIT",homepage:"https://github.com/beeblastco/broods#readme",repository:{type:"git",url:"git+https://github.com/beeblastco/broods.git",directory:"packages/broods"},bugs:{url:"https://github.com/beeblastco/broods/issues"},keywords:["agents","ai","sdk","cli","broods"],bin:{broods:"dist/cli/index.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./account":{types:"./dist/account.d.ts",import:"./dist/account.js"}},typesVersions:{"*":{account:["./dist/account.d.ts"]}},main:"./dist/index.js",types:"./dist/index.d.ts",files:["dist","README.md","LICENSE.md"],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 .",test:"bun test"},engines:{node:">=22.15"},dependencies:{esbuild:"^0.28.2"},peerDependencies:{ai:"^7.0.68"},devDependencies:{"@ai-sdk/tui":"^1.0.69","@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","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.68",publint:"^0.3.23",rollup:"^4.62.4","rollup-plugin-dts":"^6.5.1",typescript:"^7.0.2"}};var st=$f.version,lt="https://dashboard.broods.app",Jt="eu-west-1",R_=[{region:"eu-west-1",label:"eu-west-1 (Ireland)"},{region:"us-east-1",label:"us-east-1 (US East)"},{region:"ap-southeast-1",label:"ap-southeast-1 (Singapore)"}],ge=`Global options:
|
|
156
156
|
--project <name> Project name override (default: package name or folder)
|
|
157
157
|
--stage <name> Target stage override (BROODS_STAGE otherwise)
|
|
158
158
|
--base-url <url> broods API base URL for sync/env calls (default: discovered at login)
|
package/dist/index.d.ts
CHANGED
|
@@ -307,6 +307,8 @@ interface AgentTelegramChannelConfig {
|
|
|
307
307
|
webhookSecret?: string;
|
|
308
308
|
allowedChannelIds?: string[];
|
|
309
309
|
allowedUserIds?: string[];
|
|
310
|
+
/** Bot's @username, e.g. `tracy_bot`. Set it to answer only when the agent is mentioned. */
|
|
311
|
+
botUsername?: string;
|
|
310
312
|
reactionEmoji?: string;
|
|
311
313
|
trace?: "enabled" | "disabled";
|
|
312
314
|
partition?: ChannelPartition;
|
|
@@ -1841,7 +1843,7 @@ type ConnectionIdentityInput = {
|
|
|
1841
1843
|
/** Provider user ids allowed to trigger the agent. `["*"]` or omitted is everyone. */
|
|
1842
1844
|
allowedUserIds?: readonly string[];
|
|
1843
1845
|
};
|
|
1844
|
-
type TelegramConnectionInput = EnvRefString<RequiredChannelKeys<Pick<AgentTelegramChannelConfig, "apiUrl" | "botToken" | "webhookSecret" | "reactionEmoji">, "botToken" | "webhookSecret">> & ConnectionIdentityInput;
|
|
1846
|
+
type TelegramConnectionInput = EnvRefString<RequiredChannelKeys<Pick<AgentTelegramChannelConfig, "apiUrl" | "botToken" | "webhookSecret" | "botUsername" | "reactionEmoji">, "botToken" | "webhookSecret">> & ConnectionIdentityInput;
|
|
1845
1847
|
type GitHubConnectionInput = EnvRefString<RequiredChannelKeys<Pick<AgentGitHubChannelConfig, "apiUrl" | "webhookSecret" | "appId" | "privateKey" | "userName" | "botUserId" | "triggerOnIssueOpen" | "triggerOnPROpen">, "webhookSecret" | "appId" | "privateKey">> & ConnectionIdentityInput;
|
|
1846
1848
|
type SlackConnectionInput = EnvRefString<RequiredChannelKeys<Pick<AgentSlackChannelConfig, "apiUrl" | "botToken" | "signingSecret" | "reactionEmoji">, "botToken" | "signingSecret">> & ConnectionIdentityInput;
|
|
1847
1849
|
type DiscordConnectionInput = EnvRefString<RequiredChannelKeys<Pick<AgentDiscordChannelConfig, "apiUrl" | "botToken" | "publicKey" | "botUserId" | "mentionRoleIds">, "botToken" | "publicKey">> & ConnectionIdentityInput;
|