@agimon-ai/doompi-team 0.0.1-alpha.71 → 0.0.1-alpha.72

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.
@@ -1,4 +1,4 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../runtime-subagent-policy.cjs"),t=require("../runtime-subagent-tool.cjs"),n=require("../services/agentDiscovery/index.cjs"),r=require("../services/asyncJobTracker/index.cjs"),i=require("../services/sessionPaths/index.cjs"),a=require("../services/modelInfo/index.cjs"),o=require("../services/errors/index.cjs"),s=require("../services/config/index.cjs"),c=require("../services/delegationBridge/index.cjs"),l=require("../services/suspendedRuns/index.cjs"),u=require("../services/sessionLifecycle/index.cjs"),d=require("../services/backgroundWorkService/index.cjs"),f=require("../services/directRunBackgroundWork/index.cjs"),p=require("../services/subagentPolicyService/index.cjs"),m=require("../services/teamRuntime/index.cjs"),h=require("../services/webSubagentCatalog/index.cjs"),g=require("../controllers/teamSessionApi.cjs"),_=require("../types/webSubagents.cjs"),v=require("../controllers/webSubagentCatalogChannel.cjs"),y=require("../controllers/webSubagentsChannel.cjs"),b=require("../services/nativeRunProjection/index.cjs");let x=require("@agimon-ai/doompi-core/delegation"),S=require("@agimon-ai/doompi-core/child"),C=require("typebox/value"),w=require("@agimon-ai/doompi-core/background-work"),T=require("@agimon-ai/doompi-core/server-facet");const E=`@agimon-ai/doompi-team`,D=new Set([`completed`,`complete`,`failed`,`stopped`,`paused`]);function O(e){return e===`completed`||e===`complete`?`done`:e===`failed`?`failed`:e===`stopped`||e===`paused`?`stopped`:e===`queued`?`queued`:`running`}function k(e){if(!e.agent||!e.status||e.startedAt===void 0)return;let t=e.updatedAt??e.startedAt;return{runId:e.runId,agent:e.agent,state:O(e.status),rawState:e.status,task:e.task??``,cwd:e.cwd??``,startedAt:e.startedAt,...D.has(e.status)?{endedAt:t}:{},lastUpdate:t,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function A(e){return{runId:e.runId,agent:e.agent,state:O(e.status),rawState:e.status,task:e.task,cwd:e.cwd,startedAt:e.startedAt,...D.has(e.status)?{endedAt:e.updatedAt}:{},lastUpdate:e.updatedAt,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function j(e,t,n,r){let i=n.filter(e=>!e.native).map(k).filter(e=>e!==void 0);i.push(...[...r.values()].map(A)),e.publish(_.SUBAGENT_RUNS_TYPE,t,{runs:i})}function M(e,t=!1){return{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e,null,2)}],details:e,...t?{isError:!0}:{}}}function N(e){return e===`user`||e===`project`?e:`both`}function P(e,n){let c=i.createSessionScope(n.sessionId),u=e.asyncJobTracker.forSession(n.sessionId,c),d=n.model?[a.toModelInfo(n.model)]:[];return{name:`subagent`,label:`Subagent`,description:`Discover agents, start and manage persistent background subagent runs, and inspect suspended work.`,parameters:t.SubagentParams,promptSnippet:`Discover, run, inspect, steer, stop, and restore persistent subagents`,promptGuidelines:[`Runs are persistent background work. Do not resubmit a run that already returned an id.`,`Use status or suspended before retrying a failed or interrupted operation.`],executionMode:`serial`,async execute(a,c,f,p){if(!(0,C.Check)(t.SubagentParams,c))return M(`Invalid subagent parameters.`,!0);let m=c;try{if(m.action===t.SUBAGENT_ACTIONS.agents){let t=N(m.scope),r=e.discovery.discover(m.cwd??n.cwd,t).agents,i=m.name?e.discovery.find(m.cwd??n.cwd,t,m.name):void 0;if(m.name&&!i)throw new o.DoomTeamExpectedError(`agent_not_found`,`No executable agent matches '${m.name}'.`,!1,`Call subagent({"action":"agents"}) and retry with an exact agent name.`);return M({agents:i?[i]:r.map(e=>({name:e.name,source:e.source,description:e.description,runtime:e.runtime??`pi`}))})}if(m.action===t.SUBAGENT_ACTIONS.run){p?.(M(`Starting ${m.requests.length} subagent${m.requests.length===1?``:`s`}...`));let t=await e.spawnPlanner.spawn({tasks:m.requests.map(e=>({agent:e.agent.trim(),task:e.task.trim(),...e.inlineAgent?{inlineAgent:e.inlineAgent}:{},...e.cwd?{cwd:e.cwd}:{},...e.model?{model:e.model}:{},...e.runtime?{runtime:e.runtime}:{}})),cwd:n.cwd,agentScope:N(m.scope),sessionScope:i.createSessionScope(n.sessionId),environment:n.environment,parentSessionId:n.sessionId,...m.concurrency===void 0?{}:{concurrency:m.concurrency},...m.artifacts===void 0?{}:{artifacts:m.artifacts},availableModels:d,...n.model?{parentModel:n.model}:{}},s.loadConfig().config);for(let e of t.outcomes)e.runId&&u.track(e.runId);return M(t)}if(m.action===t.SUBAGENT_ACTIONS.status){if(!(`id`in m))return M({runs:u.list()});let t=e.management.status(m.id);return M({runId:t.runId,status:t.status})}if(m.action===t.SUBAGENT_ACTIONS.suspended){let e=l.listSuspendedRuns(i.createSessionScope(n.sessionId));return M({suspended:e,text:e.length?l.formatSuspendedRuns(e):`No suspended subagents in this session.`})}let a=r.resolveTrackedRunId(u,m.id);if(m.action===t.SUBAGENT_ACTIONS.stop)return M({runId:a,control:await e.management.stop(a,m.reason)});if(m.action===t.SUBAGENT_ACTIONS.steer)return M({runId:a,steer:await e.management.steer(a,m.message,void 0,f)});let c=l.listSuspendedRuns(i.createSessionScope(n.sessionId)).find(e=>e.runId===m.id);if(!c)throw Error(`No suspended run matches '${m.id}'.`);if(!l.isSuspendedRunResumable(c))throw Error(`Suspended run '${m.id}' is not resumable.`);let h=(await e.spawnPlanner.spawn({single:{agent:c.agent,...c.inlineAgent?{inlineAgent:c.inlineAgent}:{},task:c.task,cwd:c.cwd,...c.model?{model:c.model}:{},sessionFile:c.sessionFile},cwd:c.cwd,agentScope:`both`,sessionScope:i.createSessionScope(n.sessionId),environment:n.environment,runtime:`pi`,parentSessionId:n.sessionId,availableModels:d},s.loadConfig().config)).outcomes[0];if(!h?.runId)throw Error(`Could not restore '${m.id}': ${h?.error??`the spawn produced no run.`}`);return l.clearSuspendedRun(i.createSessionScope(n.sessionId),m.id),M({restore:{...h,restoredFrom:m.id}})}catch(e){return M(e instanceof Error?e.message:String(e),!0)}}}}function F(e){return{name:`intercom`,label:`Intercom`,description:`Communicate with active agents in this root session.`,parameters:{type:`object`,additionalProperties:!1,properties:{action:{type:`string`,enum:[`members`,`send`,`ask`,`pending`,`reply`]},to:{type:`string`},message:{type:`string`},requestId:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`]},executionMode:`serial`,async execute(t,n,r,i){return e.execute(t,n,r,i)}}}const I=(0,T.defineServerPlugin)({name:E,global:{channels:[y.createSubagentsChannel,v.createSubagentCatalogChannel]},workspace:{channels:[y.createSubagentsChannel,v.createSubagentCatalogChannel]},session:({context:t,host:r,agent:o})=>{function v(t,n){let r=n.execution.model?[a.toModelInfo(n.execution.model)]:[];t.provide(x.DOOM_DELEGATION_SERVICE,n.bridge.createService(t,{sessionId:n.execution.sessionId,sessionScope:i.createSessionScope(n.execution.sessionId),availableModels:r,...n.execution.model?{parentModel:n.execution.model}:{}}));let o=d.createBackgroundWorkService(t);t.provide(w.DOOM_BACKGROUND_WORK_SERVICE,o),f.registerDirectRunBackgroundWork(t,o,n.execution.sessionId,n.runtime.asyncJobTracker),t.provide(e.DOOM_SUBAGENT_POLICY_SERVICE,p.createSubagentPolicyService(n.runtime.capabilityPolicies))}if(!o)throw Error(`Team session requires the headless host.`);if(r.context.environment===void 0)throw Error(`Team headless facet requires an admitted session environment.`);let y=r.context.directEvents;if(y===void 0)throw Error(`Team headless facet requires host-owned direct events.`);let C=o.context,T=m.createTeamExtensionRuntime(void 0,{environment:r.context.environment,childSessions:{get:()=>(0,S.readDoomChildSessionService)(t)},nativeRunProjection:b.nativeRunProjection}),D=i.createSessionScope(C.sessionId);T.management.bindSessionScope(D);let O=[],k=T.asyncJobTracker.forSession(C.sessionId,D),A=new Map,M=()=>j(y,C.sessionId,k.list(),A);O.push(T.asyncJobTracker.subscribe(C.sessionId,M)),O.push(b.subscribeNativeRunProjection(C.sessionId,e=>{A.clear();for(let t of e)A.set(t.runId,t);M()})),M();try{let e=T.discovery.discover(C.cwd,`both`).agents;y.publish(_.SUBAGENT_CATALOG_TYPE,C.sessionId,{cwd:C.cwd,agents:h.presentCatalog(e),models:h.catalogModels(e,n.resolveActiveTeamModelSpecs(r.context.environment)??[])})}catch(e){let t=e instanceof Error?e.message:String(e);y.publish(_.SUBAGENT_CATALOG_TYPE,C.sessionId,{cwd:C.cwd,agents:[],models:[],warning:t})}let N=c.createDelegationBridge({planner:T.spawnPlanner,management:T.management,waiter:T.subagentWaiter,scheduler:T.pollScheduler,tracker:T.asyncJobTracker,loadConfig:()=>s.loadConfig().config});T.completionNotifier.attachHost({sendMessage:e=>{let t=C.client.notify({body:e.content,level:`info`});t&&t.catch(e=>process.emitWarning(`Could not notify headless Team completion: ${String(e)}`))}});let I=T.teamChannel.createHeadlessRuntime({sendMessage:(e=>void C.client.notify({body:typeof e.content==`string`?e.content:e.content.map(e=>`text`in e?e.text:`[image]`).join(`
2
- `),level:`info`})),sendUserMessage:(e=>void C.session.prompt(typeof e==`string`?e:e.map(e=>`text`in e?e.text:`[image]`).join(`
3
- `),`steer`))});return{api:[g.createTeamSessionApi(T,C)],services:[e=>v(e,{bridge:N,runtime:T,execution:C})],async onDispose(){for(let e of O.splice(0).reverse())e();I.dispose(),T.completionNotifier.dispose();let e=u.suspendScopeRuns({scope:D,reason:`headless session ended`,jobs:k.list(),stop:(e,t)=>T.management.stop(e,t)}),t=T.nativeRuns.close().finally(()=>b.nativeRunProjection.dispose(C.sessionId)),n=await Promise.allSettled([e,t]);for(let e of n)e.status===`rejected`&&process.emitWarning(`Could not shut down headless Team runs: ${String(e.reason)}`);N.abandonAll(),T.dispose(),T.asyncJobTracker.stop(),T.pollScheduler.stop()},tools:[P(T,C),F(I)],resources:[{name:`doompi/team`,kind:`context`,read:()=>JSON.stringify({sessionId:C.sessionId,members:I.current()?[I.current()]:[]},null,2)}],activities:[{name:E,async start(e){let t=await u.openScopeAsync(D);return t.suspended.length&&await e.client.notify({body:l.formatSuspendedRuns(t.suspended),level:`info`}),I.bindMainSession(e.sessionId),()=>{I.dispose()}}}]}}});exports.default=I,exports.teamServerFacet=I;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../runtime-subagent-policy.cjs"),t=require("../runtime-subagent-tool.cjs"),n=require("../services/agentDiscovery/index.cjs"),r=require("../services/asyncJobTracker/index.cjs"),i=require("../services/sessionPaths/index.cjs"),a=require("../services/modelInfo/index.cjs"),o=require("../services/errors/index.cjs"),s=require("../services/config/index.cjs"),c=require("../services/delegationBridge/index.cjs"),l=require("../services/suspendedRuns/index.cjs"),u=require("../services/sessionLifecycle/index.cjs"),d=require("../services/subagentTool/index.cjs"),f=require("../services/backgroundWorkService/index.cjs"),p=require("../services/directRunBackgroundWork/index.cjs"),m=require("../services/subagentPolicyService/index.cjs"),h=require("../services/teamRuntime/index.cjs"),g=require("../services/webSubagentCatalog/index.cjs"),_=require("../controllers/teamSessionApi.cjs"),v=require("../types/webSubagents.cjs"),y=require("../controllers/webSubagentCatalogChannel.cjs"),b=require("../controllers/webSubagentsChannel.cjs"),x=require("../services/nativeRunProjection/index.cjs");let S=require("@agimon-ai/doompi-core/delegation"),C=require("@agimon-ai/doompi-core/child"),w=require("@agimon-ai/doompi-core/background-work"),T=require("@agimon-ai/doompi-core/server-facet");const E=`@agimon-ai/doompi-team`,D=new Set([`completed`,`complete`,`failed`,`stopped`,`paused`]);function O(e){return e===`completed`||e===`complete`?`done`:e===`failed`?`failed`:e===`stopped`||e===`paused`?`stopped`:e===`queued`?`queued`:`running`}function k(e){if(!e.agent||!e.status||e.startedAt===void 0)return;let t=e.updatedAt??e.startedAt;return{runId:e.runId,agent:e.agent,state:O(e.status),rawState:e.status,task:e.task??``,cwd:e.cwd??``,startedAt:e.startedAt,...D.has(e.status)?{endedAt:t}:{},lastUpdate:t,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function A(e){return{runId:e.runId,agent:e.agent,state:O(e.status),rawState:e.status,task:e.task,cwd:e.cwd,startedAt:e.startedAt,...D.has(e.status)?{endedAt:e.updatedAt}:{},lastUpdate:e.updatedAt,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function j(e,t,n,r){let i=n.filter(e=>!e.native).map(k).filter(e=>e!==void 0);i.push(...[...r.values()].map(A)),e.publish(v.SUBAGENT_RUNS_TYPE,t,{runs:i})}function M(e,t=!1){return{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e,null,2)}],details:e,...t?{isError:!0}:{}}}function N(e){return e===`user`||e===`project`?e:`both`}function P(e,n){let c=i.createSessionScope(n.sessionId),u=e.asyncJobTracker.forSession(n.sessionId,c),f=n.model?[a.toModelInfo(n.model)]:[];return{name:`subagent`,label:`Subagent`,description:`Discover agents, start and manage persistent background subagent runs, and inspect suspended work.`,parameters:t.SubagentToolSchema,promptSnippet:`Discover, run, inspect, steer, stop, and restore persistent subagents`,promptGuidelines:[`Runs are persistent background work. Do not resubmit a run that already returned an id.`,`Use status or suspended before retrying a failed or interrupted operation.`],executionMode:`serial`,async execute(a,c,p,m){try{let a=d.validateParams(c);if(a.action===t.SUBAGENT_ACTIONS.agents){let t=N(a.scope),r=e.discovery.discover(a.cwd??n.cwd,t).agents,i=a.name?e.discovery.find(a.cwd??n.cwd,t,a.name):void 0;if(a.name&&!i)throw new o.DoomTeamExpectedError(`agent_not_found`,`No executable agent matches '${a.name}'.`,!1,`Call subagent({"action":"agents"}) and retry with an exact agent name.`);return M({agents:i?[i]:r.map(e=>({name:e.name,source:e.source,description:e.description,runtime:e.runtime??`pi`}))})}if(a.action===t.SUBAGENT_ACTIONS.run){m?.(M(`Starting ${a.requests.length} subagent${a.requests.length===1?``:`s`}...`));let t=await e.spawnPlanner.spawn({tasks:a.requests.map(e=>({agent:e.agent.trim(),task:e.task.trim(),...e.inlineAgent?{inlineAgent:e.inlineAgent}:{},...e.cwd?{cwd:e.cwd}:{},...e.model?{model:e.model}:{},...e.runtime?{runtime:e.runtime}:{}})),cwd:n.cwd,agentScope:N(a.scope),sessionScope:i.createSessionScope(n.sessionId),environment:n.environment,parentSessionId:n.sessionId,...a.concurrency===void 0?{}:{concurrency:a.concurrency},...a.artifacts===void 0?{}:{artifacts:a.artifacts},availableModels:f,...n.model?{parentModel:n.model}:{}},s.loadConfig().config);for(let e of t.outcomes)e.runId&&u.track(e.runId);return M(t)}if(a.action===t.SUBAGENT_ACTIONS.status){if(!(`id`in a))return M({runs:u.list()});let t=e.management.status(a.id);return M({runId:t.runId,status:t.status})}if(a.action===t.SUBAGENT_ACTIONS.suspended){let e=l.listSuspendedRuns(i.createSessionScope(n.sessionId));return M({suspended:e,text:e.length?l.formatSuspendedRuns(e):`No suspended subagents in this session.`})}let h=r.resolveTrackedRunId(u,a.id);if(a.action===t.SUBAGENT_ACTIONS.stop)return M({runId:h,control:await e.management.stop(h,a.reason)});if(a.action===t.SUBAGENT_ACTIONS.steer)return M({runId:h,steer:await e.management.steer(h,a.message,void 0,p)});let g=l.listSuspendedRuns(i.createSessionScope(n.sessionId)).find(e=>e.runId===a.id);if(!g)throw Error(`No suspended run matches '${a.id}'.`);if(!l.isSuspendedRunResumable(g))throw Error(`Suspended run '${a.id}' is not resumable.`);let _=(await e.spawnPlanner.spawn({single:{agent:g.agent,...g.inlineAgent?{inlineAgent:g.inlineAgent}:{},task:g.task,cwd:g.cwd,...g.model?{model:g.model}:{},sessionFile:g.sessionFile},cwd:g.cwd,agentScope:`both`,sessionScope:i.createSessionScope(n.sessionId),environment:n.environment,runtime:`pi`,parentSessionId:n.sessionId,availableModels:f},s.loadConfig().config)).outcomes[0];if(!_?.runId)throw Error(`Could not restore '${a.id}': ${_?.error??`the spawn produced no run.`}`);return l.clearSuspendedRun(i.createSessionScope(n.sessionId),a.id),M({restore:{..._,restoredFrom:a.id}})}catch(e){return M(e instanceof Error?e.message:String(e),!0)}}}}function F(e){return{name:`intercom`,label:`Intercom`,description:`Communicate with active agents in this root session.`,parameters:{type:`object`,additionalProperties:!1,properties:{action:{type:`string`,enum:[`members`,`send`,`ask`,`pending`,`reply`]},to:{type:`string`},message:{type:`string`},requestId:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`]},executionMode:`serial`,async execute(t,n,r,i){return e.execute(t,n,r,i)}}}const I=(0,T.defineServerPlugin)({name:E,global:{channels:[b.createSubagentsChannel,y.createSubagentCatalogChannel]},workspace:{channels:[b.createSubagentsChannel,y.createSubagentCatalogChannel]},session:({context:t,host:r,agent:o})=>{function d(t,n){let r=n.execution.model?[a.toModelInfo(n.execution.model)]:[];t.provide(S.DOOM_DELEGATION_SERVICE,n.bridge.createService(t,{sessionId:n.execution.sessionId,sessionScope:i.createSessionScope(n.execution.sessionId),availableModels:r,...n.execution.model?{parentModel:n.execution.model}:{}}));let o=f.createBackgroundWorkService(t);t.provide(w.DOOM_BACKGROUND_WORK_SERVICE,o),p.registerDirectRunBackgroundWork(t,o,n.execution.sessionId,n.runtime.asyncJobTracker),t.provide(e.DOOM_SUBAGENT_POLICY_SERVICE,m.createSubagentPolicyService(n.runtime.capabilityPolicies))}if(!o)throw Error(`Team session requires the headless host.`);if(r.context.environment===void 0)throw Error(`Team headless facet requires an admitted session environment.`);let y=r.context.directEvents;if(y===void 0)throw Error(`Team headless facet requires host-owned direct events.`);let b=o.context,T=h.createTeamExtensionRuntime(void 0,{environment:r.context.environment,childSessions:{get:()=>(0,C.readDoomChildSessionService)(t)},nativeRunProjection:x.nativeRunProjection}),D=i.createSessionScope(b.sessionId);T.management.bindSessionScope(D);let O=[],k=T.asyncJobTracker.forSession(b.sessionId,D),A=new Map,M=()=>j(y,b.sessionId,k.list(),A);O.push(T.asyncJobTracker.subscribe(b.sessionId,M)),O.push(x.subscribeNativeRunProjection(b.sessionId,e=>{A.clear();for(let t of e)A.set(t.runId,t);M()})),M();try{let e=T.discovery.discover(b.cwd,`both`).agents;y.publish(v.SUBAGENT_CATALOG_TYPE,b.sessionId,{cwd:b.cwd,agents:g.presentCatalog(e),models:g.catalogModels(e,n.resolveActiveTeamModelSpecs(r.context.environment)??[])})}catch(e){let t=e instanceof Error?e.message:String(e);y.publish(v.SUBAGENT_CATALOG_TYPE,b.sessionId,{cwd:b.cwd,agents:[],models:[],warning:t})}let N=c.createDelegationBridge({planner:T.spawnPlanner,management:T.management,waiter:T.subagentWaiter,scheduler:T.pollScheduler,tracker:T.asyncJobTracker,loadConfig:()=>s.loadConfig().config});T.completionNotifier.attachHost({sendMessage:e=>{let t=b.client.notify({body:e.content,level:`info`});t&&t.catch(e=>process.emitWarning(`Could not notify headless Team completion: ${String(e)}`))}});let I=T.teamChannel.createHeadlessRuntime({sendMessage:(e=>void b.client.notify({body:typeof e.content==`string`?e.content:e.content.map(e=>`text`in e?e.text:`[image]`).join(`
2
+ `),level:`info`})),sendUserMessage:(e=>void b.session.prompt(typeof e==`string`?e:e.map(e=>`text`in e?e.text:`[image]`).join(`
3
+ `),`steer`))});return{api:[_.createTeamSessionApi(T,b)],services:[e=>d(e,{bridge:N,runtime:T,execution:b})],async onDispose(){for(let e of O.splice(0).reverse())e();I.dispose(),T.completionNotifier.dispose();let e=u.suspendScopeRuns({scope:D,reason:`headless session ended`,jobs:k.list(),stop:(e,t)=>T.management.stop(e,t)}),t=T.nativeRuns.close().finally(()=>x.nativeRunProjection.dispose(b.sessionId)),n=await Promise.allSettled([e,t]);for(let e of n)e.status===`rejected`&&process.emitWarning(`Could not shut down headless Team runs: ${String(e.reason)}`);N.abandonAll(),T.dispose(),T.asyncJobTracker.stop(),T.pollScheduler.stop()},tools:[P(T,b),F(I)],resources:[{name:`doompi/team`,kind:`context`,read:()=>JSON.stringify({sessionId:b.sessionId,members:I.current()?[I.current()]:[]},null,2)}],activities:[{name:E,async start(e){let t=await u.openScopeAsync(D);return t.suspended.length&&await e.client.notify({body:l.formatSuspendedRuns(t.suspended),level:`info`}),I.bindMainSession(e.sessionId),()=>{I.dispose()}}}]}}});exports.default=I,exports.teamServerFacet=I;
4
4
  //# sourceMappingURL=server.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["SUBAGENT_RUNS_TYPE","createSessionScope","toModelInfo","SubagentParams","Check","SUBAGENT_ACTIONS","DoomTeamExpectedError","loadConfig","listSuspendedRuns","formatSuspendedRuns","resolveTrackedRunId","isSuspendedRunResumable","defineServerPlugin","createSubagentsChannel","createSubagentCatalogChannel","DOOM_DELEGATION_SERVICE","createBackgroundWorkService","DOOM_BACKGROUND_WORK_SERVICE","DOOM_SUBAGENT_POLICY_SERVICE","createSubagentPolicyService","createTeamExtensionRuntime","readDoomChildSessionService","subscribeNativeRunProjection","SUBAGENT_CATALOG_TYPE","presentCatalog","catalogModels","resolveActiveTeamModelSpecs","createDelegationBridge","createTeamSessionApi","suspendScopeRuns","nativeRunProjection","openScopeAsync"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { DOOM_BACKGROUND_WORK_SERVICE } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessTool,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hub-channel';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport type { Context } from '@deepseek-ai/cordis';\nimport { Check } from 'typebox/value';\n\nimport { createTeamSessionApi } from '../controllers/teamSessionApi';\nimport { createSubagentCatalogChannel } from '../controllers/webSubagentCatalogChannel';\nimport { createSubagentsChannel } from '../controllers/webSubagentsChannel';\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../schemas/subagentPolicy';\nimport { SUBAGENT_ACTIONS, SubagentParams, type SubagentToolParams } from '../schemas/subagentTool';\nimport { resolveActiveTeamModelSpecs } from '../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../services/asyncJobTracker';\nimport { resolveTrackedRunId } from '../services/asyncJobTracker';\nimport { createBackgroundWorkService } from '../services/backgroundWorkService';\nimport { loadConfig } from '../services/config';\nimport { createDelegationBridge } from '../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../services/directRunBackgroundWork';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport { toModelInfo } from '../services/modelInfo';\nimport { subscribeNativeRunProjection } from '../services/nativeRunProjection';\nimport { nativeRunProjection } from '../services/nativeRunProjection';\nimport type { NativeTeamRuntime, NativeTeamTransport } from '../services/nativeTeamChannel';\nimport { openScopeAsync, suspendScopeRuns } from '../services/sessionLifecycle';\nimport { createSessionScope } from '../services/sessionPaths';\nimport { createSubagentPolicyService } from '../services/subagentPolicyService';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n} from '../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../types/webSubagents';\n\nconst SOURCE = '@agimon-ai/doompi-team';\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nfunction result(value: unknown, isError = false): DoomHeadlessToolResult {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value, ...(isError ? { isError: true } : {}) };\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\ntype HeadlessTeamServicesConfig = {\n readonly bridge: ReturnType<typeof createDelegationBridge>;\n readonly runtime: ReturnType<typeof createTeamExtensionRuntime>;\n readonly execution: DoomHeadlessExecutionContext;\n};\n\nfunction subagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentParams> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentParams,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n if (!Check(SubagentParams, parameters)) return result('Invalid subagent parameters.', true);\n const params = parameters as SubagentToolParams;\n try {\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n return result({\n agents: selected\n ? [selected]\n : agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`),\n );\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) if (outcome.runId) jobs.track(outcome.runId);\n return result(plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) return result({ runs: jobs.list() });\n const status = runtime.management.status(params.id);\n return result({ runId: status.runId, status: status.status });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n return result({\n suspended,\n text: suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.',\n });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n return result({ runId: id, control: await runtime.management.stop(id, params.reason) });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result({ runId: id, steer });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result({ restore: { ...outcome, restoredFrom: params.id } });\n } catch (error) {\n return result(error instanceof Error ? error.message : String(error), true);\n }\n },\n };\n}\n\nfunction intercomTool(channel: NativeTeamRuntime): DoomHeadlessTool {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: {\n type: 'object',\n additionalProperties: false,\n properties: {\n action: { type: 'string', enum: ['members', 'send', 'ask', 'pending', 'reply'] },\n to: { type: 'string' },\n message: { type: 'string' },\n requestId: { type: 'string' },\n timeoutMs: { type: 'integer', minimum: 1 },\n },\n required: ['action'],\n },\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n\nexport const teamServerFacet = defineServerPlugin({\n name: SOURCE,\n global: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n workspace: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n session: ({ context, host: serverHost, agent: host }) => {\n /** Mount Team's session services under a Cordis-owned plugin fiber. */\n function headlessTeamServicesPlugin(ctx: Context, config: HeadlessTeamServicesConfig): void {\n const availableModels = config.execution.model ? [toModelInfo(config.execution.model)] : [];\n ctx.provide(\n DOOM_DELEGATION_SERVICE,\n config.bridge.createService(ctx, {\n sessionId: config.execution.sessionId,\n sessionScope: createSessionScope(config.execution.sessionId),\n availableModels,\n ...(config.execution.model ? { parentModel: config.execution.model } : {}),\n }),\n );\n const backgroundWork = createBackgroundWorkService(ctx);\n ctx.provide(DOOM_BACKGROUND_WORK_SERVICE, backgroundWork);\n registerDirectRunBackgroundWork(ctx, backgroundWork, config.execution.sessionId, config.runtime.asyncJobTracker);\n ctx.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(config.runtime.capabilityPolicies));\n }\n\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const directEventCleanups: Array<() => void> = [];\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const publishRunSnapshot = (): void => publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n directEventCleanups.push(runtime.asyncJobTracker.subscribe(execution.sessionId, publishRunSnapshot));\n directEventCleanups.push(\n subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishRunSnapshot();\n }),\n );\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(serverHost.context.environment) ?? []),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning,\n });\n }\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n\n runtime.completionNotifier.attachHost({\n sendMessage: (message) => {\n const pending = execution.client.notify({ body: message.content, level: 'info' });\n if (pending)\n void pending.catch((error) =>\n process.emitWarning(`Could not notify headless Team completion: ${String(error)}`),\n );\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n return {\n api: [createTeamSessionApi(runtime, execution)],\n services: [(ctx: Context) => headlessTeamServicesPlugin(ctx, { bridge, runtime, execution })],\n async onDispose() {\n for (const cleanup of directEventCleanups.splice(0).reverse()) cleanup();\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns\n .close()\n .finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n tools: [subagentTool(runtime, execution), intercomTool(channel)],\n resources: [\n {\n name: 'doompi/team',\n kind: 'context',\n read: () =>\n JSON.stringify(\n { sessionId: execution.sessionId, members: channel.current() ? [channel.current()] : [] },\n null,\n 2,\n ),\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n // Optional disable only detaches the communication member. Jobs and\n // their tracker remain available for a later activation.\n channel.dispose();\n };\n },\n },\n ],\n };\n },\n});\n\nexport default teamServerFacet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["SUBAGENT_RUNS_TYPE","createSessionScope","toModelInfo","SubagentToolSchema","validateSubagentParams","SUBAGENT_ACTIONS","DoomTeamExpectedError","loadConfig","listSuspendedRuns","formatSuspendedRuns","resolveTrackedRunId","isSuspendedRunResumable","defineServerPlugin","createSubagentsChannel","createSubagentCatalogChannel","DOOM_DELEGATION_SERVICE","createBackgroundWorkService","DOOM_BACKGROUND_WORK_SERVICE","DOOM_SUBAGENT_POLICY_SERVICE","createSubagentPolicyService","createTeamExtensionRuntime","readDoomChildSessionService","subscribeNativeRunProjection","SUBAGENT_CATALOG_TYPE","presentCatalog","catalogModels","resolveActiveTeamModelSpecs","createDelegationBridge","createTeamSessionApi","suspendScopeRuns","nativeRunProjection","openScopeAsync"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { DOOM_BACKGROUND_WORK_SERVICE } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessTool,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hub-channel';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createTeamSessionApi } from '../controllers/teamSessionApi';\nimport { createSubagentCatalogChannel } from '../controllers/webSubagentCatalogChannel';\nimport { createSubagentsChannel } from '../controllers/webSubagentsChannel';\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../schemas/subagentPolicy';\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../schemas/subagentTool';\nimport { resolveActiveTeamModelSpecs } from '../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../services/asyncJobTracker';\nimport { resolveTrackedRunId } from '../services/asyncJobTracker';\nimport { createBackgroundWorkService } from '../services/backgroundWorkService';\nimport { loadConfig } from '../services/config';\nimport { createDelegationBridge } from '../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../services/directRunBackgroundWork';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport { toModelInfo } from '../services/modelInfo';\nimport { subscribeNativeRunProjection } from '../services/nativeRunProjection';\nimport { nativeRunProjection } from '../services/nativeRunProjection';\nimport type { NativeTeamRuntime, NativeTeamTransport } from '../services/nativeTeamChannel';\nimport { openScopeAsync, suspendScopeRuns } from '../services/sessionLifecycle';\nimport { createSessionScope } from '../services/sessionPaths';\nimport { createSubagentPolicyService } from '../services/subagentPolicyService';\nimport { validateParams as validateSubagentParams } from '../services/subagentTool';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n} from '../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../types/webSubagents';\n\nconst SOURCE = '@agimon-ai/doompi-team';\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nfunction result(value: unknown, isError = false): DoomHeadlessToolResult {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value, ...(isError ? { isError: true } : {}) };\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\ntype HeadlessTeamServicesConfig = {\n readonly bridge: ReturnType<typeof createDelegationBridge>;\n readonly runtime: ReturnType<typeof createTeamExtensionRuntime>;\n readonly execution: DoomHeadlessExecutionContext;\n};\n\nfunction subagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n return result({\n agents: selected\n ? [selected]\n : agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`),\n );\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) if (outcome.runId) jobs.track(outcome.runId);\n return result(plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) return result({ runs: jobs.list() });\n const status = runtime.management.status(params.id);\n return result({ runId: status.runId, status: status.status });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n return result({\n suspended,\n text: suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.',\n });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n return result({ runId: id, control: await runtime.management.stop(id, params.reason) });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result({ runId: id, steer });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result({ restore: { ...outcome, restoredFrom: params.id } });\n } catch (error) {\n return result(error instanceof Error ? error.message : String(error), true);\n }\n },\n };\n}\n\nfunction intercomTool(channel: NativeTeamRuntime): DoomHeadlessTool {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: {\n type: 'object',\n additionalProperties: false,\n properties: {\n action: { type: 'string', enum: ['members', 'send', 'ask', 'pending', 'reply'] },\n to: { type: 'string' },\n message: { type: 'string' },\n requestId: { type: 'string' },\n timeoutMs: { type: 'integer', minimum: 1 },\n },\n required: ['action'],\n },\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n\nexport const teamServerFacet = defineServerPlugin({\n name: SOURCE,\n global: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n workspace: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n session: ({ context, host: serverHost, agent: host }) => {\n /** Mount Team's session services under a Cordis-owned plugin fiber. */\n function headlessTeamServicesPlugin(ctx: Context, config: HeadlessTeamServicesConfig): void {\n const availableModels = config.execution.model ? [toModelInfo(config.execution.model)] : [];\n ctx.provide(\n DOOM_DELEGATION_SERVICE,\n config.bridge.createService(ctx, {\n sessionId: config.execution.sessionId,\n sessionScope: createSessionScope(config.execution.sessionId),\n availableModels,\n ...(config.execution.model ? { parentModel: config.execution.model } : {}),\n }),\n );\n const backgroundWork = createBackgroundWorkService(ctx);\n ctx.provide(DOOM_BACKGROUND_WORK_SERVICE, backgroundWork);\n registerDirectRunBackgroundWork(ctx, backgroundWork, config.execution.sessionId, config.runtime.asyncJobTracker);\n ctx.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(config.runtime.capabilityPolicies));\n }\n\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const directEventCleanups: Array<() => void> = [];\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const publishRunSnapshot = (): void => publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n directEventCleanups.push(runtime.asyncJobTracker.subscribe(execution.sessionId, publishRunSnapshot));\n directEventCleanups.push(\n subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishRunSnapshot();\n }),\n );\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(serverHost.context.environment) ?? []),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning,\n });\n }\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n\n runtime.completionNotifier.attachHost({\n sendMessage: (message) => {\n const pending = execution.client.notify({ body: message.content, level: 'info' });\n if (pending)\n void pending.catch((error) =>\n process.emitWarning(`Could not notify headless Team completion: ${String(error)}`),\n );\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n return {\n api: [createTeamSessionApi(runtime, execution)],\n services: [(ctx: Context) => headlessTeamServicesPlugin(ctx, { bridge, runtime, execution })],\n async onDispose() {\n for (const cleanup of directEventCleanups.splice(0).reverse()) cleanup();\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns\n .close()\n .finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n tools: [subagentTool(runtime, execution), intercomTool(channel)],\n resources: [\n {\n name: 'doompi/team',\n kind: 'context',\n read: () =>\n JSON.stringify(\n { sessionId: execution.sessionId, members: channel.current() ? [channel.current()] : [] },\n null,\n 2,\n ),\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n // Optional disable only detaches the communication member. Jobs and\n // their tracker remain available for a later activation.\n channel.dispose();\n };\n },\n },\n ],\n };\n },\n});\n\nexport default teamServerFacet;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAkSa,+DAAe"}
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAiSa,+DAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAkSa,+DAAe"}
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAiSa,+DAAe"}
@@ -1,4 +1,4 @@
1
- import{DOOM_SUBAGENT_POLICY_SERVICE as e}from"../runtime-subagent-policy.mjs";import{SUBAGENT_ACTIONS as t,SubagentParams as n}from"../runtime-subagent-tool.mjs";import{resolveActiveTeamModelSpecs as r}from"../services/agentDiscovery/index.mjs";import{resolveTrackedRunId as i}from"../services/asyncJobTracker/index.mjs";import{createSessionScope as a}from"../services/sessionPaths/index.mjs";import{toModelInfo as o}from"../services/modelInfo/index.mjs";import{DoomTeamExpectedError as s}from"../services/errors/index.mjs";import{loadConfig as c}from"../services/config/index.mjs";import{createDelegationBridge as l}from"../services/delegationBridge/index.mjs";import{clearSuspendedRun as u,formatSuspendedRuns as d,isSuspendedRunResumable as f,listSuspendedRuns as p}from"../services/suspendedRuns/index.mjs";import{openScopeAsync as m,suspendScopeRuns as h}from"../services/sessionLifecycle/index.mjs";import{createBackgroundWorkService as g}from"../services/backgroundWorkService/index.mjs";import{registerDirectRunBackgroundWork as _}from"../services/directRunBackgroundWork/index.mjs";import{createSubagentPolicyService as v}from"../services/subagentPolicyService/index.mjs";import{createTeamExtensionRuntime as y}from"../services/teamRuntime/index.mjs";import{catalogModels as b,presentCatalog as x}from"../services/webSubagentCatalog/index.mjs";import{createTeamSessionApi as S}from"../controllers/teamSessionApi.mjs";import{SUBAGENT_CATALOG_TYPE as C,SUBAGENT_RUNS_TYPE as w}from"../types/webSubagents.mjs";import{createSubagentCatalogChannel as T}from"../controllers/webSubagentCatalogChannel.mjs";import{createSubagentsChannel as E}from"../controllers/webSubagentsChannel.mjs";import{nativeRunProjection as D,subscribeNativeRunProjection as O}from"../services/nativeRunProjection/index.mjs";import{DOOM_DELEGATION_SERVICE as k}from"@agimon-ai/doompi-core/delegation";import{readDoomChildSessionService as A}from"@agimon-ai/doompi-core/child";import{Check as j}from"typebox/value";import{DOOM_BACKGROUND_WORK_SERVICE as M}from"@agimon-ai/doompi-core/background-work";import{defineServerPlugin as N}from"@agimon-ai/doompi-core/server-facet";const P=`@agimon-ai/doompi-team`,F=new Set([`completed`,`complete`,`failed`,`stopped`,`paused`]);function I(e){return e===`completed`||e===`complete`?`done`:e===`failed`?`failed`:e===`stopped`||e===`paused`?`stopped`:e===`queued`?`queued`:`running`}function L(e){if(!e.agent||!e.status||e.startedAt===void 0)return;let t=e.updatedAt??e.startedAt;return{runId:e.runId,agent:e.agent,state:I(e.status),rawState:e.status,task:e.task??``,cwd:e.cwd??``,startedAt:e.startedAt,...F.has(e.status)?{endedAt:t}:{},lastUpdate:t,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function R(e){return{runId:e.runId,agent:e.agent,state:I(e.status),rawState:e.status,task:e.task,cwd:e.cwd,startedAt:e.startedAt,...F.has(e.status)?{endedAt:e.updatedAt}:{},lastUpdate:e.updatedAt,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function z(e,t,n,r){let i=n.filter(e=>!e.native).map(L).filter(e=>e!==void 0);i.push(...[...r.values()].map(R)),e.publish(w,t,{runs:i})}function B(e,t=!1){return{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e,null,2)}],details:e,...t?{isError:!0}:{}}}function V(e){return e===`user`||e===`project`?e:`both`}function H(e,r){let l=a(r.sessionId),m=e.asyncJobTracker.forSession(r.sessionId,l),h=r.model?[o(r.model)]:[];return{name:`subagent`,label:`Subagent`,description:`Discover agents, start and manage persistent background subagent runs, and inspect suspended work.`,parameters:n,promptSnippet:`Discover, run, inspect, steer, stop, and restore persistent subagents`,promptGuidelines:[`Runs are persistent background work. Do not resubmit a run that already returned an id.`,`Use status or suspended before retrying a failed or interrupted operation.`],executionMode:`serial`,async execute(o,l,g,_){if(!j(n,l))return B(`Invalid subagent parameters.`,!0);let v=l;try{if(v.action===t.agents){let t=V(v.scope),n=e.discovery.discover(v.cwd??r.cwd,t).agents,i=v.name?e.discovery.find(v.cwd??r.cwd,t,v.name):void 0;if(v.name&&!i)throw new s(`agent_not_found`,`No executable agent matches '${v.name}'.`,!1,`Call subagent({"action":"agents"}) and retry with an exact agent name.`);return B({agents:i?[i]:n.map(e=>({name:e.name,source:e.source,description:e.description,runtime:e.runtime??`pi`}))})}if(v.action===t.run){_?.(B(`Starting ${v.requests.length} subagent${v.requests.length===1?``:`s`}...`));let t=await e.spawnPlanner.spawn({tasks:v.requests.map(e=>({agent:e.agent.trim(),task:e.task.trim(),...e.inlineAgent?{inlineAgent:e.inlineAgent}:{},...e.cwd?{cwd:e.cwd}:{},...e.model?{model:e.model}:{},...e.runtime?{runtime:e.runtime}:{}})),cwd:r.cwd,agentScope:V(v.scope),sessionScope:a(r.sessionId),environment:r.environment,parentSessionId:r.sessionId,...v.concurrency===void 0?{}:{concurrency:v.concurrency},...v.artifacts===void 0?{}:{artifacts:v.artifacts},availableModels:h,...r.model?{parentModel:r.model}:{}},c().config);for(let e of t.outcomes)e.runId&&m.track(e.runId);return B(t)}if(v.action===t.status){if(!(`id`in v))return B({runs:m.list()});let t=e.management.status(v.id);return B({runId:t.runId,status:t.status})}if(v.action===t.suspended){let e=p(a(r.sessionId));return B({suspended:e,text:e.length?d(e):`No suspended subagents in this session.`})}let n=i(m,v.id);if(v.action===t.stop)return B({runId:n,control:await e.management.stop(n,v.reason)});if(v.action===t.steer)return B({runId:n,steer:await e.management.steer(n,v.message,void 0,g)});let o=p(a(r.sessionId)).find(e=>e.runId===v.id);if(!o)throw Error(`No suspended run matches '${v.id}'.`);if(!f(o))throw Error(`Suspended run '${v.id}' is not resumable.`);let l=(await e.spawnPlanner.spawn({single:{agent:o.agent,...o.inlineAgent?{inlineAgent:o.inlineAgent}:{},task:o.task,cwd:o.cwd,...o.model?{model:o.model}:{},sessionFile:o.sessionFile},cwd:o.cwd,agentScope:`both`,sessionScope:a(r.sessionId),environment:r.environment,runtime:`pi`,parentSessionId:r.sessionId,availableModels:h},c().config)).outcomes[0];if(!l?.runId)throw Error(`Could not restore '${v.id}': ${l?.error??`the spawn produced no run.`}`);return u(a(r.sessionId),v.id),B({restore:{...l,restoredFrom:v.id}})}catch(e){return B(e instanceof Error?e.message:String(e),!0)}}}}function U(e){return{name:`intercom`,label:`Intercom`,description:`Communicate with active agents in this root session.`,parameters:{type:`object`,additionalProperties:!1,properties:{action:{type:`string`,enum:[`members`,`send`,`ask`,`pending`,`reply`]},to:{type:`string`},message:{type:`string`},requestId:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`]},executionMode:`serial`,async execute(t,n,r,i){return e.execute(t,n,r,i)}}}const W=N({name:P,global:{channels:[E,T]},workspace:{channels:[E,T]},session:({context:t,host:n,agent:i})=>{function s(t,n){let r=n.execution.model?[o(n.execution.model)]:[];t.provide(k,n.bridge.createService(t,{sessionId:n.execution.sessionId,sessionScope:a(n.execution.sessionId),availableModels:r,...n.execution.model?{parentModel:n.execution.model}:{}}));let i=g(t);t.provide(M,i),_(t,i,n.execution.sessionId,n.runtime.asyncJobTracker),t.provide(e,v(n.runtime.capabilityPolicies))}if(!i)throw Error(`Team session requires the headless host.`);if(n.context.environment===void 0)throw Error(`Team headless facet requires an admitted session environment.`);let u=n.context.directEvents;if(u===void 0)throw Error(`Team headless facet requires host-owned direct events.`);let f=i.context,p=y(void 0,{environment:n.context.environment,childSessions:{get:()=>A(t)},nativeRunProjection:D}),w=a(f.sessionId);p.management.bindSessionScope(w);let T=[],E=p.asyncJobTracker.forSession(f.sessionId,w),j=new Map,N=()=>z(u,f.sessionId,E.list(),j);T.push(p.asyncJobTracker.subscribe(f.sessionId,N)),T.push(O(f.sessionId,e=>{j.clear();for(let t of e)j.set(t.runId,t);N()})),N();try{let e=p.discovery.discover(f.cwd,`both`).agents;u.publish(C,f.sessionId,{cwd:f.cwd,agents:x(e),models:b(e,r(n.context.environment)??[])})}catch(e){let t=e instanceof Error?e.message:String(e);u.publish(C,f.sessionId,{cwd:f.cwd,agents:[],models:[],warning:t})}let F=l({planner:p.spawnPlanner,management:p.management,waiter:p.subagentWaiter,scheduler:p.pollScheduler,tracker:p.asyncJobTracker,loadConfig:()=>c().config});p.completionNotifier.attachHost({sendMessage:e=>{let t=f.client.notify({body:e.content,level:`info`});t&&t.catch(e=>process.emitWarning(`Could not notify headless Team completion: ${String(e)}`))}});let I=p.teamChannel.createHeadlessRuntime({sendMessage:(e=>void f.client.notify({body:typeof e.content==`string`?e.content:e.content.map(e=>`text`in e?e.text:`[image]`).join(`
1
+ import{DOOM_SUBAGENT_POLICY_SERVICE as e}from"../runtime-subagent-policy.mjs";import{SUBAGENT_ACTIONS as t,SubagentToolSchema as n}from"../runtime-subagent-tool.mjs";import{resolveActiveTeamModelSpecs as r}from"../services/agentDiscovery/index.mjs";import{resolveTrackedRunId as i}from"../services/asyncJobTracker/index.mjs";import{createSessionScope as a}from"../services/sessionPaths/index.mjs";import{toModelInfo as o}from"../services/modelInfo/index.mjs";import{DoomTeamExpectedError as s}from"../services/errors/index.mjs";import{loadConfig as c}from"../services/config/index.mjs";import{createDelegationBridge as l}from"../services/delegationBridge/index.mjs";import{clearSuspendedRun as u,formatSuspendedRuns as d,isSuspendedRunResumable as f,listSuspendedRuns as p}from"../services/suspendedRuns/index.mjs";import{openScopeAsync as m,suspendScopeRuns as h}from"../services/sessionLifecycle/index.mjs";import{validateParams as g}from"../services/subagentTool/index.mjs";import{createBackgroundWorkService as _}from"../services/backgroundWorkService/index.mjs";import{registerDirectRunBackgroundWork as v}from"../services/directRunBackgroundWork/index.mjs";import{createSubagentPolicyService as y}from"../services/subagentPolicyService/index.mjs";import{createTeamExtensionRuntime as b}from"../services/teamRuntime/index.mjs";import{catalogModels as x,presentCatalog as S}from"../services/webSubagentCatalog/index.mjs";import{createTeamSessionApi as C}from"../controllers/teamSessionApi.mjs";import{SUBAGENT_CATALOG_TYPE as w,SUBAGENT_RUNS_TYPE as T}from"../types/webSubagents.mjs";import{createSubagentCatalogChannel as E}from"../controllers/webSubagentCatalogChannel.mjs";import{createSubagentsChannel as D}from"../controllers/webSubagentsChannel.mjs";import{nativeRunProjection as O,subscribeNativeRunProjection as k}from"../services/nativeRunProjection/index.mjs";import{DOOM_DELEGATION_SERVICE as A}from"@agimon-ai/doompi-core/delegation";import{readDoomChildSessionService as j}from"@agimon-ai/doompi-core/child";import{DOOM_BACKGROUND_WORK_SERVICE as M}from"@agimon-ai/doompi-core/background-work";import{defineServerPlugin as N}from"@agimon-ai/doompi-core/server-facet";const P=`@agimon-ai/doompi-team`,F=new Set([`completed`,`complete`,`failed`,`stopped`,`paused`]);function I(e){return e===`completed`||e===`complete`?`done`:e===`failed`?`failed`:e===`stopped`||e===`paused`?`stopped`:e===`queued`?`queued`:`running`}function L(e){if(!e.agent||!e.status||e.startedAt===void 0)return;let t=e.updatedAt??e.startedAt;return{runId:e.runId,agent:e.agent,state:I(e.status),rawState:e.status,task:e.task??``,cwd:e.cwd??``,startedAt:e.startedAt,...F.has(e.status)?{endedAt:t}:{},lastUpdate:t,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function R(e){return{runId:e.runId,agent:e.agent,state:I(e.status),rawState:e.status,task:e.task,cwd:e.cwd,startedAt:e.startedAt,...F.has(e.status)?{endedAt:e.updatedAt}:{},lastUpdate:e.updatedAt,tail:[],...e.sessionFile===void 0?{}:{sessionFile:e.sessionFile},...e.summary===void 0?{}:{summary:e.summary},...e.error===void 0?{}:{error:e.error}}}function z(e,t,n,r){let i=n.filter(e=>!e.native).map(L).filter(e=>e!==void 0);i.push(...[...r.values()].map(R)),e.publish(T,t,{runs:i})}function B(e,t=!1){return{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e,null,2)}],details:e,...t?{isError:!0}:{}}}function V(e){return e===`user`||e===`project`?e:`both`}function H(e,r){let l=a(r.sessionId),m=e.asyncJobTracker.forSession(r.sessionId,l),h=r.model?[o(r.model)]:[];return{name:`subagent`,label:`Subagent`,description:`Discover agents, start and manage persistent background subagent runs, and inspect suspended work.`,parameters:n,promptSnippet:`Discover, run, inspect, steer, stop, and restore persistent subagents`,promptGuidelines:[`Runs are persistent background work. Do not resubmit a run that already returned an id.`,`Use status or suspended before retrying a failed or interrupted operation.`],executionMode:`serial`,async execute(n,o,l,_){try{let n=g(o);if(n.action===t.agents){let t=V(n.scope),i=e.discovery.discover(n.cwd??r.cwd,t).agents,a=n.name?e.discovery.find(n.cwd??r.cwd,t,n.name):void 0;if(n.name&&!a)throw new s(`agent_not_found`,`No executable agent matches '${n.name}'.`,!1,`Call subagent({"action":"agents"}) and retry with an exact agent name.`);return B({agents:a?[a]:i.map(e=>({name:e.name,source:e.source,description:e.description,runtime:e.runtime??`pi`}))})}if(n.action===t.run){_?.(B(`Starting ${n.requests.length} subagent${n.requests.length===1?``:`s`}...`));let t=await e.spawnPlanner.spawn({tasks:n.requests.map(e=>({agent:e.agent.trim(),task:e.task.trim(),...e.inlineAgent?{inlineAgent:e.inlineAgent}:{},...e.cwd?{cwd:e.cwd}:{},...e.model?{model:e.model}:{},...e.runtime?{runtime:e.runtime}:{}})),cwd:r.cwd,agentScope:V(n.scope),sessionScope:a(r.sessionId),environment:r.environment,parentSessionId:r.sessionId,...n.concurrency===void 0?{}:{concurrency:n.concurrency},...n.artifacts===void 0?{}:{artifacts:n.artifacts},availableModels:h,...r.model?{parentModel:r.model}:{}},c().config);for(let e of t.outcomes)e.runId&&m.track(e.runId);return B(t)}if(n.action===t.status){if(!(`id`in n))return B({runs:m.list()});let t=e.management.status(n.id);return B({runId:t.runId,status:t.status})}if(n.action===t.suspended){let e=p(a(r.sessionId));return B({suspended:e,text:e.length?d(e):`No suspended subagents in this session.`})}let v=i(m,n.id);if(n.action===t.stop)return B({runId:v,control:await e.management.stop(v,n.reason)});if(n.action===t.steer)return B({runId:v,steer:await e.management.steer(v,n.message,void 0,l)});let y=p(a(r.sessionId)).find(e=>e.runId===n.id);if(!y)throw Error(`No suspended run matches '${n.id}'.`);if(!f(y))throw Error(`Suspended run '${n.id}' is not resumable.`);let b=(await e.spawnPlanner.spawn({single:{agent:y.agent,...y.inlineAgent?{inlineAgent:y.inlineAgent}:{},task:y.task,cwd:y.cwd,...y.model?{model:y.model}:{},sessionFile:y.sessionFile},cwd:y.cwd,agentScope:`both`,sessionScope:a(r.sessionId),environment:r.environment,runtime:`pi`,parentSessionId:r.sessionId,availableModels:h},c().config)).outcomes[0];if(!b?.runId)throw Error(`Could not restore '${n.id}': ${b?.error??`the spawn produced no run.`}`);return u(a(r.sessionId),n.id),B({restore:{...b,restoredFrom:n.id}})}catch(e){return B(e instanceof Error?e.message:String(e),!0)}}}}function U(e){return{name:`intercom`,label:`Intercom`,description:`Communicate with active agents in this root session.`,parameters:{type:`object`,additionalProperties:!1,properties:{action:{type:`string`,enum:[`members`,`send`,`ask`,`pending`,`reply`]},to:{type:`string`},message:{type:`string`},requestId:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`]},executionMode:`serial`,async execute(t,n,r,i){return e.execute(t,n,r,i)}}}const W=N({name:P,global:{channels:[D,E]},workspace:{channels:[D,E]},session:({context:t,host:n,agent:i})=>{function s(t,n){let r=n.execution.model?[o(n.execution.model)]:[];t.provide(A,n.bridge.createService(t,{sessionId:n.execution.sessionId,sessionScope:a(n.execution.sessionId),availableModels:r,...n.execution.model?{parentModel:n.execution.model}:{}}));let i=_(t);t.provide(M,i),v(t,i,n.execution.sessionId,n.runtime.asyncJobTracker),t.provide(e,y(n.runtime.capabilityPolicies))}if(!i)throw Error(`Team session requires the headless host.`);if(n.context.environment===void 0)throw Error(`Team headless facet requires an admitted session environment.`);let u=n.context.directEvents;if(u===void 0)throw Error(`Team headless facet requires host-owned direct events.`);let f=i.context,p=b(void 0,{environment:n.context.environment,childSessions:{get:()=>j(t)},nativeRunProjection:O}),g=a(f.sessionId);p.management.bindSessionScope(g);let T=[],E=p.asyncJobTracker.forSession(f.sessionId,g),D=new Map,N=()=>z(u,f.sessionId,E.list(),D);T.push(p.asyncJobTracker.subscribe(f.sessionId,N)),T.push(k(f.sessionId,e=>{D.clear();for(let t of e)D.set(t.runId,t);N()})),N();try{let e=p.discovery.discover(f.cwd,`both`).agents;u.publish(w,f.sessionId,{cwd:f.cwd,agents:S(e),models:x(e,r(n.context.environment)??[])})}catch(e){let t=e instanceof Error?e.message:String(e);u.publish(w,f.sessionId,{cwd:f.cwd,agents:[],models:[],warning:t})}let F=l({planner:p.spawnPlanner,management:p.management,waiter:p.subagentWaiter,scheduler:p.pollScheduler,tracker:p.asyncJobTracker,loadConfig:()=>c().config});p.completionNotifier.attachHost({sendMessage:e=>{let t=f.client.notify({body:e.content,level:`info`});t&&t.catch(e=>process.emitWarning(`Could not notify headless Team completion: ${String(e)}`))}});let I=p.teamChannel.createHeadlessRuntime({sendMessage:(e=>void f.client.notify({body:typeof e.content==`string`?e.content:e.content.map(e=>`text`in e?e.text:`[image]`).join(`
2
2
  `),level:`info`})),sendUserMessage:(e=>void f.session.prompt(typeof e==`string`?e:e.map(e=>`text`in e?e.text:`[image]`).join(`
3
- `),`steer`))});return{api:[S(p,f)],services:[e=>s(e,{bridge:F,runtime:p,execution:f})],async onDispose(){for(let e of T.splice(0).reverse())e();I.dispose(),p.completionNotifier.dispose();let e=h({scope:w,reason:`headless session ended`,jobs:E.list(),stop:(e,t)=>p.management.stop(e,t)}),t=p.nativeRuns.close().finally(()=>D.dispose(f.sessionId)),n=await Promise.allSettled([e,t]);for(let e of n)e.status===`rejected`&&process.emitWarning(`Could not shut down headless Team runs: ${String(e.reason)}`);F.abandonAll(),p.dispose(),p.asyncJobTracker.stop(),p.pollScheduler.stop()},tools:[H(p,f),U(I)],resources:[{name:`doompi/team`,kind:`context`,read:()=>JSON.stringify({sessionId:f.sessionId,members:I.current()?[I.current()]:[]},null,2)}],activities:[{name:P,async start(e){let t=await m(w);return t.suspended.length&&await e.client.notify({body:d(t.suspended),level:`info`}),I.bindMainSession(e.sessionId),()=>{I.dispose()}}}]}}});export{W as default,W as teamServerFacet};
3
+ `),`steer`))});return{api:[C(p,f)],services:[e=>s(e,{bridge:F,runtime:p,execution:f})],async onDispose(){for(let e of T.splice(0).reverse())e();I.dispose(),p.completionNotifier.dispose();let e=h({scope:g,reason:`headless session ended`,jobs:E.list(),stop:(e,t)=>p.management.stop(e,t)}),t=p.nativeRuns.close().finally(()=>O.dispose(f.sessionId)),n=await Promise.allSettled([e,t]);for(let e of n)e.status===`rejected`&&process.emitWarning(`Could not shut down headless Team runs: ${String(e.reason)}`);F.abandonAll(),p.dispose(),p.asyncJobTracker.stop(),p.pollScheduler.stop()},tools:[H(p,f),U(I)],resources:[{name:`doompi/team`,kind:`context`,read:()=>JSON.stringify({sessionId:f.sessionId,members:I.current()?[I.current()]:[]},null,2)}],activities:[{name:P,async start(e){let t=await m(g);return t.suspended.length&&await e.client.notify({body:d(t.suspended),level:`info`}),I.bindMainSession(e.sessionId),()=>{I.dispose()}}}]}}});export{W as default,W as teamServerFacet};
4
4
  //# sourceMappingURL=server.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { DOOM_BACKGROUND_WORK_SERVICE } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessTool,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hub-channel';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport type { Context } from '@deepseek-ai/cordis';\nimport { Check } from 'typebox/value';\n\nimport { createTeamSessionApi } from '../controllers/teamSessionApi';\nimport { createSubagentCatalogChannel } from '../controllers/webSubagentCatalogChannel';\nimport { createSubagentsChannel } from '../controllers/webSubagentsChannel';\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../schemas/subagentPolicy';\nimport { SUBAGENT_ACTIONS, SubagentParams, type SubagentToolParams } from '../schemas/subagentTool';\nimport { resolveActiveTeamModelSpecs } from '../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../services/asyncJobTracker';\nimport { resolveTrackedRunId } from '../services/asyncJobTracker';\nimport { createBackgroundWorkService } from '../services/backgroundWorkService';\nimport { loadConfig } from '../services/config';\nimport { createDelegationBridge } from '../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../services/directRunBackgroundWork';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport { toModelInfo } from '../services/modelInfo';\nimport { subscribeNativeRunProjection } from '../services/nativeRunProjection';\nimport { nativeRunProjection } from '../services/nativeRunProjection';\nimport type { NativeTeamRuntime, NativeTeamTransport } from '../services/nativeTeamChannel';\nimport { openScopeAsync, suspendScopeRuns } from '../services/sessionLifecycle';\nimport { createSessionScope } from '../services/sessionPaths';\nimport { createSubagentPolicyService } from '../services/subagentPolicyService';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n} from '../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../types/webSubagents';\n\nconst SOURCE = '@agimon-ai/doompi-team';\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nfunction result(value: unknown, isError = false): DoomHeadlessToolResult {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value, ...(isError ? { isError: true } : {}) };\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\ntype HeadlessTeamServicesConfig = {\n readonly bridge: ReturnType<typeof createDelegationBridge>;\n readonly runtime: ReturnType<typeof createTeamExtensionRuntime>;\n readonly execution: DoomHeadlessExecutionContext;\n};\n\nfunction subagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentParams> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentParams,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n if (!Check(SubagentParams, parameters)) return result('Invalid subagent parameters.', true);\n const params = parameters as SubagentToolParams;\n try {\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n return result({\n agents: selected\n ? [selected]\n : agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`),\n );\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) if (outcome.runId) jobs.track(outcome.runId);\n return result(plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) return result({ runs: jobs.list() });\n const status = runtime.management.status(params.id);\n return result({ runId: status.runId, status: status.status });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n return result({\n suspended,\n text: suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.',\n });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n return result({ runId: id, control: await runtime.management.stop(id, params.reason) });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result({ runId: id, steer });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result({ restore: { ...outcome, restoredFrom: params.id } });\n } catch (error) {\n return result(error instanceof Error ? error.message : String(error), true);\n }\n },\n };\n}\n\nfunction intercomTool(channel: NativeTeamRuntime): DoomHeadlessTool {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: {\n type: 'object',\n additionalProperties: false,\n properties: {\n action: { type: 'string', enum: ['members', 'send', 'ask', 'pending', 'reply'] },\n to: { type: 'string' },\n message: { type: 'string' },\n requestId: { type: 'string' },\n timeoutMs: { type: 'integer', minimum: 1 },\n },\n required: ['action'],\n },\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n\nexport const teamServerFacet = defineServerPlugin({\n name: SOURCE,\n global: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n workspace: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n session: ({ context, host: serverHost, agent: host }) => {\n /** Mount Team's session services under a Cordis-owned plugin fiber. */\n function headlessTeamServicesPlugin(ctx: Context, config: HeadlessTeamServicesConfig): void {\n const availableModels = config.execution.model ? [toModelInfo(config.execution.model)] : [];\n ctx.provide(\n DOOM_DELEGATION_SERVICE,\n config.bridge.createService(ctx, {\n sessionId: config.execution.sessionId,\n sessionScope: createSessionScope(config.execution.sessionId),\n availableModels,\n ...(config.execution.model ? { parentModel: config.execution.model } : {}),\n }),\n );\n const backgroundWork = createBackgroundWorkService(ctx);\n ctx.provide(DOOM_BACKGROUND_WORK_SERVICE, backgroundWork);\n registerDirectRunBackgroundWork(ctx, backgroundWork, config.execution.sessionId, config.runtime.asyncJobTracker);\n ctx.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(config.runtime.capabilityPolicies));\n }\n\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const directEventCleanups: Array<() => void> = [];\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const publishRunSnapshot = (): void => publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n directEventCleanups.push(runtime.asyncJobTracker.subscribe(execution.sessionId, publishRunSnapshot));\n directEventCleanups.push(\n subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishRunSnapshot();\n }),\n );\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(serverHost.context.environment) ?? []),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning,\n });\n }\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n\n runtime.completionNotifier.attachHost({\n sendMessage: (message) => {\n const pending = execution.client.notify({ body: message.content, level: 'info' });\n if (pending)\n void pending.catch((error) =>\n process.emitWarning(`Could not notify headless Team completion: ${String(error)}`),\n );\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n return {\n api: [createTeamSessionApi(runtime, execution)],\n services: [(ctx: Context) => headlessTeamServicesPlugin(ctx, { bridge, runtime, execution })],\n async onDispose() {\n for (const cleanup of directEventCleanups.splice(0).reverse()) cleanup();\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns\n .close()\n .finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n tools: [subagentTool(runtime, execution), intercomTool(channel)],\n resources: [\n {\n name: 'doompi/team',\n kind: 'context',\n read: () =>\n JSON.stringify(\n { sessionId: execution.sessionId, members: channel.current() ? [channel.current()] : [] },\n null,\n 2,\n ),\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n // Optional disable only detaches the communication member. Jobs and\n // their tracker remain available for a later activation.\n channel.dispose();\n };\n },\n },\n ],\n };\n },\n});\n\nexport default teamServerFacet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["validateSubagentParams"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { DOOM_BACKGROUND_WORK_SERVICE } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessTool,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hub-channel';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createTeamSessionApi } from '../controllers/teamSessionApi';\nimport { createSubagentCatalogChannel } from '../controllers/webSubagentCatalogChannel';\nimport { createSubagentsChannel } from '../controllers/webSubagentsChannel';\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../schemas/subagentPolicy';\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../schemas/subagentTool';\nimport { resolveActiveTeamModelSpecs } from '../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../services/asyncJobTracker';\nimport { resolveTrackedRunId } from '../services/asyncJobTracker';\nimport { createBackgroundWorkService } from '../services/backgroundWorkService';\nimport { loadConfig } from '../services/config';\nimport { createDelegationBridge } from '../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../services/directRunBackgroundWork';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport { toModelInfo } from '../services/modelInfo';\nimport { subscribeNativeRunProjection } from '../services/nativeRunProjection';\nimport { nativeRunProjection } from '../services/nativeRunProjection';\nimport type { NativeTeamRuntime, NativeTeamTransport } from '../services/nativeTeamChannel';\nimport { openScopeAsync, suspendScopeRuns } from '../services/sessionLifecycle';\nimport { createSessionScope } from '../services/sessionPaths';\nimport { createSubagentPolicyService } from '../services/subagentPolicyService';\nimport { validateParams as validateSubagentParams } from '../services/subagentTool';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n} from '../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../types/webSubagents';\n\nconst SOURCE = '@agimon-ai/doompi-team';\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nfunction result(value: unknown, isError = false): DoomHeadlessToolResult {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n return { content: [{ type: 'text', text }], details: value, ...(isError ? { isError: true } : {}) };\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\ntype HeadlessTeamServicesConfig = {\n readonly bridge: ReturnType<typeof createDelegationBridge>;\n readonly runtime: ReturnType<typeof createTeamExtensionRuntime>;\n readonly execution: DoomHeadlessExecutionContext;\n};\n\nfunction subagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n return result({\n agents: selected\n ? [selected]\n : agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`),\n );\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) if (outcome.runId) jobs.track(outcome.runId);\n return result(plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) return result({ runs: jobs.list() });\n const status = runtime.management.status(params.id);\n return result({ runId: status.runId, status: status.status });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n return result({\n suspended,\n text: suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.',\n });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n return result({ runId: id, control: await runtime.management.stop(id, params.reason) });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result({ runId: id, steer });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result({ restore: { ...outcome, restoredFrom: params.id } });\n } catch (error) {\n return result(error instanceof Error ? error.message : String(error), true);\n }\n },\n };\n}\n\nfunction intercomTool(channel: NativeTeamRuntime): DoomHeadlessTool {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: {\n type: 'object',\n additionalProperties: false,\n properties: {\n action: { type: 'string', enum: ['members', 'send', 'ask', 'pending', 'reply'] },\n to: { type: 'string' },\n message: { type: 'string' },\n requestId: { type: 'string' },\n timeoutMs: { type: 'integer', minimum: 1 },\n },\n required: ['action'],\n },\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n\nexport const teamServerFacet = defineServerPlugin({\n name: SOURCE,\n global: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n workspace: { channels: [createSubagentsChannel, createSubagentCatalogChannel] },\n session: ({ context, host: serverHost, agent: host }) => {\n /** Mount Team's session services under a Cordis-owned plugin fiber. */\n function headlessTeamServicesPlugin(ctx: Context, config: HeadlessTeamServicesConfig): void {\n const availableModels = config.execution.model ? [toModelInfo(config.execution.model)] : [];\n ctx.provide(\n DOOM_DELEGATION_SERVICE,\n config.bridge.createService(ctx, {\n sessionId: config.execution.sessionId,\n sessionScope: createSessionScope(config.execution.sessionId),\n availableModels,\n ...(config.execution.model ? { parentModel: config.execution.model } : {}),\n }),\n );\n const backgroundWork = createBackgroundWorkService(ctx);\n ctx.provide(DOOM_BACKGROUND_WORK_SERVICE, backgroundWork);\n registerDirectRunBackgroundWork(ctx, backgroundWork, config.execution.sessionId, config.runtime.asyncJobTracker);\n ctx.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(config.runtime.capabilityPolicies));\n }\n\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const directEventCleanups: Array<() => void> = [];\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const publishRunSnapshot = (): void => publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n directEventCleanups.push(runtime.asyncJobTracker.subscribe(execution.sessionId, publishRunSnapshot));\n directEventCleanups.push(\n subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishRunSnapshot();\n }),\n );\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(serverHost.context.environment) ?? []),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning,\n });\n }\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n\n runtime.completionNotifier.attachHost({\n sendMessage: (message) => {\n const pending = execution.client.notify({ body: message.content, level: 'info' });\n if (pending)\n void pending.catch((error) =>\n process.emitWarning(`Could not notify headless Team completion: ${String(error)}`),\n );\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n return {\n api: [createTeamSessionApi(runtime, execution)],\n services: [(ctx: Context) => headlessTeamServicesPlugin(ctx, { bridge, runtime, execution })],\n async onDispose() {\n for (const cleanup of directEventCleanups.splice(0).reverse()) cleanup();\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns\n .close()\n .finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n tools: [subagentTool(runtime, execution), intercomTool(channel)],\n resources: [\n {\n name: 'doompi/team',\n kind: 'context',\n read: () =>\n JSON.stringify(\n { sessionId: execution.sessionId, members: channel.current() ? [channel.current()] : [] },\n null,\n 2,\n ),\n },\n ],\n activities: [\n {\n name: SOURCE,\n async start(activityContext) {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n // Optional disable only detaches the communication member. Jobs and\n // their tracker remain available for a later activation.\n channel.dispose();\n };\n },\n },\n ],\n };\n },\n});\n\nexport default teamServerFacet;\n"],"mappings":"woEAgDA,MAAM,EAAS,yBAST,EAAsB,IAAI,IAAI,CAAC,YAAa,WAAY,SAAU,UAAW,QAAQ,CAAC,EAE5F,SAAS,EAAS,EAAkC,CAKlD,OAJI,IAAW,aAAe,IAAW,WAAmB,OACxD,IAAW,SAAiB,SAC5B,IAAW,WAAa,IAAW,SAAiB,UACpD,IAAW,SAAiB,SACzB,SACT,CAEA,SAAS,EAAkB,EAAwD,CACjF,GAAI,CAAC,EAAI,OAAS,CAAC,EAAI,QAAU,EAAI,YAAc,IAAA,GAAW,OAC9D,IAAM,EAAa,EAAI,WAAa,EAAI,UACxC,MAAO,CACL,MAAO,EAAI,MACX,MAAO,EAAI,MACX,MAAO,EAAS,EAAI,MAAM,EAC1B,SAAU,EAAI,OACd,KAAM,EAAI,MAAQ,GAClB,IAAK,EAAI,KAAO,GAChB,UAAW,EAAI,UACf,GAAI,EAAoB,IAAI,EAAI,MAAM,EAAI,CAAE,QAAS,CAAW,EAAI,CAAC,EACrE,aACA,KAAM,CAAC,EACP,GAAI,EAAI,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAI,WAAY,EACxE,GAAI,EAAI,UAAY,IAAA,GAAY,CAAC,EAAI,CAAE,QAAS,EAAI,OAAQ,EAC5D,GAAI,EAAI,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAI,KAAM,CACxD,CACF,CAEA,SAAS,EAAiB,EAAqD,CAC7E,MAAO,CACL,MAAO,EAAI,MACX,MAAO,EAAI,MACX,MAAO,EAAS,EAAI,MAAM,EAC1B,SAAU,EAAI,OACd,KAAM,EAAI,KACV,IAAK,EAAI,IACT,UAAW,EAAI,UACf,GAAI,EAAoB,IAAI,EAAI,MAAM,EAAI,CAAE,QAAS,EAAI,SAAU,EAAI,CAAC,EACxE,WAAY,EAAI,UAChB,KAAM,CAAC,EACP,GAAI,EAAI,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAI,WAAY,EACxE,GAAI,EAAI,UAAY,IAAA,GAAY,CAAC,EAAI,CAAE,QAAS,EAAI,OAAQ,EAC5D,GAAI,EAAI,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAI,KAAM,CACxD,CACF,CAEA,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,IAAM,EAAO,EACV,OAAQ,GAAQ,CAAC,EAAI,MAAM,CAAC,CAC5B,IAAI,CAAiB,CAAC,CACtB,OAAQ,GAAqC,IAAQ,IAAA,EAAS,EACjE,EAAK,KAAK,GAAG,CAAC,GAAG,EAAW,OAAO,CAAC,CAAC,CAAC,IAAI,CAAgB,CAAC,EAC3D,EAAa,QAAQ,EAAoB,EAAW,CAAE,MAAK,CAAC,CAC9D,CAEA,SAAS,EAAO,EAAgB,EAAU,GAA+B,CAEvE,MAAO,CAAE,QAAS,CAAC,CAAE,KAAM,OAAQ,KADtB,OAAO,GAAU,SAAW,EAAQ,KAAK,UAAU,EAAO,KAAM,CAAC,CACtC,CAAC,EAAG,QAAS,EAAO,GAAI,EAAU,CAAE,QAAS,EAAK,EAAI,CAAC,CAAG,CACpG,CAEA,SAAS,EAAQ,EAAwD,CACvE,OAAO,IAAU,QAAU,IAAU,UAAY,EAAQ,MAC3D,CAQA,SAAS,EACP,EACA,EAC6C,CAC7C,IAAM,EAAQ,EAAmB,EAAU,SAAS,EAC9C,EAAO,EAAQ,gBAAgB,WAAW,EAAU,UAAW,CAAK,EACpE,EAAkB,EAAU,MAAQ,CAAC,EAAY,EAAU,KAAK,CAAC,EAAI,CAAC,EAC5E,MAAO,CACL,KAAM,WACN,MAAO,WACP,YAAa,qGACb,WAAY,EACZ,cAAe,wEACf,iBAAkB,CAChB,0FACA,4EACF,EACA,cAAe,SACf,MAAM,QAAQ,EAAa,EAAY,EAAQ,EAAU,CACvD,GAAI,CACF,IAAM,EAA6BA,EAAuB,CAAU,EACpE,GAAI,EAAO,SAAW,EAAiB,OAAQ,CAC7C,IAAM,EAAQ,EAAQ,EAAO,KAAK,EAC5B,EAAS,EAAQ,UAAU,SAAS,EAAO,KAAO,EAAU,IAAK,CAAK,CAAC,CAAC,OACxE,EAAW,EAAO,KACpB,EAAQ,UAAU,KAAK,EAAO,KAAO,EAAU,IAAK,EAAO,EAAO,IAAI,EACtE,IAAA,GACJ,GAAI,EAAO,MAAQ,CAAC,EAClB,MAAM,IAAI,EACR,kBACA,gCAAgC,EAAO,KAAK,IAC5C,GACA,wEACF,EACF,OAAO,EAAO,CACZ,OAAQ,EACJ,CAAC,CAAQ,EACT,EAAO,IAAK,IAAW,CACrB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,QAAS,EAAM,SAAW,IAC5B,EAAE,CACR,CAAC,CACH,CACA,GAAI,EAAO,SAAW,EAAiB,IAAK,CAC1C,IACE,EAAO,YAAY,EAAO,SAAS,OAAO,WAAW,EAAO,SAAS,SAAW,EAAI,GAAK,IAAI,IAAI,CACnG,EACA,IAAM,EAAO,MAAM,EAAQ,aAAa,MACtC,CACE,MAAO,EAAO,SAAS,IAAK,IAAa,CACvC,MAAO,EAAQ,MAAM,KAAK,EAC1B,KAAM,EAAQ,KAAK,KAAK,EACxB,GAAI,EAAQ,YAAc,CAAE,YAAa,EAAQ,WAAY,EAAI,CAAC,EAClE,GAAI,EAAQ,IAAM,CAAE,IAAK,EAAQ,GAAI,EAAI,CAAC,EAC1C,GAAI,EAAQ,MAAQ,CAAE,MAAO,EAAQ,KAAM,EAAI,CAAC,EAChD,GAAI,EAAQ,QAAU,CAAE,QAAS,EAAQ,OAAQ,EAAI,CAAC,CACxD,EAAE,EACF,IAAK,EAAU,IACf,WAAY,EAAQ,EAAO,KAAK,EAChC,aAAc,EAAmB,EAAU,SAAS,EACpD,YAAa,EAAU,YACvB,gBAAiB,EAAU,UAC3B,GAAI,EAAO,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAO,WAAY,EAC9E,GAAI,EAAO,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAO,SAAU,EACxE,kBACA,GAAI,EAAU,MAAQ,CAAE,YAAa,EAAU,KAAM,EAAI,CAAC,CAC5D,EACA,EAAW,CAAC,CAAC,MACf,EACA,IAAK,IAAM,KAAW,EAAK,SAAc,EAAQ,OAAO,EAAK,MAAM,EAAQ,KAAK,EAChF,OAAO,EAAO,CAAI,CACpB,CACA,GAAI,EAAO,SAAW,EAAiB,OAAQ,CAC7C,GAAI,EAAE,OAAQ,GAAS,OAAO,EAAO,CAAE,KAAM,EAAK,KAAK,CAAE,CAAC,EAC1D,IAAM,EAAS,EAAQ,WAAW,OAAO,EAAO,EAAE,EAClD,OAAO,EAAO,CAAE,MAAO,EAAO,MAAO,OAAQ,EAAO,MAAO,CAAC,CAC9D,CACA,GAAI,EAAO,SAAW,EAAiB,UAAW,CAChD,IAAM,EAAY,EAAkB,EAAmB,EAAU,SAAS,CAAC,EAC3E,OAAO,EAAO,CACZ,YACA,KAAM,EAAU,OAAS,EAAoB,CAAS,EAAI,yCAC5D,CAAC,CACH,CACA,IAAM,EAAK,EAAoB,EAAM,EAAO,EAAE,EAC9C,GAAI,EAAO,SAAW,EAAiB,KACrC,OAAO,EAAO,CAAE,MAAO,EAAI,QAAS,MAAM,EAAQ,WAAW,KAAK,EAAI,EAAO,MAAM,CAAE,CAAC,EAExF,GAAI,EAAO,SAAW,EAAiB,MAErC,OAAO,EAAO,CAAE,MAAO,EAAI,MAAA,MADP,EAAQ,WAAW,MAAM,EAAI,EAAO,QAAS,IAAA,GAAW,CAAM,CACjD,CAAC,EAEpC,IAAM,EAAY,EAAkB,EAAmB,EAAU,SAAS,CAAC,CAAC,CAAC,KAC1E,GAAS,EAAK,QAAU,EAAO,EAClC,EACA,GAAI,CAAC,EAAW,MAAU,MAAM,6BAA6B,EAAO,GAAG,GAAG,EAC1E,GAAI,CAAC,EAAwB,CAAS,EAAG,MAAU,MAAM,kBAAkB,EAAO,GAAG,oBAAoB,EAqBzG,IAAM,GAAU,MApBO,EAAQ,aAAa,MAC1C,CACE,OAAQ,CACN,MAAO,EAAU,MACjB,GAAI,EAAU,YAAc,CAAE,YAAa,EAAU,WAAY,EAAI,CAAC,EACtE,KAAM,EAAU,KAChB,IAAK,EAAU,IACf,GAAI,EAAU,MAAQ,CAAE,MAAO,EAAU,KAAM,EAAI,CAAC,EACpD,YAAa,EAAU,WACzB,EACA,IAAK,EAAU,IACf,WAAY,OACZ,aAAc,EAAmB,EAAU,SAAS,EACpD,YAAa,EAAU,YACvB,QAAS,KACT,gBAAiB,EAAU,UAC3B,iBACF,EACA,EAAW,CAAC,CAAC,MACf,EAAA,CACyB,SAAS,GAClC,GAAI,CAAC,GAAS,MACZ,MAAU,MAAM,sBAAsB,EAAO,GAAG,KAAK,GAAS,OAAS,8BAA8B,EAEvG,OADA,EAAkB,EAAmB,EAAU,SAAS,EAAG,EAAO,EAAE,EAC7D,EAAO,CAAE,QAAS,CAAE,GAAG,EAAS,aAAc,EAAO,EAAG,CAAE,CAAC,CACpE,OAAS,EAAO,CACd,OAAO,EAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAG,EAAI,CAC5E,CACF,CACF,CACF,CAEA,SAAS,EAAa,EAA8C,CAClE,MAAO,CACL,KAAM,WACN,MAAO,WACP,YAAa,uDACb,WAAY,CACV,KAAM,SACN,qBAAsB,GACtB,WAAY,CACV,OAAQ,CAAE,KAAM,SAAU,KAAM,CAAC,UAAW,OAAQ,MAAO,UAAW,OAAO,CAAE,EAC/E,GAAI,CAAE,KAAM,QAAS,EACrB,QAAS,CAAE,KAAM,QAAS,EAC1B,UAAW,CAAE,KAAM,QAAS,EAC5B,UAAW,CAAE,KAAM,UAAW,QAAS,CAAE,CAC3C,EACA,SAAU,CAAC,QAAQ,CACrB,EACA,cAAe,SACf,MAAM,QAAQ,EAAY,EAAY,EAAQ,EAAU,CACtD,OAAO,EAAQ,QAAQ,EAAY,EAAY,EAAQ,CAAQ,CACjE,CACF,CACF,CAEA,MAAa,EAAkB,EAAmB,CAChD,KAAM,EACN,OAAQ,CAAE,SAAU,CAAC,EAAwB,CAA4B,CAAE,EAC3E,UAAW,CAAE,SAAU,CAAC,EAAwB,CAA4B,CAAE,EAC9E,SAAU,CAAE,UAAS,KAAM,EAAY,MAAO,KAAW,CAEvD,SAAS,EAA2B,EAAc,EAA0C,CAC1F,IAAM,EAAkB,EAAO,UAAU,MAAQ,CAAC,EAAY,EAAO,UAAU,KAAK,CAAC,EAAI,CAAC,EAC1F,EAAI,QACF,EACA,EAAO,OAAO,cAAc,EAAK,CAC/B,UAAW,EAAO,UAAU,UAC5B,aAAc,EAAmB,EAAO,UAAU,SAAS,EAC3D,kBACA,GAAI,EAAO,UAAU,MAAQ,CAAE,YAAa,EAAO,UAAU,KAAM,EAAI,CAAC,CAC1E,CAAC,CACH,EACA,IAAM,EAAiB,EAA4B,CAAG,EACtD,EAAI,QAAQ,EAA8B,CAAc,EACxD,EAAgC,EAAK,EAAgB,EAAO,UAAU,UAAW,EAAO,QAAQ,eAAe,EAC/G,EAAI,QAAQ,EAA8B,EAA4B,EAAO,QAAQ,kBAAkB,CAAC,CAC1G,CAEA,GAAI,CAAC,EAAM,MAAU,MAAM,0CAA0C,EACrE,GAAI,EAAW,QAAQ,cAAgB,IAAA,GACrC,MAAU,MAAM,+DAA+D,EAEjF,IAAM,EAAe,EAAW,QAAQ,aACxC,GAAI,IAAiB,IAAA,GACnB,MAAU,MAAM,wDAAwD,EAE1E,IAAM,EAAY,EAAK,QACjB,EAAU,EAA2B,IAAA,GAAW,CACpD,YAAa,EAAW,QAAQ,YAChC,cAAe,CAAE,QAAW,EAA4B,CAAO,CAAE,EACjE,qBACF,CAAC,EACK,EAAQ,EAAmB,EAAU,SAAS,EACpD,EAAQ,WAAW,iBAAiB,CAAK,EACzC,IAAM,EAAyC,CAAC,EAC1C,EAAO,EAAQ,gBAAgB,WAAW,EAAU,UAAW,CAAK,EACpE,EAAa,IAAI,IACjB,MAAiC,EAAY,EAAc,EAAU,UAAW,EAAK,KAAK,EAAG,CAAU,EAC7G,EAAoB,KAAK,EAAQ,gBAAgB,UAAU,EAAU,UAAW,CAAkB,CAAC,EACnG,EAAoB,KAClB,EAA6B,EAAU,UAAY,GAAS,CAC1D,EAAW,MAAM,EACjB,IAAK,IAAM,KAAO,EAAM,EAAW,IAAI,EAAI,MAAO,CAAG,EACrD,EAAmB,CACrB,CAAC,CACH,EACA,EAAmB,EACnB,GAAI,CACF,IAAM,EAAa,EAAQ,UAAU,SAAS,EAAU,IAAK,MAAM,CAAC,CAAC,OACrE,EAAa,QAAQ,EAAuB,EAAU,UAAW,CAC/D,IAAK,EAAU,IACf,OAAQ,EAAe,CAAU,EACjC,OAAQ,EAAc,EAAY,EAA4B,EAAW,QAAQ,WAAW,GAAK,CAAC,CAAC,CACrG,CAAC,CACH,OAAS,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACrE,EAAa,QAAQ,EAAuB,EAAU,UAAW,CAC/D,IAAK,EAAU,IACf,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,SACF,CAAC,CACH,CACA,IAAM,EAAS,EAAuB,CACpC,QAAS,EAAQ,aACjB,WAAY,EAAQ,WACpB,OAAQ,EAAQ,eAChB,UAAW,EAAQ,cACnB,QAAS,EAAQ,gBACjB,eAAkB,EAAW,CAAC,CAAC,MACjC,CAAC,EAED,EAAQ,mBAAmB,WAAW,CACpC,YAAc,GAAY,CACxB,IAAM,EAAU,EAAU,OAAO,OAAO,CAAE,KAAM,EAAQ,QAAS,MAAO,MAAO,CAAC,EAC5E,GACF,EAAa,MAAO,GAClB,QAAQ,YAAY,8CAA8C,OAAO,CAAK,GAAG,CACnF,CACJ,CACF,CAAC,EAkBD,IAAM,EAAU,EAAQ,YAAY,sBAAsB,CAhBxD,aAAe,GACb,KAAK,EAAU,OAAO,OAAO,CAC3B,KACE,OAAO,EAAQ,SAAY,SACvB,EAAQ,QACR,EAAQ,QAAQ,IAAK,GAAU,SAAU,EAAO,EAAK,KAAO,SAAU,CAAC,CAAC,KAAK;CAAI,EACvF,MAAO,MACT,CAAC,GACH,iBAAmB,GACjB,KAAK,EAAU,QAAQ,OACrB,OAAO,GAAY,SACf,EACA,EAAQ,IAAK,GAAU,SAAU,EAAO,EAAK,KAAO,SAAU,CAAC,CAAC,KAAK;CAAI,EAC7E,OACF,EAE8D,CAAC,EACnE,MAAO,CACL,IAAK,CAAC,EAAqB,EAAS,CAAS,CAAC,EAC9C,SAAU,CAAE,GAAiB,EAA2B,EAAK,CAAE,SAAQ,UAAS,WAAU,CAAC,CAAC,EAC5F,MAAM,WAAY,CAChB,IAAK,IAAM,KAAW,EAAoB,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAG,EAAQ,EACvE,EAAQ,QAAQ,EAChB,EAAQ,mBAAmB,QAAQ,EACnC,IAAM,EAAa,EAAiB,CAClC,QACA,OAAQ,yBACR,KAAM,EAAK,KAAK,EAChB,MAAO,EAAO,IAAW,EAAQ,WAAW,KAAK,EAAO,CAAM,CAChE,CAAC,EACK,EAAiB,EAAQ,WAC5B,MAAM,CAAC,CACP,YAAc,EAAoB,QAAQ,EAAU,SAAS,CAAC,EAC3D,EAAW,MAAM,QAAQ,WAAW,CAAC,EAAY,CAAc,CAAC,EACtE,IAAK,IAAM,KAAW,EAChB,EAAQ,SAAW,YACrB,QAAQ,YAAY,2CAA2C,OAAO,EAAQ,MAAM,GAAG,EAE3F,EAAO,WAAW,EAClB,EAAQ,QAAQ,EAChB,EAAQ,gBAAgB,KAAK,EAC7B,EAAQ,cAAc,KAAK,CAC7B,EACA,MAAO,CAAC,EAAa,EAAS,CAAS,EAAG,EAAa,CAAO,CAAC,EAC/D,UAAW,CACT,CACE,KAAM,cACN,KAAM,UACN,SACE,KAAK,UACH,CAAE,UAAW,EAAU,UAAW,QAAS,EAAQ,QAAQ,EAAI,CAAC,EAAQ,QAAQ,CAAC,EAAI,CAAC,CAAE,EACxF,KACA,CACF,CACJ,CACF,EACA,WAAY,CACV,CACE,KAAM,EACN,MAAM,MAAM,EAAiB,CAC3B,IAAM,EAAS,MAAM,EAAe,CAAK,EAIzC,OAHI,EAAO,UAAU,QACnB,MAAM,EAAgB,OAAO,OAAO,CAAE,KAAM,EAAoB,EAAO,SAAS,EAAG,MAAO,MAAO,CAAC,EACpG,EAAQ,gBAAgB,EAAgB,SAAS,MACpC,CAGX,EAAQ,QAAQ,CAClB,CACF,CACF,CACF,CACF,CACF,CACF,CAAC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("typebox"),t=require("@agimon-ai/doompi-core/delegation");const n={agents:`agents`,run:`run`,status:`status`,steer:`steer`,stop:`stop`,suspended:`suspended`,restore:`restore`},r={agents:[`action`,`name`,`cwd`,`scope`],run:[`action`,`requests`,`concurrency`,`artifacts`,`scope`],status:[`action`,`id`,`transcriptLines`],steer:[`action`,`id`,`message`],stop:[`action`,`id`,`reason`],suspended:[`action`],restore:[`action`,`id`]},i=new Set(Object.values(n));function a(e){return typeof e==`string`&&i.has(e)}function o(e,t){return r[e].includes(t)}const s=e.Type.Union([e.Type.Literal(`user`),e.Type.Literal(`project`),e.Type.Literal(`both`)]),c=e.Type.Object({agent:e.Type.String({minLength:1}),inlineAgent:e.Type.Optional(t.InlineAgentSchema),task:e.Type.String({minLength:1}),cwd:e.Type.Optional(e.Type.String({minLength:1})),model:e.Type.Optional(e.Type.String({minLength:1})),runtime:e.Type.Optional(e.Type.String({minLength:1}))},{additionalProperties:!1}),l=e.Type.Object({action:e.Type.Literal(n.agents),name:e.Type.Optional(e.Type.String({minLength:1})),cwd:e.Type.Optional(e.Type.String({minLength:1})),scope:e.Type.Optional(s)},{additionalProperties:!1}),u=e.Type.Object({action:e.Type.Literal(n.run),requests:e.Type.Array(c,{minItems:1}),concurrency:e.Type.Optional(e.Type.Integer({minimum:1})),artifacts:e.Type.Optional(e.Type.Boolean()),scope:e.Type.Optional(s)},{additionalProperties:!1}),d=e.Type.Object({action:e.Type.Literal(n.status)},{additionalProperties:!1}),f=e.Type.Object({action:e.Type.Literal(n.status),id:e.Type.String({minLength:1}),transcriptLines:e.Type.Optional(e.Type.Integer({minimum:1,maximum:500}))},{additionalProperties:!1}),p=e.Type.Object({action:e.Type.Literal(n.steer),id:e.Type.String({minLength:1}),message:e.Type.String({minLength:1})},{additionalProperties:!1}),m=e.Type.Object({action:e.Type.Literal(n.stop),id:e.Type.String({minLength:1}),reason:e.Type.Optional(e.Type.String({minLength:1}))},{additionalProperties:!1}),h=e.Type.Object({action:e.Type.Literal(n.suspended)},{additionalProperties:!1}),g=e.Type.Object({action:e.Type.Literal(n.restore),id:e.Type.String({minLength:1})},{additionalProperties:!1}),_=e.Type.Union([l,u,d,f,p,m,h,g]);exports.InlineAgentSchema=t.InlineAgentSchema,exports.SUBAGENT_ACTIONS=n,exports.SUBAGENT_ACTION_FIELDS=r,exports.SubagentParams=_,exports.isSubagentAction=a,exports.subagentActionAcceptsField=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("typebox"),t=require("@agimon-ai/doompi-core/delegation");const n={agents:`agents`,run:`run`,status:`status`,steer:`steer`,stop:`stop`,suspended:`suspended`,restore:`restore`},r={agents:[`action`,`name`,`cwd`,`scope`],run:[`action`,`requests`,`concurrency`,`artifacts`,`scope`],status:[`action`,`id`,`transcriptLines`],steer:[`action`,`id`,`message`],stop:[`action`,`id`,`reason`],suspended:[`action`],restore:[`action`,`id`]},i=new Set(Object.values(n));function a(e){return typeof e==`string`&&i.has(e)}function o(e,t){return r[e].includes(t)}const s=e.Type.Union([e.Type.Literal(`user`),e.Type.Literal(`project`),e.Type.Literal(`both`)]),c=e.Type.Object({agent:e.Type.String({minLength:1}),inlineAgent:e.Type.Optional(t.InlineAgentSchema),task:e.Type.String({minLength:1}),cwd:e.Type.Optional(e.Type.String({minLength:1})),model:e.Type.Optional(e.Type.String({minLength:1})),runtime:e.Type.Optional(e.Type.String({minLength:1}))},{additionalProperties:!1}),l=e.Type.Object({action:e.Type.Literal(n.agents),name:e.Type.Optional(e.Type.String({minLength:1})),cwd:e.Type.Optional(e.Type.String({minLength:1})),scope:e.Type.Optional(s)},{additionalProperties:!1}),u=e.Type.Object({action:e.Type.Literal(n.run),requests:e.Type.Array(c,{minItems:1}),concurrency:e.Type.Optional(e.Type.Integer({minimum:1})),artifacts:e.Type.Optional(e.Type.Boolean()),scope:e.Type.Optional(s)},{additionalProperties:!1}),d=e.Type.Object({action:e.Type.Literal(n.status)},{additionalProperties:!1}),f=e.Type.Object({action:e.Type.Literal(n.status),id:e.Type.String({minLength:1}),transcriptLines:e.Type.Optional(e.Type.Integer({minimum:1,maximum:500}))},{additionalProperties:!1}),p=e.Type.Object({action:e.Type.Literal(n.steer),id:e.Type.String({minLength:1}),message:e.Type.String({minLength:1})},{additionalProperties:!1}),m=e.Type.Object({action:e.Type.Literal(n.stop),id:e.Type.String({minLength:1}),reason:e.Type.Optional(e.Type.String({minLength:1}))},{additionalProperties:!1}),h=e.Type.Object({action:e.Type.Literal(n.suspended)},{additionalProperties:!1}),g=e.Type.Object({action:e.Type.Literal(n.restore),id:e.Type.String({minLength:1})},{additionalProperties:!1}),_=e.Type.Union([l,u,d,f,p,m,h,g]);function v(e){return Object.values(n).filter(t=>o(t,e)).join(`, `)}const y=e.Type.Object({action:e.Type.String({enum:Object.values(n),description:`The operation to run. Every other field is accepted only by the actions its description names.`}),name:e.Type.Optional(e.Type.String({minLength:1,description:`Exact agent name to inspect. Actions: ${v(`name`)}.`})),cwd:e.Type.Optional(e.Type.String({minLength:1,description:`Directory to discover agents in. Actions: ${v(`cwd`)}.`})),scope:e.Type.Optional(e.Type.String({enum:[`user`,`project`,`both`],description:`Agent discovery scope. Actions: ${v(`scope`)}.`})),requests:e.Type.Optional(e.Type.Array(c,{minItems:1,description:`Runs to start, one entry each. Actions: ${v(`requests`)}.`})),concurrency:e.Type.Optional(e.Type.Integer({minimum:1,description:`Maximum runs started at once. Actions: ${v(`concurrency`)}.`})),artifacts:e.Type.Optional(e.Type.Boolean({description:`Collect run artifacts. Actions: ${v(`artifacts`)}.`})),id:e.Type.Optional(e.Type.String({minLength:1,description:`Run id. Actions: ${v(`id`)}.`})),transcriptLines:e.Type.Optional(e.Type.Integer({minimum:1,maximum:500,description:`Transcript lines to include; valid only alongside id. Actions: ${v(`transcriptLines`)}.`})),message:e.Type.Optional(e.Type.String({minLength:1,description:`Guidance to deliver. Actions: ${v(`message`)}.`})),reason:e.Type.Optional(e.Type.String({minLength:1,description:`Why the run is stopping. Actions: ${v(`reason`)}.`}))},{additionalProperties:!1});exports.InlineAgentSchema=t.InlineAgentSchema,exports.SUBAGENT_ACTIONS=n,exports.SUBAGENT_ACTION_FIELDS=r,exports.SubagentParams=_,exports.SubagentToolSchema=y,exports.isSubagentAction=a,exports.subagentActionAcceptsField=o;
