broods 0.39.0 → 0.39.1

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/cli/index.js CHANGED
@@ -73,7 +73,7 @@ Check the browser tab and the dashboard logs for an error. If the browser shows
73
73
  404 on /cli-auth/start, deploy the dashboard build that includes CLI auth or pass
74
74
  --dashboard-url for the environment you deployed. Other common causes are missing
75
75
  cliAuth Convex functions or no active API account (Settings -> API Access).`)),n)});try{return await Promise.race([e,o])}finally{if(t)clearTimeout(t)}}import{existsSync as it}from"node:fs";import{mkdir as vr,readFile as kr,writeFile as Sr}from"node:fs/promises";import{dirname as lt,join as rn,resolve as $r,sep as ie}from"node:path";import{fileURLToPath as Er}from"node:url";var sn=rn(lt(C),"update-check.json"),Or=86400000,Rr="https://registry.npmjs.org/broods/latest",Cr=2000;function an(e,n){let t=ct(e),o=ct(n);for(let r=0;r<3;r+=1){let s=t[r]??0,i=o[r]??0;if(s!==i)return s>i}return!at(e)&&at(n)}async function cn(e={}){let n=await jr(),t=e.maxAgeMs??Or;if(n&&Date.now()-n.checkedAt<t)return n.latest;let o=await Ar();if(o===null)return n?.latest??null;return await Pr({checkedAt:Date.now(),latest:o}),o}function dt(e=$r(process.cwd()),n=Er(import.meta.url)){let t=`${ie}node_modules${ie}`,o=n.lastIndexOf(t),r=o===-1?null:n.slice(0,o),s=r===null?n.startsWith(`${e}${ie}`):e===r||e.startsWith(`${r}${ie}`),a=n.includes(`${ie}.bun${ie}install${ie}global${ie}`)||s&&xr(r??e)?"bun":"npm",c=a==="bun"?"add":"install";return{manager:a,global:!s,command:a,args:s?[c,"broods@latest"]:[c,"-g","broods@latest"]}}async function Ar(){try{let e=await fetch(Rr,{signal:AbortSignal.timeout(Cr),headers:{accept:"application/json"}});if(!e.ok)return null;let n=await e.json();return typeof n.version==="string"?n.version:null}catch{return null}}function xr(e){return it(rn(e,"bun.lock"))||it(rn(e,"bun.lockb"))}function at(e){return e.includes("-")}async function jr(){try{let e=JSON.parse(await kr(sn,"utf8"));if(typeof e.latest!=="string")return null;if(typeof e.checkedAt!=="number")return null;return{checkedAt:e.checkedAt,latest:e.latest}}catch{return null}}function ct(e){let[n]=e.trim().replace(/^v/,"").split("-");return(n??"").split(".").slice(0,3).map((t)=>Number.parseInt(t,10)||0)}async function Pr(e){try{await vr(lt(sn),{recursive:!0}),await Sr(sn,`${JSON.stringify(e)}
76
- `,"utf8")}catch{}}var ut={name:"broods",version:"0.39.0",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:{"@modelcontextprotocol/client":"^2.0.0",esbuild:"^0.28.2"},devDependencies:{"@ai-sdk/tui":"1.0.108","@arethetypeswrong/cli":"^0.18.5","@chat-adapter/discord":"^4.38.1","@chat-adapter/github":"^4.38.1","@chat-adapter/slack":"^4.38.1","@chat-adapter/telegram":"^4.38.1","@modelcontextprotocol/server":"2.0.0","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.107",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.107"},engines:{node:">=22.15"}};var gt=`---
76
+ `,"utf8")}catch{}}var ut={name:"broods",version:"0.39.1",description:"CLI + TypeScript SDK for the broods agent platform.",keywords:["agents","ai","broods","cli","sdk"],homepage:"https://github.com/beeblastco/broods#readme",bugs:{url:"https://github.com/beeblastco/broods/issues"},license:"MIT",repository:{type:"git",url:"git+https://github.com/beeblastco/broods.git",directory:"packages/broods"},bin:{broods:"dist/cli/index.js"},files:["dist","README.md","LICENSE.md"],type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",typesVersions:{"*":{account:["./dist/account.d.ts"]}},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./account":{types:"./dist/account.d.ts",import:"./dist/account.js"}},scripts:{build:"bun scripts/build.ts && rollup -c rollup.dts.config.mjs && rm -rf .dts-temp",check:"tsc --noEmit","pack:check":"bun run build && publint && attw --pack .",test:"bun test"},dependencies:{"@modelcontextprotocol/client":"^2.0.0",esbuild:"^0.28.2"},devDependencies:{"@ai-sdk/tui":"1.0.108","@arethetypeswrong/cli":"^0.18.5","@chat-adapter/discord":"^4.38.1","@chat-adapter/github":"^4.38.1","@chat-adapter/slack":"^4.38.1","@chat-adapter/telegram":"^4.38.1","@modelcontextprotocol/server":"2.0.0","@types/bun":"^1.3.14","@typescript/typescript6":"6.0.2",ai:"^7.0.107",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.107"},engines:{node:">=22.15"}};var gt=`---
77
77
  name: broods
78
78
  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.
79
79
  ---
