broods 0.33.2 → 0.33.3
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 +1 -0
- package/dist/account.js +1 -1
- package/dist/{chunk-2mmzrp1w.js → chunk-7dq2qhaa.js} +1 -1
- package/dist/{chunk-0p445bm3.js → chunk-7keawrjg.js} +1 -1
- package/dist/{chunk-0622rd68.js → chunk-9emkj9m1.js} +2 -2
- package/dist/{chunk-pvpa68ca.js → chunk-rea5p7sh.js} +4 -4
- package/dist/cli/index.js +3 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.js +1 -1
- package/package.json +1 -1
- /package/dist/{chunk-ttrs3r94.js → chunk-rjx0qg7x.js} +0 -0
package/dist/account.d.ts
CHANGED
package/dist/account.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ce,m,L,U}from"./chunk-9emkj9m1.js";export{m as BroodsAccountApiError,U as BroodsAccountClient,Ce as envPlaceholder,L as resolveEnvCredential};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N}from"./chunk-ttrs3r94.js";import{L,U}from"./chunk-0622rd68.js";import{e,o,i,l,s}from"./cli/index.js";var R={project:e().optional(),stage:e().optional()},M={sandboxId:e().min(1),reservationKey:e().min(1)},v=i().describe("Must be true, after the owner has agreed to this delete."),E="'********' keeps a stored secret and null deletes a field: never send a placeholder you did not read from a get.",A=[{singular:"agent",plural:"agents",key:"agentId",createHint:"Needs name and config; a 409 returns the existing agentId.",deleteHint:"Deleting an agent also drops its runtime rows.",updateHint:E,list:(t)=>t.listAgents(),get:(t,r)=>t.getAgent(r),create:(t,r)=>t.createAgent(r),update:(t,r,n)=>t.updateAgent(r,n),remove:(t,r)=>t.deleteAgent(r)},{singular:"cron",plural:"crons",key:"cronId",createHint:"Needs name, agentId, scheduleExpression (rate/cron/at) and input or events.",list:(t)=>t.listCrons(),get:(t,r)=>t.getCron(r),create:(t,r)=>t.createCron(r),update:(t,r,n)=>t.updateCron(r,n),remove:(t,r)=>t.deleteCron(r)},{singular:"sandbox",plural:"sandboxes",key:"sandboxId",updateHint:E,list:(t)=>t.listSandboxes(),get:(t,r)=>t.getSandbox(r),create:(t,r)=>t.createSandbox(r),update:(t,r,n)=>t.updateSandbox(r,n),remove:(t,r)=>t.deleteSandbox(r)},{singular:"workspace",plural:"workspaces",key:"workspaceId",list:(t)=>t.listWorkspaces(),get:(t,r)=>t.getWorkspace(r),create:(t,r)=>t.createWorkspace(r),update:(t,r,n)=>t.updateWorkspace(r,n),remove:(t,r)=>t.deleteWorkspace(r)},{singular:"policy",plural:"policies",key:"policyId",createHint:"Agent-runtime policy document (tool.call, skill.load), not API credential scoping.",list:(t)=>t.listPolicies(),get:(t,r)=>t.getPolicy(r),create:(t,r)=>t.createPolicy(r),update:(t,r,n)=>t.updatePolicy(r,n),remove:(t,r)=>t.deletePolicy(r)},{singular:"role",plural:"roles",key:"roleId",createHint:"Needs name and a version-1 policy over the API namespace, e.g. agents:read. Account secret only.",list:(t)=>t.listRoles(),get:(t,r)=>t.getRole(r),create:(t,r)=>t.createRole(r),update:(t,r,n)=>t.updateRole(r,n),remove:(t,r)=>t.deleteRole(r)},{singular:"channel",plural:"channels",key:"channelId",list:(t)=>t.listChannels(),get:(t,r)=>t.getChannel(r),create:(t,r)=>t.createChannel(r),update:(t,r,n)=>t.updateChannel(r,n),remove:(t,r)=>t.deleteChannel(r)},{singular:"skill",plural:"skills",key:"skillName",createHint:'source is "files" (base64), "json" or "github". The stored name comes from the SKILL.md frontmatter.',list:(t)=>t.listSkills(),get:(t,r)=>t.getSkill(r),create:(t,r)=>t.createSkill(r),remove:(t,r)=>t.deleteSkill(r)},{singular:"mcp",plural:"mcp",key:"serverId",scoped:!0,list:(t,r)=>t.listMcp(r),get:(t,r)=>t.getMcp(r),create:(t,r,n)=>t.createMcp(n,r),update:(t,r,n)=>t.updateMcp(r,n),remove:(t,r)=>t.deleteMcp(r)}];function qt(t={}){let r=L()?new U({}):null;if(!r&&!t.cli)throw Error("broods mcp needs a credential: set BROODS_SESSION_TOKEN or BROODS_ACCOUNT_SECRET, or run `broods login`.");let n=new N({name:"broods",version:"1"},{capabilities:{tools:{}}});if(r){for(let a of A)O(n,r,a,t.scope??{});q(n,r)}if(t.cli)j(n,t.cli);if(t.allowDestructive)x(n,r,t.cli??null);return n}function k(t){return{content:[{type:"text",text:JSON.stringify(t??null,null,2)}]}}function P(t){return{content:[{type:"text",text:t instanceof Error?t.message:String(t)}],isError:!0}}function w(t,r){if(!t)throw Error(`Refusing without confirm:true. ${r}`)}async function d(t){try{return k(await t())}catch(r){return P(r)}}function b(t,r,n,a){if(!t.scoped)return;let c=n??r.project,p=a??r.stage;if(!c||!p)throw Error(`${t.plural} live in one stage, so this call needs both 'project' and 'stage'`);return{project:c,stage:p}}function O(t,r,n,a){let c=e().min(1).describe(`The ${n.key}.`),p=n.scoped?` ${n.plural} live in one stage, so this also takes 'project' and 'stage'.`:"",{list:f,get:g,create:y,update:S,remove:_}=n;if(f){let u=`List every ${n.singular} on the account.${p}`;if(n.scoped)t.registerTool(`list-${n.plural}`,{description:u,inputSchema:R},async({project:h,stage:m})=>await d(async()=>await f(r,b(n,a,h,m))));else t.registerTool(`list-${n.plural}`,{description:u,inputSchema:{}},async()=>await d(async()=>await f(r)))}if(g)t.registerTool(`get-${n.singular}`,{description:`Read one ${n.singular} by ${n.key}.`,inputSchema:{id:c}},async({id:u})=>await d(async()=>await g(r,u)));if(y){let u=`Create one ${n.singular}. 'body' is the request body the config plane documents.`+(n.createHint?` ${n.createHint}`:"")+p+" Prefer changing the broods/ manifest and deploying for anything the project already declares.",h=s(e(),l());if(n.scoped)t.registerTool(`create-${n.singular}`,{description:u,inputSchema:{body:h,...R}},async({body:m,project:T,stage:I})=>await d(async()=>await y(r,m,b(n,a,T,I))));else t.registerTool(`create-${n.singular}`,{description:u,inputSchema:{body:h}},async({body:m})=>await d(async()=>await y(r,m)))}if(S)t.registerTool(`update-${n.singular}`,{description:`Deep-merge a patch into one ${n.singular} and return the updated record, so there is no need to read it back.`+(n.updateHint?` ${n.updateHint}`:""),inputSchema:{id:c,body:s(e(),l())}},async({id:u,body:h})=>await d(async()=>await S(r,u,h)));if(_)t.registerTool(`delete-${n.singular}`,{description:`Delete one ${n.singular}. Requires confirm:true, and takes one ${n.key} per call: never loop this over a list.`+(n.deleteHint?` ${n.deleteHint}`:""),inputSchema:{id:c,confirm:v}},async({id:u,confirm:h})=>await d(async()=>(w(h,`Deleting ${n.singular} '${u}' goes away for good: name it, get the owner's agreement, then retry.`),{deleted:await _(r,u),id:u})))}function q(t,r){t.registerTool("list-cron-runs",{description:"Run history for one cron, newest first. Check this before telling anyone a cron fired.",inputSchema:{cronId:e().min(1),limit:o().int().positive().max(100).optional()}},async({cronId:a,limit:c})=>await d(async()=>await r.listCronRuns(a,c===void 0?{}:{limit:c})));let n=[["suspend-sandbox","Suspend a persistent sandbox reservation.",(a,c)=>r.suspendSandbox(a,c)],["resume-sandbox","Resume a suspended sandbox reservation.",(a,c)=>r.resumeSandbox(a,c)],["terminate-sandbox","Terminate a sandbox reservation and drop its live-instance row. Terminate only a sandbox you created, and never one holding state you did not put there.",(a,c)=>r.terminateSandbox(a,c)],["open-sandbox-terminal","Mint a short-lived sealed ticket for an interactive PTY session on a persistent sandbox.",(a,c)=>r.openSandboxTerminal(a,c)]];for(let[a,c,p]of n)t.registerTool(a,{description:c,inputSchema:M},async({sandboxId:f,reservationKey:g})=>await d(async()=>await p(f,g)));t.registerTool("snapshot-sandbox",{description:"Snapshot a sandbox reservation into a reusable image (self-hosted provider).",inputSchema:{sandboxId:e().min(1),reservationKey:e().min(1),name:e().min(1)}},async({sandboxId:a,reservationKey:c,name:p})=>await d(async()=>await r.snapshotSandbox(a,c,p))),t.registerTool("upload-skill",{description:"Replace one skill's bundle wholesale (PUT, not a merge) by skillName. 'body' is the same source shape create-skill takes.",inputSchema:{id:e().min(1).describe("The skillName."),body:s(e(),l())}},async({id:a,body:c})=>await d(async()=>await r.uploadSkill(a,c))),t.registerTool("list-env-vars",{description:"List environment variable names. Values are write-only: the plane never returns them, so there is no read.",inputSchema:{}},async()=>await d(async()=>await r.listEnvVars())),t.registerTool("set-env-var",{description:"Create or replace one write-only environment variable. Reference it from a config as ${NAME} rather than inlining the value.",inputSchema:{name:e().min(1),value:e()}},async({name:a,value:c})=>await d(async()=>(await r.setEnvVar(a,c),{name:a,stored:!0}))),t.registerTool("delete-env-var",{description:"Delete one environment variable.",inputSchema:{name:e().min(1),confirm:v}},async({name:a,confirm:c})=>await d(async()=>(w(c,`Anything referencing \${${a}} breaks the moment this env var goes.`),{deleted:await r.deleteEnvVar(a),name:a}))),t.registerTool("assume-role",{description:"Exchange a role for a short-lived session token (default 1h, max 12h). Hand the returned token to whatever tool needs narrow access, as BROODS_SESSION_TOKEN. It is shown once and is not stored here.",inputSchema:{roleId:e().min(1),ttlSeconds:o().int().positive().max(43200).optional()}},async({roleId:a,ttlSeconds:c})=>await d(async()=>await r.assumeRole(a,c===void 0?{}:{ttlSeconds:c}))),t.registerTool("update-account",{description:"Rename this account or change its description. Everything else about an account is derived, not settable.",inputSchema:{username:e().optional(),description:e().nullable().optional()}},async({username:a,description:c})=>await d(async()=>await r.updateAccount({...a===void 0?{}:{username:a},...c===void 0?{}:{description:c}}))),t.registerTool("get-account",{description:"The account this server's credential resolves to. Run it first to confirm which tenant you are about to change.",inputSchema:{}},async()=>await d(async()=>await r.getAccount()))}function j(t,r){t.registerTool("list-orgs",{description:"Every organization this login can reach, with the current one marked.",inputSchema:{}},async()=>await d(async()=>{let n=await r.getOnboarding();return{currentOrgId:n.currentOrgId,orgs:n.orgs}})),t.registerTool("create-org",{description:"Create an organization and switch this login to it. Later calls act in the new org.",inputSchema:{name:e().min(1)}},async({name:n})=>await d(async()=>await r.createOnboardingOrg(n))),t.registerTool("select-org",{description:"Switch this login to another organization, by an orgId from list-orgs.",inputSchema:{orgId:e().min(1)}},async({orgId:n})=>await d(async()=>await r.selectOnboardingOrg(n))),t.registerTool("list-projects",{description:"Every project in the current org, empty ones last. Project names are not unique, so take the id from here.",inputSchema:{}},async()=>await d(async()=>await r.listProjects())),t.registerTool("list-stages",{description:"Every stage of one project, by project name.",inputSchema:{project:e().min(1)}},async({project:n})=>await d(async()=>await r.listStages(n))),t.registerTool("create-stage",{description:"Create a stage in a project, optionally cloning another stage's architecture and env vars. A project name that does not exist yet is created with it, which is the only way to make a project without deploying a manifest.",inputSchema:{project:e().min(1),name:e().min(1),from:e().optional().describe("Stage to clone architecture and env vars from.")}},async({project:n,name:a,from:c})=>await d(async()=>await r.createStage(n,a,c)))}function x(t,r,n){if(r)t.registerTool("rotate-secret",{description:"Rotate the account secret. The current secret stops working immediately and the new one is shown once, so this breaks every deployment and CI job still holding the old one. Requires confirm:true.",inputSchema:{confirm:v}},async({confirm:a})=>await d(async()=>(w(a,"Everything holding the current secret breaks the moment this runs."),await r.rotateSecret())));if(n)t.registerTool("delete-project",{description:"Delete a project and everything under it: stages, agents, canvas, env vars, crons and workspace files. Takes a projectId from list-projects and requires confirm:true.",inputSchema:{projectId:e().min(1),confirm:v}},async({projectId:a,confirm:c})=>await d(async()=>(w(c,`Project '${a}' and everything under it goes away: name it, get the owner's agreement, then retry.`),await n.deleteProject(a))))}export{qt as createBroodsMcpServer};
|
|
1
|
+
import{N}from"./chunk-rjx0qg7x.js";import{L,U}from"./chunk-9emkj9m1.js";import{e,o,i,l,s}from"./cli/index.js";var R={project:e().optional(),stage:e().optional()},M={sandboxId:e().min(1),reservationKey:e().min(1)},v=i().describe("Must be true, after the owner has agreed to this delete."),E="'********' keeps a stored secret and null deletes a field: never send a placeholder you did not read from a get.",A=[{singular:"agent",plural:"agents",key:"agentId",createHint:"Needs name and config; a 409 returns the existing agentId.",deleteHint:"Deleting an agent also drops its runtime rows.",updateHint:E,list:(t)=>t.listAgents(),get:(t,r)=>t.getAgent(r),create:(t,r)=>t.createAgent(r),update:(t,r,n)=>t.updateAgent(r,n),remove:(t,r)=>t.deleteAgent(r)},{singular:"cron",plural:"crons",key:"cronId",createHint:"Needs name, agentId, scheduleExpression (rate/cron/at) and input or events.",list:(t)=>t.listCrons(),get:(t,r)=>t.getCron(r),create:(t,r)=>t.createCron(r),update:(t,r,n)=>t.updateCron(r,n),remove:(t,r)=>t.deleteCron(r)},{singular:"sandbox",plural:"sandboxes",key:"sandboxId",updateHint:E,list:(t)=>t.listSandboxes(),get:(t,r)=>t.getSandbox(r),create:(t,r)=>t.createSandbox(r),update:(t,r,n)=>t.updateSandbox(r,n),remove:(t,r)=>t.deleteSandbox(r)},{singular:"workspace",plural:"workspaces",key:"workspaceId",list:(t)=>t.listWorkspaces(),get:(t,r)=>t.getWorkspace(r),create:(t,r)=>t.createWorkspace(r),update:(t,r,n)=>t.updateWorkspace(r,n),remove:(t,r)=>t.deleteWorkspace(r)},{singular:"policy",plural:"policies",key:"policyId",createHint:"Agent-runtime policy document (tool.call, skill.load), not API credential scoping.",list:(t)=>t.listPolicies(),get:(t,r)=>t.getPolicy(r),create:(t,r)=>t.createPolicy(r),update:(t,r,n)=>t.updatePolicy(r,n),remove:(t,r)=>t.deletePolicy(r)},{singular:"role",plural:"roles",key:"roleId",createHint:"Needs name and a version-1 policy over the API namespace, e.g. agents:read. Account secret only.",list:(t)=>t.listRoles(),get:(t,r)=>t.getRole(r),create:(t,r)=>t.createRole(r),update:(t,r,n)=>t.updateRole(r,n),remove:(t,r)=>t.deleteRole(r)},{singular:"channel",plural:"channels",key:"channelId",list:(t)=>t.listChannels(),get:(t,r)=>t.getChannel(r),create:(t,r)=>t.createChannel(r),update:(t,r,n)=>t.updateChannel(r,n),remove:(t,r)=>t.deleteChannel(r)},{singular:"skill",plural:"skills",key:"skillName",createHint:'source is "files" (base64), "json" or "github". The stored name comes from the SKILL.md frontmatter.',list:(t)=>t.listSkills(),get:(t,r)=>t.getSkill(r),create:(t,r)=>t.createSkill(r),remove:(t,r)=>t.deleteSkill(r)},{singular:"mcp",plural:"mcp",key:"serverId",scoped:!0,list:(t,r)=>t.listMcp(r),get:(t,r)=>t.getMcp(r),create:(t,r,n)=>t.createMcp(n,r),update:(t,r,n)=>t.updateMcp(r,n),remove:(t,r)=>t.deleteMcp(r)}];function qt(t={}){let r=L()?new U({}):null;if(!r&&!t.cli)throw Error("broods mcp needs a credential: set BROODS_SESSION_TOKEN or BROODS_ACCOUNT_SECRET, or run `broods login`.");let n=new N({name:"broods",version:"1"},{capabilities:{tools:{}}});if(r){for(let a of A)O(n,r,a,t.scope??{});q(n,r)}if(t.cli)j(n,t.cli);if(t.allowDestructive)x(n,r,t.cli??null);return n}function k(t){return{content:[{type:"text",text:JSON.stringify(t??null,null,2)}]}}function P(t){return{content:[{type:"text",text:t instanceof Error?t.message:String(t)}],isError:!0}}function w(t,r){if(!t)throw Error(`Refusing without confirm:true. ${r}`)}async function d(t){try{return k(await t())}catch(r){return P(r)}}function b(t,r,n,a){if(!t.scoped)return;let c=n??r.project,p=a??r.stage;if(!c||!p)throw Error(`${t.plural} live in one stage, so this call needs both 'project' and 'stage'`);return{project:c,stage:p}}function O(t,r,n,a){let c=e().min(1).describe(`The ${n.key}.`),p=n.scoped?` ${n.plural} live in one stage, so this also takes 'project' and 'stage'.`:"",{list:f,get:g,create:y,update:S,remove:_}=n;if(f){let u=`List every ${n.singular} on the account.${p}`;if(n.scoped)t.registerTool(`list-${n.plural}`,{description:u,inputSchema:R},async({project:h,stage:m})=>await d(async()=>await f(r,b(n,a,h,m))));else t.registerTool(`list-${n.plural}`,{description:u,inputSchema:{}},async()=>await d(async()=>await f(r)))}if(g)t.registerTool(`get-${n.singular}`,{description:`Read one ${n.singular} by ${n.key}.`,inputSchema:{id:c}},async({id:u})=>await d(async()=>await g(r,u)));if(y){let u=`Create one ${n.singular}. 'body' is the request body the config plane documents.`+(n.createHint?` ${n.createHint}`:"")+p+" Prefer changing the broods/ manifest and deploying for anything the project already declares.",h=s(e(),l());if(n.scoped)t.registerTool(`create-${n.singular}`,{description:u,inputSchema:{body:h,...R}},async({body:m,project:T,stage:I})=>await d(async()=>await y(r,m,b(n,a,T,I))));else t.registerTool(`create-${n.singular}`,{description:u,inputSchema:{body:h}},async({body:m})=>await d(async()=>await y(r,m)))}if(S)t.registerTool(`update-${n.singular}`,{description:`Deep-merge a patch into one ${n.singular} and return the updated record, so there is no need to read it back.`+(n.updateHint?` ${n.updateHint}`:""),inputSchema:{id:c,body:s(e(),l())}},async({id:u,body:h})=>await d(async()=>await S(r,u,h)));if(_)t.registerTool(`delete-${n.singular}`,{description:`Delete one ${n.singular}. Requires confirm:true, and takes one ${n.key} per call: never loop this over a list.`+(n.deleteHint?` ${n.deleteHint}`:""),inputSchema:{id:c,confirm:v}},async({id:u,confirm:h})=>await d(async()=>(w(h,`Deleting ${n.singular} '${u}' goes away for good: name it, get the owner's agreement, then retry.`),{deleted:await _(r,u),id:u})))}function q(t,r){t.registerTool("list-cron-runs",{description:"Run history for one cron, newest first. Check this before telling anyone a cron fired.",inputSchema:{cronId:e().min(1),limit:o().int().positive().max(100).optional()}},async({cronId:a,limit:c})=>await d(async()=>await r.listCronRuns(a,c===void 0?{}:{limit:c})));let n=[["suspend-sandbox","Suspend a persistent sandbox reservation.",(a,c)=>r.suspendSandbox(a,c)],["resume-sandbox","Resume a suspended sandbox reservation.",(a,c)=>r.resumeSandbox(a,c)],["terminate-sandbox","Terminate a sandbox reservation and drop its live-instance row. Terminate only a sandbox you created, and never one holding state you did not put there.",(a,c)=>r.terminateSandbox(a,c)],["open-sandbox-terminal","Mint a short-lived sealed ticket for an interactive PTY session on a persistent sandbox.",(a,c)=>r.openSandboxTerminal(a,c)]];for(let[a,c,p]of n)t.registerTool(a,{description:c,inputSchema:M},async({sandboxId:f,reservationKey:g})=>await d(async()=>await p(f,g)));t.registerTool("snapshot-sandbox",{description:"Snapshot a sandbox reservation into a reusable image (self-hosted provider).",inputSchema:{sandboxId:e().min(1),reservationKey:e().min(1),name:e().min(1)}},async({sandboxId:a,reservationKey:c,name:p})=>await d(async()=>await r.snapshotSandbox(a,c,p))),t.registerTool("upload-skill",{description:"Replace one skill's bundle wholesale (PUT, not a merge) by skillName. 'body' is the same source shape create-skill takes.",inputSchema:{id:e().min(1).describe("The skillName."),body:s(e(),l())}},async({id:a,body:c})=>await d(async()=>await r.uploadSkill(a,c))),t.registerTool("list-env-vars",{description:"List environment variable names. Values are write-only: the plane never returns them, so there is no read.",inputSchema:{}},async()=>await d(async()=>await r.listEnvVars())),t.registerTool("set-env-var",{description:"Create or replace one write-only environment variable. Reference it from a config as ${NAME} rather than inlining the value.",inputSchema:{name:e().min(1),value:e()}},async({name:a,value:c})=>await d(async()=>(await r.setEnvVar(a,c),{name:a,stored:!0}))),t.registerTool("delete-env-var",{description:"Delete one environment variable.",inputSchema:{name:e().min(1),confirm:v}},async({name:a,confirm:c})=>await d(async()=>(w(c,`Anything referencing \${${a}} breaks the moment this env var goes.`),{deleted:await r.deleteEnvVar(a),name:a}))),t.registerTool("assume-role",{description:"Exchange a role for a short-lived session token (default 1h, max 12h). Hand the returned token to whatever tool needs narrow access, as BROODS_SESSION_TOKEN. It is shown once and is not stored here.",inputSchema:{roleId:e().min(1),ttlSeconds:o().int().positive().max(43200).optional()}},async({roleId:a,ttlSeconds:c})=>await d(async()=>await r.assumeRole(a,c===void 0?{}:{ttlSeconds:c}))),t.registerTool("update-account",{description:"Rename this account or change its description. Everything else about an account is derived, not settable.",inputSchema:{username:e().optional(),description:e().nullable().optional()}},async({username:a,description:c})=>await d(async()=>await r.updateAccount({...a===void 0?{}:{username:a},...c===void 0?{}:{description:c}}))),t.registerTool("get-account",{description:"The account this server's credential resolves to. Run it first to confirm which tenant you are about to change.",inputSchema:{}},async()=>await d(async()=>await r.getAccount()))}function j(t,r){t.registerTool("list-orgs",{description:"Every organization this login can reach, with the current one marked.",inputSchema:{}},async()=>await d(async()=>{let n=await r.getOnboarding();return{currentOrgId:n.currentOrgId,orgs:n.orgs}})),t.registerTool("create-org",{description:"Create an organization and switch this login to it. Later calls act in the new org.",inputSchema:{name:e().min(1)}},async({name:n})=>await d(async()=>await r.createOnboardingOrg(n))),t.registerTool("select-org",{description:"Switch this login to another organization, by an orgId from list-orgs.",inputSchema:{orgId:e().min(1)}},async({orgId:n})=>await d(async()=>await r.selectOnboardingOrg(n))),t.registerTool("list-projects",{description:"Every project in the current org, empty ones last. Project names are not unique, so take the id from here.",inputSchema:{}},async()=>await d(async()=>await r.listProjects())),t.registerTool("list-stages",{description:"Every stage of one project, by project name.",inputSchema:{project:e().min(1)}},async({project:n})=>await d(async()=>await r.listStages(n))),t.registerTool("create-stage",{description:"Create a stage in a project, optionally cloning another stage's architecture and env vars. A project name that does not exist yet is created with it, which is the only way to make a project without deploying a manifest.",inputSchema:{project:e().min(1),name:e().min(1),from:e().optional().describe("Stage to clone architecture and env vars from.")}},async({project:n,name:a,from:c})=>await d(async()=>await r.createStage(n,a,c)))}function x(t,r,n){if(r)t.registerTool("rotate-secret",{description:"Rotate the account secret. The current secret stops working immediately and the new one is shown once, so this breaks every deployment and CI job still holding the old one. Requires confirm:true.",inputSchema:{confirm:v}},async({confirm:a})=>await d(async()=>(w(a,"Everything holding the current secret breaks the moment this runs."),await r.rotateSecret())));if(n)t.registerTool("delete-project",{description:"Delete a project and everything under it: stages, agents, canvas, env vars, crons and workspace files. Takes a projectId from list-projects and requires confirm:true.",inputSchema:{projectId:e().min(1),confirm:v}},async({projectId:a,confirm:c})=>await d(async()=>(w(c,`Project '${a}' and everything under it goes away: name it, get the owner's agreement, then retry.`),await n.deleteProject(a))))}export{qt as createBroodsMcpServer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{x,a,F,O,G,J,Y,b,k,X,oe,se,fe,he,ge,ve,ae,ie,ye,be,Se,N}from"./chunk-
|
|
1
|
+
import{x,a,F,O,G,J,Y,b,k,X,oe,se,fe,he,ge,ve,ae,ie,ye,be,Se,N}from"./chunk-rjx0qg7x.js";var W=class{_readBuffer;_started=!1;_closed=!1;constructor(r=ae.stdin,o=ae.stdout,c){this._stdin=r,this._stdout=o,this._readBuffer=new ge({maxBufferSize:c?.maxBufferSize})}onclose;onerror;onmessage;_ondata=(r)=>{try{this._readBuffer.append(r),this.processReadBuffer()}catch(o){this.onerror?.(o),this.close().catch(()=>{})}};_onerror=(r)=>{this.onerror?.(r)};_onstdouterror=(r)=>{this.onerror?.(r),this.close().catch(()=>{})};async start(){if(this._started)throw Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror),this._stdout.on("error",this._onstdouterror)}processReadBuffer(){while(!0)try{let r=this._readBuffer.readMessage();if(r===null)break;this.onmessage?.(r)}catch(r){this.onerror?.(r)}}async close(){if(this._closed)return;if(this._closed=!0,this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdout.off("error",this._onstdouterror),this._stdin.listenerCount("data")===0)this._stdin.pause();this._readBuffer.clear(),this.onclose?.()}send(r){if(this._closed)return Promise.reject(Error("StdioServerTransport is closed"));return new Promise((o,c)=>{let l=ve(r),t=!1,f=(_)=>{if(t)return;t=!0,this._stdout.off("error",f),this._stdout.off("drain",p),c(_)},p=()=>{if(t)return;t=!0,this._stdout.off("error",f),this._stdout.off("drain",p),o()};if(this._stdout.once("error",f),this._stdout.write(l)){if(t)return;t=!0,this._stdout.off("error",f),o()}else if(!t)this._stdout.once("drain",p)})}},j=3000,z=class{onclose;onerror;onmessage;_closed=!1;_pendingRequests=new Set;_drainWaiters=[];constructor(r,o,c){this._wire=r,this._onInstanceClose=o,this._outboundIntercept=c}async start(){}async send(r,o){if(X(r)||oe(r)){let{id:c}=r;if(c!==void 0)this._settle(c)}if(this._closed)return;if(this._outboundIntercept?.(r)==="handled")return;return this._wire.send(r,o)}setProtocolVersion=(r)=>{this._wire.setProtocolVersion?.(r)};deliver(r,o){if(this._closed)return;if(b(r))this._pendingRequests.add(r.id);else if(k(r)&&r.method==="notifications/cancelled"){let c=r.params?.requestId;if(c!==void 0)this._settle(c)}this.onmessage?.(r,o)}async whenRequestsAnswered(r){if(this._closed||this._pendingRequests.size===0)return!0;return await new Promise((o)=>{let c=()=>{clearTimeout(l),o(!0)},l=setTimeout(()=>{this._drainWaiters=this._drainWaiters.filter((t)=>t!==c),o(!1)},r);this._drainWaiters.push(c)})}async close(){if(this._closed)return;this._closed=!0,this._pendingRequests.clear(),this._releaseDrainWaiters();try{this._onInstanceClose()}finally{this.onclose?.()}}_settle(r){if(this._pendingRequests.delete(r),this._pendingRequests.size===0)this._releaseDrainWaiters()}_releaseDrainWaiters(){let r=this._drainWaiters;this._drainWaiters=[];for(let o of r)o()}};function A(r){let o=r.params;if(r.method==="initialize"&&!se(o)){let f=o!==null&&typeof o==="object"&&typeof o.protocolVersion==="string"?o.protocolVersion:void 0;return{kind:"legacy",reason:"initialize",...f!==void 0&&{requestedVersion:f}}}if(!G(o))return{kind:"legacy",reason:"no-claim"};let c=O(o),l=(c===void 0?[]:Y(c))[0];if(l!==void 0)return{kind:"invalid-envelope",issue:l};let t=J(o);if(t===void 0||!x.includes(t))return{kind:"unsupported-revision",requested:t??"unknown"};return{kind:"modern",revision:t,classification:{era:"modern",revision:t}}}function H(r,o={}){let c=o.legacy??"serve",l=o.transport??new W,t={phase:"opening"},f,p=!1,_=()=>p||t.phase==="closed",d=(e)=>{try{o.onerror?.(e)}catch{}},y=(e,n,i,s)=>l.send({jsonrpc:"2.0",id:e,error:{code:n,message:i,...s!==void 0&&{data:s}}}).catch((u)=>d(h(u))),w=new ye(o.maxSubscriptions??ie),D=(e)=>{if(!k(e))return;let n=w.routeOutbound(e);if(n==="passthrough")return;for(let i of n)l.send({jsonrpc:"2.0",...i}).catch((s)=>d(h(s)));return"handled"},I=async(e)=>{if(b(e)&&e.method==="subscriptions/listen"){let n=O(e.params),i=G(e.params)?(n===void 0?[]:Y(n))[0]:{key:"_meta",problem:"the per-request envelope is required on protocol revision 2026-07-28"},s=J(e.params),u;if(i!==void 0)u={jsonrpc:"2.0",id:e.id,error:{code:-32602,message:`Invalid _meta envelope: ${i.key}: ${i.problem}`}};else if(s===void 0||!x.includes(s)){let v=new F({supported:[...x],requested:s??"unknown"});u={jsonrpc:"2.0",id:e.id,error:{code:v.code,message:v.message,data:v.data}}}else u=w.serve(e);return await l.send("error"in u?u:{jsonrpc:"2.0",method:u.method,params:u.params}).catch((v)=>d(h(v))),!0}if(k(e)&&e.method==="notifications/cancelled"){let n=e.params?.requestId;if(n!==void 0&&w.cancel(n))return!0}return!1},q=(e,n,i)=>{let s=fe({kind:"legacy",reason:n,...i!==void 0&&{requestedVersion:i}},x);if(s===void 0)return Promise.resolve();return d(Error(`Rejected 2025-era request on a modern-only stdio connection (${s.cell}): ${s.message}`)),y(e.id,s.code,s.message,s.data)},M=(e)=>{if(p||e===f)return;C()},m=async(e,n)=>{let i=await r({era:e}),s=i instanceof N?i.server:i;if(e==="modern")he(s,n),be(s,x),w.setServerCapabilities(s.getCapabilities(),Se(s));let u=new z(l,()=>M(u),e==="modern"?D:void 0);return await i.connect(u),{product:i,channel:u}},R=(e)=>e.product.close().catch((n)=>d(h(n))),V=async(e)=>{f=e.channel;try{if(!await e.channel.whenRequestsAnswered(j))d(Error(`Discarded the probe instance with requests still unanswered after ${j}ms; continuing with the fallback`));await e.product.close()}catch(n){d(h(n))}finally{f=void 0}},T=async(e)=>{if(t.phase==="closed")return;if(t.phase==="pinned"){if(t.era==="modern"&&b(e)&&e.method==="initialize"&&!se(e.params)){await q(e,"initialize",e.params!==null&&typeof e.params==="object"&&typeof e.params.protocolVersion==="string"?e.params.protocolVersion:void 0);return}if(t.era==="modern"&&await I(e))return;t.instance.channel.deliver(e);return}if(!b(e)&&!k(e)){d(Error("Discarded a JSON-RPC response received before the connection negotiated an era"));return}let n=A(e);switch(n.kind){case"invalid-envelope":{let i=`Invalid _meta envelope for protocol revision 2026-07-28: ${n.issue.key}: ${n.issue.problem}`;if(b(e))await y(e.id,a.InvalidParams,i,{envelope:n.issue});else d(Error(`Discarded a notification with a malformed envelope: ${i}`));return}case"unsupported-revision":if(b(e)){let i=new F({supported:[...x],requested:n.requested});d(i),await y(e.id,i.code,i.message,i.data)}else d(Error(`Discarded a notification claiming unsupported protocol revision ${n.requested}`));return;case"modern":if(b(e)&&e.method==="server/discover"){if(t.phase==="probe"){t.instance.channel.deliver(e,{classification:n.classification});return}let i=await m("modern",n.revision);if(_()){await R(i);return}t={phase:"probe",instance:i},i.channel.deliver(e,{classification:n.classification});return}if(t.phase==="probe"){if(k(e)){t.instance.channel.deliver(e,{classification:n.classification});return}t={phase:"pinned",era:"modern",instance:t.instance}}else{let i=await m("modern",n.revision);if(_()){await R(i);return}t={phase:"pinned",era:"modern",instance:i}}if(await I(e))return;t.instance.channel.deliver(e,{classification:n.classification});return;case"legacy":{if(c==="reject"){if(b(e))await q(e,n.reason,n.requestedVersion);return}if(t.phase==="probe"){if(await V(t.instance),_())return;t={phase:"opening"}}let i=await m("legacy");if(_()){await R(i);return}t={phase:"pinned",era:"legacy",instance:i},t.instance.channel.deliver(e);return}}},S=[],E=!1,B=async()=>{if(E)return;E=!0;try{while(S.length>0){let e=S.shift();try{await T(e)}catch(n){if(b(e))await y(e.id,a.InternalError,"Internal server error");d(h(n))}}}finally{E=!1}},C=async()=>{if(p||t.phase==="closed")return;p=!0;let e=t;t={phase:"closed"};for(let n of w.teardownAll())await l.send(n).catch((i)=>d(h(i)));if(e.phase==="probe"||e.phase==="pinned")await e.instance.product.close().catch((n)=>d(h(n)));await l.close().catch((n)=>d(h(n)))};l.onmessage=(e)=>{S.push(e),B()},l.onerror=(e)=>{if(d(e),t.phase==="probe"||t.phase==="pinned")t.instance.channel.onerror?.(e)},l.onclose=()=>{if(p||t.phase==="closed")return;p=!0;let e=t;if(t={phase:"closed"},e.phase==="probe"||e.phase==="pinned")e.instance.product.close().catch((n)=>d(h(n)))};let P=l.start().catch((e)=>{throw d(h(e)),e});return P.catch(()=>{}),{close:async()=>{await P.catch(()=>{}),await C()}}}function h(r){return r instanceof Error?r:Error(String(r))}export{H as serveStdio};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var u=/^[A-Z][A-Z0-9_]*$/;function
|
|
2
|
-
export{
|
|
1
|
+
var u=/^[A-Z][A-Z0-9_]*$/;function Ce(e){if(!u.test(e)||e.length>64)throw Error("envPlaceholder name must match /^[A-Z][A-Z0-9_]*$/ and be at most 64 characters.");return`\${${e}}`}class m extends Error{status;body;constructor(e,t,n,s){super(`${e} ${t} failed with ${n}: ${s}`);this.name="BroodsAccountApiError",this.status=n,this.body=s}}function L(){return o("BROODS_SESSION_TOKEN")??o("BROODS_ACCOUNT_SECRET")}function o(e){return typeof process<"u"?process?.env?.[e]:void 0}function i(e){return`?${new URLSearchParams({project:e.project,stage:e.stage}).toString()}`}class U{baseUrl;bearerToken;fetchImpl;constructor(e={}){let t=e.baseUrl??o("BROODS_BASE_URL")??"https://gateway.broods.app",n=e.sessionToken??e.accountSecret??L();if(!n)throw Error("BroodsAccountClient requires an accountSecret or sessionToken (or BROODS_ACCOUNT_SECRET / BROODS_SESSION_TOKEN).");let s=t.length;while(s>0&&t.charCodeAt(s-1)===47)s-=1;this.baseUrl=t.slice(0,s),this.bearerToken=n,this.fetchImpl=e.fetch??fetch}async getAccount(){let e=await this.request("GET","/v1/account");if(!e)throw new m("GET","/v1/account",404,"Account not found");return e.account}async updateAccount(e){return(await this.request("PATCH","/v1/account",e))?.account??null}async assumeRole(e,t={}){let n=await this.request("POST","/v1/account/assume-role",{roleId:e,...t.ttlSeconds!==void 0?{ttlSeconds:t.ttlSeconds}:{}});if(!n)throw new m("POST","/v1/account/assume-role",404,"Role not found");return n}async rotateSecret(){let e=await this.request("POST","/v1/account/rotate-secret");if(!e)throw new m("POST","/v1/account/rotate-secret",404,"Account not found");return e}async deleteAccount(){return await this.request("DELETE","/v1/account")??{deleted:!1}}webhookUrl(e,t){let n=[e,t].map(encodeURIComponent);return`${this.baseUrl}/webhooks/${n.join("/")}`}async listAgents(){return(await this.request("GET","/v1/agents"))?.agents??[]}async createAgent(e){let t=await this.request("POST","/v1/agents",e);if(!t)throw new m("POST","/v1/agents",404,"Not found");return t}async getAgent(e){return await this.request("GET",`/v1/agents/${encodeURIComponent(e)}`)}async updateAgent(e,t){return await this.request("PATCH",`/v1/agents/${encodeURIComponent(e)}`,t)}async deleteAgent(e){return(await this.request("DELETE",`/v1/agents/${encodeURIComponent(e)}`))?.deleted??!1}async listEnvVars(){return(await this.request("GET","/v1/env"))?.env??[]}async setEnvVar(e,t){await this.request("PUT",`/v1/env/${encodeURIComponent(e)}`,{value:t})}async deleteEnvVar(e){return(await this.request("DELETE",`/v1/env/${encodeURIComponent(e)}`))?.deleted??!1}async listCrons(){return(await this.request("GET","/v1/crons"))?.crons??[]}async createCron(e){let t=await this.request("POST","/v1/crons",e);if(!t)throw new m("POST","/v1/crons",404,"Not found");return t}async getCron(e){return await this.request("GET",`/v1/crons/${encodeURIComponent(e)}`)}async updateCron(e,t){return await this.request("PATCH",`/v1/crons/${encodeURIComponent(e)}`,t)}async deleteCron(e){return(await this.request("DELETE",`/v1/crons/${encodeURIComponent(e)}`))?.deleted??!1}async listCronRuns(e,t={}){let n=t.limit!==void 0?`?limit=${t.limit}`:"";return(await this.request("GET",`/v1/crons/${encodeURIComponent(e)}/runs${n}`))?.runs??[]}async listWorkspaces(){return(await this.request("GET","/v1/workspaces"))?.workspaces??[]}async createWorkspace(e){let t=await this.request("POST","/v1/workspaces",e);if(!t)throw new m("POST","/v1/workspaces",404,"Not found");return t}async getWorkspace(e){return await this.request("GET",`/v1/workspaces/${encodeURIComponent(e)}`)}async updateWorkspace(e,t){return await this.request("PATCH",`/v1/workspaces/${encodeURIComponent(e)}`,t)}async deleteWorkspace(e){return(await this.request("DELETE",`/v1/workspaces/${encodeURIComponent(e)}`))?.deleted??!1}async listWorkspaceFiles(e){return(await this.request("GET",`/v1/workspaces/${encodeURIComponent(e)}/files`))?.files??[]}async getWorkspaceFileUrl(e,t){let n=`?path=${encodeURIComponent(t)}`;return(await this.request("GET",`/v1/workspaces/${encodeURIComponent(e)}/files${n}`))?.url??null}async uploadWorkspaceFile(e,t){let n=`/v1/workspaces/${encodeURIComponent(e)}/files`,s=await this.request("POST",n,t);if(!s)throw new m("POST",n,404,"Workspace not found");return s.file}async renameWorkspaceFile(e,t,n){return(await this.request("PATCH",`/v1/workspaces/${encodeURIComponent(e)}/files`,{path:t,newPath:n}))?.renamed??!1}async deleteWorkspaceFile(e,t){return(await this.request("DELETE",`/v1/workspaces/${encodeURIComponent(e)}/files`,{path:t}))?.deleted??!1}async listSandboxes(){return(await this.request("GET","/v1/sandboxes"))?.sandboxes??[]}async createSandbox(e){let t=await this.request("POST","/v1/sandboxes",e);if(!t)throw new m("POST","/v1/sandboxes",404,"Not found");return t}async getSandbox(e){return await this.request("GET",`/v1/sandboxes/${encodeURIComponent(e)}`)}async updateSandbox(e,t){return await this.request("PATCH",`/v1/sandboxes/${encodeURIComponent(e)}`,t)}async deleteSandbox(e){return(await this.request("DELETE",`/v1/sandboxes/${encodeURIComponent(e)}`))?.deleted??!1}async suspendSandbox(e,t){return await this.sandboxAction(e,"suspend",{reservationKey:t})}async resumeSandbox(e,t){return await this.sandboxAction(e,"resume",{reservationKey:t})}async terminateSandbox(e,t){return await this.sandboxAction(e,"terminate",{reservationKey:t})}async snapshotSandbox(e,t,n){return await this.sandboxAction(e,"snapshot",{reservationKey:t,name:n})}async openSandboxTerminal(e,t){return await this.sandboxAction(e,"terminal",{reservationKey:t})}async listMcp(e){let t=`/v1/mcp${i(e)}`,n=await this.request("GET",t);if(!n)throw new m("GET",t,404,"Not found");return n.servers??[]}async createMcp(e,t){let n=`/v1/mcp${i(e)}`,s=await this.request("POST",n,t);if(!s)throw new m("POST",n,404,"Not found");return s}async uploadMcpBundle(e){let n=await this.request("POST","/v1/mcp/uploads");if(!n?.uploadUrl)throw new m("POST","/v1/mcp/uploads",502,"response omitted uploadUrl");let s=await this.fetchImpl(n.uploadUrl,{method:"POST",headers:{"Content-Type":"application/javascript"},body:e});if(!s.ok)throw new m("POST","/v1/mcp/uploads",s.status,await s.text());let{storageId:r}=await s.json();if(!r)throw new m("POST","/v1/mcp/uploads",502,"upload response omitted storageId");let a=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e)),c=Array.from(new Uint8Array(a)).map((l)=>l.toString(16).padStart(2,"0")).join("");return{bundleStorageId:r,sha256:c}}async getMcp(e){return await this.request("GET",`/v1/mcp/${encodeURIComponent(e)}`)}async updateMcp(e,t){return await this.request("PATCH",`/v1/mcp/${encodeURIComponent(e)}`,t)}async deleteMcp(e){return(await this.request("DELETE",`/v1/mcp/${encodeURIComponent(e)}`))?.deleted??!1}async listPolicies(){return(await this.request("GET","/v1/policies"))?.policies??[]}async createPolicy(e){let t=await this.request("POST","/v1/policies",e);if(!t)throw new m("POST","/v1/policies",404,"Not found");return t}async getPolicy(e){return await this.request("GET",`/v1/policies/${encodeURIComponent(e)}`)}async updatePolicy(e,t){return await this.request("PATCH",`/v1/policies/${encodeURIComponent(e)}`,t)}async deletePolicy(e){return(await this.request("DELETE",`/v1/policies/${encodeURIComponent(e)}`))?.deleted??!1}async listRoles(){return(await this.request("GET","/v1/roles"))?.roles??[]}async createRole(e){let t=await this.request("POST","/v1/roles",e);if(!t)throw new m("POST","/v1/roles",404,"Not found");return t}async getRole(e){return await this.request("GET",`/v1/roles/${encodeURIComponent(e)}`)}async updateRole(e,t){return await this.request("PATCH",`/v1/roles/${encodeURIComponent(e)}`,t)}async deleteRole(e){return(await this.request("DELETE",`/v1/roles/${encodeURIComponent(e)}`))?.deleted??!1}async listChannels(){return(await this.request("GET","/v1/channels"))?.channels??[]}async createChannel(e){let t=await this.request("POST","/v1/channels",e);if(!t)throw new m("POST","/v1/channels",404,"Not found");return t}async getChannel(e){return await this.request("GET",`/v1/channels/${encodeURIComponent(e)}`)}async updateChannel(e,t){return await this.request("PATCH",`/v1/channels/${encodeURIComponent(e)}`,t)}async deleteChannel(e){return(await this.request("DELETE",`/v1/channels/${encodeURIComponent(e)}`))?.deleted??!1}async listSkills(){return(await this.request("GET","/v1/skills"))?.skills??[]}async createSkill(e){let t=await this.request("POST","/v1/skills",e);if(!t)throw new m("POST","/v1/skills",404,"Not found");return t}async getSkill(e){return await this.request("GET",`/v1/skills/${encodeURIComponent(e)}`)}async uploadSkill(e,t){let n=`/v1/skills/${encodeURIComponent(e)}`,s=await this.request("PUT",n,t);if(!s)throw new m("PUT",n,404,"Skill not found");return s}async deleteSkill(e){return(await this.request("DELETE",`/v1/skills/${encodeURIComponent(e)}`))?.deleted??!1}async sandboxAction(e,t,n){let s=`/v1/sandboxes/${encodeURIComponent(e)}/${t}`,r=await this.request("POST",s,n);if(!r)throw new m("POST",s,404,"Sandbox not found");return r}async request(e,t,n){let s=await this.fetchImpl(`${this.baseUrl}${t}`,{method:e,headers:{Authorization:`Bearer ${this.bearerToken}`,...n!==void 0?{"Content-Type":"application/json"}:{}},...n!==void 0?{body:JSON.stringify(n)}:{}});if(s.status===404)return null;if(!s.ok)throw new m(e,t,s.status,await s.text());return await s.json()}}
|
|
2
|
+
export{Ce,m,L,U};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function B(e){if(e.events&&e.input!==void 0)throw Error("Run input accepts either `input` or `events`, not both");if(e.events&&e.events.length>0)return e.events;if(typeof e.input==="string")return[{role:"user",content:[{type:"text",text:e.input}]}];throw Error("Run input requires `input` (string) or a non-empty `events` array")}async function*pe(e){let n=e.getReader(),t=new TextDecoder,o="";try{while(!0){let{done:r,value:s}=await n.read();if(r)break;o+=t.decode(s,{stream:!0});let i=o.split(`
|
|
2
|
-
`);o=i.pop()??"";for(let a of i)if(a.startsWith("data: "))yield a.slice(6)}}finally{n.releaseLock()}}var
|
|
3
|
-
`,"utf8")}function w(){return process.env.BROODS_STAGE}function g(e){let n=e.length;while(n>0&&e.charCodeAt(n-1)===47)n-=1;return e.slice(0,n)}function re(e){try{let n=new URL(e);if(!n.hostname.startsWith(`${
|
|
4
|
-
`).replace(/\\"/g,'"');if(e.startsWith("'")&&e.endsWith("'"))return e.slice(1,-1);let n=e.indexOf(" #");return n>=0?e.slice(0,n).trimEnd():e}function $e(){try{let e=JSON.parse(N(I,"utf8"));if(typeof e.baseUrl!=="string"||typeof e.token!=="string")return null;return{baseUrl:g(e.baseUrl),...typeof e.dashboardUrl==="string"?{dashboardUrl:g(e.dashboardUrl)}:{},token:e.token}}catch{return null}}var C="https://gateway.broods.app";class me extends Error{accepted;constructor(e){super(`Ingress ${e.eventId} was accepted asynchronously with status ${e.status??"queued"}`);this.accepted=e;this.name="IngressAcceptedError"}}class q{baseUrl;apiKey;fetchImpl;constructor(e={}){f(),this.baseUrl=W(e.baseUrl||e.host||process.env.BROODS_BASE_URL||process.env.BROODS_HOST||C),this.apiKey=e.apiKey||process.env.BROODS_API_KEY||void 0,this.fetchImpl=e.fetch??fetch}channelWebhookUrl(e){return`${this.baseUrl}${e.webhookPath.startsWith("/")?"":"/"}${e.webhookPath}`}accountWebhookUrl(e,n){let t=[e,n].map(encodeURIComponent);return`${this.baseUrl}/webhooks/${t.join("/")}`}stageWebhookUrl(e,n,t){let o=[e,"dev",n,t].map(encodeURIComponent);return`${this.baseUrl}/webhooks/${o.join("/")}`}agent(e,n){if(typeof e==="string"){let o=e,r=n??"";if(!r)throw Error(`Agent ${o} is missing a generated id. Run broods dev --once or broods deploy to sync it first.`);return{id:r,run:(s)=>this.run({...s,agentName:o,agentId:r}),runAsync:(s)=>this.runAsync({...s,agentName:o,agentId:r}),stream:(s)=>this.stream({...s,agentName:o,agentId:r})}}let t=e;if(!t.id)throw Error(`Agent ${t.name} is missing a generated id. Run broods dev --once or broods deploy to sync it first.`);return{id:t.id,run:(o)=>this.run(t,o),runAsync:(o)=>this.runAsync(t,o),stream:(o)=>this.stream(t,o)}}async run(e,n){let t=[],o="",r=n?this.stream(e,n):this.stream(e);for await(let s of r)if(t.push(s),s.type==="text-delta")o+=s.text;return{text:o,events:t}}async*stream(e,n){let t=n?{...n,agentId:e.id,agentName:e.name}:e,o=F(t,"cli"),r=n?this.scopedUrl(e):this.baseUrl,s=await this.openStream(o,r);if(!s.ok)throw Error(`Run failed: ${s.status} ${await s.text()}`);if(s.status===202)throw new me(J(await s.json(),o));if(!s.body)throw Error("Run response has no body");for await(let i of pe(s.body)){let a;try{a=JSON.parse(i)}catch{continue}if(a.type==="error")throw Error(`Agent run failed: ${on(a.error)}`);yield a}}async runAsync(e,n){let t=n?{...n,agentId:e.id,agentName:e.name}:e,o=F(t,"async"),r=n?this.scopedUrl(e,"/async"):`${this.baseUrl}/async`,s=await this.fetchJson(r,{method:"POST",headers:this.apiKeyHeaders(),body:JSON.stringify(o)});if(s.status!==202)throw Error(`Async run failed: ${s.status} ${await en(s,"202 JSON")}`);let i=J(await s.json(),o);return{...i,conversationKey:o.conversationKey,poll:()=>this.getAsyncStatus(i),wait:(a)=>this.waitForAsyncStatus(i,a)}}async getAsyncStatus(e,n={}){let t=this.resolveStatusUrl(e,n),o=await this.fetchJson(t,{method:"GET",headers:this.apiKeyHeaders()});if(o.status===404)return{status:"not_found"};if(!o.ok)throw Error(`Status check failed: ${o.status} ${await o.text()}`);return await o.json()}async waitForAsyncStatus(e,n={}){let t=Date.now()+(n.timeoutMs??180000),o=n.intervalMs??2000;while(Date.now()<t){if(n.signal?.aborted)throw Error("Async status polling aborted.");let r=await this.getAsyncStatus(e,n);if(r.status==="awaiting_approval"||r.status==="awaiting_input"||r.status==="completed"||r.status==="failed"||r.status==="expired"||r.status==="not_found")return r;await tn(o,n.signal)}throw Error("Polling timeout")}async createCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons`,{method:"POST",headers:this.apiKeyHeaders(),body:JSON.stringify(nn(e))});if(n.status!==201)throw Error(`Create cron job failed: ${n.status} ${await p(n)}`);return await n.json()}async listCrons(){let e=await this.fetchJson(`${this.baseUrl}/v1/crons`,{method:"GET",headers:this.apiKeyHeaders()});if(!e.ok)throw Error(`List cron jobs failed: ${e.status} ${await p(e)}`);return(await e.json()).crons}async getCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"GET",headers:this.apiKeyHeaders()});if(n.status===404)return null;if(!n.ok)throw Error(`Get cron job failed: ${n.status} ${await p(n)}`);return await n.json()}async listCronRuns(e,n={}){let t=new URLSearchParams;if(n.limit!==void 0)t.set("limit",String(n.limit));let o=t.size>0?`?${t}`:"",r=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}/runs${o}`,{method:"GET",headers:this.apiKeyHeaders()});if(!r.ok)throw Error(`List cron job runs failed: ${r.status} ${await p(r)}`);return(await r.json()).runs}async updateCron(e,n){let t=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"PATCH",headers:this.apiKeyHeaders(),body:JSON.stringify(n)});if(!t.ok)throw Error(`Update cron job failed: ${t.status} ${await p(t)}`);return await t.json()}async deleteCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"DELETE",headers:this.apiKeyHeaders()});if(n.status===404)return!1;if(!n.ok)throw Error(`Delete cron job failed: ${n.status} ${await p(n)}`);return(await n.json()).deleted}scopedUrl(e,n=""){if(e.projectSlug&&e.stageSlug&&e.endpointId)return`${this.baseUrl}/v1/${encodeURIComponent(e.projectSlug)}/agents/${encodeURIComponent(e.stageSlug)}/${encodeURIComponent(e.endpointId)}${n}`;return`${this.baseUrl}${n}`}async openStream(e,n){if(this.apiKey)return await this.fetchCore(e,n,{Authorization:`Bearer ${this.apiKey}`});throw Error(`BroodsClient streams directly from the core service at ${this.baseUrl}. Provide apiKey. For a self-hosted core service, set host/baseUrl or BROODS_HOST/BROODS_BASE_URL.`)}async fetchCore(e,n,t){try{return await this.fetchImpl(n,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",...t},body:JSON.stringify(e)})}catch(o){throw Error(`Cannot access the broods core service at ${n}. The SDK uses ${C} by default; set host/baseUrl or BROODS_HOST/BROODS_BASE_URL to your own core service URL if your account uses a custom deployment. Cause: ${o instanceof Error?o.message:String(o)}`)}}apiKeyHeaders(){if(!this.apiKey)throw Error("BroodsClient requires apiKey or BROODS_API_KEY.");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}}async fetchJson(e,n){try{return await this.fetchImpl(e,{...n,headers:{"Content-Type":"application/json",...n.headers}})}catch(t){throw Error(`Cannot access the broods core service at ${e}. Cause: ${t instanceof Error?t.message:String(t)}`)}}resolveStatusUrl(e,n){if(typeof e!=="string")return e.statusUrl;if(/^https?:\/\//.test(e))return e;if(!n.agentId)throw Error("Polling by status id requires agentId.");return Qe(this.baseUrl,e,n.agentId)}}function W(e){let n=e.trim(),t=/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(n)?n:`https://${n}`;return g(t)}function F(e,n){let t=e.eventId??`${n}-${Date.now()}`;return{agentId:e.agentId,eventId:t,conversationKey:e.conversationKey??t,events:B(e),...e.mode!==void 0?{mode:e.mode}:{},...e.idempotencyKey!==void 0?{idempotencyKey:e.idempotencyKey}:{},...e.system!==void 0?{system:e.system}:{},...e.model!==void 0?{model:e.model}:{}}}function J(e,n){if(!e||typeof e!=="object")throw Error("Async response must be an object");let t=e.statusUrl;if(typeof t!=="string"||t.length===0)throw Error("Async response missing statusUrl");let o=_e(t);if(!o.statusId)throw Error("Async response statusUrl missing status id");let r=typeof e.eventId==="string"?e.eventId:o.statusId,{status:s,requestedMode:i}=e;return{statusUrl:t,statusId:o.statusId,eventId:r,agentId:o.agentId??n.agentId,...s==="accepted"||s==="queued"||s==="applied"||s==="processing"?{status:s}:{},...i==="reject"||i==="followup"||i==="collect"||i==="steer"?{requestedMode:i}:{}}}function _e(e){let n=new URL(e),t=n.pathname.match(/\/status\/([^/]+)$/);return{statusId:t?.[1]?decodeURIComponent(t[1]):void 0,agentId:n.searchParams.get("agentId")??void 0}}function Qe(e,n,t){return`${W(e)}/status/${encodeURIComponent(n)}?agentId=${encodeURIComponent(t)}`}async function en(e,n){if((e.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return await e.body?.cancel().catch(()=>{}),`expected ${n}, but the server returned an SSE stream. This usually means the core deployment routed /async to the direct streaming runner instead of the async handler.`;let o=await e.text();if(o.length<=2000)return o;return`${o.slice(0,2000)}... [truncated ${o.length-2000} chars]`}async function p(e){let n=await e.text();if(n.includes("Request body must include eventId and conversationKey"))return`${n}. Cron job APIs must be served by the configured baseUrl. Prefer defining stable cron jobs with defineCron(...) in broods/ and syncing with \`broods dev\` or \`broods deploy\`.`;return n}function nn(e){if("agentId"in e)return e;let n=e.agent,t=typeof n==="string"?n:n.id,{agent:o,...r}=e;return{...r,agentId:t}}function tn(e,n){return new Promise((t,o)=>{if(n?.aborted){o(Error("Async status polling aborted."));return}let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),o(Error("Async status polling aborted."))},{once:!0})})}function on(e){if(typeof e==="string")return e;if(!e||typeof e!=="object")return String(e);let n=e,t=n.data?.error?.message??n.message??n.responseBody??JSON.stringify(e),o=n.name?`${n.name}: `:"",r=n.statusCode?` (HTTP ${n.statusCode})`:"";return`${o}${t}${r}`}var rn=2000,Y=0,k=1;class Ie{baseUrl;apiKey;WebSocketImpl;connectTimeoutMs;constructor(e={}){if(f(),this.baseUrl=oe(e.baseUrl||e.host||process.env.BROODS_BASE_URL||process.env.BROODS_HOST||C),this.apiKey=e.apiKey||process.env.BROODS_API_KEY||"",!this.apiKey)throw Error("BroodsWebSocketClient requires apiKey or BROODS_API_KEY.");this.WebSocketImpl=e.WebSocket,this.connectTimeoutMs=e.connectTimeoutMs??rn}subscribe(e,n={}){let t=this.resolveWebSocket(),o=this.buildUrl(e),r=sn(e),s=X(this.baseUrl),i=new t(o,D(this.apiKey)),a=!1,u=!1,l=setTimeout(()=>{if(!a)R(s)},this.connectTimeoutMs),E=(c=1000,v="client closed")=>{if(u)return;if(u=!0,clearTimeout(l),e.signal?.removeEventListener("abort",x),i.readyState===k||i.readyState===Y)i.close(c,v)},R=(c)=>{n.onError?.(c),E(1011,"websocket error")},ue=()=>{n.onDone?.(),E(1000,"done")},x=()=>{if(i.readyState===k)i.send(JSON.stringify({type:"cancel"}));R(Error("WebSocket run aborted."))};return e.signal?.addEventListener("abort",x,{once:!0}),i.onopen=()=>{if(a=!0,clearTimeout(l),e.signal?.aborted){x();return}i.send(JSON.stringify({type:"execute",agentId:r,events:B(e),sessionId:e.sessionId,...e.eventId!==void 0?{eventId:e.eventId}:{},...e.mode!==void 0?{mode:e.mode}:{},...e.idempotencyKey!==void 0?{idempotencyKey:e.idempotencyKey}:{},...e.system!==void 0?{system:e.system}:{},...e.model!==void 0?{model:e.model}:{}}))},i.onmessage=(c)=>{if(typeof c.data!=="string")return;let v=ee(c.data);if(!v)return;let A=Q(v,n);switch(n.onMessage?.(A),A.type){case"meta":n.onMeta?.(A);break;case"done":ue();break;case"error":R(Error(te(A.error)));break}},i.onerror=()=>{R(s)},i.onclose=(c)=>{if(clearTimeout(l),e.signal?.removeEventListener("abort",x),u||c.code===1000)return;R(Error(c.reason||"WebSocket connection closed."))},{url:o,sendControl:function(c){if(i.readyState!==k)throw Error("WebSocket is not open");i.send(JSON.stringify({type:"control",...c}))},close:E}}attach(e,n={}){let t=this.resolveWebSocket(),o=this.buildUrl(e),r=new t(o,D(this.apiKey)),s=!1,i=(a=1000,u="client closed")=>{if(s)return;if(s=!0,r.readyState===k||r.readyState===Y)r.close(a,u)};return r.onopen=()=>r.send(JSON.stringify({type:"attach",...e,signal:void 0,agent:void 0})),r.onmessage=(a)=>{if(typeof a.data!=="string")return;let u=ee(a.data);if(!u)return;let l=Q(u,n);if(n.onMessage?.(l),l.type==="done")n.onDone?.();if(l.type==="error")n.onError?.(Error(te(l.error)))},r.onerror=()=>n.onError?.(X(this.baseUrl)),r.onclose=(a)=>{if(!s&&a.code!==1000)n.onError?.(Error(a.reason||"WebSocket connection closed."))},{url:o,sendControl:function(a){if(r.readyState!==k)throw Error("WebSocket is not open");r.send(JSON.stringify({type:"control",...a}))},close:i}}async*stream(e){let n=[],t=!1,o=null,r=null,s=()=>{r?.(),r=null},i=this.subscribe(e,{onMessage:function(a){n.push(a),s()},onDone:function(){t=!0,s()},onError:function(a){o=a,s()}});try{while(!0){if(n.length>0){yield n.shift();continue}if(o)throw o;if(t)return;await new Promise((a)=>{r=a})}}finally{i.close()}}buildUrl(e){let n=an(e),t=e.projectSlug??e.agent?.projectSlug,o=e.stageSlug??e.agent?.stageSlug,r=t?`/${t}`:"",s=o?`/${o}`:"";return`${K(this.baseUrl)}/v1${r}/agents${s}/${encodeURIComponent(n)}/ws`}resolveWebSocket(){let e=this.WebSocketImpl??globalThis.WebSocket;if(!e)throw Error("WebSocket is not available. Pass a WebSocket implementation in BroodsWebSocketClient options.");return e}}function D(e){return["broods.v1",`broods.token.${e}`]}function sn(e){let n=e.agentId??e.agent?.id??e.endpointId;if(!n)throw Error("WebSocket run requires agent, agentId, or endpointId.");return n}function an(e){let n=e.endpointId??e.agent?.endpointId??e.agent?.id;if(!n)throw Error("WebSocket run requires agent or endpointId.");return n}function K(e){let n=new URL(oe(e));if(n.protocol==="https:")n.protocol="wss:";if(n.protocol==="http:")n.protocol="ws:";return g(n.toString())}function oe(e){let n=e.trim();if(/^wss?:\/\//.test(n))return g(n);return W(n)}function X(e){return Error(`Cannot access the WebSocket service at ${e}.`)}function Q(e,n){if(e.type!=="output")return e;let t=e;return n.onOutput?.(t),t.data}function ee(e){try{let n=JSON.parse(e);return typeof n==="object"&&n!==null&&typeof n.type==="string"?n:null}catch{return null}}function te(e){if(typeof e==="string")return e;if(e&&typeof e==="object"&&typeof e.message==="string")return e.message;return e===void 0?"WebSocket stream error.":JSON.stringify(e)}var ie=Symbol.for("broods.resource"),ae=Symbol.for("broods.config"),ce=Symbol.for("broods.connection"),se=/^[A-Z][A-Z0-9_]{0,63}$/,Pe=new Proxy((e)=>{if(!se.test(e))throw Error("env name must match /^[A-Z][A-Z0-9_]*$/ and be at most 64 characters.");return{__beeblastEnv:!0,name:e}},{get:function(e,n,t){if(typeof n==="string"&&se.test(n))throw Error(`env.${n} is not supported; use env("${n}")`);return Reflect.get(e,n,t)}});function d(e,n,t,o){return{[ie]:!0,kind:e,name:n,...t?{description:t}:{},config:o}}function m(e,n){let{partition:t,...o}=n;return{[ce]:!0,kind:"connection",type:e,...t?{partition:t}:{},config:o}}function b(e,n,t,o,r){return d("channelRecord",e,n,{...r,externalId:t,...o?{workspaceRef:o}:{}})}function Me(e){return m("discord",e)}function Ae(e){return m("github",e)}function ze(e){return m("pancake",e)}function Oe(e){return m("slack",e)}function Ne(e){return m("telegram",e)}function je(e){return m("zalo",e)}function qe(e){let{name:n,description:t,channelId:o,guildId:r,...s}=e;return b(n,t,o,r,s)}function De(e){let{name:n,description:t,repo:o,...r}=e,[s,...i]=o.split("/");if(!s||i.length!==1||!i[0])throw Error(`Channel "${n}" repo must be "owner/name", not "${o}"`);return b(n,t,o,s,r)}function Le(e){let{name:n,description:t,conversationId:o,...r}=e;return b(n,t,o,void 0,r)}function Ue(e){let{name:n,description:t,channelId:o,teamId:r,...s}=e;return b(n,t,o,r,s)}function Fe(e){let{name:n,description:t,chatId:o,...r}=e;return b(n,t,o,void 0,r)}function Be(e){let{name:n,description:t,chatId:o,...r}=e;return b(n,t,o,void 0,r)}function Ve(e){return{[ae]:!0,config:e}}function Ze(e){let{name:n,description:t,...o}=e;return d("agent",n,t,o)}function He(e){return e}function We(e){let{name:n,description:t,...o}=e;return d("workspace",n,t,o)}function Ke(e){let{name:n,description:t,...o}=e;return d("sandbox",n,t,o)}function Ge(e){let{name:n,description:t,...o}=e;return d("skill",n,t,o)}function Je(e){let{name:n,description:t,...o}=e;return d("mcp",n,t,o)}function Ye(e){let{name:n,description:t,...o}=e;return d("policy",n,t,o)}function Xe(e){let{name:n,description:t,...o}=e;return d("cron",n,t,o)}function h(e){return Boolean(e&&typeof e==="object"&&e[ie])}function _(e){return Boolean(e&&typeof e==="object"&&e[ce])}function ne(e){return Boolean(e&&typeof e==="object"&&e[ae])}
|
|
5
|
-
export{B,pe,
|
|
2
|
+
`);o=i.pop()??"";for(let a of i)if(a.startsWith("data: "))yield a.slice(6)}}finally{n.releaseLock()}}var xe=500,ge=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,de=/^(?!0{32}$)[0-9a-f]{32}$/;function ke(e){if(typeof e!=="object"||e===null)return!1;let n=e;if(n.type==="subscribe")return fe(n);if(n.type==="unsubscribe")return T(n.stream);if(n.type==="fetchTrace")return Ie(n.traceId);return!1}function Te(e){return e==="DEBUG"||e==="INFO"||e==="WARN"||e==="ERROR"}function Pe(e){return e==="task"||e==="cron"||e==="subtask"}function Ie(e){return typeof e==="string"&&de.test(e)}function V(e){return typeof e==="string"&&ge.test(e)}function T(e){return e==="logs"||e==="traces"}function fe(e){let n=e.stream;if(!T(n))return!1;let t=e.backfill;if(t!==void 0&&(typeof t!=="number"||!Number.isSafeInteger(t)||t<0||t>500))return!1;if(e.liveOnly!==void 0&&typeof e.liveOnly!=="boolean")return!1;let o=e.minLevel;if(o!==void 0&&!Te(o))return!1;let r=e.sandboxId;return r===void 0||n==="logs"&&V(r)}import{mkdir as ye,readFile as be,writeFile as he}from"node:fs/promises";import{homedir as Se}from"node:os";import{dirname as Re,join as Ce}from"node:path";var y="broods",S="_generated",I=Ce(Se(),".broods","config.json"),M="broods.app",P="dashboard",ve="gateway";async function Z(){let e=process.env.BROODS_TOKEN,n=process.env.BROODS_BASE_URL;if(e&&n)return{baseUrl:g(n),token:e,createdAt:new Date().toISOString()};try{let t=JSON.parse(await be(I,"utf8"));if(typeof t.baseUrl!=="string"||!t.baseUrl)return null;return t}catch{return null}}async function H(e){await ye(Re(I),{recursive:!0}),await he(I,`${JSON.stringify(e,null,2)}
|
|
3
|
+
`,"utf8")}function w(){return process.env.BROODS_STAGE}function g(e){let n=e.length;while(n>0&&e.charCodeAt(n-1)===47)n-=1;return e.slice(0,n)}function re(e){try{let n=new URL(e);if(!n.hostname.startsWith(`${P}.`))return;let t=n.hostname.slice(P.length+1);if(t!==M&&!t.endsWith(`.${M}`))return;return n.hostname=`${ve}.${t}`,g(n.origin)}catch{return}}import{existsSync as L,readFileSync as N,statSync as we}from"node:fs";import{join as j,resolve as G}from"node:path";var O=new Map,Ee=new Set(Object.keys(process.env)),U=new Set;function f(e=process.cwd()){_e(e);let n=nn();return{dashboardUrl:process.env.BROODS_DASHBOARD_URL??n?.dashboardUrl,baseUrl:process.env.BROODS_BASE_URL??n?.baseUrl,token:process.env.BROODS_TOKEN??n?.token,project:process.env.BROODS_PROJECT,stage:w()}}function z(e,n=process.cwd()){let t=process.env[e];if(t===void 0)return!1;let o=G(n);for(let r of[".env.local",".env"]){let s=j(o,r);if(!L(s))continue;let i=F(N(s,"utf8"));if(i[e]!==void 0)return i[e]!==t}return!0}function _e(e){let n=G(e),t=process.env.BROODS_RELOAD_ENV==="1";for(let o of[".env",".env.local"]){let r=j(n,o);if(!L(r)){O.delete(r);continue}let s=we(r).mtimeMs,i=O.get(r);if(i&&i.mtimeMs===s)continue;O.set(r,{mtimeMs:s});for(let[a,u]of Object.entries(F(N(r,"utf8"))))if(t||!Ee.has(a)||U.has(a))process.env[a]=u,U.add(a)}}function F(e){let n={};for(let t of e.split(/\r?\n/)){let o=t.trim();if(!o||o.startsWith("#"))continue;let r=o.startsWith("export ")?o.slice(7).trim():o,s=r.indexOf("=");if(s<=0)continue;let i=r.slice(0,s).trim();if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i))continue;n[i]=en(r.slice(s+1).trim())}return n}function en(e){if(e.startsWith('"')&&e.endsWith('"'))return e.slice(1,-1).replace(/\\n/g,`
|
|
4
|
+
`).replace(/\\"/g,'"');if(e.startsWith("'")&&e.endsWith("'"))return e.slice(1,-1);let n=e.indexOf(" #");return n>=0?e.slice(0,n).trimEnd():e}function nn(){try{let e=JSON.parse(N(I,"utf8"));if(typeof e.baseUrl!=="string"||typeof e.token!=="string")return null;return{baseUrl:g(e.baseUrl),...typeof e.dashboardUrl==="string"?{dashboardUrl:g(e.dashboardUrl)}:{},token:e.token}}catch{return null}}var C="https://gateway.broods.app";class me extends Error{accepted;constructor(e){super(`Ingress ${e.eventId} was accepted asynchronously with status ${e.status??"queued"}`);this.accepted=e;this.name="IngressAcceptedError"}}class q{baseUrl;apiKey;fetchImpl;constructor(e={}){f(),this.baseUrl=W(e.baseUrl||e.host||process.env.BROODS_BASE_URL||process.env.BROODS_HOST||C),this.apiKey=e.apiKey||process.env.BROODS_API_KEY||void 0,this.fetchImpl=e.fetch??fetch}channelWebhookUrl(e){return`${this.baseUrl}${e.webhookPath.startsWith("/")?"":"/"}${e.webhookPath}`}accountWebhookUrl(e,n){let t=[e,n].map(encodeURIComponent);return`${this.baseUrl}/webhooks/${t.join("/")}`}stageWebhookUrl(e,n,t){let o=[e,"dev",n,t].map(encodeURIComponent);return`${this.baseUrl}/webhooks/${o.join("/")}`}agent(e,n){if(typeof e==="string"){let o=e,r=n??"";if(!r)throw Error(`Agent ${o} is missing a generated id. Run broods dev --once or broods deploy to sync it first.`);return{id:r,run:(s)=>this.run({...s,agentName:o,agentId:r}),runAsync:(s)=>this.runAsync({...s,agentName:o,agentId:r}),stream:(s)=>this.stream({...s,agentName:o,agentId:r})}}let t=e;if(!t.id)throw Error(`Agent ${t.name} is missing a generated id. Run broods dev --once or broods deploy to sync it first.`);return{id:t.id,run:(o)=>this.run(t,o),runAsync:(o)=>this.runAsync(t,o),stream:(o)=>this.stream(t,o)}}async run(e,n){let t=[],o="",r=n?this.stream(e,n):this.stream(e);for await(let s of r)if(t.push(s),s.type==="text-delta")o+=s.text;return{text:o,events:t}}async*stream(e,n){let t=n?{...n,agentId:e.id,agentName:e.name}:e,o=J(t,"cli"),r=n?this.scopedUrl(e):this.baseUrl,s=await this.openStream(o,r);if(!s.ok)throw Error(`Run failed: ${s.status} ${await s.text()}`);if(s.status===202)throw new me(Y(await s.json(),o));if(!s.body)throw Error("Run response has no body");for await(let i of pe(s.body)){let a;try{a=JSON.parse(i)}catch{continue}if(a.type==="error")throw Error(`Agent run failed: ${cn(a.error)}`);yield a}}async runAsync(e,n){let t=n?{...n,agentId:e.id,agentName:e.name}:e,o=J(t,"async"),r=n?this.scopedUrl(e,"/async"):`${this.baseUrl}/async`,s=await this.fetchJson(r,{method:"POST",headers:this.apiKeyHeaders(),body:JSON.stringify(o)});if(s.status!==202)throw Error(`Async run failed: ${s.status} ${await rn(s,"202 JSON")}`);let i=Y(await s.json(),o);return{...i,conversationKey:o.conversationKey,poll:()=>this.getAsyncStatus(i),wait:(a)=>this.waitForAsyncStatus(i,a)}}async getAsyncStatus(e,n={}){let t=this.resolveStatusUrl(e,n),o=await this.fetchJson(t,{method:"GET",headers:this.apiKeyHeaders()});if(o.status===404)return{status:"not_found"};if(!o.ok)throw Error(`Status check failed: ${o.status} ${await o.text()}`);return await o.json()}async waitForAsyncStatus(e,n={}){let t=Date.now()+(n.timeoutMs??180000),o=n.intervalMs??2000;while(Date.now()<t){if(n.signal?.aborted)throw Error("Async status polling aborted.");let r=await this.getAsyncStatus(e,n);if(r.status==="awaiting_approval"||r.status==="awaiting_input"||r.status==="completed"||r.status==="failed"||r.status==="expired"||r.status==="not_found")return r;await an(o,n.signal)}throw Error("Polling timeout")}async createCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons`,{method:"POST",headers:this.apiKeyHeaders(),body:JSON.stringify(sn(e))});if(n.status!==201)throw Error(`Create cron job failed: ${n.status} ${await p(n)}`);return await n.json()}async listCrons(){let e=await this.fetchJson(`${this.baseUrl}/v1/crons`,{method:"GET",headers:this.apiKeyHeaders()});if(!e.ok)throw Error(`List cron jobs failed: ${e.status} ${await p(e)}`);return(await e.json()).crons}async getCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"GET",headers:this.apiKeyHeaders()});if(n.status===404)return null;if(!n.ok)throw Error(`Get cron job failed: ${n.status} ${await p(n)}`);return await n.json()}async listCronRuns(e,n={}){let t=new URLSearchParams;if(n.limit!==void 0)t.set("limit",String(n.limit));let o=t.size>0?`?${t}`:"",r=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}/runs${o}`,{method:"GET",headers:this.apiKeyHeaders()});if(!r.ok)throw Error(`List cron job runs failed: ${r.status} ${await p(r)}`);return(await r.json()).runs}async updateCron(e,n){let t=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"PATCH",headers:this.apiKeyHeaders(),body:JSON.stringify(n)});if(!t.ok)throw Error(`Update cron job failed: ${t.status} ${await p(t)}`);return await t.json()}async deleteCron(e){let n=await this.fetchJson(`${this.baseUrl}/v1/crons/${encodeURIComponent(e)}`,{method:"DELETE",headers:this.apiKeyHeaders()});if(n.status===404)return!1;if(!n.ok)throw Error(`Delete cron job failed: ${n.status} ${await p(n)}`);return(await n.json()).deleted}scopedUrl(e,n=""){if(e.projectSlug&&e.stageSlug&&e.endpointId)return`${this.baseUrl}/v1/${encodeURIComponent(e.projectSlug)}/agents/${encodeURIComponent(e.stageSlug)}/${encodeURIComponent(e.endpointId)}${n}`;return`${this.baseUrl}${n}`}async openStream(e,n){if(this.apiKey)return await this.fetchCore(e,n,{Authorization:`Bearer ${this.apiKey}`});throw Error(`BroodsClient streams directly from the core service at ${this.baseUrl}. Provide apiKey. For a self-hosted core service, set host/baseUrl or BROODS_HOST/BROODS_BASE_URL.`)}async fetchCore(e,n,t){try{return await this.fetchImpl(n,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream",...t},body:JSON.stringify(e)})}catch(o){throw Error(`Cannot access the broods core service at ${n}. The SDK uses ${C} by default; set host/baseUrl or BROODS_HOST/BROODS_BASE_URL to your own core service URL if your account uses a custom deployment. Cause: ${o instanceof Error?o.message:String(o)}`)}}apiKeyHeaders(){if(!this.apiKey)throw Error("BroodsClient requires apiKey or BROODS_API_KEY.");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}}async fetchJson(e,n){try{return await this.fetchImpl(e,{...n,headers:{"Content-Type":"application/json",...n.headers}})}catch(t){throw Error(`Cannot access the broods core service at ${e}. Cause: ${t instanceof Error?t.message:String(t)}`)}}resolveStatusUrl(e,n){if(typeof e!=="string")return e.statusUrl;if(/^https?:\/\//.test(e))return e;if(!n.agentId)throw Error("Polling by status id requires agentId.");return on(this.baseUrl,e,n.agentId)}}function W(e){let n=e.trim(),t=/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(n)?n:`https://${n}`;return g(t)}function J(e,n){let t=e.eventId??`${n}-${Date.now()}`;return{agentId:e.agentId,eventId:t,conversationKey:e.conversationKey??t,events:B(e),...e.mode!==void 0?{mode:e.mode}:{},...e.idempotencyKey!==void 0?{idempotencyKey:e.idempotencyKey}:{},...e.system!==void 0?{system:e.system}:{},...e.model!==void 0?{model:e.model}:{}}}function Y(e,n){if(!e||typeof e!=="object")throw Error("Async response must be an object");let t=e.statusUrl;if(typeof t!=="string"||t.length===0)throw Error("Async response missing statusUrl");let o=tn(t);if(!o.statusId)throw Error("Async response statusUrl missing status id");let r=typeof e.eventId==="string"?e.eventId:o.statusId,{status:s,requestedMode:i}=e;return{statusUrl:t,statusId:o.statusId,eventId:r,agentId:o.agentId??n.agentId,...s==="accepted"||s==="queued"||s==="applied"||s==="processing"?{status:s}:{},...i==="reject"||i==="followup"||i==="collect"||i==="steer"?{requestedMode:i}:{}}}function tn(e){let n=new URL(e),t=n.pathname.match(/\/status\/([^/]+)$/);return{statusId:t?.[1]?decodeURIComponent(t[1]):void 0,agentId:n.searchParams.get("agentId")??void 0}}function on(e,n,t){return`${W(e)}/status/${encodeURIComponent(n)}?agentId=${encodeURIComponent(t)}`}async function rn(e,n){if((e.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return await e.body?.cancel().catch(()=>{}),`expected ${n}, but the server returned an SSE stream. This usually means the core deployment routed /async to the direct streaming runner instead of the async handler.`;let o=await e.text();if(o.length<=2000)return o;return`${o.slice(0,2000)}... [truncated ${o.length-2000} chars]`}async function p(e){let n=await e.text();if(n.includes("Request body must include eventId and conversationKey"))return`${n}. Cron job APIs must be served by the configured baseUrl. Prefer defining stable cron jobs with defineCron(...) in broods/ and syncing with \`broods dev\` or \`broods deploy\`.`;return n}function sn(e){if("agentId"in e)return e;let n=e.agent,t=typeof n==="string"?n:n.id,{agent:o,...r}=e;return{...r,agentId:t}}function an(e,n){return new Promise((t,o)=>{if(n?.aborted){o(Error("Async status polling aborted."));return}let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),o(Error("Async status polling aborted."))},{once:!0})})}function cn(e){if(typeof e==="string")return e;if(!e||typeof e!=="object")return String(e);let n=e,t=n.data?.error?.message??n.message??n.responseBody??JSON.stringify(e),o=n.name?`${n.name}: `:"",r=n.statusCode?` (HTTP ${n.statusCode})`:"";return`${o}${t}${r}`}var un=2000,X=0,k=1;class $e{baseUrl;apiKey;WebSocketImpl;connectTimeoutMs;constructor(e={}){if(f(),this.baseUrl=se(e.baseUrl||e.host||process.env.BROODS_BASE_URL||process.env.BROODS_HOST||C),this.apiKey=e.apiKey||process.env.BROODS_API_KEY||"",!this.apiKey)throw Error("BroodsWebSocketClient requires apiKey or BROODS_API_KEY.");this.WebSocketImpl=e.WebSocket,this.connectTimeoutMs=e.connectTimeoutMs??un}subscribe(e,n={}){let t=this.resolveWebSocket(),o=this.buildUrl(e),r=ln(e),s=Q(this.baseUrl),i=new t(o,D(this.apiKey)),a=!1,u=!1,l=setTimeout(()=>{if(!a)R(s)},this.connectTimeoutMs),E=(c=1000,v="client closed")=>{if(u)return;if(u=!0,clearTimeout(l),e.signal?.removeEventListener("abort",x),i.readyState===k||i.readyState===X)i.close(c,v)},R=(c)=>{n.onError?.(c),E(1011,"websocket error")},le=()=>{n.onDone?.(),E(1000,"done")},x=()=>{if(i.readyState===k)i.send(JSON.stringify({type:"cancel"}));R(Error("WebSocket run aborted."))};return e.signal?.addEventListener("abort",x,{once:!0}),i.onopen=()=>{if(a=!0,clearTimeout(l),e.signal?.aborted){x();return}i.send(JSON.stringify({type:"execute",agentId:r,events:B(e),sessionId:e.sessionId,...e.eventId!==void 0?{eventId:e.eventId}:{},...e.mode!==void 0?{mode:e.mode}:{},...e.idempotencyKey!==void 0?{idempotencyKey:e.idempotencyKey}:{},...e.system!==void 0?{system:e.system}:{},...e.model!==void 0?{model:e.model}:{}}))},i.onmessage=(c)=>{if(typeof c.data!=="string")return;let v=te(c.data);if(!v)return;let A=ee(v,n);switch(n.onMessage?.(A),A.type){case"meta":n.onMeta?.(A);break;case"done":le();break;case"error":R(Error(oe(A.error)));break}},i.onerror=()=>{R(s)},i.onclose=(c)=>{if(clearTimeout(l),e.signal?.removeEventListener("abort",x),u||c.code===1000)return;R(Error(c.reason||"WebSocket connection closed."))},{url:o,sendControl:function(c){if(i.readyState!==k)throw Error("WebSocket is not open");i.send(JSON.stringify({type:"control",...c}))},close:E}}attach(e,n={}){let t=this.resolveWebSocket(),o=this.buildUrl(e),r=new t(o,D(this.apiKey)),s=!1,i=(a=1000,u="client closed")=>{if(s)return;if(s=!0,r.readyState===k||r.readyState===X)r.close(a,u)};return r.onopen=()=>r.send(JSON.stringify({type:"attach",...e,signal:void 0,agent:void 0})),r.onmessage=(a)=>{if(typeof a.data!=="string")return;let u=te(a.data);if(!u)return;let l=ee(u,n);if(n.onMessage?.(l),l.type==="done")n.onDone?.();if(l.type==="error")n.onError?.(Error(oe(l.error)))},r.onerror=()=>n.onError?.(Q(this.baseUrl)),r.onclose=(a)=>{if(!s&&a.code!==1000)n.onError?.(Error(a.reason||"WebSocket connection closed."))},{url:o,sendControl:function(a){if(r.readyState!==k)throw Error("WebSocket is not open");r.send(JSON.stringify({type:"control",...a}))},close:i}}async*stream(e){let n=[],t=!1,o=null,r=null,s=()=>{r?.(),r=null},i=this.subscribe(e,{onMessage:function(a){n.push(a),s()},onDone:function(){t=!0,s()},onError:function(a){o=a,s()}});try{while(!0){if(n.length>0){yield n.shift();continue}if(o)throw o;if(t)return;await new Promise((a)=>{r=a})}}finally{i.close()}}buildUrl(e){let n=gn(e),t=e.projectSlug??e.agent?.projectSlug,o=e.stageSlug??e.agent?.stageSlug,r=t?`/${t}`:"",s=o?`/${o}`:"";return`${K(this.baseUrl)}/v1${r}/agents${s}/${encodeURIComponent(n)}/ws`}resolveWebSocket(){let e=this.WebSocketImpl??globalThis.WebSocket;if(!e)throw Error("WebSocket is not available. Pass a WebSocket implementation in BroodsWebSocketClient options.");return e}}function D(e){return["broods.v1",`broods.token.${e}`]}function ln(e){let n=e.agentId??e.agent?.id??e.endpointId;if(!n)throw Error("WebSocket run requires agent, agentId, or endpointId.");return n}function gn(e){let n=e.endpointId??e.agent?.endpointId??e.agent?.id;if(!n)throw Error("WebSocket run requires agent or endpointId.");return n}function K(e){let n=new URL(se(e));if(n.protocol==="https:")n.protocol="wss:";if(n.protocol==="http:")n.protocol="ws:";return g(n.toString())}function se(e){let n=e.trim();if(/^wss?:\/\//.test(n))return g(n);return W(n)}function Q(e){return Error(`Cannot access the WebSocket service at ${e}.`)}function ee(e,n){if(e.type!=="output")return e;let t=e;return n.onOutput?.(t),t.data}function te(e){try{let n=JSON.parse(e);return typeof n==="object"&&n!==null&&typeof n.type==="string"?n:null}catch{return null}}function oe(e){if(typeof e==="string")return e;if(e&&typeof e==="object"&&typeof e.message==="string")return e.message;return e===void 0?"WebSocket stream error.":JSON.stringify(e)}var ae=Symbol.for("broods.resource"),ce=Symbol.for("broods.config"),ue=Symbol.for("broods.connection"),ie=/^[A-Z][A-Z0-9_]{0,63}$/,Me=new Proxy((e)=>{if(!ie.test(e))throw Error("env name must match /^[A-Z][A-Z0-9_]*$/ and be at most 64 characters.");return{__beeblastEnv:!0,name:e}},{get:function(e,n,t){if(typeof n==="string"&&ie.test(n))throw Error(`env.${n} is not supported; use env("${n}")`);return Reflect.get(e,n,t)}});function d(e,n,t,o){return{[ae]:!0,kind:e,name:n,...t?{description:t}:{},config:o}}function m(e,n){let{partition:t,...o}=n;return{[ue]:!0,kind:"connection",type:e,...t?{partition:t}:{},config:o}}function b(e,n,t,o,r){return d("channelRecord",e,n,{...r,externalId:t,...o?{workspaceRef:o}:{}})}function Ae(e){return m("discord",e)}function ze(e){return m("github",e)}function Oe(e){return m("pancake",e)}function Ne(e){return m("slack",e)}function je(e){return m("telegram",e)}function qe(e){return m("zalo",e)}function De(e){let{name:n,description:t,channelId:o,guildId:r,...s}=e;return b(n,t,o,r,s)}function Le(e){let{name:n,description:t,repo:o,...r}=e,[s,...i]=o.split("/");if(!s||i.length!==1||!i[0])throw Error(`Channel "${n}" repo must be "owner/name", not "${o}"`);return b(n,t,o,s,r)}function Ue(e){let{name:n,description:t,conversationId:o,...r}=e;return b(n,t,o,void 0,r)}function Fe(e){let{name:n,description:t,channelId:o,teamId:r,...s}=e;return b(n,t,o,r,s)}function Be(e){let{name:n,description:t,chatId:o,...r}=e;return b(n,t,o,void 0,r)}function Ve(e){let{name:n,description:t,chatId:o,...r}=e;return b(n,t,o,void 0,r)}function Ze(e){return{[ce]:!0,config:e}}function He(e){let{name:n,description:t,...o}=e;return d("agent",n,t,o)}function We(e){return e}function Ke(e){let{name:n,description:t,...o}=e;return d("workspace",n,t,o)}function Ge(e){let{name:n,description:t,...o}=e;return d("sandbox",n,t,o)}function Je(e){let{name:n,description:t,...o}=e;return d("skill",n,t,o)}function Ye(e){let{name:n,description:t,...o}=e;return d("mcp",n,t,o)}function Xe(e){let{name:n,description:t,...o}=e;return d("policy",n,t,o)}function Qe(e){let{name:n,description:t,...o}=e;return d("cron",n,t,o)}function h(e){return Boolean(e&&typeof e==="object"&&e[ae])}function _(e){return Boolean(e&&typeof e==="object"&&e[ue])}function ne(e){return Boolean(e&&typeof e==="object"&&e[ce])}
|
|
5
|
+
export{B,pe,xe,ke,Te,Pe,Ie,V,y,S,I,Z,H,w,g,re,f,z,C,me,q,W,$e,D,K,Me,Ae,ze,Oe,Ne,je,qe,De,Le,Ue,Fe,Be,Ve,Ze,He,We,Ke,Ge,Je,Ye,Xe,Qe,h,_,ne};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{V,y,S,I,Z,H,w,g,re,f,z,C,q,D,K,h,_,ne}from"../chunk-
|
|
2
|
+
import{V,y,S,I,Z,H,w,g,re,f,z,C,q,D,K,h,_,ne}from"../chunk-rea5p7sh.js";import{chmod as aS,lstat as sS,mkdir as Ss,readFile as Dh,readdir as iS,stat as lS,writeFile as Rt}from"node:fs/promises";import{createHash as Uh}from"node:crypto";import{basename as cS,join as vn,relative as uS,resolve as Fe,sep as dS}from"node:path";import{watch as pS}from"node:fs";import{spawn as Lh}from"node:child_process";import{tmpdir as fS}from"node:os";import{performance as Ch}from"node:perf_hooks";import{stripVTControlCharacters as mS}from"node:util";import{fileURLToPath as tg,pathToFileURL as qs}from"node:url";import{createHash as rg}from"node:crypto";import{readFileSync as ng}from"node:fs";import{mkdtemp as Ws,readdir as Vs,readFile as og,rm as Gs,writeFile as bo}from"node:fs/promises";import Ns from"node:module";import{tmpdir as Js}from"node:os";import{basename as ag,isAbsolute as sg,join as Ot,relative as gr,resolve as bn}from"node:path";import{build as ig,transformSync as Ks}from"esbuild";var As={anthropic:{label:"Anthropic",modelPlaceholder:"claude-sonnet-4-5-20250929"},azure:{label:"Azure OpenAI",modelPlaceholder:"gpt-4.1-mini"},baseten:{label:"Baseten",modelPlaceholder:"deepseek-ai/DeepSeek-V3"},bedrock:{label:"Amazon Bedrock",modelPlaceholder:"anthropic.claude-sonnet-4-5-20250929-v1:0"},cerebras:{label:"Cerebras",modelPlaceholder:"llama3.1-8b"},cohere:{label:"Cohere",modelPlaceholder:"command-a-03-2025"},custom:{label:"Custom OpenAI-compatible",modelPlaceholder:"gpt-oss-120b"},deepinfra:{label:"DeepInfra",modelPlaceholder:"deepseek-ai/DeepSeek-V3"},deepseek:{label:"DeepSeek",modelPlaceholder:"deepseek-chat"},fireworks:{label:"Fireworks",modelPlaceholder:"accounts/fireworks/models/deepseek-v3"},google:{label:"Google",modelPlaceholder:"gemini-2.5-flash"},groq:{label:"Groq",modelPlaceholder:"llama-3.3-70b-versatile"},minimax:{label:"MiniMax",modelPlaceholder:"MiniMax-M2.7"},mistral:{label:"Mistral",modelPlaceholder:"mistral-large-latest"},openai:{label:"OpenAI",modelPlaceholder:"gpt-4.1-mini"},perplexity:{label:"Perplexity",modelPlaceholder:"sonar-pro"},togetherai:{label:"Together.ai",modelPlaceholder:"deepseek-ai/DeepSeek-V3"},v0:{label:"Vercel v0",modelPlaceholder:"v0-1.0-md"},vercel:{label:"Vercel AI Gateway",modelPlaceholder:"openai/gpt-4.1-mini"},vertex:{label:"Google Vertex AI",modelPlaceholder:"gemini-2.5-flash"},xai:{label:"xAI Grok",modelPlaceholder:"grok-4"}},Os=Object.keys(As);function Ps(a){return Object.hasOwn(As,a)}var zr="*",lg=`const passthrough = (input) => input;
|
|
3
3
|
export const defineAgent = passthrough;
|
|
4
4
|
export const defineBroods = passthrough;
|
|
5
5
|
export const defineCron = passthrough;
|
|
@@ -160,7 +160,7 @@ Reason: ${(O=a.approval.reason)!=null?O:"denied"}`}}}function Km(a,m,b,x){switch
|
|
|
160
160
|
`).flatMap((G)=>I_(G,x));return[U,...W.map((G)=>S_(G,x,b.color)),B]}function S_(a,m,b){let x=$r(a,m),k=" ".repeat(Math.max(0,m-Wt(x)));return`${b}│${lt.reset} ${x}${k} ${b}│${lt.reset}`}function I_(a,m){if(a.length===0)return[""];let b=[],x=a;while(Wt(x)>m){let k=E_(x,m);b.push(x.slice(0,k).trimEnd()),x=x.slice(k).trimStart()}return b.push(x),b}function E_(a,m){let x=$r(a,m+1).lastIndexOf(" ");if(x>0)return x;return $r(a,m).length}function T_(a){var m,b;let x="usage"in a?a.usage:void 0,k="messageMetadata"in a?(m=a.messageMetadata)==null?void 0:m.usage:void 0,O="messageMetadata"in a?(b=a.messageMetadata)==null?void 0:b.performance:void 0;return{totalTokens:gh(x!=null?x:k),outputTokens:fs(x!=null?x:k),outputTokensPerSecond:O==null?void 0:O.outputTokensPerSecond}}function k_(a){var m;let b=a;return{totalTokens:gh(b==null?void 0:b.usage),outputTokens:fs(b==null?void 0:b.usage),outputTokensPerSecond:(m=b==null?void 0:b.performance)==null?void 0:m.outputTokensPerSecond}}function gh(a){let m=a==null?void 0:a.totalTokens;if(typeof m==="number")return m;if(typeof(m==null?void 0:m.total)==="number")return m.total;let b=$_(a),x=fs(a);if(b!=null&&x!=null)return b+x;return}function $_(a){let m=a==null?void 0:a.inputTokens;if(typeof m==="number")return m;if(typeof(m==null?void 0:m.total)==="number")return m.total;return a==null?void 0:a.promptTokens}function fs(a){let m=a==null?void 0:a.outputTokens;if(typeof m==="number")return m;if(typeof(m==null?void 0:m.total)==="number")return m.total;return a==null?void 0:a.completionTokens}function vh(a,m){if(a==null)return;let b=`${a.toLocaleString()} ${a===1?"token":"tokens"}`,x=M_(a,m);return x==null?b:`${b} ${x}`}function M_(a,m){if(m==null||m<=0||!Number.isFinite(m))return;return`${Math.round(a/m*100).toLocaleString()}%`}function R_(a,m){if(m==="outputTokensPerSecond")return C_(a.outputTokensPerSecond);return vh(a.outputTokens)}function C_(a){if(a==null)return;return`${A_(a)} tok/s`}function A_(a){return Number.isInteger(a)?a.toLocaleString():a.toLocaleString(void 0,{maximumFractionDigits:1})}function co(a){let m=a.toString("utf8");switch(m){case"\f":return{type:"ctrl-l"};case"\x03":return{type:"ctrl-c"};case"\x1B":return{type:"escape"};case"\r":case`
|
|
161
161
|
`: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(m>=" "&&m!=="")return{type:"character",value:m};return{type:"ignore"}}}var O_="outputTokensPerSecond",P_=class{constructor(a){this.chatId=Sr();var m,b,x,k;this.agent=a.agent,this.transport=a.transport,this.renderer=(m=j_(a))!=null?m:N_(a),this.title=a.title,this.tools=(b=a.tools)!=null?b:"auto-collapsed",this.reasoning=(x=a.reasoning)!=null?x:"auto-collapsed",this.responseStatistics=(k=a.responseStatistics)!=null?k:O_,this.contextSize=a.contextSize,this.sandbox=a.sandbox}async run(){let a=this.title,m=[],b=0,x=()=>`message-${++b}`,k,O=!1,N=!1;while(!0){if(!N){if(k==null){if(!this.renderer.readPrompt){if(O)return;throw Error("No prompt was provided and the renderer does not support prompt input.")}try{k=await this.renderer.readPrompt({title:a})}catch(B){if(th(B))return;throw B}if(k==null)return}m.push(U_(x(),k)),O=!0}let U=await this.streamMessages([...m],x);try{let B=await this.renderer.renderStream(U,{title:a,submittedPrompt:k,continueSession:Boolean(this.renderer.readPrompt),tools:this.tools,reasoning:this.reasoning,responseStatistics:this.responseStatistics,contextSize:this.contextSize,waitForExit:!1});if(B&&B.parts.length>0){let F=L_(B);if(F.length>0){if(!this.renderer.readToolApproval)throw Error("Tool approval was requested, but the renderer does not support tool approval input.");for(let W of F){let G=await this.renderer.readToolApproval(W,{title:a});Z_(B,W,G)}Xm(m,B,N),N=!0,k=void 0;continue}Xm(m,B,N)}}catch(B){if(th(B))return;throw B}N=!1,k=void 0}}async streamMessages(a,m){let b=new AbortController,x=()=>b.abort();if(this.transport)return{uiMessageStream:await this.transport.sendMessages({trigger:"submit-message",chatId:this.chatId,messageId:void 0,messages:a,abortSignal:b.signal}),message:is(a),abort:x};let k=this.agent,O=await k.stream({prompt:await Qn(a,{tools:k.tools}),abortSignal:b.signal,options:void 0,experimental_sandbox:this.sandbox});return{uiMessageStream:z_(O.fullStream,m,a),message:is(a),abort:x}}};function N_(a){return a.tools===void 0&&a.reasoning===void 0&&a.responseStatistics===void 0&&a.contextSize===void 0?new ss:new ss({tools:a.tools,reasoning:a.reasoning,responseStatistics:a.responseStatistics,contextSize:a.contextSize})}function j_(a){if(a.renderer)return a.renderer;if(!a.screen&&!a.userInput)return;return new ss({tools:a.tools,reasoning:a.reasoning,responseStatistics:a.responseStatistics,contextSize:a.contextSize,input:a.userInput,output:a.screen})}async function*z_(a,m,b=[]){var x,k;let O=new Set,N=new Set,U=new Set,B,F,W=!1;yield{type:"start",messageId:(k=(x=is(b))==null?void 0:x.id)!=null?k:m()};for await(let G of a)switch(G.type){case"text-start":O.add(G.id),yield{type:"text-start",id:G.id,providerMetadata:G.providerMetadata};break;case"text-delta":if(!O.has(G.id))O.add(G.id),yield{type:"text-start",id:G.id,providerMetadata:G.providerMetadata};yield{type:"text-delta",id:G.id,delta:G.text,providerMetadata:G.providerMetadata};break;case"text-end":O.delete(G.id),yield{type:"text-end",id:G.id,providerMetadata:G.providerMetadata};break;case"reasoning-start":N.add(G.id),yield{type:"reasoning-start",id:G.id,providerMetadata:G.providerMetadata};break;case"reasoning-delta":if(!N.has(G.id))N.add(G.id),yield{type:"reasoning-start",id:G.id,providerMetadata:G.providerMetadata};yield{type:"reasoning-delta",id:G.id,delta:G.text,providerMetadata:G.providerMetadata};break;case"reasoning-end":N.delete(G.id),yield{type:"reasoning-end",id:G.id,providerMetadata:G.providerMetadata};break;case"tool-input-start":yield{type:"tool-input-start",toolCallId:G.id,toolName:G.toolName,providerExecuted:G.providerExecuted,providerMetadata:G.providerMetadata,toolMetadata:G.toolMetadata,dynamic:G.dynamic,title:G.title};break;case"tool-input-delta":yield{type:"tool-input-delta",toolCallId:G.id,inputTextDelta:G.delta};break;case"tool-call":U.add(G.toolCallId),yield{type:"tool-input-available",toolCallId:G.toolCallId,toolName:G.toolName,input:G.input,providerExecuted:G.providerExecuted,providerMetadata:G.providerMetadata,toolMetadata:G.toolMetadata,dynamic:G.dynamic,title:G.title};break;case"tool-approval-request":if(!U.has(G.toolCall.toolCallId))U.add(G.toolCall.toolCallId),yield{type:"tool-input-available",toolCallId:G.toolCall.toolCallId,toolName:G.toolCall.toolName,input:G.toolCall.input,providerExecuted:G.toolCall.providerExecuted,providerMetadata:G.toolCall.providerMetadata,toolMetadata:G.toolCall.toolMetadata,dynamic:G.toolCall.dynamic,title:G.toolCall.title};yield{type:"tool-approval-request",approvalId:G.approvalId,toolCallId:G.toolCall.toolCallId,isAutomatic:G.isAutomatic};break;case"tool-approval-response":yield{type:"tool-approval-response",approvalId:G.approvalId,approved:G.approved,reason:G.reason,providerExecuted:G.providerExecuted};break;case"tool-result":yield{type:"tool-output-available",toolCallId:G.toolCallId,output:G.output,providerExecuted:G.providerExecuted,providerMetadata:G.providerMetadata,toolMetadata:G.toolMetadata,dynamic:G.dynamic,preliminary:G.preliminary};break;case"tool-error":yield{type:"tool-output-error",toolCallId:G.toolCallId,errorText:Qm(G.error),providerExecuted:G.providerExecuted,providerMetadata:G.providerMetadata,toolMetadata:G.toolMetadata,dynamic:G.dynamic};break;case"tool-output-denied":yield{type:"tool-output-denied",toolCallId:G.toolCallId};break;case"source":if(G.sourceType==="url")yield{type:"source-url",sourceId:G.id,url:G.url,title:G.title,providerMetadata:G.providerMetadata};else yield{type:"source-document",sourceId:G.id,mediaType:G.mediaType,title:G.title,filename:G.filename,providerMetadata:G.providerMetadata};break;case"file":yield{type:"file",url:eh(G.file.mediaType,G.file.base64),mediaType:G.file.mediaType,providerMetadata:G.providerMetadata};break;case"reasoning-file":yield{type:"reasoning-file",url:eh(G.file.mediaType,G.file.base64),mediaType:G.file.mediaType,providerMetadata:G.providerMetadata};break;case"start-step":yield{type:"start-step"};break;case"finish-step":B=G.usage,F=G.performance,yield{type:"finish-step"};break;case"finish":yield*Ym(O,N),W=!0,yield{type:"finish",finishReason:G.finishReason,messageMetadata:D_(B!=null?B:G.totalUsage,F)};break;case"abort":yield{type:"abort",reason:G.reason};break;case"error":yield{type:"error",errorText:Qm(G.error)};break}if(!W)yield*Ym(O,N),yield{type:"finish"}}function D_(a,m){if((a==null?void 0:a.totalTokens)==null&&(a==null?void 0:a.outputTokens)==null&&(m==null?void 0:m.outputTokensPerSecond)==null)return;return{...(a==null?void 0:a.totalTokens)==null&&(a==null?void 0:a.outputTokens)==null?{}:{usage:{...a.totalTokens==null?{}:{totalTokens:a.totalTokens},...a.outputTokens==null?{}:{outputTokens:a.outputTokens}}},...(m==null?void 0:m.outputTokensPerSecond)==null?{}:{performance:{outputTokensPerSecond:m.outputTokensPerSecond}}}}function*Ym(a,m){for(let b of a)yield{type:"text-end",id:b};a.clear();for(let b of m)yield{type:"reasoning-end",id:b};m.clear()}function U_(a,m){return{id:a,role:"user",parts:[{type:"text",text:m}]}}function Xm(a,m,b){var x;if(b&&((x=a.at(-1))==null?void 0:x.role)==="assistant"){a[a.length-1]=m;return}a.push(m)}function is(a){let m=a.at(-1);return(m==null?void 0:m.role)==="assistant"?m:void 0}function L_(a){let m=[];for(let[b,x]of a.parts.entries()){if(!tt(x)||x.state!=="approval-requested"||x.approval.isAutomatic===!0)continue;m.push({approvalId:x.approval.id,toolCallId:x.toolCallId,toolName:qt(x),title:x.title,input:x.input,providerExecuted:x.providerExecuted,messageId:a.id,partIndex:b})}return m}function Z_(a,m,b){let x=a.parts[m.partIndex];if(!x||!tt(x)||x.toolCallId!==m.toolCallId)throw Error(`Could not find tool approval request ${m.approvalId}.`);x.state="approval-responded",x.approval={id:m.approvalId,approved:b.approved,...b.reason?{reason:b.reason}:{}}}function Qm(a){if(a instanceof Error)return a.message;if(typeof a==="string")return a;return JSON.stringify(a)}function eh(a,m){return`data:${a};base64,${m}`}function th(a){return a instanceof Error&&a.message==="Interrupted"}async function yh(a){await new P_(a).run()}async function bh(a){if(a.prompt!==void 0)F_(a.prompt);await yh({title:`broods · ${a.agent.name}`,tools:"full",transport:new xh(a.client,a.agent)})}async function wh(a){let m=Pm({stream:_h(a.client.stream(a.agent,{input:a.prompt}),void 0,()=>{})});for await(let b of m)process.stdout.write(b);process.stdout.write(`
|
|
162
162
|
`)}async function F_(a){let m=process.stdin.listenerCount("data"),b=Date.now()+1e4;while(process.stdin.listenerCount("data")<=m){if(Date.now()>b)return;await new Promise((x)=>setTimeout(x,20))}process.stdin.emit("data",Buffer.from(a)),process.stdin.emit("data",Buffer.from("\r"))}class xh{client;agent;conversationKey=`tui-${Sr()}`;sentApprovals=new Set;sentUserTurns=0;constructor(a,m){this.client=a;this.agent=m}async reconnectToStream(){return null}async sendMessages(a){let m=this.pendingEvents(await Qn(a.messages));if(m.events.length===0)throw Error("Nothing new to send: the agent already saw this turn.");let b=this.client.stream(this.agent,{conversationKey:this.conversationKey,events:m.events});return Dm({stream:_h(b,a.abortSignal,m.commit),originalMessages:a.messages,generateMessageId:Sr,sendSources:!0})}pendingEvents(a){let m=[],b=[],x=0;for(let k of a){if(k.role==="user"){if(x+=1,x>this.sentUserTurns)m.push(k);continue}if(k.role!=="tool")continue;for(let O of k.content)if(O.type==="tool-approval-response"&&!this.sentApprovals.has(O.approvalId))b.push(O)}if(b.length>0)m.push({role:"tool",content:b});return{events:m,commit:()=>{this.sentUserTurns=x;for(let k of b)this.sentApprovals.add(k.approvalId)}}}}function _h(a,m,b){let x=!1,k=()=>void a.return(void 0);return new ReadableStream({pull:async function(O){let N=await Promise.race([a.next(),B_(m)]);if(m?.aborted){k(),O.close();return}if(!x)x=!0,b();if(N.done)O.close();else O.enqueue(N.value)},cancel:k})}function B_(a){return new Promise((m)=>{if(!a)return;let b=()=>m({done:!0,value:void 0});if(a.aborted)b();else a.addEventListener("abort",b,{once:!0})})}import{existsSync as Sh}from"node:fs";import{mkdir as q_,readFile as W_,writeFile as V_}from"node:fs/promises";import{dirname as Th,join as ms,resolve as G_,sep as Kt}from"node:path";import{fileURLToPath as J_}from"node:url";var hs=ms(Th(I),"update-check.json"),K_=86400000,H_="https://registry.npmjs.org/broods/latest",Y_=2000;function gs(a,m){let b=Eh(a),x=Eh(m);for(let k=0;k<3;k+=1){let O=b[k]??0,N=x[k]??0;if(O!==N)return O>N}return!Ih(a)&&Ih(m)}async function vs(a={}){let m=await eS(),b=a.maxAgeMs??K_;if(m&&Date.now()-m.checkedAt<b)return m.latest;let x=await X_();if(x===null)return m?.latest??null;return await tS({checkedAt:Date.now(),latest:x}),x}function kh(a=G_(process.cwd()),m=J_(import.meta.url)){let b=`${Kt}node_modules${Kt}`,x=m.lastIndexOf(b),k=x===-1?null:m.slice(0,x),O=k===null?m.startsWith(`${a}${Kt}`):a===k||a.startsWith(`${k}${Kt}`),U=m.includes(`${Kt}.bun${Kt}install${Kt}global${Kt}`)||O&&Q_(k??a)?"bun":"npm",B=U==="bun"?"add":"install";return{manager:U,global:!O,command:U,args:O?[B,"broods@latest"]:[B,"-g","broods@latest"]}}async function X_(){try{let a=await fetch(H_,{signal:AbortSignal.timeout(Y_),headers:{accept:"application/json"}});if(!a.ok)return null;let m=await a.json();return typeof m.version==="string"?m.version:null}catch{return null}}function Q_(a){return Sh(ms(a,"bun.lock"))||Sh(ms(a,"bun.lockb"))}function Ih(a){return a.includes("-")}async function eS(){try{let a=JSON.parse(await W_(hs,"utf8"));if(typeof a.latest!=="string")return null;if(typeof a.checkedAt!=="number")return null;return{checkedAt:a.checkedAt,latest:a.latest}}catch{return null}}function Eh(a){let[m]=a.trim().replace(/^v/,"").split("-");return(m??"").split(".").slice(0,3).map((b)=>Number.parseInt(b,10)||0)}async function tS(a){try{await q_(Th(hs),{recursive:!0}),await V_(hs,`${JSON.stringify(a)}
|
|
163
|
-
`,"utf8")}catch{}}var $h={name:"broods",version:"0.33.
|
|
163
|
+
`,"utf8")}catch{}}var $h={name:"broods",version:"0.33.3",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 .",test:"bun test"},dependencies:{esbuild:"^0.28.2"},devDependencies:{"@ai-sdk/tui":"1.0.94","@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/client":"^2.0.0","@modelcontextprotocol/server":"2.0.0","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.93",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.93"},peerDependenciesMeta:{ai:{optional:!0}},engines:{node:">=22.15"}};var Mh=`---
|
|
164
164
|
name: broods
|
|
165
165
|
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.
|
|
166
166
|
---
|
|
@@ -496,4 +496,4 @@ export const myAgent = defineAgent({
|
|
|
496
496
|
`+" // `broods run` can reach this agent. Off by default — secured: a\n"+` // private agent is only reachable via internal endpoints or channel webhooks.
|
|
497
497
|
publicAccess: true,
|
|
498
498
|
});
|
|
499
|
-
`}function oI(a,m){if(a==="status")throw Error("status was renamed to whoami. Run `broods whoami`.");if(m.includes("--env"))throw Error("--env was renamed to --stage. Pass --stage <name> instead.");f();let b=process.env.BROODS_ENVIRONMENT;if(b!==void 0&&process.env.BROODS_STAGE===void 0)throw Error(`BROODS_ENVIRONMENT was renamed to BROODS_STAGE. Rename the key in .env.local (it is currently set to "${b}").`)}async function aI(){let a=f(),[{createBroodsMcpServer:m},{serveStdio:b},x]=await Promise.all([import("../chunk-
|
|
499
|
+
`}function oI(a,m){if(a==="status")throw Error("status was renamed to whoami. Run `broods whoami`.");if(m.includes("--env"))throw Error("--env was renamed to --stage. Pass --stage <name> instead.");f();let b=process.env.BROODS_ENVIRONMENT;if(b!==void 0&&process.env.BROODS_STAGE===void 0)throw Error(`BROODS_ENVIRONMENT was renamed to BROODS_STAGE. Rename the key in .env.local (it is currently set to "${b}").`)}async function aI(){let a=f(),[{createBroodsMcpServer:m},{serveStdio:b},x]=await Promise.all([import("../chunk-7dq2qhaa.js"),import("../chunk-7keawrjg.js"),Z()]),k=x?new Je({baseUrl:x.baseUrl,token:x.token}):null,O=m({allowDestructive:process.env.BROODS_MCP_ALLOW_DESTRUCTIVE==="1"&&z("BROODS_MCP_ALLOW_DESTRUCTIVE"),cli:k,scope:{project:a.project,stage:a.stage}});b(()=>O),await new Promise((N)=>{process.stdin.on("close",N)})}gS().catch((a)=>{console.error(a instanceof Error?a.message:String(a)),process.exit(1)});export{ce,v,le,ue,we,_e,P,j,de,Q,e,Re,ee,te,o,i,R,Ee,l,r,t,d,c,T,E,s,p,n,u,M,A};
|
package/dist/index.d.ts
CHANGED
|
@@ -505,6 +505,7 @@ interface SandboxNetworkConfig {
|
|
|
505
505
|
*/
|
|
506
506
|
interface SandboxConfig {
|
|
507
507
|
provider: SandboxProvider;
|
|
508
|
+
fallbackProvider?: SandboxProvider;
|
|
508
509
|
size?: SandboxSize;
|
|
509
510
|
snapshot?: string;
|
|
510
511
|
runtimes?: RuntimeName[];
|
|
@@ -1058,7 +1059,11 @@ type ObservabilityUnsubscribeMessage = {
|
|
|
1058
1059
|
type: "unsubscribe";
|
|
1059
1060
|
stream: "logs" | "traces";
|
|
1060
1061
|
};
|
|
1061
|
-
type
|
|
1062
|
+
type ObservabilityFetchTraceMessage = {
|
|
1063
|
+
type: "fetchTrace";
|
|
1064
|
+
traceId: string;
|
|
1065
|
+
};
|
|
1066
|
+
type ObservabilityClientMessage = ObservabilitySubscribeMessage | ObservabilityUnsubscribeMessage | ObservabilityFetchTraceMessage;
|
|
1062
1067
|
type ObservabilityReadyMessage = {
|
|
1063
1068
|
type: "ready";
|
|
1064
1069
|
};
|
|
@@ -1066,6 +1071,8 @@ type ObservabilityBackfillMessage = {
|
|
|
1066
1071
|
type: "backfill";
|
|
1067
1072
|
stream: "logs" | "traces";
|
|
1068
1073
|
entries: ObservabilityLogEntry[] | ObservabilitySpanRow[];
|
|
1074
|
+
more?: boolean;
|
|
1075
|
+
error?: string;
|
|
1069
1076
|
};
|
|
1070
1077
|
type ObservabilityLogMessage = {
|
|
1071
1078
|
type: "log";
|
|
@@ -1085,6 +1092,8 @@ declare function isObservabilityClientMessage(v: unknown): v is ObservabilityCli
|
|
|
1085
1092
|
declare function isLogLevel(value: unknown): value is LogLevel;
|
|
1086
1093
|
/** Whether a span is a top-level run, each of which owns its own trace. */
|
|
1087
1094
|
declare function isRootSpanKind(kind: ObservabilitySpanRow["kind"]): boolean;
|
|
1095
|
+
/** Whether a value is a real trace id a log line can be followed to. */
|
|
1096
|
+
declare function isTraceId(value: unknown): value is string;
|
|
1088
1097
|
/**
|
|
1089
1098
|
* Narrow a wire value to a sandbox log id. Strict on purpose: the gateway
|
|
1090
1099
|
* interpolates it into LogQL, so only the UUID shape core mints may pass.
|
|
@@ -2378,5 +2387,5 @@ declare function isResource(value: unknown): value is AnyResource;
|
|
|
2378
2387
|
declare function isConnectionDefinition(value: unknown): value is AnyConnectionDefinition;
|
|
2379
2388
|
declare function isBroodsConfig(value: unknown): value is BroodsConfigDefinition;
|
|
2380
2389
|
|
|
2381
|
-
export { BroodsAccountApiError, BroodsAccountClient, BroodsClient, BroodsWebSocketClient, DEFAULT_CORE_BASE_URL, IngressAcceptedError, MAX_OBSERVABILITY_BACKFILL, BroodsWebSocketClient as WebSocketClient, BroodsWebSocketClient as WebsocketClient, defineAgent, defineBroods, defineCron, defineDiscordChannel, defineDiscordConnection, defineGitHubChannel, defineGitHubConnection, defineHarness, defineMcp, definePancakeChannel, definePancakeConnection, definePolicy, defineSandbox, defineSkill, defineSlackChannel, defineSlackConnection, defineTelegramChannel, defineTelegramConnection, defineWorkspace, defineZaloChannel, defineZaloConnection, env, envPlaceholder, isBroodsConfig, isConnectionDefinition, isLogLevel, isObservabilityClientMessage, isResource, isRootSpanKind, isSandboxLogId, normalizeHttpServiceUrl, readSseStream, resolveEnvCredential, resolveRunEvents, toWebSocketBaseUrl, webSocketSubprotocols };
|
|
2382
|
-
export type { Account, AccountAgent, AccountChannel, AccountEnvVar, AccountMcp, AccountPolicy, AccountRole, AccountSandbox, AccountWorkspace, Agent, AgentChannelsConfig, AgentCodeHookConfig, AgentConfig, AgentConfigDoc, AgentDefinitionConfig, AgentDiscordChannelConfig, AgentGitHubChannelConfig, AgentHandle, AgentHookEventName, AgentHooks, AgentHooksConfig, AgentPancakeChannelConfig, AgentProviderSettings, AgentReference, AgentResource, AgentRunEventInput, AgentRunInput, AgentRunModelOverrides, AgentRunOverrides, AgentRunResult, AgentSkillsDefinitionConfig, AgentSlackChannelConfig, AgentStreamPart, AgentSubagentDefinitionConfig, AgentTelegramChannelConfig, AgentWebhookHookConfig, AgentWorkspaceInput, AgentWorkspaceRef, AgentWorkspaceRefInput, AgentZaloChannelConfig, AnyConnectionDefinition, AnyResource, AssumeRoleResult, AsyncAgentRun, AsyncPollOptions, AsyncRequestAccepted, AsyncStatus, BroodsAccount, BroodsAccountClientOptions, BroodsClientOptions, BroodsConfigDefinition, BroodsProjectConfig, BroodsWebSocketClientOptions, ChannelAgentInput, ChannelDefinitionConfig, ChannelMessageReceived, ChannelPartition, ChannelRecordConfig, ChannelReference, ChannelReplyIn, ChannelResource, ChannelType, CliManifest, CliManifestResource, ConnectionDefinition, CreateAgentResult, CreateClientCronInput, CreateCronInput, CreateMcpInput, Cron, CronDefinitionConfig, CronDoc, CronLastStatus, CronResource, CronRun, CronStatus, DeleteAccountResult, DiscordChannelInput, DiscordConnectionDefinition, DiscordConnectionInput, DiscordMessageSource, DiscordSource, Doc, EnvAccessor, EnvRef, EnvRefString, GeneratedIds, GitHubChannelInput, GitHubConnectionDefinition, GitHubConnectionInput, GitHubMessageSource, GitHubSource, HarnessDefinition, HarnessType, HookContext, Id, IngressMode, IngressStatus, LogLevel, McpDefinitionConfig, McpHandler, McpOauthInput, McpResource, ObservabilityBackfillMessage, ObservabilityClientMessage, ObservabilityErrorMessage, ObservabilityLogEntry, ObservabilityLogMessage, ObservabilityReadyMessage, ObservabilityServerMessage, ObservabilitySpanMessage, ObservabilitySpanRow, ObservabilitySubscribeMessage, ObservabilityUnsubscribeMessage, PancakeChannelInput, PancakeConnectionDefinition, PancakeConnectionInput, PancakeMessageSource, PancakeSource, PendingQuestion, PolicyDefinitionConfig, PolicyDocument, PolicyResource, ProjectDoc, ProviderConfigInput, ProviderSettingsInput, ResourceApi, ResourceDefinition, ResourceInput, ResourceKind, RotateSecretResult, Sandbox, SandboxConfig, SandboxConfigDoc, SandboxDefinitionConfig, SandboxDefinitionOptions, SandboxLifecycleResult, SandboxResource, SandboxSnapshotResult, SandboxTerminalTicket, Skill, SkillDefinitionConfig, SkillResource, SkillUploadInput, SlackChannelInput, SlackConnectionDefinition, SlackConnectionInput, SlackMessageSource, SlackSource, StageDoc, StageScope, TelegramChannelInput, TelegramConnectionDefinition, TelegramConnectionInput, TelegramMessageSource, TelegramSource, ToolApprovalSummary, UpdateAgentInput, UpdateCronInput, UpdateMcpInput, WebSocketAttachInput, WebSocketClientAttachMessage, WebSocketClientCancelMessage, WebSocketClientControlMessage, WebSocketClientExecuteMessage, WebSocketClientMessage, WebSocketConstructorLike, WebSocketHandlers, WebSocketLike, WebSocketOutputMessage, WebSocketRunInput, WebSocketServerMessage, WebSocketStreamMessage, WebSocketSubscription, Workspace, WorkspaceConfig, WorkspaceConfigDoc, WorkspaceDefinitionConfig, WorkspaceFileEntry, WorkspaceResource, ZaloChannelInput, ZaloConnectionDefinition, ZaloConnectionInput, ZaloMessageSource, ZaloSource };
|
|
2390
|
+
export { BroodsAccountApiError, BroodsAccountClient, BroodsClient, BroodsWebSocketClient, DEFAULT_CORE_BASE_URL, IngressAcceptedError, MAX_OBSERVABILITY_BACKFILL, BroodsWebSocketClient as WebSocketClient, BroodsWebSocketClient as WebsocketClient, defineAgent, defineBroods, defineCron, defineDiscordChannel, defineDiscordConnection, defineGitHubChannel, defineGitHubConnection, defineHarness, defineMcp, definePancakeChannel, definePancakeConnection, definePolicy, defineSandbox, defineSkill, defineSlackChannel, defineSlackConnection, defineTelegramChannel, defineTelegramConnection, defineWorkspace, defineZaloChannel, defineZaloConnection, env, envPlaceholder, isBroodsConfig, isConnectionDefinition, isLogLevel, isObservabilityClientMessage, isResource, isRootSpanKind, isSandboxLogId, isTraceId, normalizeHttpServiceUrl, readSseStream, resolveEnvCredential, resolveRunEvents, toWebSocketBaseUrl, webSocketSubprotocols };
|
|
2391
|
+
export type { Account, AccountAgent, AccountChannel, AccountEnvVar, AccountMcp, AccountPolicy, AccountRole, AccountSandbox, AccountWorkspace, Agent, AgentChannelsConfig, AgentCodeHookConfig, AgentConfig, AgentConfigDoc, AgentDefinitionConfig, AgentDiscordChannelConfig, AgentGitHubChannelConfig, AgentHandle, AgentHookEventName, AgentHooks, AgentHooksConfig, AgentPancakeChannelConfig, AgentProviderSettings, AgentReference, AgentResource, AgentRunEventInput, AgentRunInput, AgentRunModelOverrides, AgentRunOverrides, AgentRunResult, AgentSkillsDefinitionConfig, AgentSlackChannelConfig, AgentStreamPart, AgentSubagentDefinitionConfig, AgentTelegramChannelConfig, AgentWebhookHookConfig, AgentWorkspaceInput, AgentWorkspaceRef, AgentWorkspaceRefInput, AgentZaloChannelConfig, AnyConnectionDefinition, AnyResource, AssumeRoleResult, AsyncAgentRun, AsyncPollOptions, AsyncRequestAccepted, AsyncStatus, BroodsAccount, BroodsAccountClientOptions, BroodsClientOptions, BroodsConfigDefinition, BroodsProjectConfig, BroodsWebSocketClientOptions, ChannelAgentInput, ChannelDefinitionConfig, ChannelMessageReceived, ChannelPartition, ChannelRecordConfig, ChannelReference, ChannelReplyIn, ChannelResource, ChannelType, CliManifest, CliManifestResource, ConnectionDefinition, CreateAgentResult, CreateClientCronInput, CreateCronInput, CreateMcpInput, Cron, CronDefinitionConfig, CronDoc, CronLastStatus, CronResource, CronRun, CronStatus, DeleteAccountResult, DiscordChannelInput, DiscordConnectionDefinition, DiscordConnectionInput, DiscordMessageSource, DiscordSource, Doc, EnvAccessor, EnvRef, EnvRefString, GeneratedIds, GitHubChannelInput, GitHubConnectionDefinition, GitHubConnectionInput, GitHubMessageSource, GitHubSource, HarnessDefinition, HarnessType, HookContext, Id, IngressMode, IngressStatus, LogLevel, McpDefinitionConfig, McpHandler, McpOauthInput, McpResource, ObservabilityBackfillMessage, ObservabilityClientMessage, ObservabilityErrorMessage, ObservabilityFetchTraceMessage, ObservabilityLogEntry, ObservabilityLogMessage, ObservabilityReadyMessage, ObservabilityServerMessage, ObservabilitySpanMessage, ObservabilitySpanRow, ObservabilitySubscribeMessage, ObservabilityUnsubscribeMessage, PancakeChannelInput, PancakeConnectionDefinition, PancakeConnectionInput, PancakeMessageSource, PancakeSource, PendingQuestion, PolicyDefinitionConfig, PolicyDocument, PolicyResource, ProjectDoc, ProviderConfigInput, ProviderSettingsInput, ResourceApi, ResourceDefinition, ResourceInput, ResourceKind, RotateSecretResult, Sandbox, SandboxConfig, SandboxConfigDoc, SandboxDefinitionConfig, SandboxDefinitionOptions, SandboxLifecycleResult, SandboxResource, SandboxSnapshotResult, SandboxTerminalTicket, Skill, SkillDefinitionConfig, SkillResource, SkillUploadInput, SlackChannelInput, SlackConnectionDefinition, SlackConnectionInput, SlackMessageSource, SlackSource, StageDoc, StageScope, TelegramChannelInput, TelegramConnectionDefinition, TelegramConnectionInput, TelegramMessageSource, TelegramSource, ToolApprovalSummary, UpdateAgentInput, UpdateCronInput, UpdateMcpInput, WebSocketAttachInput, WebSocketClientAttachMessage, WebSocketClientCancelMessage, WebSocketClientControlMessage, WebSocketClientExecuteMessage, WebSocketClientMessage, WebSocketConstructorLike, WebSocketHandlers, WebSocketLike, WebSocketOutputMessage, WebSocketRunInput, WebSocketServerMessage, WebSocketStreamMessage, WebSocketSubscription, Workspace, WorkspaceConfig, WorkspaceConfigDoc, WorkspaceDefinitionConfig, WorkspaceFileEntry, WorkspaceResource, ZaloChannelInput, ZaloConnectionDefinition, ZaloConnectionInput, ZaloMessageSource, ZaloSource };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B,pe,
|
|
1
|
+
import{B,pe,xe,ke,Te,Pe,Ie,V,C,me,q,W,$e,D,K,Me,Ae,ze,Oe,Ne,je,qe,De,Le,Ue,Fe,Be,Ve,Ze,He,We,Ke,Ge,Je,Ye,Xe,Qe,h,_,ne}from"./chunk-rea5p7sh.js";import{Ce,m,L,U}from"./chunk-9emkj9m1.js";export{m as BroodsAccountApiError,U as BroodsAccountClient,q as BroodsClient,$e as BroodsWebSocketClient,C as DEFAULT_CORE_BASE_URL,me as IngressAcceptedError,xe as MAX_OBSERVABILITY_BACKFILL,$e as WebSocketClient,$e as WebsocketClient,He as defineAgent,Ze as defineBroods,Qe as defineCron,De as defineDiscordChannel,Ae as defineDiscordConnection,Le as defineGitHubChannel,ze as defineGitHubConnection,We as defineHarness,Ye as defineMcp,Ue as definePancakeChannel,Oe as definePancakeConnection,Xe as definePolicy,Ge as defineSandbox,Je as defineSkill,Fe as defineSlackChannel,Ne as defineSlackConnection,Be as defineTelegramChannel,je as defineTelegramConnection,Ke as defineWorkspace,Ve as defineZaloChannel,qe as defineZaloConnection,Me as env,Ce as envPlaceholder,ne as isBroodsConfig,_ as isConnectionDefinition,Te as isLogLevel,ke as isObservabilityClientMessage,h as isResource,Pe as isRootSpanKind,V as isSandboxLogId,Ie as isTraceId,W as normalizeHttpServiceUrl,pe as readSseStream,L as resolveEnvCredential,B as resolveRunEvents,K as toWebSocketBaseUrl,D as webSocketSubprotocols};
|
package/package.json
CHANGED
|
File without changes
|