2
2
  //# sourceMappingURL=runtime-subagent-tool.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-subagent-tool.cjs","names":["Type","InlineAgentSchema"],"sources":["../src/schemas/subagentTool.ts"],"sourcesContent":["import { InlineAgentSchema, type InlineAgent } from '@agimon-ai/doompi-core/delegation';\nimport { type Static, Type } from 'typebox';\n\nexport { InlineAgentSchema };\nexport type { InlineAgent };\n\nexport const SUBAGENT_ACTIONS = {\n agents: 'agents',\n run: 'run',\n status: 'status',\n steer: 'steer',\n stop: 'stop',\n suspended: 'suspended',\n restore: 'restore',\n} as const;\n\nexport type SubagentAction = (typeof SUBAGENT_ACTIONS)[keyof typeof SUBAGENT_ACTIONS];\n\nexport const SUBAGENT_ACTION_FIELDS = {\n agents: ['action', 'name', 'cwd', 'scope'],\n run: ['action', 'requests', 'concurrency', 'artifacts', 'scope'],\n status: ['action', 'id', 'transcriptLines'],\n steer: ['action', 'id', 'message'],\n stop: ['action', 'id', 'reason'],\n suspended: ['action'],\n restore: ['action', 'id'],\n} as const satisfies Record<SubagentAction, readonly string[]>;\n\nconst IMPLEMENTED_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\nexport function isSubagentAction(value: unknown): value is SubagentAction {\n return typeof value === 'string' && IMPLEMENTED_ACTIONS.has(value);\n}\n\nexport function subagentActionAcceptsField(action: SubagentAction, field: string): boolean {\n return (SUBAGENT_ACTION_FIELDS[action] as readonly string[]).includes(field);\n}\n\nconst AgentScope = Type.Union([Type.Literal('user'), Type.Literal('project'), Type.Literal('both')]);\n\nconst RunRequest = Type.Object(\n {\n agent: Type.String({ minLength: 1 }),\n inlineAgent: Type.Optional(InlineAgentSchema),\n task: Type.String({ minLength: 1 }),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n model: Type.Optional(Type.String({ minLength: 1 })),\n runtime: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst AgentsParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.agents),\n name: Type.Optional(Type.String({ minLength: 1 })),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst RunParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.run),\n requests: Type.Array(RunRequest, { minItems: 1 }),\n concurrency: Type.Optional(Type.Integer({ minimum: 1 })),\n artifacts: Type.Optional(Type.Boolean()),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst FleetStatusParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.status) },\n { additionalProperties: false },\n);\n\nconst RunStatusParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.status),\n id: Type.String({ minLength: 1 }),\n transcriptLines: Type.Optional(Type.Integer({ minimum: 1, maximum: 500 })),\n },\n { additionalProperties: false },\n);\n\nconst SteerParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.steer),\n id: Type.String({ minLength: 1 }),\n message: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nconst StopParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.stop),\n id: Type.String({ minLength: 1 }),\n reason: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst SuspendedParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.suspended) },\n { additionalProperties: false },\n);\n\nconst RestoreParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.restore),\n id: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nexport const SubagentParams = Type.Union([\n AgentsParams,\n RunParams,\n FleetStatusParams,\n RunStatusParams,\n SteerParams,\n StopParams,\n SuspendedParams,\n RestoreParams,\n]);\n\nexport type SubagentToolParams = Static<typeof SubagentParams>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime-subagent-tool.cjs","names":["Type","InlineAgentSchema"],"sources":["../src/schemas/subagentTool.ts"],"sourcesContent":["import { InlineAgentSchema, type InlineAgent } from '@agimon-ai/doompi-core/delegation';\nimport { type Static, Type } from 'typebox';\n\nexport { InlineAgentSchema };\nexport type { InlineAgent };\n\nexport const SUBAGENT_ACTIONS = {\n agents: 'agents',\n run: 'run',\n status: 'status',\n steer: 'steer',\n stop: 'stop',\n suspended: 'suspended',\n restore: 'restore',\n} as const;\n\nexport type SubagentAction = (typeof SUBAGENT_ACTIONS)[keyof typeof SUBAGENT_ACTIONS];\n\nexport const SUBAGENT_ACTION_FIELDS = {\n agents: ['action', 'name', 'cwd', 'scope'],\n run: ['action', 'requests', 'concurrency', 'artifacts', 'scope'],\n status: ['action', 'id', 'transcriptLines'],\n steer: ['action', 'id', 'message'],\n stop: ['action', 'id', 'reason'],\n suspended: ['action'],\n restore: ['action', 'id'],\n} as const satisfies Record<SubagentAction, readonly string[]>;\n\nconst IMPLEMENTED_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\nexport function isSubagentAction(value: unknown): value is SubagentAction {\n return typeof value === 'string' && IMPLEMENTED_ACTIONS.has(value);\n}\n\nexport function subagentActionAcceptsField(action: SubagentAction, field: string): boolean {\n return (SUBAGENT_ACTION_FIELDS[action] as readonly string[]).includes(field);\n}\n\nconst AgentScope = Type.Union([Type.Literal('user'), Type.Literal('project'), Type.Literal('both')]);\n\nconst RunRequest = Type.Object(\n {\n agent: Type.String({ minLength: 1 }),\n inlineAgent: Type.Optional(InlineAgentSchema),\n task: Type.String({ minLength: 1 }),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n model: Type.Optional(Type.String({ minLength: 1 })),\n runtime: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst AgentsParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.agents),\n name: Type.Optional(Type.String({ minLength: 1 })),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst RunParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.run),\n requests: Type.Array(RunRequest, { minItems: 1 }),\n concurrency: Type.Optional(Type.Integer({ minimum: 1 })),\n artifacts: Type.Optional(Type.Boolean()),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst FleetStatusParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.status) },\n { additionalProperties: false },\n);\n\nconst RunStatusParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.status),\n id: Type.String({ minLength: 1 }),\n transcriptLines: Type.Optional(Type.Integer({ minimum: 1, maximum: 500 })),\n },\n { additionalProperties: false },\n);\n\nconst SteerParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.steer),\n id: Type.String({ minLength: 1 }),\n message: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nconst StopParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.stop),\n id: Type.String({ minLength: 1 }),\n reason: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst SuspendedParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.suspended) },\n { additionalProperties: false },\n);\n\nconst RestoreParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.restore),\n id: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nexport const SubagentParams = Type.Union([\n AgentsParams,\n RunParams,\n FleetStatusParams,\n RunStatusParams,\n SteerParams,\n StopParams,\n SuspendedParams,\n RestoreParams,\n]);\n\n/** The actions that accept `field`, so the declared docs cannot drift from the validator. */\nfunction acceptingActions(field: string): string {\n return Object.values(SUBAGENT_ACTIONS)\n .filter((action) => subagentActionAcceptsField(action, field))\n .join(', ');\n}\n\n/**\n * The schema declared to the model.\n *\n * A flat object rather than `SubagentParams` itself. A top-level union is\n * `{anyOf:[...]}` with no `properties`, and Pi's Anthropic Messages adapter\n * rebuilds tool input as `{type:'object', properties: schema.properties ?? {},\n * required: schema.required ?? []}`, so the union arrived at the model as an\n * empty object while the host went on validating calls against it. Nothing here\n * relaxes what is accepted: `validateParams` still rejects an unknown action, a\n * field the action does not take, and a missing required one.\n */\nexport const SubagentToolSchema = Type.Object(\n {\n action: Type.String({\n enum: Object.values(SUBAGENT_ACTIONS),\n description: 'The operation to run. Every other field is accepted only by the actions its description names.',\n }),\n name: Type.Optional(\n Type.String({ minLength: 1, description: `Exact agent name to inspect. Actions: ${acceptingActions('name')}.` }),\n ),\n cwd: Type.Optional(\n Type.String({\n minLength: 1,\n description: `Directory to discover agents in. Actions: ${acceptingActions('cwd')}.`,\n }),\n ),\n scope: Type.Optional(\n Type.String({\n enum: ['user', 'project', 'both'],\n description: `Agent discovery scope. Actions: ${acceptingActions('scope')}.`,\n }),\n ),\n requests: Type.Optional(\n Type.Array(RunRequest, {\n minItems: 1,\n description: `Runs to start, one entry each. Actions: ${acceptingActions('requests')}.`,\n }),\n ),\n concurrency: Type.Optional(\n Type.Integer({\n minimum: 1,\n description: `Maximum runs started at once. Actions: ${acceptingActions('concurrency')}.`,\n }),\n ),\n artifacts: Type.Optional(\n Type.Boolean({ description: `Collect run artifacts. Actions: ${acceptingActions('artifacts')}.` }),\n ),\n id: Type.Optional(Type.String({ minLength: 1, description: `Run id. Actions: ${acceptingActions('id')}.` })),\n transcriptLines: Type.Optional(\n Type.Integer({\n minimum: 1,\n maximum: 500,\n description: `Transcript lines to include; valid only alongside id. Actions: ${acceptingActions('transcriptLines')}.`,\n }),\n ),\n message: Type.Optional(\n Type.String({ minLength: 1, description: `Guidance to deliver. Actions: ${acceptingActions('message')}.` }),\n ),\n reason: Type.Optional(\n Type.String({ minLength: 1, description: `Why the run is stopping. Actions: ${acceptingActions('reason')}.` }),\n ),\n },\n { additionalProperties: false },\n);\n\nexport type SubagentToolParams = Static<typeof SubagentParams>;\n"],"mappings":"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"}