@@ -379,7 +379,7 @@ Only orgs where you are owner or admin can be selected from the CLI.`);return}if
379
379
  ${L("project")}`);let s=h(),i=b(e,"--dashboard-url")??s.dashboardUrl??J,a=Ge(e),c=await Ke(i,b(e,"--base-url")),d=new D({baseUrl:c.baseUrl,token:c.token});if(o){let y=await d.listProjects();if(y.length===0){console.log("This org has no projects yet. `broods dev` creates one.");return}console.log("Projects:");for(let R of y)console.log(gs(R,a.project));let k=y.filter((R)=>R.empty);if(k.length>0)console.log(`
380
380
  ${k.length} empty project(s). Delete one with \`broods project delete <name>\`.`);return}let l=t??await le("Project to delete","");if(!l.trim())throw Error("Project name is required.");let u=await d.listProjects(),p=u.find((y)=>y.name===l||y.slug===l);if(!p)throw Error(`No project named "${l}". Existing: ${u.map((y)=>y.name).join(", ")}.`);if(!P(e,"--yes")){if(console.log(`Deleting ${p.name} removes ${gn(p)}.`),!await Le(`Permanently delete project ${p.name}?`)){console.log("Left it alone. Pass --yes to skip this prompt.");return}}let m=await d.deleteProject(p.id);if(!m)throw Error(`Project ${p.name} was not found.`);if(console.log(`Deleted project ${m.name} (${gn(m)})`),m.name===a.project||m.slug===a.project)console.log("That was the project this directory points at. Update BROODS_PROJECT in .env.local.")}async function es(e){let[n,t]=se(e);if(!n){console.log(L("stage"));return}let o=n==="list"||n==="ls",r=n==="use"||n==="select";if(!o&&!r&&!(n==="create"||n==="new"))throw Error(`Unknown stage subcommand: ${n}
381
381
 
382
- ${L("stage")}`);let i=h(),a=b(e,"--dashboard-url")??i.dashboardUrl??J,c=Ge(e),d=await Ke(a,b(e,"--base-url")),l=new D({baseUrl:d.baseUrl,token:d.token});if(o){let k=await l.listStages(c.project);if(k.length===0){console.log(`${c.project} has no stages yet. \`broods dev\` creates Development.`);return}console.log(`Stages for ${c.project}:`);for(let R of k)console.log(fs(R,c.stage));return}if(r){let k=await l.listStages(c.project),R=t?k.find((N)=>fn(N.name,t)):await Se("Select stage",k,Ct,k.findIndex((N)=>fn(N.name,c.stage)));if(!R)throw Error(`${c.project} has no stage "${t}". Existing: ${k.map((N)=>N.name).join(", ")}. Create it with \`broods stage create ${t} --from ${c.stage}\`.`);let q=O("BROODS_STAGE");await he("BROODS_STAGE",R.name),console.log(`Stage: ${R.name} (wrote BROODS_STAGE)`),un("BROODS_STAGE",q),await dn(l,{project:c.project,stage:R.name});return}let u=t??await le("Stage name","staging");if(!u.trim())throw Error("Stage name is required.");let p=b(e,"--from"),m=await l.createStage(c.project,u,p);if(console.log(`Created stage ${m.stage.name} in ${c.project}${m.clonedFrom?` from ${m.clonedFrom}`:""}`),m.clonedFrom)console.log(` ${m.stage.agentCount} agent(s), ${m.stage.variableCount} env var(s) copied`);if(!P(e,"--use")){console.log(`Switch to it with \`broods stage use ${m.stage.name}\`.`);return}let y=O("BROODS_STAGE");await he("BROODS_STAGE",m.stage.name),console.log(`Stage: ${m.stage.name} (wrote BROODS_STAGE)`),un("BROODS_STAGE",y),await dn(l,{project:c.project,stage:m.stage.name})}async function ns(e){let{manifest:n,config:t}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),o=await G(b(e,"--base-url")??t.baseUrl),r=new D({baseUrl:o.baseUrl,token:o.token}),s=await r.getManifest(n.project,n.stage);Ue(nn(n,s?.manifest??null)),ys(await hn(r,n),`${n.project}/${n.stage}`)}async function ts(e){let{manifest:n,config:t,resourceAliases:o,channels:r}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"deploy",useRuntimeStage:!1}),s=await G(b(e,"--base-url")??t.baseUrl),a=await new D({baseUrl:s.baseUrl,token:s.token}).putManifest(n,P(e,"--prune"),P(e,"--rotate-key"));await Ie(n,a.ids,process.cwd(),o,a.deployment,r),await Dt(),await vn(),console.log(`Synced ${a.manifest.resources.length} resources to ${n.project}/${n.stage}`),await Et(a.deployment),At(r,a),Ot(a)}async function Et(e){if(!e)return;if(e.apiKey){await he("BROODS_API_KEY",e.apiKey),console.log(`Wrote BROODS_API_KEY (${e.keyHint}) to .env.local`);return}}function Ot(e){let n=e.warnings?.missingPolicies??[];if(n.length>0)x(`⚠ ${n.length} policy ref(s) in agent config match no policy resource in this deploy and will be ignored at runtime: ${n.join(", ")}`)}async function os(){let e=await cn({maxAgeMs:0});if(e===null)throw Error("Could not reach the npm registry to check for a newer broods.");if(!an(e,ae)){console.log(`broods v${ae} is already the newest release.`);return}let n=dt();console.log(`Updating broods ${ae} → ${e} ${n.global?"globally":"in this project"}`),console.log(`$ ${[n.command,...n.args].join(" ")}`),await new Promise((t,o)=>{let r=$t(n.command,n.args,{stdio:"inherit"});r.on("error",o),r.on("exit",(s)=>{if(s===0){t();return}o(Error(`${n.command} exited with code ${s??"unknown"}`))})}),console.log(`broods ${e} installed.`)}async function mt(){let e=await cn();if(e===null||!an(e,ae))return;x(`broods ${e} is out, you are on ${ae}. Run \`broods update\`.`)}async function rs(e){if(await is(e),P(e,"--once")){if(!process.env.BROODS_SUPPRESS_DEV_TARGET)await yt(e),await mt();let l=pt.now();await ws(e),ot(pt.now()-l);return}let n=Oe(Wr(),`broods-declined-${process.pid}.txt`),t={...process.env,BROODS_DECLINED_FILE:n,BROODS_SUPPRESS_DEV_TARGET:"1",BROODS_RELOAD_ENV:"1"};await yt(e),await mt(),await wt(e,t);let o,r=!1,s=!1,i=await vt(),a=()=>{if(r){s=!0;return}r=!0,vt().then(async(l)=>{if(l===i)return;i=l,await wt(e,t)}).catch((l)=>console.error(l instanceof Error?l.message:String(l))).finally(()=>{if(r=!1,s)s=!1,a()})},c=Gr(A(process.cwd(),S),{recursive:!0},(l,u)=>{if(!u||Us(u))return;clearTimeout(o),o=setTimeout(a,150)}),d=new AbortController;ss(e,d.signal),process.on("SIGINT",()=>{d.abort(),c.close(),process.exit(0)})}async function ss(e,n){let t;try{t=We()}catch{console.log("· live logs off. No runtime key for this stage yet. Run `broods dev --once` after login to create or reconnect it.");return}let o,r;try{({project:o,stage:r}=await wn(e,t))}catch{return}let s=bn(e);try{for await(let i of Te({baseUrl:t.baseUrl,apiKey:t.apiKey,project:o,stage:r},{backfill:0,minLevel:s,signal:n}))console.log(yn(i))}catch(i){if(!n.aborted)console.error(`live logs: ${i instanceof Error?i.message:String(i)}`)}}async function is(e){await cs(),await Rt(!1),await ls(e)}async function Rt(e){let n=process.cwd();if(!(await Promise.all([".agent",".agents",".claude","AGENTS.md","CLAUDE.md"].map((c)=>ht(A(n,c))))).includes(!0))return;let r=A(n,Ne);if(!e&&await ht(A(r,"SKILL.md")))return;let s=Oe(Ne,"SKILL.md"),i=Oe(Ne,"scripts","onboard.sh");for(let c of[s,i])if(await as(n,c)){x(`Skipped the agent skill: ${c} crosses a symlink.`);return}await pn(A(r,"scripts"),{recursive:!0}),await V(A(r,"SKILL.md"),gt);let a=A(r,"scripts","onboard.sh");await V(a,ft),await Tr(a,493),console.log(`Installed the broods agent skill at ${Ne}/`)}async function as(e,n){let t=e;for(let o of n.split(Kr)){t=A(t,o);try{if((await Ur(t)).isSymbolicLink())return!0}catch{return!1}}return!1}async function ht(e){try{return await Nr(e),!0}catch{return!1}}async function cs(){let e=A(process.cwd(),S);await pn(A(e,v),{recursive:!0});let n=[];if(await Sn(e,n),n.length>0)return;await Be(A(e,"index.ts"),Tt(),!1),await Be(A(e,".gitignore"),`_generated
382
+ ${L("stage")}`);let i=h(),a=b(e,"--dashboard-url")??i.dashboardUrl??J,c=Ge(e),d=await Ke(a,b(e,"--base-url")),l=new D({baseUrl:d.baseUrl,token:d.token});if(o){let k=await l.listStages(c.project);if(k.length===0){console.log(`${c.project} has no stages yet. \`broods dev\` creates Development.`);return}console.log(`Stages for ${c.project}:`);for(let R of k)console.log(fs(R,c.stage));return}if(r){let k=await l.listStages(c.project),R=t?k.find((N)=>fn(N.name,t)):await Se("Select stage",k,Ct,k.findIndex((N)=>fn(N.name,c.stage)));if(!R)throw Error(`${c.project} has no stage "${t}". Existing: ${k.map((N)=>N.name).join(", ")}. Create it with \`broods stage create ${t} --from ${c.stage}\`.`);let q=O("BROODS_STAGE");await he("BROODS_STAGE",R.name),console.log(`Stage: ${R.name} (wrote BROODS_STAGE)`),un("BROODS_STAGE",q),await dn(l,{project:c.project,stage:R.name});return}let u=t??await le("Stage name","staging");if(!u.trim())throw Error("Stage name is required.");let p=b(e,"--from"),m=await l.createStage(c.project,u,p);if(console.log(`Created stage ${m.stage.name} in ${c.project}${m.clonedFrom?` from ${m.clonedFrom}`:""}`),m.clonedFrom)console.log(` ${m.stage.agentCount} agent(s), ${m.stage.variableCount} env var(s) copied`);if(!P(e,"--use")){console.log(`Switch to it with \`broods stage use ${m.stage.name}\`.`);return}let y=O("BROODS_STAGE");await he("BROODS_STAGE",m.stage.name),console.log(`Stage: ${m.stage.name} (wrote BROODS_STAGE)`),un("BROODS_STAGE",y),await dn(l,{project:c.project,stage:m.stage.name})}async function ns(e){let{manifest:n,config:t}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),o=await G(b(e,"--base-url")??t.baseUrl),r=new D({baseUrl:o.baseUrl,token:o.token}),s=await r.getManifest(n.project,n.stage);Ue(nn(n,s?.manifest??null)),ys(await hn(r,n),`${n.project}/${n.stage}`)}async function ts(e){let{manifest:n,config:t,resourceAliases:o,channels:r}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"deploy",useRuntimeStage:!1}),s=await G(b(e,"--base-url")??t.baseUrl),a=await new D({baseUrl:s.baseUrl,token:s.token}).putManifest(n,P(e,"--prune"),P(e,"--rotate-key"));await Ie(n,a.ids,process.cwd(),o,a.deployment,r),await Dt(),await vn(),console.log(`Synced ${a.manifest.resources.length} resources to ${n.project}/${n.stage}`),await Et(a.deployment),At(r,a),Ot(a)}async function Et(e){if(!e)return;if(e.apiKey){await he("BROODS_API_KEY",e.apiKey),console.log(`Wrote BROODS_API_KEY (${e.keyHint}) to .env.local`);return}}function Ot(e){let n=e.warnings?.missingPolicies??[];if(n.length>0)x(`⚠ ${n.length} policy ref(s) in agent config match no policy resource in this deploy. One that is not an existing policy id refuses every action at runtime: ${n.join(", ")}`)}async function os(){let e=await cn({maxAgeMs:0});if(e===null)throw Error("Could not reach the npm registry to check for a newer broods.");if(!an(e,ae)){console.log(`broods v${ae} is already the newest release.`);return}let n=dt();console.log(`Updating broods ${ae} → ${e} ${n.global?"globally":"in this project"}`),console.log(`$ ${[n.command,...n.args].join(" ")}`),await new Promise((t,o)=>{let r=$t(n.command,n.args,{stdio:"inherit"});r.on("error",o),r.on("exit",(s)=>{if(s===0){t();return}o(Error(`${n.command} exited with code ${s??"unknown"}`))})}),console.log(`broods ${e} installed.`)}async function mt(){let e=await cn();if(e===null||!an(e,ae))return;x(`broods ${e} is out, you are on ${ae}. Run \`broods update\`.`)}async function rs(e){if(await is(e),P(e,"--once")){if(!process.env.BROODS_SUPPRESS_DEV_TARGET)await yt(e),await mt();let l=pt.now();await ws(e),ot(pt.now()-l);return}let n=Oe(Wr(),`broods-declined-${process.pid}.txt`),t={...process.env,BROODS_DECLINED_FILE:n,BROODS_SUPPRESS_DEV_TARGET:"1",BROODS_RELOAD_ENV:"1"};await yt(e),await mt(),await wt(e,t);let o,r=!1,s=!1,i=await vt(),a=()=>{if(r){s=!0;return}r=!0,vt().then(async(l)=>{if(l===i)return;i=l,await wt(e,t)}).catch((l)=>console.error(l instanceof Error?l.message:String(l))).finally(()=>{if(r=!1,s)s=!1,a()})},c=Gr(A(process.cwd(),S),{recursive:!0},(l,u)=>{if(!u||Us(u))return;clearTimeout(o),o=setTimeout(a,150)}),d=new AbortController;ss(e,d.signal),process.on("SIGINT",()=>{d.abort(),c.close(),process.exit(0)})}async function ss(e,n){let t;try{t=We()}catch{console.log("· live logs off. No runtime key for this stage yet. Run `broods dev --once` after login to create or reconnect it.");return}let o,r;try{({project:o,stage:r}=await wn(e,t))}catch{return}let s=bn(e);try{for await(let i of Te({baseUrl:t.baseUrl,apiKey:t.apiKey,project:o,stage:r},{backfill:0,minLevel:s,signal:n}))console.log(yn(i))}catch(i){if(!n.aborted)console.error(`live logs: ${i instanceof Error?i.message:String(i)}`)}}async function is(e){await cs(),await Rt(!1),await ls(e)}async function Rt(e){let n=process.cwd();if(!(await Promise.all([".agent",".agents",".claude","AGENTS.md","CLAUDE.md"].map((c)=>ht(A(n,c))))).includes(!0))return;let r=A(n,Ne);if(!e&&await ht(A(r,"SKILL.md")))return;let s=Oe(Ne,"SKILL.md"),i=Oe(Ne,"scripts","onboard.sh");for(let c of[s,i])if(await as(n,c)){x(`Skipped the agent skill: ${c} crosses a symlink.`);return}await pn(A(r,"scripts"),{recursive:!0}),await V(A(r,"SKILL.md"),gt);let a=A(r,"scripts","onboard.sh");await V(a,ft),await Tr(a,493),console.log(`Installed the broods agent skill at ${Ne}/`)}async function as(e,n){let t=e;for(let o of n.split(Kr)){t=A(t,o);try{if((await Ur(t)).isSymbolicLink())return!0}catch{return!1}}return!1}async function ht(e){try{return await Nr(e),!0}catch{return!1}}async function cs(){let e=A(process.cwd(),S);await pn(A(e,v),{recursive:!0});let n=[];if(await Sn(e,n),n.length>0)return;await Be(A(e,"index.ts"),Tt(),!1),await Be(A(e,".gitignore"),`_generated
383
383
  .cache
384
384
  `,!1),console.log(`Created starter ${S}/`)}async function ls(e){let n=A(process.cwd(),".env.local"),t=await be(n),o=_t(t),r=o.BROODS_STAGE;if(["BROODS_DASHBOARD_URL","BROODS_BASE_URL","BROODS_PROJECT","BROODS_REGION"].filter((y)=>o[y]===void 0).length===0&&r!==void 0)return;let i=o.BROODS_PROJECT===void 0,a=r===void 0,c=o.BROODS_REGION===void 0,d=h(),l=b(e,"--dashboard-url")??d.dashboardUrl??J,u=b(e,"--project")??process.env.BROODS_PROJECT??Ce(process.cwd()),p=b(e,"--stage")??_()??"development",m=b(e,"--region")??process.env.BROODS_REGION??$e;if(process.stdin.isTTY&&i){let y=await Ke(l,b(e,"--base-url")),k=new D({baseUrl:y.baseUrl,token:y.token}),R=await ds(k,y),q=await ps(k,R);if(u=await bs(q,u),!u.trim())throw Error("Project name is required.")}if(process.stdin.isTTY&&a){if(p=await le("Stage",p),!p.trim())throw Error("Stage is required.")}if(process.stdin.isTTY&&c){let y=[...Hr];m=await Se("Select service region",y,(k)=>k.label,y.findIndex((k)=>k.region===m)).then((k)=>k.region)}await kn({dashboardUrl:l,baseUrl:d.baseUrl??te(l),project:u,stage:p,region:m,force:!1})}async function Ke(e,n){try{return await G(n)}catch(t){if(!process.stdin.isTTY)throw t;return x("No CLI login found. Starting browser login."),await on(e)}}async function ds(e,n){try{return await e.getOnboarding()}catch(t){if(!n.org)throw t;return x("CLI onboarding endpoint is not available yet; using the org from the current login."),{currentOrgId:n.org.id,orgs:[{id:n.org.id,name:n.org.name,slug:n.org.slug,role:"admin",accountStatus:"active"}],projects:[]}}}async function bt(e,n,t,o){let r=t.orgs.find((s)=>s.id===t.currentOrgId);if(!r)throw Error("Selected organization is not visible to this login");if(process.env.BROODS_TOKEN)x("BROODS_TOKEN is set, so the switch applies to this token only and was not stored.");else await H({...n,org:{id:r.id,name:r.name,slug:r.slug},...t.account?{account:{id:t.account.id,username:t.account.username}}:{}});console.log(`Org: ${Re(r)}`),console.log(`Projects: ${t.projects.length>0?t.projects.map((s)=>s.name).join(", "):"none yet"}`),await dn(e,Ge(o))}async function dn(e,n){let t;try{t=await e.getRuntimeKey(n.project,n.stage)}catch(r){x(`⚠ Could not read the runtime key for ${n.project}/${n.stage} (${r instanceof Error?r.message:String(r)}). BROODS_API_KEY still points at the previous scope. Run \`broods whoami\` to check it.`);return}if(!t?.apiKey){x(`⚠ ${n.project}/${n.stage} is not synced here yet, so BROODS_API_KEY still points at the previous scope. Run \`broods dev\`.`);return}let o=O("BROODS_API_KEY");if(!o&&process.env.BROODS_API_KEY===t.apiKey)return;await he("BROODS_API_KEY",t.apiKey),console.log(`Wrote BROODS_API_KEY (${t.keyHint}) to .env.local`),un("BROODS_API_KEY",o)}function un(e,n){if(!n)return;x(`⚠ ${e} is exported in your shell, which wins over .env.local. Run \`unset ${e}\` or the next broods command keeps the old value.`)}function Re(e){let n=e.role==="owner"||e.role==="admin"?e.role:"member",t=e.plan?`, ${e.plan} plan`:"";return`${e.name} (${e.slug}, ${n}${t})`}function us(e){return e.slug===e.name?e.name:`${e.name} (${e.slug})`}function gn(e){return e.empty?"nothing (it is already empty)":`${e.stageCount} stage(s), ${e.agentCount} agent(s), ${e.variableCount} env var(s), ${e.deploymentCount} deployment(s), ${e.fileCount} workspace file(s)`}function gs(e,n){let t=e.empty?"empty":gn(e);return fe(`${e.name}: ${t}`,e.name===n||e.slug===n)}function fs(e,n){return fe(Ct(e),fn(e.name,n))}function Ct(e){let n=e.deploymentRegion?`, ${e.deploymentRegion}`:"";return`${e.name} (${e.kind}${n}): ${e.agentCount} agent(s), ${e.variableCount} env var(s)`}function fn(e,n){return e.trim().toLowerCase()===n.trim().toLowerCase()}function Ge(e){return h(),{project:b(e,"--project")??process.env.BROODS_PROJECT??Ce(process.cwd()),stage:b(e,"--stage")??_()??"development"}}async function ps(e,n){let t=n.orgs.filter((s)=>s.accountStatus==="active"),o={kind:"create",name:"New organization"},r=await Se("Select organization",[...t,o],(s)=>("kind"in s)?"Create new organization":Re(s),t.findIndex((s)=>s.id===n.currentOrgId));if("kind"in r){let s=await le("Organization name",Ce(process.cwd()));if(!s.trim())throw Error("Organization name is required.");return await e.createOnboardingOrg(s)}return r.id===n.currentOrgId?n:await e.selectOnboardingOrg(r.id)}function ms(e,n){return e.projects.find((o)=>o.name===n||o.slug===n)?.name??n}function hs(e,n){return e.projects.find((t)=>t.name===n||t.slug===n)}async function bs(e,n){let t=ms(e,n);if(e.projects.length===0)return le("Project name",t);while(!0){let o=await st("Select project",e.projects,us,{hint:"type a new project name",defaultValue:t}),r=typeof o==="string"?o:o.name,s=hs(e,r);if(!s)return r;if(await Le(`Continue with the existing project ${s.name}?`))return s.name}}function wt(e,n){return new Promise((t,o)=>{let r=process.argv[1]??"",s=$t(process.execPath,[r,"dev","--once",...e],{stdio:"inherit",env:n});s.on("error",o),s.on("exit",(i,a)=>{if(i===0){t();return}o(Error(a?`Sync child exited from signal ${a}`:`Sync child exited with code ${i??"unknown"}`))})})}async function ws(e){let{manifest:n,config:t,resourceAliases:o,channels:r}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),s=await G(b(e,"--base-url")??t.baseUrl),i=new D({baseUrl:s.baseUrl,token:s.token}),a=await i.getManifest(n.project,n.stage),c=nn(n,a?.manifest??null);Ue(c.filter((k)=>k.operation!=="delete"));let d=await xt(i,n,await hn(i,n));if(d.length>0)tn(d);let l=await i.putManifest(n,!1);await Ie(n,l.ids,process.cwd(),o,l.deployment,r),await Dt(),await vn();let u=await Ss(),p=c.filter((k)=>k.operation==="delete"),m=p.filter((k)=>!u.has(`${k.kind}:${k.name}`)),y=!1;if(m.length>0)if(x("⚠ These remote resources are no longer declared locally:"),Ue(m),await Le(`Delete ${m.length} resource(s) from ${n.project}/${n.stage}?`))l=await i.putManifest(n,!0),await Ie(n,l.ids,process.cwd(),o,l.deployment,r),await Es(),y=!0;else await $s(m.map((k)=>`${k.kind}:${k.name}`));if(!y&&p.length>0){let k=p.map((R)=>`${R.kind}:${R.name}`).join(", ");x(`⚠ ${p.length} undeclared resource(s) kept remotely: ${k}. Re-declare in code or run \`deploy --prune\` to remove.`)}return await Et(l.deployment),At(r,l),Ot(l),l}function At(e,n){let t=n.deployment;if(!t||e.length===0)return;let o=new j,r=new Map;for(let i of e){if(!n.ids.agents[i.agentName])continue;let a=r.get(i.type)??[];a.push(i.alias),r.set(i.type,a)}let s=t.stageKind===void 0||t.stageKind==="production";for(let[i,a]of r){let c=s?o.accountWebhookUrl(t.accountId,i):o.stageWebhookUrl(t.accountId,t.endpointId,i);console.log(`Channel ${a.join(", ")} (${i}): ${c}${i==="pancake"?"?secret=<PANCAKE_WEBHOOK_SECRET>":""}`)}}async function hn(e,n){let t=Wn(n).filter((r)=>!r.startsWith("BROODS_"));if(t.length===0)return[];let o=new Map((await e.listEnv(n.project,n.stage)).map((r)=>[r.name,r.valueDigest]));return t.map((r)=>({name:r,state:vs(r,o)}))}async function xt(e,n,t){let o=t.filter((r)=>r.state==="unset"||r.state==="drifted"||r.state==="unverified").map((r)=>r.name);if(o.length===0)return[];return await Promise.all(o.map((r)=>e.setEnv(n.project,n.stage,r,process.env[r]))),o}function ys(e,n){let t=Ee(e,"drifted"),o=Ee(e,"unverified");if(t.length>0)x(`⚠ .env.local and ${n} disagree on ${t.length} variable(s): ${t.join(", ")}. Run \`broods env sync\` to push the local values.`);if(o.length>0)x(`⚠ ${n} stored ${o.length} variable(s) before value digests, so nothing can compare them: ${o.join(", ")}. Run \`broods env sync\` to bring them in step.`)}function vs(e,n){let t=process.env[e],o=n.has(e);if(t===void 0||t==="")return o?"stage-only":"unresolved";if(!o)return"unset";let r=n.get(e);if(!r)return"unverified";return r===ks(t)?"synced":"drifted"}function ks(e){return St("sha256").update(e).digest("hex")}function Ee(e,n){return e.filter((t)=>t.state===n).map((t)=>t.name)}async function yt(e){let n=h(),{manifest:t,config:o}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),r=await G(b(e,"--base-url")??o.baseUrl);tt({project:t.project,stage:t.stage,dashboardUrl:b(e,"--dashboard-url")??n.dashboardUrl??r.dashboardUrl??o.dashboardUrl??J})}async function Ss(){let e=process.env.BROODS_DECLINED_FILE;if(!e)return new Set;let n=await be(e);return new Set(n.split(/\r?\n/).map((t)=>t.trim()).filter(Boolean))}async function $s(e){let n=process.env.BROODS_DECLINED_FILE;if(!n||e.length===0)return;await V(n,`${e.join(`
385
385
  `)}
@@ -387,7 +387,7 @@ ${L("stage")}`);let i=h(),a=b(e,"--dashboard-url")??i.dashboardUrl??J,c=Ge(e),d=
387
387
 
388
388
  ${L("env")}`);if(a&&!t)throw Error(`broods env ${n} needs a variable name.
389
389
 
390
- ${L("env")}`);let{manifest:c,config:d}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),l=await G(b(e,"--base-url")??d.baseUrl),u=new D({baseUrl:l.baseUrl,token:l.token}),p=`${c.project}/${c.stage}`;if(i){await Rs(u,c,p);return}if(o){let y=await u.listEnv(c.project,c.stage);if(y.length===0){console.log(`No environment variables set for ${p}.`);return}console.log(`Environment variables for ${p} (values hidden):`);for(let k of y)console.log(` ${k.name}`);return}if(s){let y=await u.getEnv(c.project,c.stage,t);if(y===null){console.error(`${t} is not set for ${p}`),process.exitCode=1;return}console.log(y);return}if(r){await u.removeEnv(c.project,c.stage,t),console.log(`Removed ${t} from ${p}`);return}let m=await rt(t);await u.setEnv(c.project,c.stage,t,m),console.log(`Stored ${t} for ${p}`)}async function Rs(e,n,t){let o=await hn(e,n);if(o.length===0){console.log('No env("NAME") references in this project.');return}let r=await xt(e,n,o);if(r.length>0)tn(r);let s=Ee(o,"synced").length;console.log(r.length>0?`${s} other referenced variable(s) already in step with ${t}.`:`${s} referenced variable(s) already in step with ${t}.`);let i=Ee(o,"stage-only");if(i.length>0)console.log(`${i.length} referenced variable(s) live only on ${t}: ${i.join(", ")}`);let a=Ee(o,"unresolved");if(a.length>0)x(`⚠ ${a.length} referenced variable(s) with no value here or on ${t}: ${a.join(", ")}. Put them in .env.local, or run \`broods env set <NAME>\`.`)}function We(){h();let e=process.env.BROODS_API_KEY??"";if(!e)throw Error("BROODS_API_KEY is not set. Run `broods deploy` first, or set the key in .env.local.");let n=process.env.BROODS_BASE_URL??process.env.BROODS_HOST??z;return{apiKey:e,baseUrl:n}}function bn(e){if(P(e,"--all"))return"DEBUG";let n=b(e,"--level");if(n===void 0&&P(e,"--level"))throw Error("Missing value for --level. Use DEBUG, INFO, WARN, or ERROR.");if(!n)return"WARN";let t=n.toUpperCase();if(t==="DEBUG")return"DEBUG";if(t==="INFO")return"INFO";if(t==="WARN"||t==="WARNING")return"WARN";if(t==="ERROR")return"ERROR";throw Error(`Unknown log level: ${n}. Use DEBUG, INFO, WARN, or ERROR.`)}async function Cs(e){h();let n=b(e,"--project")??process.env.BROODS_PROJECT,t=b(e,"--stage")??_();if(!n)throw Error("Project name is required. Pass --project <name> or set BROODS_PROJECT in .env.local.");if(!t)throw Error("Stage name is required. Pass --stage <name> or set BROODS_STAGE in .env.local.");return{project:n,stage:t}}async function wn(e,n){let t=await Cs(e),o=await nt(n.baseUrl,n.apiKey);if(!o)return t;if(o.projectSlug!==t.project||o.stageSlug!==t.stage)console.log(`· reading ${o.projectSlug}/${o.stageSlug}. The runtime key is scoped there, not to ${t.project}/${t.stage}.`);return{project:o.projectSlug,stage:o.stageSlug}}function jt(e){return e==="WARN"?" (--all for INFO too)":""}function yn(e){let n=new Date(e.ts).toISOString().slice(11,23),t=e.level.padEnd(5),o=Fr(e.message);return`${n} ${t} ${e.eventType} ${o}`}async function As(e){let{apiKey:n,baseUrl:t}=We(),{project:o,stage:r}=await wn(e,{baseUrl:t,apiKey:n}),s=bn(e),i=new AbortController,a=()=>i.abort();process.on("SIGINT",a),console.log(`Streaming live logs for ${o}/${r} [${s}+]`+jt(s)+", Ctrl+C to stop");try{for await(let c of Te({baseUrl:t,apiKey:n,project:o,stage:r},{backfill:0,minLevel:s,signal:i.signal}))console.log(yn(c))}catch(c){if(!i.signal.aborted)console.error(c instanceof Error?c.message:String(c)),process.exitCode=1}finally{process.off("SIGINT",a)}}async function xs(e){if(P(e,"--doctor")){await js(P(e,"--request"));return}let n=se(e)[0];if(!n){console.log(mn.machine),process.exitCode=1;return}let{runMachineDaemon:t}=await import("../chunk-efbzcyvt.js"),{apiKey:o,baseUrl:r}=We(),s=A(b(e,"--cwd")??process.cwd()),i=P(e,"--computer"),a=b(e,"--mcp"),c=P(e,"--force"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Connecting ${n} to ${r} (cwd ${s}${i?", computer use on":""}), Ctrl+C to stop`);try{await t({apiKey:o,baseUrl:r,computer:i,cwd:s,force:c,log:(u)=>console.log(u),mcpFile:a?A(a):void 0,sandbox:n,signal:d.signal})}catch(u){console.error(u instanceof Error?u.message:String(u)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function js(e){try{let{startDesktop:n}=await import("../chunk-5tnnqapc.js"),{display:t,driver:o,permissions:r}=await n(e);o.stop();let s=(i)=>i?"granted":"missing";if(console.log(`screenshot frame ${t.width}x${t.height} (scale ${t.scale.toFixed(2)})`),console.log(`screen recording ${s(r.screenRecording)}`),console.log(`accessibility ${s(r.accessibility)}`),!r.screenRecording||!r.accessibility)console.log(e?"Approve the prompts, or add this terminal under System Settings > Privacy & Security, then run again.":"Run `broods machine --doctor --request` to show the macOS prompts."),process.exitCode=1}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exitCode=1}}async function Ps(e){let{apiKey:n,baseUrl:t}=We(),{project:o,stage:r}=await wn(e,{baseUrl:t,apiKey:n}),s=b(e,"--sandbox");if(P(e,"--sandbox")&&!F(s))throw Error("--sandbox needs the instance log id, the UUID shown in the dashboard Instances sheet.");let i=s?"DEBUG":bn(e),a=Number(b(e,"--limit")??b(e,"-n")??100),c=P(e,"--json"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Logs for ${o}/${r}`+(s?` sandbox ${s}`:"")+` [${i}+]`+jt(i)+` (backfill ${a}), Ctrl+C to stop`);try{for await(let u of Te({baseUrl:t,apiKey:n,project:o,stage:r},{backfill:a,minLevel:i,...s?{sandboxId:s}:{},signal:d.signal}))if(c)console.log(JSON.stringify(u));else console.log(yn(u))}catch(u){if(!d.signal.aborted)console.error(u instanceof Error?u.message:String(u)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function Is(e){let[n,t]=se(e);if(!n){console.log(L("agent"));return}if(n==="list"||n==="ls"){await Ds(e);return}if(n==="get"){await _s(t,e);return}throw Error(`Unknown agent subcommand: ${n}
390
+ ${L("env")}`);let{manifest:c,config:d}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),l=await G(b(e,"--base-url")??d.baseUrl),u=new D({baseUrl:l.baseUrl,token:l.token}),p=`${c.project}/${c.stage}`;if(i){await Rs(u,c,p);return}if(o){let y=await u.listEnv(c.project,c.stage);if(y.length===0){console.log(`No environment variables set for ${p}.`);return}console.log(`Environment variables for ${p} (values hidden):`);for(let k of y)console.log(` ${k.name}`);return}if(s){let y=await u.getEnv(c.project,c.stage,t);if(y===null){console.error(`${t} is not set for ${p}`),process.exitCode=1;return}console.log(y);return}if(r){await u.removeEnv(c.project,c.stage,t),console.log(`Removed ${t} from ${p}`);return}let m=await rt(t);await u.setEnv(c.project,c.stage,t,m),console.log(`Stored ${t} for ${p}`)}async function Rs(e,n,t){let o=await hn(e,n);if(o.length===0){console.log('No env("NAME") references in this project.');return}let r=await xt(e,n,o);if(r.length>0)tn(r);let s=Ee(o,"synced").length;console.log(r.length>0?`${s} other referenced variable(s) already in step with ${t}.`:`${s} referenced variable(s) already in step with ${t}.`);let i=Ee(o,"stage-only");if(i.length>0)console.log(`${i.length} referenced variable(s) live only on ${t}: ${i.join(", ")}`);let a=Ee(o,"unresolved");if(a.length>0)x(`⚠ ${a.length} referenced variable(s) with no value here or on ${t}: ${a.join(", ")}. Put them in .env.local, or run \`broods env set <NAME>\`.`)}function We(){h();let e=process.env.BROODS_API_KEY??"";if(!e)throw Error("BROODS_API_KEY is not set. Run `broods deploy` first, or set the key in .env.local.");let n=process.env.BROODS_BASE_URL??process.env.BROODS_HOST??z;return{apiKey:e,baseUrl:n}}function bn(e){if(P(e,"--all"))return"DEBUG";let n=b(e,"--level");if(n===void 0&&P(e,"--level"))throw Error("Missing value for --level. Use DEBUG, INFO, WARN, or ERROR.");if(!n)return"WARN";let t=n.toUpperCase();if(t==="DEBUG")return"DEBUG";if(t==="INFO")return"INFO";if(t==="WARN"||t==="WARNING")return"WARN";if(t==="ERROR")return"ERROR";throw Error(`Unknown log level: ${n}. Use DEBUG, INFO, WARN, or ERROR.`)}async function Cs(e){h();let n=b(e,"--project")??process.env.BROODS_PROJECT,t=b(e,"--stage")??_();if(!n)throw Error("Project name is required. Pass --project <name> or set BROODS_PROJECT in .env.local.");if(!t)throw Error("Stage name is required. Pass --stage <name> or set BROODS_STAGE in .env.local.");return{project:n,stage:t}}async function wn(e,n){let t=await Cs(e),o=await nt(n.baseUrl,n.apiKey);if(!o)return t;if(o.projectSlug!==t.project||o.stageSlug!==t.stage)console.log(`· reading ${o.projectSlug}/${o.stageSlug}. The runtime key is scoped there, not to ${t.project}/${t.stage}.`);return{project:o.projectSlug,stage:o.stageSlug}}function jt(e){return e==="WARN"?" (--all for INFO too)":""}function yn(e){let n=new Date(e.ts).toISOString().slice(11,23),t=e.level.padEnd(5),o=Fr(e.message);return`${n} ${t} ${e.eventType} ${o}`}async function As(e){let{apiKey:n,baseUrl:t}=We(),{project:o,stage:r}=await wn(e,{baseUrl:t,apiKey:n}),s=bn(e),i=new AbortController,a=()=>i.abort();process.on("SIGINT",a),console.log(`Streaming live logs for ${o}/${r} [${s}+]`+jt(s)+", Ctrl+C to stop");try{for await(let c of Te({baseUrl:t,apiKey:n,project:o,stage:r},{backfill:0,minLevel:s,signal:i.signal}))console.log(yn(c))}catch(c){if(!i.signal.aborted)console.error(c instanceof Error?c.message:String(c)),process.exitCode=1}finally{process.off("SIGINT",a)}}async function xs(e){if(P(e,"--doctor")){await js(P(e,"--request"));return}let n=se(e)[0];if(!n){console.log(mn.machine),process.exitCode=1;return}let{runMachineDaemon:t}=await import("../chunk-ccd2bc7s.js"),{apiKey:o,baseUrl:r}=We(),s=A(b(e,"--cwd")??process.cwd()),i=P(e,"--computer"),a=b(e,"--mcp"),c=P(e,"--force"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Connecting ${n} to ${r} (cwd ${s}${i?", computer use on":""}), Ctrl+C to stop`);try{await t({apiKey:o,baseUrl:r,computer:i,cwd:s,force:c,log:(u)=>console.log(u),mcpFile:a?A(a):void 0,sandbox:n,signal:d.signal})}catch(u){console.error(u instanceof Error?u.message:String(u)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function js(e){try{let{startDesktop:n}=await import("../chunk-5tnnqapc.js"),{display:t,driver:o,permissions:r}=await n(e);o.stop();let s=(i)=>i?"granted":"missing";if(console.log(`screenshot frame ${t.width}x${t.height} (scale ${t.scale.toFixed(2)})`),console.log(`screen recording ${s(r.screenRecording)}`),console.log(`accessibility ${s(r.accessibility)}`),!r.screenRecording||!r.accessibility)console.log(e?"Approve the prompts, or add this terminal under System Settings > Privacy & Security, then run again.":"Run `broods machine --doctor --request` to show the macOS prompts."),process.exitCode=1}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exitCode=1}}async function Ps(e){let{apiKey:n,baseUrl:t}=We(),{project:o,stage:r}=await wn(e,{baseUrl:t,apiKey:n}),s=b(e,"--sandbox");if(P(e,"--sandbox")&&!F(s))throw Error("--sandbox needs the instance log id, the UUID shown in the dashboard Instances sheet.");let i=s?"DEBUG":bn(e),a=Number(b(e,"--limit")??b(e,"-n")??100),c=P(e,"--json"),d=new AbortController,l=()=>d.abort();process.on("SIGINT",l),console.log(`Logs for ${o}/${r}`+(s?` sandbox ${s}`:"")+` [${i}+]`+jt(i)+` (backfill ${a}), Ctrl+C to stop`);try{for await(let u of Te({baseUrl:t,apiKey:n,project:o,stage:r},{backfill:a,minLevel:i,...s?{sandboxId:s}:{},signal:d.signal}))if(c)console.log(JSON.stringify(u));else console.log(yn(u))}catch(u){if(!d.signal.aborted)console.error(u instanceof Error?u.message:String(u)),process.exitCode=1}finally{process.off("SIGINT",l)}}async function Is(e){let[n,t]=se(e);if(!n){console.log(L("agent"));return}if(n==="list"||n==="ls"){await Ds(e);return}if(n==="get"){await _s(t,e);return}throw Error(`Unknown agent subcommand: ${n}
391
391
 
392
392
  ${L("agent")}`)}async function Pt(e){let{manifest:n,config:t}=await ee({project:b(e,"--project"),stage:b(e,"--stage"),command:"dev"}),o=await G(b(e,"--base-url")??t.baseUrl),r=await new D({baseUrl:o.baseUrl,token:o.token}).getManifest(n.project,n.stage),s=n.resources.filter((i)=>i.kind==="agent").map((i)=>({name:i.name,config:i.config??{},agentId:r?.ids.agents[i.name]}));return{manifest:n,agents:s}}async function Ds(e){let{manifest:n,agents:t}=await Pt(e);if(t.length===0){console.log(`No agents declared in ${n.project}/${n.stage}.`);return}console.log(`Agents in ${n.project}/${n.stage}:`);for(let o of t){let r=It(o.config),s=o.config.publicAccess===!0?"public":"private",i=o.agentId?o.agentId:"not deployed";console.log(` ${o.name} [${s}] ${r} (${i})`)}}async function _s(e,n){if(!e)throw Error(`Missing agent name.
393
393
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "broods",
3
- "version": "0.39.0",
3
+ "version": "0.39.1",
4
4
  "description": "CLI + TypeScript SDK for the broods agent platform.",
5
5
  "keywords": [
6
6
  "agents",
File without changes