@@ -62,6 +62,39 @@ export declare const SubagentParams: Type.TUnion<[Type.TObject<{
62
62
  action: Type.TLiteral<"restore">;
63
63
  id: Type.TString;
64
64
  }>]>;
65
+ /**
66
+ * The schema declared to the model.
67
+ *
68
+ * A flat object rather than `SubagentParams` itself. A top-level union is
69
+ * `{anyOf:[...]}` with no `properties`, and Pi's Anthropic Messages adapter
70
+ * rebuilds tool input as `{type:'object', properties: schema.properties ?? {},
71
+ * required: schema.required ?? []}`, so the union arrived at the model as an
72
+ * empty object while the host went on validating calls against it. Nothing here
73
+ * relaxes what is accepted: `validateParams` still rejects an unknown action, a
74
+ * field the action does not take, and a missing required one.
75
+ */
76
+ export declare const SubagentToolSchema: Type.TObject<{
77
+ action: Type.TString;
78
+ name: Type.TOptional<Type.TString>;
79
+ cwd: Type.TOptional<Type.TString>;
80
+ scope: Type.TOptional<Type.TString>;
81
+ requests: Type.TOptional<Type.TArray<Type.TObject<{
82
+ agent: Type.TString;
83
+ inlineAgent: Type.TOptional<Type.TObject<{
84
+ systemPrompt: Type.TString;
85
+ }>>;
86
+ task: Type.TString;
87
+ cwd: Type.TOptional<Type.TString>;
88
+ model: Type.TOptional<Type.TString>;
89
+ runtime: Type.TOptional<Type.TString>;
90
+ }>>>;
91
+ concurrency: Type.TOptional<Type.TInteger>;
92
+ artifacts: Type.TOptional<Type.TBoolean>;
93
+ id: Type.TOptional<Type.TString>;
94
+ transcriptLines: Type.TOptional<Type.TInteger>;
95
+ message: Type.TOptional<Type.TString>;
96
+ reason: Type.TOptional<Type.TString>;
97
+ }>;
65
98
  export type SubagentToolParams = Static<typeof SubagentParams>;
66
99
  //#endregion
67
100
  export { type InlineAgent, InlineAgentSchema };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-subagent-tool.d.cts","names":[],"sources":["../src/schemas/subagentTool.ts"],"mappings":";;;qBAMa;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;YAGU,yBAAyB,+BAA+B;qBAEvD;;;;;;;;;wBAYG,iBAAiB,iBAAiB,SAAS;wBAI3C,2BAA2B,QAAQ,gBAAgB;qBAoFtD,gBAAc,KAAA,QAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAWf,qBAAqB,cAAc"}
1
+ {"version":3,"file":"runtime-subagent-tool.d.cts","names":[],"sources":["../src/schemas/subagentTool.ts"],"mappings":";;;qBAMa;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;YAGU,yBAAyB,+BAA+B;qBAEvD;;;;;;;;;wBAYG,iBAAiB,iBAAiB,SAAS;wBAI3C,2BAA2B,QAAQ,gBAAgB;qBAoFtD,gBAAc,KAAA,QAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6Bd,oBAAkB,KAAA;;;;;;;;;;;;;;;;;;;;;;YAsDnB,qBAAqB,cAAc"}
@@ -62,6 +62,39 @@ export declare const SubagentParams: Type.TUnion<[Type.TObject<{
62
62
  action: Type.TLiteral<"restore">;
63
63
  id: Type.TString;
64
64
  }>]>;
65
+ /**
66
+ * The schema declared to the model.
67
+ *
68
+ * A flat object rather than `SubagentParams` itself. A top-level union is
69
+ * `{anyOf:[...]}` with no `properties`, and Pi's Anthropic Messages adapter
70
+ * rebuilds tool input as `{type:'object', properties: schema.properties ?? {},
71
+ * required: schema.required ?? []}`, so the union arrived at the model as an
72
+ * empty object while the host went on validating calls against it. Nothing here
73
+ * relaxes what is accepted: `validateParams` still rejects an unknown action, a
74
+ * field the action does not take, and a missing required one.
75
+ */
76
+ export declare const SubagentToolSchema: Type.TObject<{
77
+ action: Type.TString;
78
+ name: Type.TOptional<Type.TString>;
79
+ cwd: Type.TOptional<Type.TString>;
80
+ scope: Type.TOptional<Type.TString>;
81
+ requests: Type.TOptional<Type.TArray<Type.TObject<{
82
+ agent: Type.TString;
83
+ inlineAgent: Type.TOptional<Type.TObject<{
84
+ systemPrompt: Type.TString;
85
+ }>>;
86
+ task: Type.TString;
87
+ cwd: Type.TOptional<Type.TString>;
88
+ model: Type.TOptional<Type.TString>;
89
+ runtime: Type.TOptional<Type.TString>;
90
+ }>>>;
91
+ concurrency: Type.TOptional<Type.TInteger>;
92
+ artifacts: Type.TOptional<Type.TBoolean>;
93
+ id: Type.TOptional<Type.TString>;
94
+ transcriptLines: Type.TOptional<Type.TInteger>;
95
+ message: Type.TOptional<Type.TString>;
96
+ reason: Type.TOptional<Type.TString>;
97
+ }>;
65
98
  export type SubagentToolParams = Static<typeof SubagentParams>;
66
99
  //#endregion
67
100
  export { type InlineAgent, InlineAgentSchema };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-subagent-tool.d.mts","names":[],"sources":["../src/schemas/subagentTool.ts"],"mappings":";;;qBAMa;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;YAGU,yBAAyB,+BAA+B;qBAEvD;;;;;;;;;wBAYG,iBAAiB,iBAAiB,SAAS;wBAI3C,2BAA2B,QAAQ,gBAAgB;qBAoFtD,gBAAc,KAAA,QAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAWf,qBAAqB,cAAc"}
1
+ {"version":3,"file":"runtime-subagent-tool.d.mts","names":[],"sources":["../src/schemas/subagentTool.ts"],"mappings":";;;qBAMa;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;YAGU,yBAAyB,+BAA+B;qBAEvD;;;;;;;;;wBAYG,iBAAiB,iBAAiB,SAAS;wBAI3C,2BAA2B,QAAQ,gBAAgB;qBAoFtD,gBAAc,KAAA,QAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6Bd,oBAAkB,KAAA;;;;;;;;;;;;;;;;;;;;;;YAsDnB,qBAAqB,cAAc"}
@@ -1,2 +1,2 @@
1
- import{Type as e}from"typebox";import{InlineAgentSchema as t}from"@agimon-ai/doompi-core/delegation";const n={agents:`agents`,run:`run`,status:`status`,steer:`steer`,stop:`stop`,suspended:`suspended`,restore:`restore`},r={agents:[`action`,`name`,`cwd`,`scope`],run:[`action`,`requests`,`concurrency`,`artifacts`,`scope`],status:[`action`,`id`,`transcriptLines`],steer:[`action`,`id`,`message`],stop:[`action`,`id`,`reason`],suspended:[`action`],restore:[`action`,`id`]},i=new Set(Object.values(n));function a(e){return typeof e==`string`&&i.has(e)}function o(e,t){return r[e].includes(t)}const s=e.Union([e.Literal(`user`),e.Literal(`project`),e.Literal(`both`)]),c=e.Object({agent:e.String({minLength:1}),inlineAgent:e.Optional(t),task:e.String({minLength:1}),cwd:e.Optional(e.String({minLength:1})),model:e.Optional(e.String({minLength:1})),runtime:e.Optional(e.String({minLength:1}))},{additionalProperties:!1}),l=e.Object({action:e.Literal(n.agents),name:e.Optional(e.String({minLength:1})),cwd:e.Optional(e.String({minLength:1})),scope:e.Optional(s)},{additionalProperties:!1}),u=e.Object({action:e.Literal(n.run),requests:e.Array(c,{minItems:1}),concurrency:e.Optional(e.Integer({minimum:1})),artifacts:e.Optional(e.Boolean()),scope:e.Optional(s)},{additionalProperties:!1}),d=e.Object({action:e.Literal(n.status)},{additionalProperties:!1}),f=e.Object({action:e.Literal(n.status),id:e.String({minLength:1}),transcriptLines:e.Optional(e.Integer({minimum:1,maximum:500}))},{additionalProperties:!1}),p=e.Object({action:e.Literal(n.steer),id:e.String({minLength:1}),message:e.String({minLength:1})},{additionalProperties:!1}),m=e.Object({action:e.Literal(n.stop),id:e.String({minLength:1}),reason:e.Optional(e.String({minLength:1}))},{additionalProperties:!1}),h=e.Object({action:e.Literal(n.suspended)},{additionalProperties:!1}),g=e.Object({action:e.Literal(n.restore),id:e.String({minLength:1})},{additionalProperties:!1}),_=e.Union([l,u,d,f,p,m,h,g]);export{t as InlineAgentSchema,n as SUBAGENT_ACTIONS,r as SUBAGENT_ACTION_FIELDS,_ as SubagentParams,a as isSubagentAction,o as subagentActionAcceptsField};
1
+ import{Type as e}from"typebox";import{InlineAgentSchema as t}from"@agimon-ai/doompi-core/delegation";const n={agents:`agents`,run:`run`,status:`status`,steer:`steer`,stop:`stop`,suspended:`suspended`,restore:`restore`},r={agents:[`action`,`name`,`cwd`,`scope`],run:[`action`,`requests`,`concurrency`,`artifacts`,`scope`],status:[`action`,`id`,`transcriptLines`],steer:[`action`,`id`,`message`],stop:[`action`,`id`,`reason`],suspended:[`action`],restore:[`action`,`id`]},i=new Set(Object.values(n));function a(e){return typeof e==`string`&&i.has(e)}function o(e,t){return r[e].includes(t)}const s=e.Union([e.Literal(`user`),e.Literal(`project`),e.Literal(`both`)]),c=e.Object({agent:e.String({minLength:1}),inlineAgent:e.Optional(t),task:e.String({minLength:1}),cwd:e.Optional(e.String({minLength:1})),model:e.Optional(e.String({minLength:1})),runtime:e.Optional(e.String({minLength:1}))},{additionalProperties:!1}),l=e.Object({action:e.Literal(n.agents),name:e.Optional(e.String({minLength:1})),cwd:e.Optional(e.String({minLength:1})),scope:e.Optional(s)},{additionalProperties:!1}),u=e.Object({action:e.Literal(n.run),requests:e.Array(c,{minItems:1}),concurrency:e.Optional(e.Integer({minimum:1})),artifacts:e.Optional(e.Boolean()),scope:e.Optional(s)},{additionalProperties:!1}),d=e.Object({action:e.Literal(n.status)},{additionalProperties:!1}),f=e.Object({action:e.Literal(n.status),id:e.String({minLength:1}),transcriptLines:e.Optional(e.Integer({minimum:1,maximum:500}))},{additionalProperties:!1}),p=e.Object({action:e.Literal(n.steer),id:e.String({minLength:1}),message:e.String({minLength:1})},{additionalProperties:!1}),m=e.Object({action:e.Literal(n.stop),id:e.String({minLength:1}),reason:e.Optional(e.String({minLength:1}))},{additionalProperties:!1}),h=e.Object({action:e.Literal(n.suspended)},{additionalProperties:!1}),g=e.Object({action:e.Literal(n.restore),id:e.String({minLength:1})},{additionalProperties:!1}),_=e.Union([l,u,d,f,p,m,h,g]);function v(e){return Object.values(n).filter(t=>o(t,e)).join(`, `)}const y=e.Object({action:e.String({enum:Object.values(n),description:`The operation to run. Every other field is accepted only by the actions its description names.`}),name:e.Optional(e.String({minLength:1,description:`Exact agent name to inspect. Actions: ${v(`name`)}.`})),cwd:e.Optional(e.String({minLength:1,description:`Directory to discover agents in. Actions: ${v(`cwd`)}.`})),scope:e.Optional(e.String({enum:[`user`,`project`,`both`],description:`Agent discovery scope. Actions: ${v(`scope`)}.`})),requests:e.Optional(e.Array(c,{minItems:1,description:`Runs to start, one entry each. Actions: ${v(`requests`)}.`})),concurrency:e.Optional(e.Integer({minimum:1,description:`Maximum runs started at once. Actions: ${v(`concurrency`)}.`})),artifacts:e.Optional(e.Boolean({description:`Collect run artifacts. Actions: ${v(`artifacts`)}.`})),id:e.Optional(e.String({minLength:1,description:`Run id. Actions: ${v(`id`)}.`})),transcriptLines:e.Optional(e.Integer({minimum:1,maximum:500,description:`Transcript lines to include; valid only alongside id. Actions: ${v(`transcriptLines`)}.`})),message:e.Optional(e.String({minLength:1,description:`Guidance to deliver. Actions: ${v(`message`)}.`})),reason:e.Optional(e.String({minLength:1,description:`Why the run is stopping. Actions: ${v(`reason`)}.`}))},{additionalProperties:!1});export{t as InlineAgentSchema,n as SUBAGENT_ACTIONS,r as SUBAGENT_ACTION_FIELDS,_ as SubagentParams,y as SubagentToolSchema,a as isSubagentAction,o as subagentActionAcceptsField};
2
2
  //# sourceMappingURL=runtime-subagent-tool.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-subagent-tool.mjs","names":[],"sources":["../src/schemas/subagentTool.ts"],"sourcesContent":["import { InlineAgentSchema, type InlineAgent } from '@agimon-ai/doompi-core/delegation';\nimport { type Static, Type } from 'typebox';\n\nexport { InlineAgentSchema };\nexport type { InlineAgent };\n\nexport const SUBAGENT_ACTIONS = {\n agents: 'agents',\n run: 'run',\n status: 'status',\n steer: 'steer',\n stop: 'stop',\n suspended: 'suspended',\n restore: 'restore',\n} as const;\n\nexport type SubagentAction = (typeof SUBAGENT_ACTIONS)[keyof typeof SUBAGENT_ACTIONS];\n\nexport const SUBAGENT_ACTION_FIELDS = {\n agents: ['action', 'name', 'cwd', 'scope'],\n run: ['action', 'requests', 'concurrency', 'artifacts', 'scope'],\n status: ['action', 'id', 'transcriptLines'],\n steer: ['action', 'id', 'message'],\n stop: ['action', 'id', 'reason'],\n suspended: ['action'],\n restore: ['action', 'id'],\n} as const satisfies Record<SubagentAction, readonly string[]>;\n\nconst IMPLEMENTED_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\nexport function isSubagentAction(value: unknown): value is SubagentAction {\n return typeof value === 'string' && IMPLEMENTED_ACTIONS.has(value);\n}\n\nexport function subagentActionAcceptsField(action: SubagentAction, field: string): boolean {\n return (SUBAGENT_ACTION_FIELDS[action] as readonly string[]).includes(field);\n}\n\nconst AgentScope = Type.Union([Type.Literal('user'), Type.Literal('project'), Type.Literal('both')]);\n\nconst RunRequest = Type.Object(\n {\n agent: Type.String({ minLength: 1 }),\n inlineAgent: Type.Optional(InlineAgentSchema),\n task: Type.String({ minLength: 1 }),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n model: Type.Optional(Type.String({ minLength: 1 })),\n runtime: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst AgentsParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.agents),\n name: Type.Optional(Type.String({ minLength: 1 })),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst RunParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.run),\n requests: Type.Array(RunRequest, { minItems: 1 }),\n concurrency: Type.Optional(Type.Integer({ minimum: 1 })),\n artifacts: Type.Optional(Type.Boolean()),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst FleetStatusParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.status) },\n { additionalProperties: false },\n);\n\nconst RunStatusParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.status),\n id: Type.String({ minLength: 1 }),\n transcriptLines: Type.Optional(Type.Integer({ minimum: 1, maximum: 500 })),\n },\n { additionalProperties: false },\n);\n\nconst SteerParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.steer),\n id: Type.String({ minLength: 1 }),\n message: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nconst StopParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.stop),\n id: Type.String({ minLength: 1 }),\n reason: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst SuspendedParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.suspended) },\n { additionalProperties: false },\n);\n\nconst RestoreParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.restore),\n id: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nexport const SubagentParams = Type.Union([\n AgentsParams,\n RunParams,\n FleetStatusParams,\n RunStatusParams,\n SteerParams,\n StopParams,\n SuspendedParams,\n RestoreParams,\n]);\n\nexport type SubagentToolParams = Static<typeof SubagentParams>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime-subagent-tool.mjs","names":[],"sources":["../src/schemas/subagentTool.ts"],"sourcesContent":["import { InlineAgentSchema, type InlineAgent } from '@agimon-ai/doompi-core/delegation';\nimport { type Static, Type } from 'typebox';\n\nexport { InlineAgentSchema };\nexport type { InlineAgent };\n\nexport const SUBAGENT_ACTIONS = {\n agents: 'agents',\n run: 'run',\n status: 'status',\n steer: 'steer',\n stop: 'stop',\n suspended: 'suspended',\n restore: 'restore',\n} as const;\n\nexport type SubagentAction = (typeof SUBAGENT_ACTIONS)[keyof typeof SUBAGENT_ACTIONS];\n\nexport const SUBAGENT_ACTION_FIELDS = {\n agents: ['action', 'name', 'cwd', 'scope'],\n run: ['action', 'requests', 'concurrency', 'artifacts', 'scope'],\n status: ['action', 'id', 'transcriptLines'],\n steer: ['action', 'id', 'message'],\n stop: ['action', 'id', 'reason'],\n suspended: ['action'],\n restore: ['action', 'id'],\n} as const satisfies Record<SubagentAction, readonly string[]>;\n\nconst IMPLEMENTED_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\nexport function isSubagentAction(value: unknown): value is SubagentAction {\n return typeof value === 'string' && IMPLEMENTED_ACTIONS.has(value);\n}\n\nexport function subagentActionAcceptsField(action: SubagentAction, field: string): boolean {\n return (SUBAGENT_ACTION_FIELDS[action] as readonly string[]).includes(field);\n}\n\nconst AgentScope = Type.Union([Type.Literal('user'), Type.Literal('project'), Type.Literal('both')]);\n\nconst RunRequest = Type.Object(\n {\n agent: Type.String({ minLength: 1 }),\n inlineAgent: Type.Optional(InlineAgentSchema),\n task: Type.String({ minLength: 1 }),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n model: Type.Optional(Type.String({ minLength: 1 })),\n runtime: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst AgentsParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.agents),\n name: Type.Optional(Type.String({ minLength: 1 })),\n cwd: Type.Optional(Type.String({ minLength: 1 })),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst RunParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.run),\n requests: Type.Array(RunRequest, { minItems: 1 }),\n concurrency: Type.Optional(Type.Integer({ minimum: 1 })),\n artifacts: Type.Optional(Type.Boolean()),\n scope: Type.Optional(AgentScope),\n },\n { additionalProperties: false },\n);\n\nconst FleetStatusParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.status) },\n { additionalProperties: false },\n);\n\nconst RunStatusParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.status),\n id: Type.String({ minLength: 1 }),\n transcriptLines: Type.Optional(Type.Integer({ minimum: 1, maximum: 500 })),\n },\n { additionalProperties: false },\n);\n\nconst SteerParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.steer),\n id: Type.String({ minLength: 1 }),\n message: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nconst StopParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.stop),\n id: Type.String({ minLength: 1 }),\n reason: Type.Optional(Type.String({ minLength: 1 })),\n },\n { additionalProperties: false },\n);\n\nconst SuspendedParams = Type.Object(\n { action: Type.Literal(SUBAGENT_ACTIONS.suspended) },\n { additionalProperties: false },\n);\n\nconst RestoreParams = Type.Object(\n {\n action: Type.Literal(SUBAGENT_ACTIONS.restore),\n id: Type.String({ minLength: 1 }),\n },\n { additionalProperties: false },\n);\n\nexport const SubagentParams = Type.Union([\n AgentsParams,\n RunParams,\n FleetStatusParams,\n RunStatusParams,\n SteerParams,\n StopParams,\n SuspendedParams,\n RestoreParams,\n]);\n\n/** The actions that accept `field`, so the declared docs cannot drift from the validator. */\nfunction acceptingActions(field: string): string {\n return Object.values(SUBAGENT_ACTIONS)\n .filter((action) => subagentActionAcceptsField(action, field))\n .join(', ');\n}\n\n/**\n * The schema declared to the model.\n *\n * A flat object rather than `SubagentParams` itself. A top-level union is\n * `{anyOf:[...]}` with no `properties`, and Pi's Anthropic Messages adapter\n * rebuilds tool input as `{type:'object', properties: schema.properties ?? {},\n * required: schema.required ?? []}`, so the union arrived at the model as an\n * empty object while the host went on validating calls against it. Nothing here\n * relaxes what is accepted: `validateParams` still rejects an unknown action, a\n * field the action does not take, and a missing required one.\n */\nexport const SubagentToolSchema = Type.Object(\n {\n action: Type.String({\n enum: Object.values(SUBAGENT_ACTIONS),\n description: 'The operation to run. Every other field is accepted only by the actions its description names.',\n }),\n name: Type.Optional(\n Type.String({ minLength: 1, description: `Exact agent name to inspect. Actions: ${acceptingActions('name')}.` }),\n ),\n cwd: Type.Optional(\n Type.String({\n minLength: 1,\n description: `Directory to discover agents in. Actions: ${acceptingActions('cwd')}.`,\n }),\n ),\n scope: Type.Optional(\n Type.String({\n enum: ['user', 'project', 'both'],\n description: `Agent discovery scope. Actions: ${acceptingActions('scope')}.`,\n }),\n ),\n requests: Type.Optional(\n Type.Array(RunRequest, {\n minItems: 1,\n description: `Runs to start, one entry each. Actions: ${acceptingActions('requests')}.`,\n }),\n ),\n concurrency: Type.Optional(\n Type.Integer({\n minimum: 1,\n description: `Maximum runs started at once. Actions: ${acceptingActions('concurrency')}.`,\n }),\n ),\n artifacts: Type.Optional(\n Type.Boolean({ description: `Collect run artifacts. Actions: ${acceptingActions('artifacts')}.` }),\n ),\n id: Type.Optional(Type.String({ minLength: 1, description: `Run id. Actions: ${acceptingActions('id')}.` })),\n transcriptLines: Type.Optional(\n Type.Integer({\n minimum: 1,\n maximum: 500,\n description: `Transcript lines to include; valid only alongside id. Actions: ${acceptingActions('transcriptLines')}.`,\n }),\n ),\n message: Type.Optional(\n Type.String({ minLength: 1, description: `Guidance to deliver. Actions: ${acceptingActions('message')}.` }),\n ),\n reason: Type.Optional(\n Type.String({ minLength: 1, description: `Why the run is stopping. Actions: ${acceptingActions('reason')}.` }),\n ),\n },\n { additionalProperties: false },\n);\n\nexport type SubagentToolParams = Static<typeof SubagentParams>;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./runtime-subagent-tool.cjs");let t=require("@agimon-ai/doompi-core/delegation");exports.InlineAgentSchema=t.InlineAgentSchema,exports.SUBAGENT_ACTIONS=e.SUBAGENT_ACTIONS,exports.SUBAGENT_ACTION_FIELDS=e.SUBAGENT_ACTION_FIELDS,exports.SubagentParams=e.SubagentParams,exports.isSubagentAction=e.isSubagentAction,exports.subagentActionAcceptsField=e.subagentActionAcceptsField;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./runtime-subagent-tool.cjs");let t=require("@agimon-ai/doompi-core/delegation");exports.InlineAgentSchema=t.InlineAgentSchema,exports.SUBAGENT_ACTIONS=e.SUBAGENT_ACTIONS,exports.SUBAGENT_ACTION_FIELDS=e.SUBAGENT_ACTION_FIELDS,exports.SubagentParams=e.SubagentParams,exports.SubagentToolSchema=e.SubagentToolSchema,exports.isSubagentAction=e.isSubagentAction,exports.subagentActionAcceptsField=e.subagentActionAcceptsField;
@@ -1,2 +1,2 @@
1
- import { InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, SubagentAction, SubagentParams, SubagentToolParams, isSubagentAction, subagentActionAcceptsField } from "./runtime-subagent-tool.cjs";
2
- export { type InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, type SubagentAction, SubagentParams, type SubagentToolParams, isSubagentAction, subagentActionAcceptsField };
1
+ import { InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, SubagentAction, SubagentParams, SubagentToolParams, SubagentToolSchema, isSubagentAction, subagentActionAcceptsField } from "./runtime-subagent-tool.cjs";
2
+ export { type InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, type SubagentAction, SubagentParams, type SubagentToolParams, SubagentToolSchema, isSubagentAction, subagentActionAcceptsField };
@@ -1,2 +1,2 @@
1
- import { InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, SubagentAction, SubagentParams, SubagentToolParams, isSubagentAction, subagentActionAcceptsField } from "./runtime-subagent-tool.mjs";
2
- export { type InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, type SubagentAction, SubagentParams, type SubagentToolParams, isSubagentAction, subagentActionAcceptsField };
1
+ import { InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, SubagentAction, SubagentParams, SubagentToolParams, SubagentToolSchema, isSubagentAction, subagentActionAcceptsField } from "./runtime-subagent-tool.mjs";
2
+ export { type InlineAgent, InlineAgentSchema, SUBAGENT_ACTIONS, SUBAGENT_ACTION_FIELDS, type SubagentAction, SubagentParams, type SubagentToolParams, SubagentToolSchema, isSubagentAction, subagentActionAcceptsField };
@@ -1 +1 @@
1
- import{InlineAgentSchema as e,SUBAGENT_ACTIONS as t,SUBAGENT_ACTION_FIELDS as n,SubagentParams as r,isSubagentAction as i,subagentActionAcceptsField as a}from"./runtime-subagent-tool.mjs";export{e as InlineAgentSchema,t as SUBAGENT_ACTIONS,n as SUBAGENT_ACTION_FIELDS,r as SubagentParams,i as isSubagentAction,a as subagentActionAcceptsField};
1
+ import{InlineAgentSchema as e,SUBAGENT_ACTIONS as t,SUBAGENT_ACTION_FIELDS as n,SubagentParams as r,SubagentToolSchema as i,isSubagentAction as a,subagentActionAcceptsField as o}from"./runtime-subagent-tool.mjs";export{e as InlineAgentSchema,t as SUBAGENT_ACTIONS,n as SUBAGENT_ACTION_FIELDS,r as SubagentParams,i as SubagentToolSchema,a as isSubagentAction,o as subagentActionAcceptsField};
@@ -1,2 +1,2 @@
1
- const e=require("../runtime-subagent-tool.cjs"),t=require("../services/errors/index.cjs"),n=require("../services/subagentTool/index.cjs"),r=require("../services/toolDescription/index.cjs");function i(i,a,o,s){let c=!1;try{c=a.getAllTools().some(e=>e.name===n.SUBAGENT_TOOL_NAME)}catch{}if(c)throw new t.DoomTeamExpectedError(`tool_conflict`,`A foreign '${n.SUBAGENT_TOOL_NAME}' tool is already registered.`,!1,`Disable the competing extension, then reload Doom Team.`);return{name:n.SUBAGENT_TOOL_NAME,label:`Subagent`,description:r.SUBAGENT_TOOL_DESCRIPTION,parameters:e.SubagentParams,prepareArguments:n.validateParams,renderShell:`self`,...o,async execute(e,t,n,r,a){return await s(a,n),i.execute(e,t,n,r,a)}}}exports.createSubagentTool=i;
1
+ const e=require("../runtime-subagent-tool.cjs"),t=require("../services/errors/index.cjs"),n=require("../services/subagentTool/index.cjs"),r=require("../services/toolDescription/index.cjs");function i(i,a,o,s){let c=!1;try{c=a.getAllTools().some(e=>e.name===n.SUBAGENT_TOOL_NAME)}catch{}if(c)throw new t.DoomTeamExpectedError(`tool_conflict`,`A foreign '${n.SUBAGENT_TOOL_NAME}' tool is already registered.`,!1,`Disable the competing extension, then reload Doom Team.`);return{name:n.SUBAGENT_TOOL_NAME,label:`Subagent`,description:r.SUBAGENT_TOOL_DESCRIPTION,parameters:e.SubagentToolSchema,prepareArguments:n.validateParams,renderShell:`self`,...o,async execute(e,t,n,r,a){return await s(a,n),i.execute(e,t,n,r,a)}}}exports.createSubagentTool=i;
2
2
  //# sourceMappingURL=subagent.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.cjs","names":["SUBAGENT_TOOL_NAME","DoomTeamExpectedError","SUBAGENT_TOOL_DESCRIPTION","SubagentParams","validateParams"],"sources":["../../src/tools/subagent.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { SubagentParams } from '../schemas/subagentTool';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport {\n SUBAGENT_TOOL_NAME,\n validateParams,\n type SubagentToolContract,\n type SubagentToolDetails,\n} from '../services/subagentTool';\nimport { SUBAGENT_TOOL_DESCRIPTION } from '../services/toolDescription';\n\nexport function createSubagentTool(\n service: SubagentToolContract,\n pi: Pick<ExtensionAPI, 'getAllTools'>,\n renderers: Pick<ToolDefinition<typeof SubagentParams, SubagentToolDetails>, 'renderCall' | 'renderResult'>,\n waitUntilReady: (context: ExtensionContext, signal?: AbortSignal) => Promise<void>,\n): ToolDefinition<typeof SubagentParams, SubagentToolDetails> {\n let conflict = false;\n try {\n conflict = pi.getAllTools().some((tool) => tool.name === SUBAGENT_TOOL_NAME);\n } catch {\n /* Host discovery can be unavailable during installation. */\n }\n if (conflict)\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentParams,\n prepareArguments: validateParams,\n renderShell: 'self',\n ...renderers,\n async execute(id, params, signal, onUpdate, context) {\n await waitUntilReady(context, signal);\n return service.execute(id, params, signal, onUpdate, context);\n },\n };\n}\n"],"mappings":"6LAYA,SAAgB,EACd,EACA,EACA,EACA,EAC4D,CAC5D,IAAI,EAAW,GACf,GAAI,CACF,EAAW,EAAG,YAAY,CAAC,CAAC,KAAM,GAAS,EAAK,OAASA,EAAAA,kBAAkB,CAC7E,MAAQ,CAER,CACA,GAAI,EACF,MAAM,IAAIC,EAAAA,sBACR,gBACA,cAAcD,EAAAA,mBAAmB,+BACjC,GACA,yDACF,EACF,MAAO,CACL,KAAMA,EAAAA,mBACN,MAAO,WACP,YAAaE,EAAAA,0BACb,WAAYC,EAAAA,eACZ,iBAAkBC,EAAAA,eAClB,YAAa,OACb,GAAG,EACH,MAAM,QAAQ,EAAI,EAAQ,EAAQ,EAAU,EAAS,CAEnD,OADA,MAAM,EAAe,EAAS,CAAM,EAC7B,EAAQ,QAAQ,EAAI,EAAQ,EAAQ,EAAU,CAAO,CAC9D,CACF,CACF"}
1
+ {"version":3,"file":"subagent.cjs","names":["SUBAGENT_TOOL_NAME","DoomTeamExpectedError","SUBAGENT_TOOL_DESCRIPTION","SubagentToolSchema","validateParams"],"sources":["../../src/tools/subagent.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { SubagentToolSchema } from '../schemas/subagentTool';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport {\n SUBAGENT_TOOL_NAME,\n validateParams,\n type SubagentToolContract,\n type SubagentToolDetails,\n} from '../services/subagentTool';\nimport { SUBAGENT_TOOL_DESCRIPTION } from '../services/toolDescription';\n\nexport function createSubagentTool(\n service: SubagentToolContract,\n pi: Pick<ExtensionAPI, 'getAllTools'>,\n renderers: Pick<ToolDefinition<typeof SubagentToolSchema, SubagentToolDetails>, 'renderCall' | 'renderResult'>,\n waitUntilReady: (context: ExtensionContext, signal?: AbortSignal) => Promise<void>,\n): ToolDefinition<typeof SubagentToolSchema, SubagentToolDetails> {\n let conflict = false;\n try {\n conflict = pi.getAllTools().some((tool) => tool.name === SUBAGENT_TOOL_NAME);\n } catch {\n /* Host discovery can be unavailable during installation. */\n }\n if (conflict)\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentToolSchema,\n prepareArguments: validateParams,\n renderShell: 'self',\n ...renderers,\n async execute(id, params, signal, onUpdate, context) {\n await waitUntilReady(context, signal);\n return service.execute(id, params, signal, onUpdate, context);\n },\n };\n}\n"],"mappings":"6LAYA,SAAgB,EACd,EACA,EACA,EACA,EACgE,CAChE,IAAI,EAAW,GACf,GAAI,CACF,EAAW,EAAG,YAAY,CAAC,CAAC,KAAM,GAAS,EAAK,OAASA,EAAAA,kBAAkB,CAC7E,MAAQ,CAER,CACA,GAAI,EACF,MAAM,IAAIC,EAAAA,sBACR,gBACA,cAAcD,EAAAA,mBAAmB,+BACjC,GACA,yDACF,EACF,MAAO,CACL,KAAMA,EAAAA,mBACN,MAAO,WACP,YAAaE,EAAAA,0BACb,WAAYC,EAAAA,mBACZ,iBAAkBC,EAAAA,eAClB,YAAa,OACb,GAAG,EACH,MAAM,QAAQ,EAAI,EAAQ,EAAQ,EAAU,EAAS,CAEnD,OADA,MAAM,EAAe,EAAS,CAAM,EAC7B,EAAQ,QAAQ,EAAI,EAAQ,EAAQ,EAAU,CAAO,CAC9D,CACF,CACF"}
@@ -1,2 +1,2 @@
1
- import{SubagentParams as e}from"../runtime-subagent-tool.mjs";import{DoomTeamExpectedError as t}from"../services/errors/index.mjs";import{SUBAGENT_TOOL_NAME as n,validateParams as r}from"../services/subagentTool/index.mjs";import{SUBAGENT_TOOL_DESCRIPTION as i}from"../services/toolDescription/index.mjs";function a(a,o,s,c){let l=!1;try{l=o.getAllTools().some(e=>e.name===n)}catch{}if(l)throw new t(`tool_conflict`,`A foreign '${n}' tool is already registered.`,!1,`Disable the competing extension, then reload Doom Team.`);return{name:n,label:`Subagent`,description:i,parameters:e,prepareArguments:r,renderShell:`self`,...s,async execute(e,t,n,r,i){return await c(i,n),a.execute(e,t,n,r,i)}}}export{a as createSubagentTool};
1
+ import{SubagentToolSchema as e}from"../runtime-subagent-tool.mjs";import{DoomTeamExpectedError as t}from"../services/errors/index.mjs";import{SUBAGENT_TOOL_NAME as n,validateParams as r}from"../services/subagentTool/index.mjs";import{SUBAGENT_TOOL_DESCRIPTION as i}from"../services/toolDescription/index.mjs";function a(a,o,s,c){let l=!1;try{l=o.getAllTools().some(e=>e.name===n)}catch{}if(l)throw new t(`tool_conflict`,`A foreign '${n}' tool is already registered.`,!1,`Disable the competing extension, then reload Doom Team.`);return{name:n,label:`Subagent`,description:i,parameters:e,prepareArguments:r,renderShell:`self`,...s,async execute(e,t,n,r,i){return await c(i,n),a.execute(e,t,n,r,i)}}}export{a as createSubagentTool};
2
2
  //# sourceMappingURL=subagent.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.mjs","names":[],"sources":["../../src/tools/subagent.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { SubagentParams } from '../schemas/subagentTool';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport {\n SUBAGENT_TOOL_NAME,\n validateParams,\n type SubagentToolContract,\n type SubagentToolDetails,\n} from '../services/subagentTool';\nimport { SUBAGENT_TOOL_DESCRIPTION } from '../services/toolDescription';\n\nexport function createSubagentTool(\n service: SubagentToolContract,\n pi: Pick<ExtensionAPI, 'getAllTools'>,\n renderers: Pick<ToolDefinition<typeof SubagentParams, SubagentToolDetails>, 'renderCall' | 'renderResult'>,\n waitUntilReady: (context: ExtensionContext, signal?: AbortSignal) => Promise<void>,\n): ToolDefinition<typeof SubagentParams, SubagentToolDetails> {\n let conflict = false;\n try {\n conflict = pi.getAllTools().some((tool) => tool.name === SUBAGENT_TOOL_NAME);\n } catch {\n /* Host discovery can be unavailable during installation. */\n }\n if (conflict)\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentParams,\n prepareArguments: validateParams,\n renderShell: 'self',\n ...renderers,\n async execute(id, params, signal, onUpdate, context) {\n await waitUntilReady(context, signal);\n return service.execute(id, params, signal, onUpdate, context);\n },\n };\n}\n"],"mappings":"iTAYA,SAAgB,EACd,EACA,EACA,EACA,EAC4D,CAC5D,IAAI,EAAW,GACf,GAAI,CACF,EAAW,EAAG,YAAY,CAAC,CAAC,KAAM,GAAS,EAAK,OAAS,CAAkB,CAC7E,MAAQ,CAER,CACA,GAAI,EACF,MAAM,IAAI,EACR,gBACA,cAAc,EAAmB,+BACjC,GACA,yDACF,EACF,MAAO,CACL,KAAM,EACN,MAAO,WACP,YAAa,EACb,WAAY,EACZ,iBAAkB,EAClB,YAAa,OACb,GAAG,EACH,MAAM,QAAQ,EAAI,EAAQ,EAAQ,EAAU,EAAS,CAEnD,OADA,MAAM,EAAe,EAAS,CAAM,EAC7B,EAAQ,QAAQ,EAAI,EAAQ,EAAQ,EAAU,CAAO,CAC9D,CACF,CACF"}
1
+ {"version":3,"file":"subagent.mjs","names":[],"sources":["../../src/tools/subagent.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { SubagentToolSchema } from '../schemas/subagentTool';\nimport { DoomTeamExpectedError } from '../services/errors';\nimport {\n SUBAGENT_TOOL_NAME,\n validateParams,\n type SubagentToolContract,\n type SubagentToolDetails,\n} from '../services/subagentTool';\nimport { SUBAGENT_TOOL_DESCRIPTION } from '../services/toolDescription';\n\nexport function createSubagentTool(\n service: SubagentToolContract,\n pi: Pick<ExtensionAPI, 'getAllTools'>,\n renderers: Pick<ToolDefinition<typeof SubagentToolSchema, SubagentToolDetails>, 'renderCall' | 'renderResult'>,\n waitUntilReady: (context: ExtensionContext, signal?: AbortSignal) => Promise<void>,\n): ToolDefinition<typeof SubagentToolSchema, SubagentToolDetails> {\n let conflict = false;\n try {\n conflict = pi.getAllTools().some((tool) => tool.name === SUBAGENT_TOOL_NAME);\n } catch {\n /* Host discovery can be unavailable during installation. */\n }\n if (conflict)\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentToolSchema,\n prepareArguments: validateParams,\n renderShell: 'self',\n ...renderers,\n async execute(id, params, signal, onUpdate, context) {\n await waitUntilReady(context, signal);\n return service.execute(id, params, signal, onUpdate, context);\n },\n };\n}\n"],"mappings":"qTAYA,SAAgB,EACd,EACA,EACA,EACA,EACgE,CAChE,IAAI,EAAW,GACf,GAAI,CACF,EAAW,EAAG,YAAY,CAAC,CAAC,KAAM,GAAS,EAAK,OAAS,CAAkB,CAC7E,MAAQ,CAER,CACA,GAAI,EACF,MAAM,IAAI,EACR,gBACA,cAAc,EAAmB,+BACjC,GACA,yDACF,EACF,MAAO,CACL,KAAM,EACN,MAAO,WACP,YAAa,EACb,WAAY,EACZ,iBAAkB,EAClB,YAAa,OACb,GAAG,EACH,MAAM,QAAQ,EAAI,EAAQ,EAAQ,EAAU,EAAS,CAEnD,OADA,MAAM,EAAe,EAAS,CAAM,EAC7B,EAAQ,QAAQ,EAAI,EAAQ,EAAQ,EAAU,CAAO,CAC9D,CACF,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-team",
3
- "version": "0.0.1-alpha.71",
3
+ "version": "0.0.1-alpha.72",
4
4
  "description": "Asynchronous named subagents, team runs, intercom, and model policy for Pi coding agents.",
5
5
  "keywords": [
6
6
  "agent-team",
@@ -101,16 +101,16 @@
101
101
  "registry": "https://registry.npmjs.org/"
102
102
  },
103
103
  "dependencies": {
104
+ "@agimon-ai/doompi-cache": "0.0.1-alpha.38",
105
+ "@agimon-ai/doompi-config": "0.0.1-alpha.71",
106
+ "@agimon-ai/doompi-core": "0.0.1-alpha.72",
107
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.69",
108
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.72",
109
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.30",
110
+ "@agimon-ai/doompi-web-security": "0.0.1-alpha.32",
104
111
  "@deepseek-ai/cordis": "4.0.2",
105
- "typebox": "1.3.25",
106
- "yaml": "2.9.0",
107
- "@agimon-ai/doompi-config": "0.0.1-alpha.70",
108
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.68",
109
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.29",
110
- "@agimon-ai/doompi-cache": "0.0.1-alpha.37",
111
- "@agimon-ai/doompi-core": "0.0.1-alpha.71",
112
- "@agimon-ai/doompi-ui": "0.0.1-alpha.71",
113
- "@agimon-ai/doompi-web-security": "0.0.1-alpha.31"
112
+ "typebox": "1.3.30",
113
+ "yaml": "2.9.0"
114
114
  },
115
115
  "devDependencies": {
116
116
  "@earendil-works/pi-agent-core": "0.85.1",
@@ -119,11 +119,11 @@
119
119
  "@earendil-works/pi-tui": "0.85.1",
120
120
  "@tanstack/react-store": "0.11.1",
121
121
  "@tanstack/store": "0.11.1",
122
- "@types/node": "26.4.1",
123
- "@types/react": "19.2.18",
122
+ "@types/node": "26.5.1",
123
+ "@types/react": "19.3.0",
124
124
  "@vitest/coverage-v8": "5.0.0",
125
- "react": "19.2.8",
126
- "react-dom": "19.2.8",
125
+ "react": "19.3.0",
126
+ "react-dom": "19.3.0",
127
127
  "typescript": "7.0.2",
128
128
  "vitest": "5.0.0"
129
129
  },
@@ -1,3 +1,4 @@
1
+ import { sessionApiPath } from '@agimon-ai/doompi-core/web';
1
2
  import { sealedTransport } from '@agimon-ai/doompi-web-security/browser';
2
3
 
3
4
  import type { SubagentCatalogAgent, SubagentCatalogPayload } from '../../types/webSubagents';
@@ -30,7 +31,7 @@ function isAgent(value: unknown): value is SubagentCatalogAgent {
30
31
 
31
32
  /** Read the selected session's catalog through the host's authenticated HTTP transport. */
32
33
  export async function fetchCatalog(sessionId: string, signal: AbortSignal): Promise<SubagentCatalogPayload> {
33
- const response = await sealedTransport.fetch(`/api/sessions/${encodeURIComponent(sessionId)}/plugin/team/catalog`, {
34
+ const response = await sealedTransport.fetch(`${sessionApiPath(sessionId)}/plugins/team/catalog`, {
34
35
  signal,
35
36
  cache: 'no-store',
36
37
  });
@@ -56,7 +57,7 @@ export async function fetchCatalog(sessionId: string, signal: AbortSignal): Prom
56
57
 
57
58
  /** Launch on the selected session host, without submitting a parent prompt. */
58
59
  export async function launchAgent(sessionId: string, request: LaunchRequest): Promise<string> {
59
- const response = await sealedTransport.fetch(`/api/sessions/${encodeURIComponent(sessionId)}/plugin/team/run`, {
60
+ const response = await sealedTransport.fetch(`${sessionApiPath(sessionId)}/plugins/team/run`, {
60
61
  method: 'POST',
61
62
  headers: { 'content-type': 'application/json' },
62
63
  body: JSON.stringify(request),