@duckmind/dm-darwin-x64 0.49.6 → 0.49.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dm +0 -0
- package/extensions/.dm-extensions.json +2 -2
- package/extensions/dm-subagents/src/extension/fanout-child.js +1 -1
- package/extensions/dm-subagents/src/extension/index.js +1 -1
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1 -1
- package/package.json +1 -1
- package/extensions/dm-subagents/.m/artifacts/shell/shell_output_1783845384621_9cf9262bf674.txt +0 -1336
- package/extensions/dm-subagents/.m/artifacts/shell/shell_output_1783846154938_6a41cefee0bf.txt +0 -1336
package/dm
CHANGED
|
Binary file
|
|
@@ -225,7 +225,7 @@ ${Y$}
|
|
|
225
225
|
|
|
226
226
|
${Z$}`:`${F$}
|
|
227
227
|
|
|
228
|
-
${Y$}`}],details:A$}}finally{if(n)C2(n)}}async function oz($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:H,runId:U,sessionDirForIndex:j,sessionFileForTask:G,thinkingOverrideForTask:z,shareEnabled:V,artifactConfig:B,artifactsDir:W,onUpdate:K,sessionRoot:F,controlConfig:q,contextPolicy:_}=$,D=D9($,J),O=$.intercomBridge.active?m$(U,Z.agent,0):void 0,f=[],S=[],C=X.find((q$)=>q$.name===Z.agent);if(!C)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let g=OQ({runBudget:$.toolBudget,agentBudget:C.toolBudget,configBudget:$.configToolBudget});if(g.error)return l2(Z,Error(g.error));let w=Y.model?.provider,I=Y.modelRegistry.getAvailable().map(f0),L=Z.task??"",R=W0(Z.model??C.model,Y.model,I,w,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),N=Y0(Z.skill),E=Z.output!==void 0?Z.output:C.output,T=EJ(E,C.output),p=Z.outputMode??"inline",M=e0(J.config.maxSubagentDepth),P=$1(M,C.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let q$=v0(C,{output:T,skills:N}),B$=P0(Q),H$=await Y.ui.custom((K$,A$,y,r)=>new MJ(K$,A$,[C],[L],L,void 0,[q$],I,w,B$,r,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!H$||!H$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};L=H$.templates[0];let Q$=H$.behaviorOverrides[0];if(Q$?.model)R=W0(Q$.model,Y.model,I,w,{scope:$.modelScope,source:"explicit"});if(Q$?.output!==void 0)T=EJ(Q$.output,C.output);if(Q$?.skills!==void 0)N=Q$.skills;if(H$.runInBackground){if(!x1())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let K$=h1(),A$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return p8(K$,{agent:Z.agent,task:F0(_,Z.agent)?t0(L):L,agentConfig:C,ctx:A$,availableModels:I,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?W:void 0,artifactConfig:B,shareEnabled:V,sessionRoot:F,sessionFile:G(Z.agent,0),skills:N===!1?[]:N,output:T,outputMode:p,outputBaseDir:V4(J,W,K$),modelOverride:R,thinkingOverride:z(Z.agent,0),maxSubagentDepth:P,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:q,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(y,r)=>m$(K$,y,r):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:g.toolBudget})}}if(F0(_,Z.agent))L=t0(L);let l=L,m=b1(T,Y.cwd,Q,V4(J,W,U)),k=I0(p,m,`Single run (${Z.agent})`);if(k)return{content:[{type:"text",text:k}],isError:!0,details:{mode:"single",results:[]}};L=TJ(L,m);let t;if(N===!1)t=[];else t=N;let O$=new AbortController,x=J.state.foregroundControls.get(U);if(x)x.currentAgent=Z.agent,x.currentIndex=0,x.currentActivityState=void 0,x.updatedAt=Date.now(),x.interrupt=()=>{if(O$.signal.aborted)return!1;return O$.abort(),x.currentActivityState=void 0,x.updatedAt=Date.now(),!0};let k$=K?(q$)=>{if(x){let B$=q$.details?.progress?.[0];x.currentAgent=Z.agent,x.currentIndex=B$?.index??0,x.currentActivityState=B$?.activityState,x.lastActivityAt=B$?.lastActivityAt,x.currentTool=B$?.currentTool,x.currentToolStartedAt=B$?.currentToolStartedAt,x.currentPath=B$?.currentPath,x.turnCount=B$?.turnCount,x.tokens=B$?.tokens,x.toolCount=B$?.toolCount,x.updatedAt=Date.now()}K(q$)}:void 0,J$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),n=await SJ(Y.cwd,X,Z.agent,L,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:H,interruptSignal:O$.signal,allowIntercomDetach:C.systemPrompt?.includes(K1)===!0,intercomEvents:J.pi.events,runId:U,sessionDir:j(0),sessionFile:G(Z.agent,0),share:V,artifactsDir:B.enabled?W:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:m,outputMode:p,maxSubagentDepth:P,onUpdate:k$,controlConfig:q,onControlEvent:D,intercomSessionName:O,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:x?.nestedRoute,index:0,modelOverride:R,thinkingOverride:z(Z.agent,0),availableModels:I,preferredModelProvider:w,modelScope:$.modelScope,skills:t,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(q$)=>f9(J.state,{runId:U,mode:"single",cwd:Q,index:0,result:q$}),timeoutMs:$.timeoutMs,deadlineAt:J$,turnBudget:$.turnBudget,toolBudget:g.toolBudget});if(x?.currentIndex===0)x.interrupt=void 0,x.currentActivityState=n.progress?.activityState,x.lastActivityAt=n.progress?.lastActivityAt,x.currentTool=n.progress?.currentTool,x.currentToolStartedAt=n.progress?.currentToolStartedAt,x.currentPath=n.progress?.currentPath,x.turnCount=n.progress?.turnCount,x.tokens=n.progress?.tokens,x.toolCount=n.progress?.toolCount,x.updatedAt=Date.now();if(RJ(Z.agent,l,n.exitCode,n.progressSummary?.durationMs??0),n.progress)f.push(n.progress);if(n.artifactPaths)S.push(n.artifactPaths);let h$=D0(n),u=O3({fullOutput:h$,truncatedOutput:n.truncation?.text,outputPath:m,outputMode:n.outputMode,exitCode:n.exitCode,savedPath:n.savedOutputPath,outputReference:n.outputReference,saveError:n.outputSaveError});if(x)e1(x),I1(U,[n],x.nestedChildren);let U$=BJ({mode:"single",runId:U,results:[n],...$.turnBudget?{turnBudget:$.turnBudget}:{},...g.toolBudget?{toolBudget:g.toolBudget}:{},progress:Z.includeProgress?f:void 0,artifacts:S.length?{dir:W,files:S}:void 0,truncation:n.truncation,totalChildUsage:iJ([n]),totalCost:GJ([n])});if(y9(J.state,{runId:U,mode:"single",cwd:Q,results:U$.results}),!n.detached&&!n.interrupted){if(x)e1(x);let q$=await b9({pi:J.pi,intercomBridge:$.intercomBridge,runId:U,mode:"single",details:U$,...x?.nestedChildren?.length?{nestedChildren:x.nestedChildren}:{}});if(q$)return{content:[{type:"text",text:q$.text}],details:q$.details,...n.exitCode!==0?{isError:!0}:{}}}if(n.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:U$};if(n.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:U$};if(n.exitCode!==0)return{content:[{type:"text",text:Tz(n,u.displayOutput)}],details:U$,isError:!0};return{content:[{type:"text",text:u.displayOutput||"(no output)"}],details:U$}}function lz($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function nz($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:lz($),results:[]}}}function _Q($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var pz=new Set(["assistant","default","general","generic","subagent"]);function iz($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((X)=>X.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(!Z&&Boolean($.task?.trim())||Boolean(Z&&pz.has(Z.toLowerCase())))||!J.some((X)=>X.name==="worker"))return $;return{...$,agent:"worker"}}function EQ($){let J=async(Q,X,Y,H,U)=>{$.state.baseCwd=U.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let j=_Q(X),G=aV(U.cwd,j.cwd),z=j.cwd===void 0?j:{...j,cwd:G},V=z.action;if(V){if(V==="doctor"){let a=null,i=$.state.currentSessionId,N$;try{a=U.sessionManager.getSessionFile()??null,i=U.sessionManager.getSessionId()}catch(X$){N$=X$ instanceof Error?`${X$.name}: ${X$.message}`:String(X$)}let v;try{v=O8($.pi.getSessionName(),U.sessionManager.getSessionId())}catch(X$){if(!N$)N$=X$ instanceof Error?`${X$.name}: ${X$.message}`:String(X$)}return{content:[{type:"text",text:M7({cwd:G,config:$.config,state:$.state,context:z.context,requestedSessionDir:z.sessionDir,currentSessionFile:a,currentSessionId:i,orchestratorTarget:v,sessionError:N$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(V==="status"){let a=z.id??z.runId,i=n2($),N$=eV(U,$);if(z.view==="fleet")return U4(z,{state:$.state,nested:i,sessionRoots:N$});if(a)try{let v=q1(a,{state:$.state,nested:i});if(v?.kind==="foreground"){let X$=S9($.state,v.id);if(X$){if(z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return BQ(X$)}}}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}else{let v=S9($.state,void 0);if(v&&z.view!=="transcript")return BQ(v);if(v&&z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return U4(z,{state:$.state,nested:i,sessionRoots:N$})}if(V==="resume")return Nz({params:z,requestCwd:G,ctx:U,deps:$});if(V==="steer"){let a=(z.message??z.task??"").trim();if(!a)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let i=z.runId??z.id;if(z.dir)try{let v=g2(z,H0,g$),X$=v.resolvedId??i??C$.basename(v.asyncDir??z.dir);return KQ({state:$.state,runId:X$,message:a,index:z.index,kill:$.kill,location:v})}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}if(!i)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let N$;try{N$=q1(i,{state:$.state,nested:n2($)})}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}if(N$?.kind==="nested")return Mz({target:N$,message:a,index:z.index});if(N$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(N$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${i}'.`}],isError:!0,details:{mode:"management",results:[]}};return KQ({state:$.state,runId:N$.id,message:a,index:z.index,kill:$.kill,location:N$.location})}if(V==="append-step")return zz({params:z,requestCwd:G,ctx:U,deps:$});if(V==="schedule"||V==="schedule-list"||V==="schedule-status"||V==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${V}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(z,U)}if(V==="interrupt"){let a=z.runId??z.id,i;if(a)try{i=q1(a,{state:$.state,nested:n2($)})}catch(X$){return{content:[{type:"text",text:X$ instanceof Error?X$.message:String(X$)}],isError:!0,details:{mode:"management",results:[]}}}if(i?.kind==="nested")return Oz(i);let N$=S9($.state,i?.kind==="foreground"?i.id:a);if(N$?.interrupt){if(N$.interrupt())return N$.updatedAt=Date.now(),N$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${N$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${N$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let v=jz($.state,i?.kind==="async"?i.id:a,$.kill,i?.kind==="async"?i.location:void 0);if(v)return v;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!T4.includes(V))return{content:[{type:"text",text:`Unknown action: ${V}. Valid: ${T4.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&sV.has(V))return{content:[{type:"text",text:`Action '${V}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return J7(V,z,{...U,cwd:G,config:$.config})}let{blocked:B,depth:W,maxDepth:K}=R4($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${W}, max=${K}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let F=kz(z);if(F.error)return F.error;let q=F.params,_=GQ(q,W,$.config.forceTopLevelAsync===!0),D=Dz(_);if(D.error)return PJ(_,D.error);let O=bz(_,$.config);if(O.error)return PJ(_,O.error);let f=p2(_.toolBudget,"toolBudget");if(f.error)return PJ(_,f.error);let S=p2($.config.toolBudget,"config.toolBudget");if(S.error)return PJ(_,S.error);let C=x8(_.agentScope),g=_.cwd??U.cwd,w=U.sessionManager.getSessionFile()??null;$.state.currentSessionId=s8(U.sessionManager);let I=$.discoverAgents(g,C),L=I.agents,R=I.modelScope;_=iz(_,L);let N=yz(_,L);_=N.params;let E=O8($.pi.getSessionName(),U.sessionManager.getSessionId()),T=L6({config:$.config.intercomBridge,context:_.context,orchestratorTarget:E}),p=T.active?L.map((a)=>O6(a,T)):L,M=h1().slice(0,8),P=DJ(),l=P?bJ():void 0,m=P??H7(M),k=_.share===!0,t=(_.chain?.length??0)>0,O$=(_.tasks?.length??0)>0,x=!t&&!O$&&Boolean(_.agent),k$=t&&_.clarify===!0&&U.hasUI&&!(_.chain?.some(T$)??!1),J$=Sz(_,p,t,O$,x,k$);if(J$)return J$;let n=()=>{return},h$=()=>{return};try{let a=f7(U.sessionManager,N.usesFork?"fork":void 0);n=a.sessionFileForIndex,h$=a.thinkingOverrideForIndex}catch(a){return l2(_,a)}let u=_.async??$.asyncByDefault,U$=(t||O$)&&u&&_.clarify===!0,q$=u&&_.clarify!==!0,B$=M8($.config.control,_.control),H$={...J8,enabled:_.artifacts!==!1},Q$=qJ(w,g),K$;if(_.sessionDir)K$=C$.resolve($.expandTilde(_.sessionDir));else{let a=$.config.defaultSessionDir?C$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(w);K$=C$.join(a,M)}try{s0.mkdirSync(K$,{recursive:!0})}catch(a){let i=a instanceof Error?a.message:String(a);return l2(_,Error(`Failed to create session directory '${K$}': ${i}`))}let A$=(a)=>C$.join(K$,`run-${a??0}`),y=(a,i)=>F0(N,a)?n(i):void 0,r=(a,i)=>F0(N,a)?h$(i):void 0,p$=(a,i)=>y(a,i)??C$.join(A$(i),"session.jsonl"),Z$=(a)=>C$.join(A$(a),"session.jsonl");try{Pz(_,N,y,$.config.chain?.dynamicFanout?.maxItems)}catch(a){return l2(_,a)}let d$=Rz(_,$.config.chain?.dynamicFanout?.maxItems);if(d$)return d$;let E$=H?(a)=>H(v1(a,_.context)):void 0,Y$=t?"chain":O$?"parallel":"single",F$=$z({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:Jz(_,$.config),mode:Y$});if(F$)return F$;let V$={params:_,effectiveCwd:g,ctx:U,signal:Y,onUpdate:E$,agents:p,runId:M,shareEnabled:k,sessionRoot:K$,sessionDirForIndex:A$,sessionFileForIndex:Z$,sessionFileForTask:p$,thinkingOverrideForTask:r,artifactConfig:H$,artifactsDir:Q$,backgroundRequestedWhileClarifying:U$,effectiveAsync:q$,controlConfig:B$,intercomBridge:T,nestedRoute:m,timeoutMs:D.timeoutMs,turnBudget:O.turnBudget,toolBudget:f.toolBudget,configToolBudget:S.toolBudget,contextPolicy:N,modelScope:R},c=q$?void 0:{runId:M,mode:Y$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:m,interrupt:void 0};if(c)$.state.foregroundControls.set(M,c),$.state.lastForegroundControlId=M;let y$=(a,i)=>{if(!P||!l)return;let N$=Date.now(),v=i?.details,X$=a==="subagent.nested.started"?"running":i?.isError||v?.results.some((b)=>b.exitCode!==0)?"failed":v?.results.some((b)=>b.interrupted)?"paused":"complete",i$=i?.isError?i.content.find((b)=>b.type==="text")?.text:void 0,P$=O$&&_.tasks?_.tasks.map((b)=>b.agent):t&&_.chain?_.chain.flatMap((b)=>T$(b)?b.parallel.map((W$)=>W$.agent):[b.agent]):_.agent?[_.agent]:[],M1=T.active&&P$[0]?m$(M,P$[0],0):void 0;try{t1(P,{type:a,ts:N$,parentRunId:l.parentRunId,parentStepIndex:l.parentStepIndex,child:{id:M,parentRunId:l.parentRunId,parentStepIndex:l.parentStepIndex,depth:l.depth,path:l.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:M1,intercomTarget:M1,ownerState:X$==="running"?"live":"gone",mode:Y$,state:X$,agent:P$[0],agents:P$,startedAt:c?.startedAt??N$,...X$!=="running"?{endedAt:N$}:{},lastUpdate:N$,...v?.totalCost?{totalCost:v.totalCost}:{},...i$?{error:i$}:{},...v?.results.length?{steps:v.results.map((b)=>({agent:b.agent,status:b.interrupted?"paused":b.exitCode===0?"complete":"failed",...b.sessionFile?{sessionFile:b.sessionFile}:{},...b.error?{error:b.error}:{}}))}:{}}})}catch(b){console.error("Failed to emit nested foreground status event:",b)}},s$=!1;try{let a=xz(V$,$);if(a)return v1(a,_.context);if(c)y$("subagent.nested.started"),s$=!0;if(t&&_.chain){let i=await vz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}if(O$&&_.tasks){let i=await dz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}if(x){let i=await oz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}}catch(a){let i=l2(_,a);if(s$)y$("subagent.nested.completed",i);return i}finally{if(c){if(N7($.state,M),$.state.foregroundControls.delete(M),$.state.lastForegroundControlId===M)$.state.lastForegroundControlId=null}}return v1({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,H,U)=>{let j=_Q(X);if(j.action)return J(Q,j,Y,H,U);if($.state.subagentInProgress===!0)return nz(j);$.state.subagentInProgress=!0;try{return await J(Q,j,Y,H,U)}finally{$.state.subagentInProgress=!1}}}}import{Type as A}from"typebox";function TQ($){return CQ($,[])}function CQ($,J){if(!$||typeof $!=="object")return $;let Z=Array.isArray($)?[]:Object.create(Object.getPrototypeOf($));for(let Q of Reflect.ownKeys($)){let X=Object.getOwnPropertyDescriptor($,Q);if(!X)continue;if(Q==="description"&&!rz(J))continue;if("value"in X){let Y=typeof Q==="string"?[...J,Q]:J;X.value=CQ(X.value,Y)}Object.defineProperty(Z,Q,X)}return Z}function rz($){return $.length===2&&$[0]==="properties"}var r2=A.Unsafe({anyOf:[{type:"array",items:{type:"string"}},{type:"boolean"},{type:"string"}],description:"Skill name(s) to make available (comma-separated), array of strings, or boolean (false disables, true uses default)"}),z4=A.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output filename/path (string), or false to disable file output"}),s2=A.String({enum:["inline","file-only"],description:"Return saved output inline (default) or only a concise file reference. file-only requires output to be a path."}),G4=A.Unsafe({anyOf:[{type:"array",items:{type:"string"}},{type:"boolean"}],description:"Files to read before running (array of filenames), or false to disable"}),B4=A.Unsafe({type:"object",additionalProperties:!0,description:"JSON Schema object for strict structured output. Non-object roots are rejected."}),a2=A.Unsafe({anyOf:[{type:"string",enum:["auto","none","attested","checked","verified","reviewed"]},{type:"boolean",enum:[!1]},{type:"object",additionalProperties:!0}],description:"Optional acceptance policy. Omitted means auto-inferred; verified requires configured runtime commands."}),sz=A.Object({maxTurns:A.Integer({minimum:1}),graceTurns:A.Optional(A.Integer({minimum:0}))},{additionalProperties:!1,description:"Optional assistant-turn budget. At maxTurns the child is asked to wrap up; after graceTurns additional assistant turns it is aborted and partial output is returned."}),az=A.Unsafe({anyOf:[{type:"array",minItems:1,items:{type:"string",minLength:1}},{type:"string",enum:["*"]}]}),t2=A.Object({soft:A.Optional(A.Integer({minimum:1})),hard:A.Integer({minimum:1}),block:A.Optional(az)},{additionalProperties:!1,description:"Optional child tool-call budget. soft nudges the child; after hard, block tools (default read/grep/find/ls, or '*' for all tools) are blocked so the child can finalize."}),tz=A.Object({agent:A.String(),task:A.String(),cwd:A.Optional(A.String()),count:A.Optional(A.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking for this task"})),model:A.Optional(A.String({description:"Override model for this task (e.g. 'google/gemini-3-pro')"})),skill:A.Optional(r2),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)}),ez=A.Object({agent:A.String(),task:A.Optional(A.String({description:"Task template with {task}, {previous}, {chain_dir} variables. Defaults to {previous}."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label for this parallel task."})),as:A.Optional(A.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),count:A.Optional(A.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this task"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)}),$G=A.Object({from:A.Object({output:A.String({description:"Prior named structured output to expand from."}),path:A.String({description:"JSON Pointer into the structured output, e.g. /items."})},{additionalProperties:!1}),item:A.Optional(A.String({description:"Template variable name for each item. Defaults to item."})),key:A.Optional(A.String({description:"JSON Pointer relative to each item for stable child ids."})),maxItems:A.Optional(A.Integer({minimum:0,description:"Required fanout bound unless configured globally."})),onEmpty:A.Optional(A.String({enum:["skip","fail"],description:"Empty input behavior. Defaults to skip."}))},{additionalProperties:!1}),JG=A.Object({agent:A.String(),task:A.Optional(A.String({description:"Task template with {item}, {item.path}, {task}, {previous}, {chain_dir}, and {outputs.name} variables."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label; item templates are supported."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this task"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)},{additionalProperties:!1}),ZG=A.Object({as:A.String({description:"Safe output name for the ordered collected result array."}),outputSchema:A.Optional(B4)},{additionalProperties:!1}),QG=A.Object({agent:A.Optional(A.String({description:"Sequential step agent name"})),task:A.Optional(A.String({description:"Task template with variables: {task}=original request, {previous}=prior step's text response, {chain_dir}=shared folder, {outputs.name}=prior named output. Required for first step, defaults to '{previous}' for subsequent steps."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label for this chain step."})),as:A.Optional(A.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this step"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2),parallel:A.Optional(A.Unsafe({anyOf:[A.Array(ez,{minItems:1,description:"Tasks to run in parallel"}),JG],description:"Static parallel tasks array, or a single dynamic fanout child template when expand/collect are present."})),expand:A.Optional($G),collect:A.Optional(ZG),concurrency:A.Optional(A.Number({description:"Max concurrent tasks (default: 4)"})),failFast:A.Optional(A.Boolean({description:"Stop on first failure (default: false)"})),worktree:A.Optional(A.Boolean({description:"Create isolated git worktrees for each parallel task."}))},{description:"Chain step: use {agent, task?, ...} for sequential, {parallel: [...]} for static concurrent execution, or {expand, parallel: {...}, collect} for dynamic fanout.",additionalProperties:!1}),XG=A.Object({enabled:A.Optional(A.Boolean({description:"Enable/disable subagent control attention tracking for this run"})),needsAttentionAfterMs:A.Optional(A.Integer({minimum:1,description:"No-observed-activity window before a run needs attention"})),activeNoticeAfterMs:A.Optional(A.Integer({minimum:1,description:"Active-long-running notice threshold by elapsed ms (default: 240000)"})),activeNoticeAfterTurns:A.Optional(A.Integer({minimum:1,description:"Optional active-long-running notice threshold by assistant turns (disabled by default)"})),activeNoticeAfterTokens:A.Optional(A.Integer({minimum:1,description:"Optional active-long-running notice threshold by total tokens (disabled by default)"})),failedToolAttemptsBeforeAttention:A.Optional(A.Integer({minimum:1,description:"Consecutive mutating-tool failures before escalating to needs_attention (default: 3)"})),notifyOn:A.Optional(A.Array(A.String({enum:["active_long_running","needs_attention"]}),{description:"Control event types that should notify the parent/orchestrator. Defaults to active_long_running and needs_attention."})),notifyChannels:A.Optional(A.Array(A.String({enum:["event","async","intercom"]}),{description:"Notification channels to use when available. Defaults to event, async, and intercom."}))}),YG=A.Object({agent:A.Optional(A.String({description:"Agent name (SINGLE mode) or target for management get/update/delete. For generic SINGLE work, omit agent; task-only execution uses the bundled default."})),task:A.Optional(A.String({description:"Task (SINGLE mode, optional for self-contained agents)"})),action:A.Optional(A.String({description:"Management/control action only. Must be omitted for execution mode (single, parallel, or chain)."})),id:A.Optional(A.String({description:"Run id or prefix for action='status', action='interrupt', action='resume', action='steer', or action='append-step'."})),runId:A.Optional(A.String({description:"Target run ID for action='interrupt', action='resume', action='steer', or action='append-step'. Defaults to the most recently active controllable run for interrupt. Prefer id for new calls."})),dir:A.Optional(A.String({description:"Async run directory for action='status', action='resume', or action='steer'."})),index:A.Optional(A.Integer({minimum:0,description:"Zero-based child index for actions that target a specific child or transcript."})),view:A.Optional(A.String({enum:["fleet","transcript"],description:"Optional status view. Use view='fleet' for a read-only active foreground/async fleet surface, or view='transcript' with id/dir (and optional index) to tail a run transcript."})),lines:A.Optional(A.Integer({minimum:1,maximum:500,description:"Maximum transcript lines for action='status', view='transcript'. Defaults to 80."})),message:A.Optional(A.String({description:"Follow-up message for action='resume' or non-terminal guidance for action='steer'. Use index to choose a child from multi-child runs."})),schedule:A.Optional(A.String({description:"Explicit one-shot schedule for action='schedule'. Only honored when scheduledRuns.enabled is true. Use '+10m' or a future ISO timestamp with timezone; scheduled runs always launch async with fresh context."})),scheduleName:A.Optional(A.String({description:"Optional display name for action='schedule'."})),chainName:A.Optional(A.String({description:"Chain name for get/update/delete management actions"})),config:A.Optional(A.Unsafe({anyOf:[{type:"object",additionalProperties:!0},{type:"string"}],description:"Agent/chain config for create/update. Object or JSON string; presence of steps creates a chain."})),tasks:A.Optional(A.Array(tz,{description:"PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]"})),concurrency:A.Optional(A.Integer({minimum:1,description:"Top-level PARALLEL mode only: max concurrent tasks. Defaults to config.parallel.concurrency or 4."})),worktree:A.Optional(A.Boolean({description:"Create isolated git worktrees for parallel tasks; requires clean git state."})),chain:A.Optional(A.Array(QG,{description:"CHAIN mode: sequential steps; each result becomes {previous}. append-step takes one tail step and may use {chain_dir}/{outputs.name}."})),context:A.Optional(A.String({enum:["fresh","fork"],description:"'fresh' or 'fork' to branch from parent session. Explicit context overrides every child in the invocation. If omitted, each requested agent uses its own defaultContext; agents without defaultContext: 'fork' run fresh."})),chainDir:A.Optional(A.String({description:"Persistent chain artifact directory; defaults to user-scoped temp storage."})),async:A.Optional(A.Boolean({description:"Run in background (default: false, or per config)"})),timeoutMs:A.Optional(A.Integer({minimum:1,description:"Optional run-level timeout in ms for foreground and async/background runs. Alias of maxRuntimeMs."})),maxRuntimeMs:A.Optional(A.Integer({minimum:1,description:"Alias of timeoutMs for optional run-level timeout in foreground and async/background runs."})),turnBudget:A.Optional(sz),toolBudget:A.Optional(t2),agentScope:A.Optional(A.String({description:"Agent discovery scope: 'user', 'project', or 'both' (default: 'both'; project wins on name collisions)"})),cwd:A.Optional(A.String()),artifacts:A.Optional(A.Boolean({description:"Write debug artifacts (default: true)"})),includeProgress:A.Optional(A.Boolean({description:"Include full progress in result (default: false)"})),share:A.Optional(A.Boolean({description:"Upload session to GitHub Gist for sharing (default: false)"})),sessionDir:A.Optional(A.String({description:"Directory to store session logs (default: temp; enables sessions even if share=false)"})),clarify:A.Optional(A.Boolean({description:"Show TUI to preview/edit before execution. Explicit clarify: true keeps the run foreground for the clarify UI; omitted clarify can still run in the background when async: true is set."})),control:A.Optional(XG),output:A.Optional(A.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output file for single agent (string), or false to disable. Relative paths resolve against cwd."})),outputMode:A.Optional(s2),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for single agent (e.g. 'anthropic/claude-sonnet-4')"})),acceptance:A.Optional(a2)}),SQ=TQ(YG),HG=A.Object({id:A.Optional(A.String({description:"Run id or prefix to wait for one specific run. Omit to wait across every active async run started in this session."})),all:A.Optional(A.Boolean({description:"Wait for ALL active runs to finish. Default false: return as soon as the first run finishes, so a fleet manager can spawn a replacement and wait again. Ignored when id targets a single run."})),timeoutMs:A.Optional(A.Integer({minimum:1,description:"Give up waiting after this many milliseconds (the runs keep going regardless). Defaults to 1800000 (30 minutes)."}))}),lA=TQ(HG);import*as xJ from"node:fs";import*as P9 from"node:path";function RQ(){return P9.join(r$(),"extensions","subagent","config.json")}function UG($=RQ()){if(!xJ.existsSync($))return{};let J=JSON.parse(xJ.readFileSync($,"utf-8"));if(!J||typeof J!=="object"||Array.isArray(J))throw Error(`Subagent config at '${$}' must be a JSON object`);return J}function yQ(){let $=RQ();try{return UG($)}catch(J){console.error(`Failed to load subagent config from '${$}':`,J)}return{}}function jG($){if($){let J=g1.basename($,".jsonl"),Z=g1.dirname($);return g1.join(Z,J)}return W4.mkdtempSync(g1.join(K4.tmpdir(),"dm-subagent-session-"))}function VG($){return $.startsWith("~/")?g1.join(K4.homedir(),$.slice(2)):$}function zG(){return{baseCwd:"",currentSessionId:null,subagentInProgress:!1,subagentSpawns:{sessionId:null,count:0},asyncJobs:new Map,foregroundRuns:new Map,foregroundControls:new Map,lastForegroundControlId:null,pendingForegroundControlNotices:new Map,cleanupTimers:new Map,lastUiContext:null,poller:null,completionSeen:new Map,watcher:null,watcherRestartTimer:null,resultFileCoalescer:{schedule:()=>!1,clear:()=>{}}}}function GG($,J){let Z;try{Z=e6()}catch{return}if(!Z)return;let Q=new Set,X=new Set,Y=new Map,H=setInterval(()=>{try{for(let U of W7(Z)){if(Q.has(U.requestId)||X.has(U.requestId))continue;X.add(U.requestId),(async()=>{try{let j=Y.get(U.requestId);if(!j){let G=!1,z="Control request failed.";try{let V=J.foregroundControls.get(U.targetRunId);if(!V)z=`Nested run ${U.targetRunId} is not active in this fanout child.`;else if(U.action==="interrupt")G=V.interrupt?.()===!0,z=G?`Interrupt requested for nested run ${U.targetRunId}.`:`Nested run ${U.targetRunId} has no active child step to interrupt.`;else if(!U.message?.trim())z="Nested resume requires message.";else if(!V.currentAgent)z=`Nested run ${U.targetRunId} has no active child message route.`;else{let B=V.currentIndex??0,W=m$(U.targetRunId,V.currentAgent,B);G=await P2($.events,W,`Follow-up for nested run ${U.targetRunId} (${V.currentAgent}):
|
|
228
|
+
${Y$}`}],details:A$}}finally{if(n)C2(n)}}async function oz($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:H,runId:U,sessionDirForIndex:j,sessionFileForTask:G,thinkingOverrideForTask:z,shareEnabled:V,artifactConfig:B,artifactsDir:W,onUpdate:K,sessionRoot:F,controlConfig:q,contextPolicy:_}=$,D=D9($,J),O=$.intercomBridge.active?m$(U,Z.agent,0):void 0,f=[],S=[],C=X.find((q$)=>q$.name===Z.agent);if(!C)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let g=OQ({runBudget:$.toolBudget,agentBudget:C.toolBudget,configBudget:$.configToolBudget});if(g.error)return l2(Z,Error(g.error));let w=Y.model?.provider,I=Y.modelRegistry.getAvailable().map(f0),L=Z.task??"",R=W0(Z.model??C.model,Y.model,I,w,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),N=Y0(Z.skill),E=Z.output!==void 0?Z.output:C.output,T=EJ(E,C.output),p=Z.outputMode??"inline",M=e0(J.config.maxSubagentDepth),P=$1(M,C.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let q$=v0(C,{output:T,skills:N}),B$=P0(Q),H$=await Y.ui.custom((K$,A$,y,r)=>new MJ(K$,A$,[C],[L],L,void 0,[q$],I,w,B$,r,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!H$||!H$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};L=H$.templates[0];let Q$=H$.behaviorOverrides[0];if(Q$?.model)R=W0(Q$.model,Y.model,I,w,{scope:$.modelScope,source:"explicit"});if(Q$?.output!==void 0)T=EJ(Q$.output,C.output);if(Q$?.skills!==void 0)N=Q$.skills;if(H$.runInBackground){if(!x1())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let K$=h1(),A$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return p8(K$,{agent:Z.agent,task:F0(_,Z.agent)?t0(L):L,agentConfig:C,ctx:A$,availableModels:I,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?W:void 0,artifactConfig:B,shareEnabled:V,sessionRoot:F,sessionFile:G(Z.agent,0),skills:N===!1?[]:N,output:T,outputMode:p,outputBaseDir:V4(J,W,K$),modelOverride:R,thinkingOverride:z(Z.agent,0),maxSubagentDepth:P,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:q,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(y,r)=>m$(K$,y,r):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:g.toolBudget})}}if(F0(_,Z.agent))L=t0(L);let l=L,m=b1(T,Y.cwd,Q,V4(J,W,U)),k=I0(p,m,`Single run (${Z.agent})`);if(k)return{content:[{type:"text",text:k}],isError:!0,details:{mode:"single",results:[]}};L=TJ(L,m);let t;if(N===!1)t=[];else t=N;let O$=new AbortController,x=J.state.foregroundControls.get(U);if(x)x.currentAgent=Z.agent,x.currentIndex=0,x.currentActivityState=void 0,x.updatedAt=Date.now(),x.interrupt=()=>{if(O$.signal.aborted)return!1;return O$.abort(),x.currentActivityState=void 0,x.updatedAt=Date.now(),!0};let k$=K?(q$)=>{if(x){let B$=q$.details?.progress?.[0];x.currentAgent=Z.agent,x.currentIndex=B$?.index??0,x.currentActivityState=B$?.activityState,x.lastActivityAt=B$?.lastActivityAt,x.currentTool=B$?.currentTool,x.currentToolStartedAt=B$?.currentToolStartedAt,x.currentPath=B$?.currentPath,x.turnCount=B$?.turnCount,x.tokens=B$?.tokens,x.toolCount=B$?.toolCount,x.updatedAt=Date.now()}K(q$)}:void 0,J$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),n=await SJ(Y.cwd,X,Z.agent,L,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:H,interruptSignal:O$.signal,allowIntercomDetach:C.systemPrompt?.includes(K1)===!0,intercomEvents:J.pi.events,runId:U,sessionDir:j(0),sessionFile:G(Z.agent,0),share:V,artifactsDir:B.enabled?W:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:m,outputMode:p,maxSubagentDepth:P,onUpdate:k$,controlConfig:q,onControlEvent:D,intercomSessionName:O,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:x?.nestedRoute,index:0,modelOverride:R,thinkingOverride:z(Z.agent,0),availableModels:I,preferredModelProvider:w,modelScope:$.modelScope,skills:t,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(q$)=>f9(J.state,{runId:U,mode:"single",cwd:Q,index:0,result:q$}),timeoutMs:$.timeoutMs,deadlineAt:J$,turnBudget:$.turnBudget,toolBudget:g.toolBudget});if(x?.currentIndex===0)x.interrupt=void 0,x.currentActivityState=n.progress?.activityState,x.lastActivityAt=n.progress?.lastActivityAt,x.currentTool=n.progress?.currentTool,x.currentToolStartedAt=n.progress?.currentToolStartedAt,x.currentPath=n.progress?.currentPath,x.turnCount=n.progress?.turnCount,x.tokens=n.progress?.tokens,x.toolCount=n.progress?.toolCount,x.updatedAt=Date.now();if(RJ(Z.agent,l,n.exitCode,n.progressSummary?.durationMs??0),n.progress)f.push(n.progress);if(n.artifactPaths)S.push(n.artifactPaths);let h$=D0(n),u=O3({fullOutput:h$,truncatedOutput:n.truncation?.text,outputPath:m,outputMode:n.outputMode,exitCode:n.exitCode,savedPath:n.savedOutputPath,outputReference:n.outputReference,saveError:n.outputSaveError});if(x)e1(x),I1(U,[n],x.nestedChildren);let U$=BJ({mode:"single",runId:U,results:[n],...$.turnBudget?{turnBudget:$.turnBudget}:{},...g.toolBudget?{toolBudget:g.toolBudget}:{},progress:Z.includeProgress?f:void 0,artifacts:S.length?{dir:W,files:S}:void 0,truncation:n.truncation,totalChildUsage:iJ([n]),totalCost:GJ([n])});if(y9(J.state,{runId:U,mode:"single",cwd:Q,results:U$.results}),!n.detached&&!n.interrupted){if(x)e1(x);let q$=await b9({pi:J.pi,intercomBridge:$.intercomBridge,runId:U,mode:"single",details:U$,...x?.nestedChildren?.length?{nestedChildren:x.nestedChildren}:{}});if(q$)return{content:[{type:"text",text:q$.text}],details:q$.details,...n.exitCode!==0?{isError:!0}:{}}}if(n.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:U$};if(n.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:U$};if(n.exitCode!==0)return{content:[{type:"text",text:Tz(n,u.displayOutput)}],details:U$,isError:!0};return{content:[{type:"text",text:u.displayOutput||"(no output)"}],details:U$}}function lz($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function nz($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:lz($),results:[]}}}function _Q($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var pz=new Set(["assistant","default","general","generic","subagent"]);function iz($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((Y)=>Y.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(Boolean($.task?.trim())&&(!Z||pz.has(Z.toLowerCase())))||!J.some((Y)=>Y.name==="worker"))return $;return{...$,agent:"worker"}}function EQ($){let J=async(Q,X,Y,H,U)=>{$.state.baseCwd=U.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let j=_Q(X),G=aV(U.cwd,j.cwd),z=j.cwd===void 0?j:{...j,cwd:G},V=z.action;if(V){if(V==="doctor"){let a=null,i=$.state.currentSessionId,N$;try{a=U.sessionManager.getSessionFile()??null,i=U.sessionManager.getSessionId()}catch(X$){N$=X$ instanceof Error?`${X$.name}: ${X$.message}`:String(X$)}let v;try{v=O8($.pi.getSessionName(),U.sessionManager.getSessionId())}catch(X$){if(!N$)N$=X$ instanceof Error?`${X$.name}: ${X$.message}`:String(X$)}return{content:[{type:"text",text:M7({cwd:G,config:$.config,state:$.state,context:z.context,requestedSessionDir:z.sessionDir,currentSessionFile:a,currentSessionId:i,orchestratorTarget:v,sessionError:N$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(V==="status"){let a=z.id??z.runId,i=n2($),N$=eV(U,$);if(z.view==="fleet")return U4(z,{state:$.state,nested:i,sessionRoots:N$});if(a)try{let v=q1(a,{state:$.state,nested:i});if(v?.kind==="foreground"){let X$=S9($.state,v.id);if(X$){if(z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return BQ(X$)}}}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}else{let v=S9($.state,void 0);if(v&&z.view!=="transcript")return BQ(v);if(v&&z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return U4(z,{state:$.state,nested:i,sessionRoots:N$})}if(V==="resume")return Nz({params:z,requestCwd:G,ctx:U,deps:$});if(V==="steer"){let a=(z.message??z.task??"").trim();if(!a)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let i=z.runId??z.id;if(z.dir)try{let v=g2(z,H0,g$),X$=v.resolvedId??i??C$.basename(v.asyncDir??z.dir);return KQ({state:$.state,runId:X$,message:a,index:z.index,kill:$.kill,location:v})}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}if(!i)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let N$;try{N$=q1(i,{state:$.state,nested:n2($)})}catch(v){return{content:[{type:"text",text:v instanceof Error?v.message:String(v)}],isError:!0,details:{mode:"management",results:[]}}}if(N$?.kind==="nested")return Mz({target:N$,message:a,index:z.index});if(N$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(N$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${i}'.`}],isError:!0,details:{mode:"management",results:[]}};return KQ({state:$.state,runId:N$.id,message:a,index:z.index,kill:$.kill,location:N$.location})}if(V==="append-step")return zz({params:z,requestCwd:G,ctx:U,deps:$});if(V==="schedule"||V==="schedule-list"||V==="schedule-status"||V==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${V}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(z,U)}if(V==="interrupt"){let a=z.runId??z.id,i;if(a)try{i=q1(a,{state:$.state,nested:n2($)})}catch(X$){return{content:[{type:"text",text:X$ instanceof Error?X$.message:String(X$)}],isError:!0,details:{mode:"management",results:[]}}}if(i?.kind==="nested")return Oz(i);let N$=S9($.state,i?.kind==="foreground"?i.id:a);if(N$?.interrupt){if(N$.interrupt())return N$.updatedAt=Date.now(),N$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${N$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${N$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let v=jz($.state,i?.kind==="async"?i.id:a,$.kill,i?.kind==="async"?i.location:void 0);if(v)return v;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!T4.includes(V))return{content:[{type:"text",text:`Unknown action: ${V}. Valid: ${T4.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&sV.has(V))return{content:[{type:"text",text:`Action '${V}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return J7(V,z,{...U,cwd:G,config:$.config})}let{blocked:B,depth:W,maxDepth:K}=R4($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${W}, max=${K}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let F=kz(z);if(F.error)return F.error;let q=F.params,_=GQ(q,W,$.config.forceTopLevelAsync===!0),D=Dz(_);if(D.error)return PJ(_,D.error);let O=bz(_,$.config);if(O.error)return PJ(_,O.error);let f=p2(_.toolBudget,"toolBudget");if(f.error)return PJ(_,f.error);let S=p2($.config.toolBudget,"config.toolBudget");if(S.error)return PJ(_,S.error);let C=x8(_.agentScope),g=_.cwd??U.cwd,w=U.sessionManager.getSessionFile()??null;$.state.currentSessionId=s8(U.sessionManager);let I=$.discoverAgents(g,C),L=I.agents,R=I.modelScope;_=iz(_,L);let N=yz(_,L);_=N.params;let E=O8($.pi.getSessionName(),U.sessionManager.getSessionId()),T=L6({config:$.config.intercomBridge,context:_.context,orchestratorTarget:E}),p=T.active?L.map((a)=>O6(a,T)):L,M=h1().slice(0,8),P=DJ(),l=P?bJ():void 0,m=P??H7(M),k=_.share===!0,t=(_.chain?.length??0)>0,O$=(_.tasks?.length??0)>0,x=!t&&!O$&&Boolean(_.agent),k$=t&&_.clarify===!0&&U.hasUI&&!(_.chain?.some(T$)??!1),J$=Sz(_,p,t,O$,x,k$);if(J$)return J$;let n=()=>{return},h$=()=>{return};try{let a=f7(U.sessionManager,N.usesFork?"fork":void 0);n=a.sessionFileForIndex,h$=a.thinkingOverrideForIndex}catch(a){return l2(_,a)}let u=_.async??$.asyncByDefault,U$=(t||O$)&&u&&_.clarify===!0,q$=u&&_.clarify!==!0,B$=M8($.config.control,_.control),H$={...J8,enabled:_.artifacts!==!1},Q$=qJ(w,g),K$;if(_.sessionDir)K$=C$.resolve($.expandTilde(_.sessionDir));else{let a=$.config.defaultSessionDir?C$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(w);K$=C$.join(a,M)}try{s0.mkdirSync(K$,{recursive:!0})}catch(a){let i=a instanceof Error?a.message:String(a);return l2(_,Error(`Failed to create session directory '${K$}': ${i}`))}let A$=(a)=>C$.join(K$,`run-${a??0}`),y=(a,i)=>F0(N,a)?n(i):void 0,r=(a,i)=>F0(N,a)?h$(i):void 0,p$=(a,i)=>y(a,i)??C$.join(A$(i),"session.jsonl"),Z$=(a)=>C$.join(A$(a),"session.jsonl");try{Pz(_,N,y,$.config.chain?.dynamicFanout?.maxItems)}catch(a){return l2(_,a)}let d$=Rz(_,$.config.chain?.dynamicFanout?.maxItems);if(d$)return d$;let E$=H?(a)=>H(v1(a,_.context)):void 0,Y$=t?"chain":O$?"parallel":"single",F$=$z({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:Jz(_,$.config),mode:Y$});if(F$)return F$;let V$={params:_,effectiveCwd:g,ctx:U,signal:Y,onUpdate:E$,agents:p,runId:M,shareEnabled:k,sessionRoot:K$,sessionDirForIndex:A$,sessionFileForIndex:Z$,sessionFileForTask:p$,thinkingOverrideForTask:r,artifactConfig:H$,artifactsDir:Q$,backgroundRequestedWhileClarifying:U$,effectiveAsync:q$,controlConfig:B$,intercomBridge:T,nestedRoute:m,timeoutMs:D.timeoutMs,turnBudget:O.turnBudget,toolBudget:f.toolBudget,configToolBudget:S.toolBudget,contextPolicy:N,modelScope:R},c=q$?void 0:{runId:M,mode:Y$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:m,interrupt:void 0};if(c)$.state.foregroundControls.set(M,c),$.state.lastForegroundControlId=M;let y$=(a,i)=>{if(!P||!l)return;let N$=Date.now(),v=i?.details,X$=a==="subagent.nested.started"?"running":i?.isError||v?.results.some((b)=>b.exitCode!==0)?"failed":v?.results.some((b)=>b.interrupted)?"paused":"complete",i$=i?.isError?i.content.find((b)=>b.type==="text")?.text:void 0,P$=O$&&_.tasks?_.tasks.map((b)=>b.agent):t&&_.chain?_.chain.flatMap((b)=>T$(b)?b.parallel.map((W$)=>W$.agent):[b.agent]):_.agent?[_.agent]:[],M1=T.active&&P$[0]?m$(M,P$[0],0):void 0;try{t1(P,{type:a,ts:N$,parentRunId:l.parentRunId,parentStepIndex:l.parentStepIndex,child:{id:M,parentRunId:l.parentRunId,parentStepIndex:l.parentStepIndex,depth:l.depth,path:l.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:M1,intercomTarget:M1,ownerState:X$==="running"?"live":"gone",mode:Y$,state:X$,agent:P$[0],agents:P$,startedAt:c?.startedAt??N$,...X$!=="running"?{endedAt:N$}:{},lastUpdate:N$,...v?.totalCost?{totalCost:v.totalCost}:{},...i$?{error:i$}:{},...v?.results.length?{steps:v.results.map((b)=>({agent:b.agent,status:b.interrupted?"paused":b.exitCode===0?"complete":"failed",...b.sessionFile?{sessionFile:b.sessionFile}:{},...b.error?{error:b.error}:{}}))}:{}}})}catch(b){console.error("Failed to emit nested foreground status event:",b)}},s$=!1;try{let a=xz(V$,$);if(a)return v1(a,_.context);if(c)y$("subagent.nested.started"),s$=!0;if(t&&_.chain){let i=await vz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}if(O$&&_.tasks){let i=await dz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}if(x){let i=await oz(V$,$);return y$("subagent.nested.completed",i),v1(i,_.context)}}catch(a){let i=l2(_,a);if(s$)y$("subagent.nested.completed",i);return i}finally{if(c){if(N7($.state,M),$.state.foregroundControls.delete(M),$.state.lastForegroundControlId===M)$.state.lastForegroundControlId=null}}return v1({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,H,U)=>{let j=_Q(X);if(j.action)return J(Q,j,Y,H,U);if($.state.subagentInProgress===!0)return nz(j);$.state.subagentInProgress=!0;try{return await J(Q,j,Y,H,U)}finally{$.state.subagentInProgress=!1}}}}import{Type as A}from"typebox";function TQ($){return CQ($,[])}function CQ($,J){if(!$||typeof $!=="object")return $;let Z=Array.isArray($)?[]:Object.create(Object.getPrototypeOf($));for(let Q of Reflect.ownKeys($)){let X=Object.getOwnPropertyDescriptor($,Q);if(!X)continue;if(Q==="description"&&!rz(J))continue;if("value"in X){let Y=typeof Q==="string"?[...J,Q]:J;X.value=CQ(X.value,Y)}Object.defineProperty(Z,Q,X)}return Z}function rz($){return $.length===2&&$[0]==="properties"}var r2=A.Unsafe({anyOf:[{type:"array",items:{type:"string"}},{type:"boolean"},{type:"string"}],description:"Skill name(s) to make available (comma-separated), array of strings, or boolean (false disables, true uses default)"}),z4=A.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output filename/path (string), or false to disable file output"}),s2=A.String({enum:["inline","file-only"],description:"Return saved output inline (default) or only a concise file reference. file-only requires output to be a path."}),G4=A.Unsafe({anyOf:[{type:"array",items:{type:"string"}},{type:"boolean"}],description:"Files to read before running (array of filenames), or false to disable"}),B4=A.Unsafe({type:"object",additionalProperties:!0,description:"JSON Schema object for strict structured output. Non-object roots are rejected."}),a2=A.Unsafe({anyOf:[{type:"string",enum:["auto","none","attested","checked","verified","reviewed"]},{type:"boolean",enum:[!1]},{type:"object",additionalProperties:!0}],description:"Optional acceptance policy. Omitted means auto-inferred; verified requires configured runtime commands."}),sz=A.Object({maxTurns:A.Integer({minimum:1}),graceTurns:A.Optional(A.Integer({minimum:0}))},{additionalProperties:!1,description:"Optional assistant-turn budget. At maxTurns the child is asked to wrap up; after graceTurns additional assistant turns it is aborted and partial output is returned."}),az=A.Unsafe({anyOf:[{type:"array",minItems:1,items:{type:"string",minLength:1}},{type:"string",enum:["*"]}]}),t2=A.Object({soft:A.Optional(A.Integer({minimum:1})),hard:A.Integer({minimum:1}),block:A.Optional(az)},{additionalProperties:!1,description:"Optional child tool-call budget. soft nudges the child; after hard, block tools (default read/grep/find/ls, or '*' for all tools) are blocked so the child can finalize."}),tz=A.Object({agent:A.String(),task:A.String(),cwd:A.Optional(A.String()),count:A.Optional(A.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking for this task"})),model:A.Optional(A.String({description:"Override model for this task (e.g. 'google/gemini-3-pro')"})),skill:A.Optional(r2),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)}),ez=A.Object({agent:A.String(),task:A.Optional(A.String({description:"Task template with {task}, {previous}, {chain_dir} variables. Defaults to {previous}."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label for this parallel task."})),as:A.Optional(A.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),count:A.Optional(A.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this task"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)}),$G=A.Object({from:A.Object({output:A.String({description:"Prior named structured output to expand from."}),path:A.String({description:"JSON Pointer into the structured output, e.g. /items."})},{additionalProperties:!1}),item:A.Optional(A.String({description:"Template variable name for each item. Defaults to item."})),key:A.Optional(A.String({description:"JSON Pointer relative to each item for stable child ids."})),maxItems:A.Optional(A.Integer({minimum:0,description:"Required fanout bound unless configured globally."})),onEmpty:A.Optional(A.String({enum:["skip","fail"],description:"Empty input behavior. Defaults to skip."}))},{additionalProperties:!1}),JG=A.Object({agent:A.String(),task:A.Optional(A.String({description:"Task template with {item}, {item.path}, {task}, {previous}, {chain_dir}, and {outputs.name} variables."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label; item templates are supported."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this task"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2)},{additionalProperties:!1}),ZG=A.Object({as:A.String({description:"Safe output name for the ordered collected result array."}),outputSchema:A.Optional(B4)},{additionalProperties:!1}),QG=A.Object({agent:A.Optional(A.String({description:"Sequential step agent name"})),task:A.Optional(A.String({description:"Task template with variables: {task}=original request, {previous}=prior step's text response, {chain_dir}=shared folder, {outputs.name}=prior named output. Required for first step, defaults to '{previous}' for subsequent steps."})),phase:A.Optional(A.String({description:"Optional phase/group label for status and graph rendering."})),label:A.Optional(A.String({description:"Optional user-facing label for this chain step."})),as:A.Optional(A.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:A.Optional(B4),cwd:A.Optional(A.String()),output:A.Optional(z4),outputMode:A.Optional(s2),reads:A.Optional(G4),progress:A.Optional(A.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for this step"})),toolBudget:A.Optional(t2),acceptance:A.Optional(a2),parallel:A.Optional(A.Unsafe({anyOf:[A.Array(ez,{minItems:1,description:"Tasks to run in parallel"}),JG],description:"Static parallel tasks array, or a single dynamic fanout child template when expand/collect are present."})),expand:A.Optional($G),collect:A.Optional(ZG),concurrency:A.Optional(A.Number({description:"Max concurrent tasks (default: 4)"})),failFast:A.Optional(A.Boolean({description:"Stop on first failure (default: false)"})),worktree:A.Optional(A.Boolean({description:"Create isolated git worktrees for each parallel task."}))},{description:"Chain step: use {agent, task?, ...} for sequential, {parallel: [...]} for static concurrent execution, or {expand, parallel: {...}, collect} for dynamic fanout.",additionalProperties:!1}),XG=A.Object({enabled:A.Optional(A.Boolean({description:"Enable/disable subagent control attention tracking for this run"})),needsAttentionAfterMs:A.Optional(A.Integer({minimum:1,description:"No-observed-activity window before a run needs attention"})),activeNoticeAfterMs:A.Optional(A.Integer({minimum:1,description:"Active-long-running notice threshold by elapsed ms (default: 240000)"})),activeNoticeAfterTurns:A.Optional(A.Integer({minimum:1,description:"Optional active-long-running notice threshold by assistant turns (disabled by default)"})),activeNoticeAfterTokens:A.Optional(A.Integer({minimum:1,description:"Optional active-long-running notice threshold by total tokens (disabled by default)"})),failedToolAttemptsBeforeAttention:A.Optional(A.Integer({minimum:1,description:"Consecutive mutating-tool failures before escalating to needs_attention (default: 3)"})),notifyOn:A.Optional(A.Array(A.String({enum:["active_long_running","needs_attention"]}),{description:"Control event types that should notify the parent/orchestrator. Defaults to active_long_running and needs_attention."})),notifyChannels:A.Optional(A.Array(A.String({enum:["event","async","intercom"]}),{description:"Notification channels to use when available. Defaults to event, async, and intercom."}))}),YG=A.Object({agent:A.Optional(A.String({description:"Agent name (SINGLE mode) or target for management get/update/delete. For generic SINGLE work, omit agent; task-only execution uses the bundled default."})),task:A.Optional(A.String({description:"Task (SINGLE mode, optional for self-contained agents)"})),action:A.Optional(A.String({description:"Management/control action only. Must be omitted for execution mode (single, parallel, or chain)."})),id:A.Optional(A.String({description:"Run id or prefix for action='status', action='interrupt', action='resume', action='steer', or action='append-step'."})),runId:A.Optional(A.String({description:"Target run ID for action='interrupt', action='resume', action='steer', or action='append-step'. Defaults to the most recently active controllable run for interrupt. Prefer id for new calls."})),dir:A.Optional(A.String({description:"Async run directory for action='status', action='resume', or action='steer'."})),index:A.Optional(A.Integer({minimum:0,description:"Zero-based child index for actions that target a specific child or transcript."})),view:A.Optional(A.String({enum:["fleet","transcript"],description:"Optional status view. Use view='fleet' for a read-only active foreground/async fleet surface, or view='transcript' with id/dir (and optional index) to tail a run transcript."})),lines:A.Optional(A.Integer({minimum:1,maximum:500,description:"Maximum transcript lines for action='status', view='transcript'. Defaults to 80."})),message:A.Optional(A.String({description:"Follow-up message for action='resume' or non-terminal guidance for action='steer'. Use index to choose a child from multi-child runs."})),schedule:A.Optional(A.String({description:"Explicit one-shot schedule for action='schedule'. Only honored when scheduledRuns.enabled is true. Use '+10m' or a future ISO timestamp with timezone; scheduled runs always launch async with fresh context."})),scheduleName:A.Optional(A.String({description:"Optional display name for action='schedule'."})),chainName:A.Optional(A.String({description:"Chain name for get/update/delete management actions"})),config:A.Optional(A.Unsafe({anyOf:[{type:"object",additionalProperties:!0},{type:"string"}],description:"Agent/chain config for create/update. Object or JSON string; presence of steps creates a chain."})),tasks:A.Optional(A.Array(tz,{description:"PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]"})),concurrency:A.Optional(A.Integer({minimum:1,description:"Top-level PARALLEL mode only: max concurrent tasks. Defaults to config.parallel.concurrency or 4."})),worktree:A.Optional(A.Boolean({description:"Create isolated git worktrees for parallel tasks; requires clean git state."})),chain:A.Optional(A.Array(QG,{description:"CHAIN mode: sequential steps; each result becomes {previous}. append-step takes one tail step and may use {chain_dir}/{outputs.name}."})),context:A.Optional(A.String({enum:["fresh","fork"],description:"'fresh' or 'fork' to branch from parent session. Explicit context overrides every child in the invocation. If omitted, each requested agent uses its own defaultContext; agents without defaultContext: 'fork' run fresh."})),chainDir:A.Optional(A.String({description:"Persistent chain artifact directory; defaults to user-scoped temp storage."})),async:A.Optional(A.Boolean({description:"Run in background (default: false, or per config)"})),timeoutMs:A.Optional(A.Integer({minimum:1,description:"Optional run-level timeout in ms for foreground and async/background runs. Alias of maxRuntimeMs."})),maxRuntimeMs:A.Optional(A.Integer({minimum:1,description:"Alias of timeoutMs for optional run-level timeout in foreground and async/background runs."})),turnBudget:A.Optional(sz),toolBudget:A.Optional(t2),agentScope:A.Optional(A.String({description:"Agent discovery scope: 'user', 'project', or 'both' (default: 'both'; project wins on name collisions)"})),cwd:A.Optional(A.String()),artifacts:A.Optional(A.Boolean({description:"Write debug artifacts (default: true)"})),includeProgress:A.Optional(A.Boolean({description:"Include full progress in result (default: false)"})),share:A.Optional(A.Boolean({description:"Upload session to GitHub Gist for sharing (default: false)"})),sessionDir:A.Optional(A.String({description:"Directory to store session logs (default: temp; enables sessions even if share=false)"})),clarify:A.Optional(A.Boolean({description:"Show TUI to preview/edit before execution. Explicit clarify: true keeps the run foreground for the clarify UI; omitted clarify can still run in the background when async: true is set."})),control:A.Optional(XG),output:A.Optional(A.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output file for single agent (string), or false to disable. Relative paths resolve against cwd."})),outputMode:A.Optional(s2),skill:A.Optional(r2),model:A.Optional(A.String({description:"Override model for single agent (e.g. 'anthropic/claude-sonnet-4')"})),acceptance:A.Optional(a2)}),SQ=TQ(YG),HG=A.Object({id:A.Optional(A.String({description:"Run id or prefix to wait for one specific run. Omit to wait across every active async run started in this session."})),all:A.Optional(A.Boolean({description:"Wait for ALL active runs to finish. Default false: return as soon as the first run finishes, so a fleet manager can spawn a replacement and wait again. Ignored when id targets a single run."})),timeoutMs:A.Optional(A.Integer({minimum:1,description:"Give up waiting after this many milliseconds (the runs keep going regardless). Defaults to 1800000 (30 minutes)."}))}),lA=TQ(HG);import*as xJ from"node:fs";import*as P9 from"node:path";function RQ(){return P9.join(r$(),"extensions","subagent","config.json")}function UG($=RQ()){if(!xJ.existsSync($))return{};let J=JSON.parse(xJ.readFileSync($,"utf-8"));if(!J||typeof J!=="object"||Array.isArray(J))throw Error(`Subagent config at '${$}' must be a JSON object`);return J}function yQ(){let $=RQ();try{return UG($)}catch(J){console.error(`Failed to load subagent config from '${$}':`,J)}return{}}function jG($){if($){let J=g1.basename($,".jsonl"),Z=g1.dirname($);return g1.join(Z,J)}return W4.mkdtempSync(g1.join(K4.tmpdir(),"dm-subagent-session-"))}function VG($){return $.startsWith("~/")?g1.join(K4.homedir(),$.slice(2)):$}function zG(){return{baseCwd:"",currentSessionId:null,subagentInProgress:!1,subagentSpawns:{sessionId:null,count:0},asyncJobs:new Map,foregroundRuns:new Map,foregroundControls:new Map,lastForegroundControlId:null,pendingForegroundControlNotices:new Map,cleanupTimers:new Map,lastUiContext:null,poller:null,completionSeen:new Map,watcher:null,watcherRestartTimer:null,resultFileCoalescer:{schedule:()=>!1,clear:()=>{}}}}function GG($,J){let Z;try{Z=e6()}catch{return}if(!Z)return;let Q=new Set,X=new Set,Y=new Map,H=setInterval(()=>{try{for(let U of W7(Z)){if(Q.has(U.requestId)||X.has(U.requestId))continue;X.add(U.requestId),(async()=>{try{let j=Y.get(U.requestId);if(!j){let G=!1,z="Control request failed.";try{let V=J.foregroundControls.get(U.targetRunId);if(!V)z=`Nested run ${U.targetRunId} is not active in this fanout child.`;else if(U.action==="interrupt")G=V.interrupt?.()===!0,z=G?`Interrupt requested for nested run ${U.targetRunId}.`:`Nested run ${U.targetRunId} has no active child step to interrupt.`;else if(!U.message?.trim())z="Nested resume requires message.";else if(!V.currentAgent)z=`Nested run ${U.targetRunId} has no active child message route.`;else{let B=V.currentIndex??0,W=m$(U.targetRunId,V.currentAgent,B);G=await P2($.events,W,`Follow-up for nested run ${U.targetRunId} (${V.currentAgent}):
|
|
229
229
|
|
|
230
230
|
${U.message.trim()}`,500,{source:"nested-resume",runId:U.targetRunId,agent:V.currentAgent,index:B}),z=G?`Delivered follow-up to live nested run ${U.targetRunId}.`:`Nested child intercom target is not registered: ${W}`}}catch(V){z=V instanceof Error?V.message:String(V)}j={ts:Date.now(),requestId:U.requestId,targetRunId:U.targetRunId,ok:G,message:z}}try{K7(Z,j)}catch(G){Y.set(U.requestId,j),console.error(`Failed to write nested control result for request '${U.requestId}' targeting '${U.targetRunId}' via inbox '${Z.controlInbox}'; keeping request for retry:`,G);return}Y.delete(U.requestId),Q.add(U.requestId);try{W4.unlinkSync(U.filePath)}catch{}}finally{X.delete(U.requestId)}})()}}catch(U){console.error(`Failed to poll nested control inbox '${Z.controlInbox}' for root '${Z.rootRunId}':`,U)}},200);return H.unref?.(),H}function BG($){if(process.env[D6]!=="1"||process.env[b6]!=="1")return;let J=globalThis,Z="__piSubagentFanoutChildRegisteredApis",Q=J[Z]instanceof WeakSet?J[Z]:new WeakSet;if(J[Z]=Q,Q.has($))return;Q.add($);let X=yQ(),Y=zG(),H=EQ({pi:$,state:Y,config:X,asyncByDefault:X.asyncByDefault===!0,tempArtifactsDir:qJ(null),getSubagentSessionRoot:jG,expandTilde:VG,discoverAgents:zZ,allowMutatingManagementActions:!1}),U={name:"subagent",label:"Subagent",description:["Delegate to subagents from child-safe fanout mode.","Allowed management/control actions: list, get, status, interrupt, resume, steer, append-step, doctor.","Agent config mutation actions (create, update, delete, eject, disable, enable, reset) are blocked in this mode."].join(`
|
|
231
231
|
`),parameters:SQ,execute(j,G,z,V,B){return H.execute(j,G,z,V,B)}};$.registerTool(U),GG($,Y)}export{BG as default};
|
|
@@ -228,7 +228,7 @@ ${K$}
|
|
|
228
228
|
|
|
229
229
|
${U$}`:`${N$}
|
|
230
230
|
|
|
231
|
-
${K$}`}],details:q$}}finally{if(l)rJ(l)}}async function wA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:z,runId:H,sessionDirForIndex:V,sessionFileForTask:K,thinkingOverrideForTask:U,shareEnabled:G,artifactConfig:B,artifactsDir:W,onUpdate:O,sessionRoot:A,controlConfig:L,contextPolicy:_}=$,M=dZ($,J),F=$.intercomBridge.active?$0(H,Z.agent,0):void 0,R=[],C=[],T=X.find((F$)=>F$.name===Z.agent);if(!T)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let I=lz({runBudget:$.toolBudget,agentBudget:T.toolBudget,configBudget:$.configToolBudget});if(I.error)return K4(Z,Error(I.error));let S=Y.model?.provider,j=Y.modelRegistry.getAvailable().map(A0),E=Z.task??"",k=T0(Z.model??T.model,Y.model,j,S,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),D=O0(Z.skill),q=Z.output!==void 0?Z.output:T.output,f=L8(q,T.output),b=Z.outputMode??"inline",y=B1(J.config.maxSubagentDepth),h=W1(y,T.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let F$=e0(T,{output:f,skills:D}),V$=t0(Q),J$=await Y.ui.custom((O$,q$,m,a)=>new M8(O$,q$,[T],[E],E,void 0,[F$],j,S,V$,a,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!J$||!J$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};E=J$.templates[0];let H$=J$.behaviorOverrides[0];if(H$?.model)k=T0(H$.model,Y.model,j,S,{scope:$.modelScope,source:"explicit"});if(H$?.output!==void 0)f=L8(H$.output,T.output);if(H$?.skills!==void 0)D=H$.skills;if(J$.runInBackground){if(!M2())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let O$=L2(),q$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return h6(O$,{agent:Z.agent,task:y0(_,Z.agent)?K1(E):E,agentConfig:T,ctx:q$,availableModels:j,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?W:void 0,artifactConfig:B,shareEnabled:G,sessionRoot:A,sessionFile:K(Z.agent,0),skills:D===!1?[]:D,output:f,outputMode:b,outputBaseDir:e6(J,W,O$),modelOverride:k,thinkingOverride:U(Z.agent,0),maxSubagentDepth:h,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:L,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(m,a)=>$0(O$,m,a):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:I.toolBudget})}}if(y0(_,Z.agent))E=K1(E);let n=E,g=W2(f,Y.cwd,Q,e6(J,W,H)),P=s0(b,g,`Single run (${Z.agent})`);if(P)return{content:[{type:"text",text:P}],isError:!0,details:{mode:"single",results:[]}};E=N8(E,g);let w;if(D===!1)w=[];else w=D;let v=new AbortController,x=J.state.foregroundControls.get(H);if(x)x.currentAgent=Z.agent,x.currentIndex=0,x.currentActivityState=void 0,x.updatedAt=Date.now(),x.interrupt=()=>{if(v.signal.aborted)return!1;return v.abort(),x.currentActivityState=void 0,x.updatedAt=Date.now(),!0};let $$=O?(F$)=>{if(x){let V$=F$.details?.progress?.[0];x.currentAgent=Z.agent,x.currentIndex=V$?.index??0,x.currentActivityState=V$?.activityState,x.lastActivityAt=V$?.lastActivityAt,x.currentTool=V$?.currentTool,x.currentToolStartedAt=V$?.currentToolStartedAt,x.currentPath=V$?.currentPath,x.turnCount=V$?.turnCount,x.tokens=V$?.tokens,x.toolCount=V$?.toolCount,x.updatedAt=Date.now()}O(F$)}:void 0,c=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),l=await C8(Y.cwd,X,Z.agent,E,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:z,interruptSignal:v.signal,allowIntercomDetach:T.systemPrompt?.includes(v1)===!0,intercomEvents:J.pi.events,runId:H,sessionDir:V(0),sessionFile:K(Z.agent,0),share:G,artifactsDir:B.enabled?W:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:g,outputMode:b,maxSubagentDepth:h,onUpdate:$$,controlConfig:L,onControlEvent:M,intercomSessionName:F,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:x?.nestedRoute,index:0,modelOverride:k,thinkingOverride:U(Z.agent,0),availableModels:j,preferredModelProvider:S,modelScope:$.modelScope,skills:w,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(F$)=>nZ(J.state,{runId:H,mode:"single",cwd:Q,index:0,result:F$}),timeoutMs:$.timeoutMs,deadlineAt:c,turnBudget:$.turnBudget,toolBudget:I.toolBudget});if(x?.currentIndex===0)x.interrupt=void 0,x.currentActivityState=l.progress?.activityState,x.lastActivityAt=l.progress?.lastActivityAt,x.currentTool=l.progress?.currentTool,x.currentToolStartedAt=l.progress?.currentToolStartedAt,x.currentPath=l.progress?.currentPath,x.turnCount=l.progress?.turnCount,x.tokens=l.progress?.tokens,x.toolCount=l.progress?.toolCount,x.updatedAt=Date.now();if(T8(Z.agent,n,l.exitCode,l.progressSummary?.durationMs??0),l.progress)R.push(l.progress);if(l.artifactPaths)C.push(l.artifactPaths);let D$=U0(l),d=eX({fullOutput:D$,truncatedOutput:l.truncation?.text,outputPath:g,outputMode:l.outputMode,exitCode:l.exitCode,savedPath:l.savedOutputPath,outputReference:l.outputReference,saveError:l.outputSaveError});if(x)d2(x),d1(H,[l],x.nestedChildren);let z$=H8({mode:"single",runId:H,results:[l],...$.turnBudget?{turnBudget:$.turnBudget}:{},...I.toolBudget?{toolBudget:I.toolBudget}:{},progress:Z.includeProgress?R:void 0,artifacts:C.length?{dir:W,files:C}:void 0,truncation:l.truncation,totalChildUsage:zJ([l]),totalCost:z8([l])});if(uZ(J.state,{runId:H,mode:"single",cwd:Q,results:z$.results}),!l.detached&&!l.interrupted){if(x)d2(x);let F$=await lZ({pi:J.pi,intercomBridge:$.intercomBridge,runId:H,mode:"single",details:z$,...x?.nestedChildren?.length?{nestedChildren:x.nestedChildren}:{}});if(F$)return{content:[{type:"text",text:F$.text}],details:F$.details,...l.exitCode!==0?{isError:!0}:{}}}if(l.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:z$};if(l.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:z$};if(l.exitCode!==0)return{content:[{type:"text",text:KA(l,d.displayOutput)}],details:z$,isError:!0};return{content:[{type:"text",text:d.displayOutput||"(no output)"}],details:z$}}function kA($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function IA($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:kA($),results:[]}}}function cz($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var PA=new Set(["assistant","default","general","generic","subagent"]);function bA($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((X)=>X.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(!Z&&Boolean($.task?.trim())||Boolean(Z&&PA.has(Z.toLowerCase())))||!J.some((X)=>X.name==="worker"))return $;return{...$,agent:"worker"}}function rz($){let J=async(Q,X,Y,z,H)=>{$.state.baseCwd=H.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let V=cz(X),K=gO(H.cwd,V.cwd),U=V.cwd===void 0?V:{...V,cwd:K},G=U.action;if(G){if(G==="doctor"){let Z$=null,t=$.state.currentSessionId,f$;try{Z$=H.sessionManager.getSessionFile()??null,t=H.sessionManager.getSessionId()}catch(G$){f$=G$ instanceof Error?`${G$.name}: ${G$.message}`:String(G$)}let o;try{o=G6($.pi.getSessionName(),H.sessionManager.getSessionId())}catch(G$){if(!f$)f$=G$ instanceof Error?`${G$.name}: ${G$.message}`:String(G$)}return{content:[{type:"text",text:aY({cwd:K,config:$.config,state:$.state,context:U.context,requestedSessionDir:U.sessionDir,currentSessionFile:Z$,currentSessionId:t,orchestratorTarget:o,sessionError:f$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(G==="status"){let Z$=U.id??U.runId,t=B4($),f$=mO(H,$);if(U.view==="fleet")return a6(U,{state:$.state,nested:t,sessionRoots:f$});if(Z$)try{let o=o1(Z$,{state:$.state,nested:t});if(o?.kind==="foreground"){let G$=mZ($.state,o.id);if(G$){if(U.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return gz(G$)}}}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}else{let o=mZ($.state,void 0);if(o&&U.view!=="transcript")return gz(o);if(o&&U.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return a6(U,{state:$.state,nested:t,sessionRoots:f$})}if(G==="resume")return UA({params:U,requestCwd:K,ctx:H,deps:$});if(G==="steer"){let Z$=(U.message??U.task??"").trim();if(!Z$)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let t=U.runId??U.id;if(U.dir)try{let o=i2(U,d$,w$),G$=o.resolvedId??t??y$.basename(o.asyncDir??U.dir);return mz({state:$.state,runId:G$,message:Z$,index:U.index,kill:$.kill,location:o})}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}if(!t)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let f$;try{f$=o1(t,{state:$.state,nested:B4($)})}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}if(f$?.kind==="nested")return VA({target:f$,message:Z$,index:U.index});if(f$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(f$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${t}'.`}],isError:!0,details:{mode:"management",results:[]}};return mz({state:$.state,runId:f$.id,message:Z$,index:U.index,kill:$.kill,location:f$.location})}if(G==="append-step")return aO({params:U,requestCwd:K,ctx:H,deps:$});if(G==="schedule"||G==="schedule-list"||G==="schedule-status"||G==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${G}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(U,H)}if(G==="interrupt"){let Z$=U.runId??U.id,t;if(Z$)try{t=o1(Z$,{state:$.state,nested:B4($)})}catch(G$){return{content:[{type:"text",text:G$ instanceof Error?G$.message:String(G$)}],isError:!0,details:{mode:"management",results:[]}}}if(t?.kind==="nested")return zA(t);let f$=mZ($.state,t?.kind==="foreground"?t.id:Z$);if(f$?.interrupt){if(f$.interrupt())return f$.updatedAt=Date.now(),f$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${f$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${f$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let o=rO($.state,t?.kind==="async"?t.id:Z$,$.kill,t?.kind==="async"?t.location:void 0);if(o)return o;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!w9.includes(G))return{content:[{type:"text",text:`Unknown action: ${G}. Valid: ${w9.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&vO.has(G))return{content:[{type:"text",text:`Action '${G}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return bY(G,U,{...H,cwd:K,config:$.config})}let{blocked:B,depth:W,maxDepth:O}=P9($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${W}, max=${O}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let A=NA(U);if(A.error)return A.error;let L=A.params,_=vz(L,W,$.config.forceTopLevelAsync===!0),M=_A(_);if(M.error)return g8(_,M.error);let F=MA(_,$.config);if(F.error)return g8(_,F.error);let R=W4(_.toolBudget,"toolBudget");if(R.error)return g8(_,R.error);let C=W4($.config.toolBudget,"config.toolBudget");if(C.error)return g8(_,C.error);let T=y6(_.agentScope),I=_.cwd??H.cwd,S=H.sessionManager.getSessionFile()??null;$.state.currentSessionId=I1(H.sessionManager);let j=$.discoverAgents(I,T),E=j.agents,k=j.modelScope;_=bA(_,E);let D=OA(_,E);_=D.params;let q=G6($.pi.getSessionName(),H.sessionManager.getSessionId()),f=w5({config:$.config.intercomBridge,context:_.context,orchestratorTarget:q}),b=f.active?E.map((Z$)=>k5(Z$,f)):E,y=L2().slice(0,8),h=D8(),n=h?S8():void 0,g=h??mY(y),P=_.share===!0,w=(_.chain?.length??0)>0,v=(_.tasks?.length??0)>0,x=!w&&!v&&Boolean(_.agent),$$=w&&_.clarify===!0&&H.hasUI&&!(_.chain?.some(T$)??!1),c=WA(_,b,w,v,x,$$);if(c)return c;let l=()=>{return},D$=()=>{return};try{let Z$=zz(H.sessionManager,D.usesFork?"fork":void 0);l=Z$.sessionFileForIndex,D$=Z$.thinkingOverrideForIndex}catch(Z$){return K4(_,Z$)}let d=_.async??$.asyncByDefault,z$=(w||v)&&d&&_.clarify===!0,F$=d&&_.clarify!==!0,V$=B6($.config.control,_.control),J$={...j2,enabled:_.artifacts!==!1},H$=P2(S,I),O$;if(_.sessionDir)O$=y$.resolve($.expandTilde(_.sessionDir));else{let Z$=$.config.defaultSessionDir?y$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(S);O$=y$.join(Z$,y)}try{U1.mkdirSync(O$,{recursive:!0})}catch(Z$){let t=Z$ instanceof Error?Z$.message:String(Z$);return K4(_,Error(`Failed to create session directory '${O$}': ${t}`))}let q$=(Z$)=>y$.join(O$,`run-${Z$??0}`),m=(Z$,t)=>y0(D,Z$)?l(t):void 0,a=(Z$,t)=>y0(D,Z$)?D$(t):void 0,s$=(Z$,t)=>m(Z$,t)??y$.join(q$(t),"session.jsonl"),U$=(Z$)=>y$.join(q$(Z$),"session.jsonl");try{EA(_,D,m,$.config.chain?.dynamicFanout?.maxItems)}catch(Z$){return K4(_,Z$)}let a$=FA(_,$.config.chain?.dynamicFanout?.maxItems);if(a$)return a$;let R$=z?(Z$)=>z(q2(Z$,_.context)):void 0,K$=w?"chain":v?"parallel":"single",N$=cO({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:uO(_,$.config),mode:K$});if(N$)return N$;let W$={params:_,effectiveCwd:I,ctx:H,signal:Y,onUpdate:R$,agents:b,runId:y,shareEnabled:P,sessionRoot:O$,sessionDirForIndex:q$,sessionFileForIndex:U$,sessionFileForTask:s$,thinkingOverrideForTask:a,artifactConfig:J$,artifactsDir:H$,backgroundRequestedWhileClarifying:z$,effectiveAsync:F$,controlConfig:V$,intercomBridge:f,nestedRoute:g,timeoutMs:M.timeoutMs,turnBudget:F.turnBudget,toolBudget:R.toolBudget,configToolBudget:C.toolBudget,contextPolicy:D,modelScope:k},i=F$?void 0:{runId:y,mode:K$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:g,interrupt:void 0};if(i)$.state.foregroundControls.set(y,i),$.state.lastForegroundControlId=y;let P$=(Z$,t)=>{if(!h||!n)return;let f$=Date.now(),o=t?.details,G$=Z$==="subagent.nested.started"?"running":t?.isError||o?.results.some((u)=>u.exitCode!==0)?"failed":o?.results.some((u)=>u.interrupted)?"paused":"complete",X0=t?.isError?t.content.find((u)=>u.type==="text")?.text:void 0,c$=v&&_.tasks?_.tasks.map((u)=>u.agent):w&&_.chain?_.chain.flatMap((u)=>T$(u)?u.parallel.map((M$)=>M$.agent):[u.agent]):_.agent?[_.agent]:[],a1=f.active&&c$[0]?$0(y,c$[0],0):void 0;try{n2(h,{type:Z$,ts:f$,parentRunId:n.parentRunId,parentStepIndex:n.parentStepIndex,child:{id:y,parentRunId:n.parentRunId,parentStepIndex:n.parentStepIndex,depth:n.depth,path:n.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:a1,intercomTarget:a1,ownerState:G$==="running"?"live":"gone",mode:K$,state:G$,agent:c$[0],agents:c$,startedAt:i?.startedAt??f$,...G$!=="running"?{endedAt:f$}:{},lastUpdate:f$,...o?.totalCost?{totalCost:o.totalCost}:{},...X0?{error:X0}:{},...o?.results.length?{steps:o.results.map((u)=>({agent:u.agent,status:u.interrupted?"paused":u.exitCode===0?"complete":"failed",...u.sessionFile?{sessionFile:u.sessionFile}:{},...u.error?{error:u.error}:{}}))}:{}}})}catch(u){console.error("Failed to emit nested foreground status event:",u)}},H0=!1;try{let Z$=CA(W$,$);if(Z$)return q2(Z$,_.context);if(i)P$("subagent.nested.started"),H0=!0;if(w&&_.chain){let t=await TA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(v&&_.tasks){let t=await SA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(x){let t=await wA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}}catch(Z$){let t=K4(_,Z$);if(H0)P$("subagent.nested.completed",t);return t}finally{if(i){if(P8($.state,y),$.state.foregroundControls.delete(y),$.state.lastForegroundControlId===y)$.state.lastForegroundControlId=null}}return q2({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,z,H)=>{let V=cz(X);if(V.action)return J(Q,V,Y,z,H);if($.state.subagentInProgress===!0)return IA(V);$.state.subagentInProgress=!0;try{return await J(Q,V,Y,z,H)}finally{$.state.subagentInProgress=!1}}}}import*as C1 from"node:fs";import*as $9 from"node:path";var xA=65536,vA=1048576,rZ=2097152;function sz($,J,Z,Q={}){let X=Q.completionRetentionMs??1e4,Y=Q.pollIntervalMs??a8,z=Q.resultsDir??w$,H=(M,F=Array.from(J.asyncJobs.values()))=>{Q6(M,F),M.ui.requestRender?.()},V=(M)=>{try{return C1.statSync($9.join(M,"events.jsonl")).size}catch(F){if(F.code==="ENOENT")return 0;throw F}},K=(M)=>{let F=X1(M.parallelGroups,M.steps.length,M.chainStepCount??M.steps.length),R=M.currentStep!==void 0?F.find((T)=>M.currentStep>=T.start&&M.currentStep<T.start+T.count):void 0,C=R?M.steps.slice(R.start,R.start+R.count).map((T,I)=>({...T,index:R.start+I})):M.steps.map((T,I)=>({...T,index:I}));return{asyncId:M.id,asyncDir:M.asyncDir,status:M.state,sessionId:M.sessionId,activityState:M.activityState,lastActivityAt:M.lastActivityAt,currentTool:M.currentTool,currentToolStartedAt:M.currentToolStartedAt,currentPath:M.currentPath,turnCount:M.turnCount,toolCount:M.toolCount,mode:M.mode,agents:C.map((T)=>T.agent),currentStep:M.currentStep,chainStepCount:M.chainStepCount,parallelGroups:F,steps:C,stepsTotal:C.length,runningSteps:C.filter((T)=>T.status==="running").length,completedSteps:C.filter((T)=>T.status==="complete"||T.status==="completed").length,hasParallelGroups:F.length>0,activeParallelGroup:Boolean(R),startedAt:M.startedAt,updatedAt:M.lastUpdate??M.startedAt,timeoutMs:M.timeoutMs,deadlineAt:M.deadlineAt,timedOut:M.timedOut,turnBudget:M.turnBudget,turnBudgetExceeded:M.turnBudgetExceeded,wrapUpRequested:M.wrapUpRequested,sessionDir:M.sessionDir,outputFile:M.outputFile,totalTokens:M.totalTokens,sessionFile:M.sessionFile,controlEventCursor:V(M.asyncDir),nestedChildren:M.nestedChildren}},U=(M)=>{let F=J.cleanupTimers.get(M);if(!F)return;clearTimeout(F),J.cleanupTimers.delete(M)},G=(M)=>{U(M);let F=setTimeout(()=>{if(J.cleanupTimers.delete(M),J.asyncJobs.delete(M),J.lastUiContext)H(J.lastUiContext)},X);J.cleanupTimers.set(M,F)},B=(M)=>{let F=$9.join(M.asyncDir,"events.jsonl"),R;try{R=C1.openSync(F,"r")}catch(C){if(C.code==="ENOENT")return;console.error(`Failed to open async control events for '${M.asyncDir}':`,C);return}try{let C=C1.fstatSync(R),T=M.controlEventCursor,I=C.size<(T??0)?0:T??0,S=T===void 0&&C.size>rZ;if(S)I=C.size-rZ;if(C.size<=I)return;let j=Math.min(C.size,I+rZ),E=(h)=>{if(!h.trim())return;let n;try{n=JSON.parse(h)}catch(w){console.error(`Ignoring malformed async control event in '${F}':`,w);return}if(!n||typeof n!=="object"||n.type!=="subagent.control")return;let g=n;if(!g.event||!Array.isArray(g.channels))return;let P={event:g.event,source:"async",asyncDir:M.asyncDir,childIntercomTarget:g.childIntercomTarget,noticeText:g.noticeText??G2(g.event,g.childIntercomTarget)};if(g.channels.includes("event"))$.events.emit($2,P);if(g.event.type!=="active_long_running"&&g.channels.includes("intercom")&&g.intercom?.to&&g.intercom.message)$.events.emit(Q8,{...P,to:g.intercom.to,message:g.intercom.message})},k=I,D=I,q=[],f=0,b=S,y=(h)=>{if(h.length===0||b)return;if(f+h.length>vA){q=[],f=0,b=!0;return}q.push(h),f+=h.length};while(k<j){let h=Math.min(xA,j-k),n=Buffer.alloc(h),g=C1.readSync(R,n,0,h,k);if(g<=0)break;let P=g===n.length?n:n.subarray(0,g),w=0;for(let v=0;v<P.length;v++){if(P[v]!==10)continue;if(y(P.subarray(w,v)),!b&&f>0)E(Buffer.concat(q,f).toString("utf-8"));q=[],f=0,b=!1,D=k+v+1,w=v+1}if(y(P.subarray(w)),k+=g,b)M.controlEventCursor=k}if(D>I)M.controlEventCursor=D;else if(j<C.size||S)M.controlEventCursor=j}catch(C){console.error(`Failed to read async control events for '${M.asyncDir}':`,C)}finally{C1.closeSync(R)}},W=()=>{if(J.poller)return;J.poller=setInterval(()=>{if(J.asyncJobs.size===0){if(J.lastUiContext?.hasUI)H(J.lastUiContext,[]);if(J.poller)clearInterval(J.poller),J.poller=null;return}let M=!1;for(let F of J.asyncJobs.values()){let R=$6(F),C=!1,T=()=>{try{WZ(F)}catch(S){C=!0,console.error(`Failed to refresh nested async descendants for '${F.asyncDir}':`,S)}},I=()=>{try{if(F.nestedRoute)p2(F.nestedRoute,{resultsDir:z,kill:Q.kill,now:Q.now})}catch(S){C=!0,console.error(`Failed to refresh nested async descendants for '${F.asyncDir}':`,S)}T()};try{B(F),I();let j=E0(F.asyncDir,{resultsDir:z,kill:Q.kill,now:Q.now,startedRun:{runId:F.asyncId,pid:F.pid,sessionId:F.sessionId,mode:F.mode,agents:F.agents,chainStepCount:F.chainStepCount,parallelGroups:F.parallelGroups,startedAt:F.startedAt,sessionFile:F.sessionFile}}).status??u0(F.asyncDir);if(j){let E=F.status;if(F.status=j.state,F.status!=="complete"&&F.status!=="failed"&&F.status!=="paused")U(F.asyncId);if(F.sessionId=j.sessionId??F.sessionId,F.activityState=j.activityState,F.lastActivityAt=j.lastActivityAt??F.lastActivityAt,F.currentTool=j.currentTool,F.currentToolStartedAt=j.currentToolStartedAt,F.currentPath=j.currentPath,F.turnCount=j.turnCount??F.turnCount,F.toolCount=j.toolCount??F.toolCount,F.mode=j.mode,F.currentStep=j.currentStep??F.currentStep,F.chainStepCount=j.chainStepCount??F.chainStepCount,F.startedAt=j.startedAt??F.startedAt,j.lastUpdate!==void 0)F.updatedAt=j.lastUpdate;if(j.steps?.length){let k=X1(j.parallelGroups,j.steps.length,j.chainStepCount??j.steps.length);F.parallelGroups=k.length?k:F.parallelGroups,F.hasParallelGroups=k.length>0||F.hasParallelGroups;let D=j.currentStep!==void 0?k.find((f)=>j.currentStep>=f.start&&j.currentStep<f.start+f.count):void 0,q=D?j.steps.slice(D.start,D.start+D.count).map((f,b)=>({...f,index:D.start+b})):j.steps.map((f,b)=>({...f,index:b}));if(F.activeParallelGroup=Boolean(D),F.agents=q.map((f)=>f.agent),F.steps=q,T(),F.stepsTotal=q.length,F.runningSteps=q.filter((f)=>f.status==="running").length,F.completedSteps=q.filter((f)=>f.status==="complete"||f.status==="completed").length,j.state==="complete")F.completedSteps=q.length}if(F.sessionDir=j.sessionDir??F.sessionDir,F.outputFile=j.outputFile??F.outputFile,F.totalTokens=j.totalTokens??F.totalTokens,F.timeoutMs=j.timeoutMs??F.timeoutMs,F.deadlineAt=j.deadlineAt??F.deadlineAt,F.timedOut=j.timedOut??F.timedOut,F.turnBudget=j.turnBudget??F.turnBudget,F.turnBudgetExceeded=j.turnBudgetExceeded??F.turnBudgetExceeded,F.wrapUpRequested=j.wrapUpRequested??F.wrapUpRequested,F.sessionFile=j.sessionFile??F.sessionFile,(F.status==="complete"||F.status==="failed"||F.status==="paused")&&!C&&!R8(F.nestedChildren)&&(E!==F.status||!J.cleanupTimers.has(F.asyncId)))G(F.asyncId);if($6(F)!==R)M=!0;continue}if(F.status==="queued")F.status="running",F.updatedAt=Date.now()}catch(S){if(F.status!=="failed")console.error(`Failed to read async status for '${F.asyncDir}':`,S),F.status="failed",F.updatedAt=Date.now();if(!R8(F.nestedChildren)&&!J.cleanupTimers.has(F.asyncId))G(F.asyncId)}if($6(F)!==R)M=!0}if(M&&J.lastUiContext?.hasUI)H(J.lastUiContext)},Y),J.poller.unref?.()};return{ensurePoller:W,handleStarted:(M)=>{let F=M;if(!F.id)return;if(typeof J.currentSessionId==="string"&&F.sessionId!==J.currentSessionId)return;let R=Date.now(),C=F.asyncDir??$9.join(Z,F.id),T=F.agents?.length?F.agents:F.chain&&F.chain.length>0?F.chain:F.agent?[F.agent]:void 0,I=X1(F.parallelGroups,Number.MAX_SAFE_INTEGER,F.chainStepCount??Number.MAX_SAFE_INTEGER),j=I.find((k)=>k.start===0)?.count,E=j&&j>0?T?.slice(0,j):T;if(J.asyncJobs.set(F.id,{asyncId:F.id,asyncDir:C,status:"queued",pid:typeof F.pid==="number"?F.pid:void 0,...typeof F.sessionId==="string"?{sessionId:F.sessionId}:{},mode:F.mode??(F.chain?"chain":"single"),agents:E,chainStepCount:F.chainStepCount,parallelGroups:I,nestedRoute:F.nestedRoute,stepsTotal:j??E?.length,hasParallelGroups:I.length>0,activeParallelGroup:Boolean(j&&j>0),startedAt:R,updatedAt:R,timeoutMs:F.timeoutMs,deadlineAt:F.deadlineAt,turnBudget:F.turnBudget,controlEventCursor:0}),W(),J.lastUiContext)H(J.lastUiContext)},handleComplete:(M)=>{let F=M;if(typeof J.currentSessionId==="string"&&F.sessionId!==J.currentSessionId)return;let R=F.id;if(!R)return;let C=J.asyncJobs.get(R),T=!1;if(C){if(C.status=F.success?"complete":"failed",C.updatedAt=Date.now(),F.asyncDir)C.asyncDir=F.asyncDir;try{WZ(C)}catch(I){T=!0,console.error(`Failed to refresh nested async descendants for '${C.asyncDir}':`,I)}}if(J.lastUiContext)H(J.lastUiContext);if(!T&&!R8(C?.nestedChildren))G(R)},resetJobs:(M)=>{for(let F of J.cleanupTimers.values())clearTimeout(F);if(J.cleanupTimers.clear(),J.asyncJobs.clear(),J.foregroundControls?.clear(),J.lastForegroundControlId=null,J.resultFileCoalescer.clear(),M?.hasUI)J.lastUiContext=M,H(M,[])},restoreActiveJobs:(M)=>{if(M?.hasUI)J.lastUiContext=M;if(!J.currentSessionId)return;let F;try{F=p1(Z,{states:["queued","running"],sessionId:J.currentSessionId,resultsDir:z,kill:Q.kill,now:Q.now})}catch(R){console.error(`Failed to restore active async jobs from '${Z}':`,R);return}for(let R of F)J.asyncJobs.set(R.id,K(R));if(F.length===0)return;if(W(),J.lastUiContext?.hasUI)H(J.lastUiContext)}}}import*as mA from"node:fs";import*as JH from"node:path";function sZ($){if(typeof $!=="string")return;let J=$.trim();return J.length>0?J:void 0}function aZ($){if(typeof $!=="number")return;return Number.isFinite($)?$:void 0}function J9($,J){let Z=sZ($.id);if(Z)return`id:${Z}`;let Q=sZ($.sessionId)??"no-session",X=sZ($.agent)??"unknown",Y=aZ($.timestamp),z=aZ($.taskIndex),H=aZ($.totalTasks),V=typeof $.success==="boolean"?$.success?"1":"0":"?";return["meta",Q,X,Y!==void 0?String(Y):"no-ts",z!==void 0?String(z):"-",H!==void 0?String(H):"-",V,J].join(":")}function gA($,J,Z){for(let[Q,X]of $.entries())if(J-X>Z)$.delete(Q)}function Z9($,J,Z,Q){if(gA($,Z,Q),$.has(J))return!0;return $.set(J,Z),!1}function az($){let J=globalThis,Z=J[$];if(Z instanceof Map)return Z;let Q=new Map;return J[$]=Q,Q}var hA={setTimeout:($,J)=>setTimeout($,J),clearTimeout:($)=>clearTimeout($)};function tz($,J,Z=hA){let Q=new Map;return{schedule(X,Y=J){if(Q.has(X))return!1;let z=Z.setTimeout(()=>{Q.delete(X),$(X)},Y);return Q.set(X,z),!0},clear(){for(let X of Q.values())Z.clearTimeout(X);Q.clear()}}}var cA=3000,uA=3000;function ez($,J,Z){if($===void 0)return;if(!Array.isArray($)){console.error(`Ignoring invalid nested children in subagent result file '${J}' at ${Z}: expected an array.`);return}let Q=$.map((X)=>k8(X)).filter((X)=>Boolean(X));if(Q.length!==$.length)console.error(`Ignoring ${$.length-Q.length} invalid nested child record(s) in subagent result file '${J}' at ${Z}.`);return Q.length?Q:void 0}function eZ($){return typeof $==="object"&&$!==null&&"code"in $?$.code:void 0}function $H($){return eZ($)==="ENOENT"}function tZ($){let J=eZ($);return J==="EMFILE"||J==="ENOSPC"}function nA($,J){try{return $.realpathSync.native(J)}catch{return J}}function ZH($,J,Z,Q,X={}){let Y=X.fs??mA,z=X.timers??{setTimeout,clearTimeout,setInterval,clearInterval},H=async(W)=>{let O=JH.join(Z,W);if(!Y.existsSync(O))return;try{let A=JSON.parse(Y.readFileSync(O,"utf-8"));if(typeof A.sessionId!=="string"||A.sessionId!==J.currentSessionId)return;let L=A.runId??A.id??W.replace(/\.json$/i,""),_=A.nestedChildren!==void 0,M=o2(ez(A.nestedChildren,O,"nestedChildren"));if(!M?.length&&!_)try{M=o2(x6(L)?.children)}catch(j){console.error(`Failed to enrich subagent result file '${O}' with nested registry children; will retry later:`,j);return}let F=Date.now(),R=J9(A,`result:${W}`);if(Z9(J.completionSeen,R,F,Q)){Y.unlinkSync(O);return}let C=Array.isArray(A.results)&&A.results.length>0,T=C?A.results:[{agent:A.agent,output:A.summary,success:A.success}],I=n6(L,T.map((j={},E)=>{let k=j.output??A.summary,D=typeof k==="string"&&k.trim().length>0,q=D?k:"(no output)",f=j.success===!1&&j.error?`${j.error}${D?`
|
|
231
|
+
${K$}`}],details:q$}}finally{if(l)rJ(l)}}async function wA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:z,runId:H,sessionDirForIndex:V,sessionFileForTask:K,thinkingOverrideForTask:U,shareEnabled:G,artifactConfig:B,artifactsDir:W,onUpdate:O,sessionRoot:A,controlConfig:L,contextPolicy:_}=$,M=dZ($,J),F=$.intercomBridge.active?$0(H,Z.agent,0):void 0,R=[],C=[],T=X.find((F$)=>F$.name===Z.agent);if(!T)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let I=lz({runBudget:$.toolBudget,agentBudget:T.toolBudget,configBudget:$.configToolBudget});if(I.error)return K4(Z,Error(I.error));let S=Y.model?.provider,j=Y.modelRegistry.getAvailable().map(A0),E=Z.task??"",k=T0(Z.model??T.model,Y.model,j,S,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),D=O0(Z.skill),q=Z.output!==void 0?Z.output:T.output,f=L8(q,T.output),b=Z.outputMode??"inline",y=B1(J.config.maxSubagentDepth),h=W1(y,T.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let F$=e0(T,{output:f,skills:D}),V$=t0(Q),J$=await Y.ui.custom((O$,q$,m,a)=>new M8(O$,q$,[T],[E],E,void 0,[F$],j,S,V$,a,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!J$||!J$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};E=J$.templates[0];let H$=J$.behaviorOverrides[0];if(H$?.model)k=T0(H$.model,Y.model,j,S,{scope:$.modelScope,source:"explicit"});if(H$?.output!==void 0)f=L8(H$.output,T.output);if(H$?.skills!==void 0)D=H$.skills;if(J$.runInBackground){if(!M2())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let O$=L2(),q$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return h6(O$,{agent:Z.agent,task:y0(_,Z.agent)?K1(E):E,agentConfig:T,ctx:q$,availableModels:j,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?W:void 0,artifactConfig:B,shareEnabled:G,sessionRoot:A,sessionFile:K(Z.agent,0),skills:D===!1?[]:D,output:f,outputMode:b,outputBaseDir:e6(J,W,O$),modelOverride:k,thinkingOverride:U(Z.agent,0),maxSubagentDepth:h,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:L,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(m,a)=>$0(O$,m,a):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:I.toolBudget})}}if(y0(_,Z.agent))E=K1(E);let n=E,g=W2(f,Y.cwd,Q,e6(J,W,H)),P=s0(b,g,`Single run (${Z.agent})`);if(P)return{content:[{type:"text",text:P}],isError:!0,details:{mode:"single",results:[]}};E=N8(E,g);let w;if(D===!1)w=[];else w=D;let v=new AbortController,x=J.state.foregroundControls.get(H);if(x)x.currentAgent=Z.agent,x.currentIndex=0,x.currentActivityState=void 0,x.updatedAt=Date.now(),x.interrupt=()=>{if(v.signal.aborted)return!1;return v.abort(),x.currentActivityState=void 0,x.updatedAt=Date.now(),!0};let $$=O?(F$)=>{if(x){let V$=F$.details?.progress?.[0];x.currentAgent=Z.agent,x.currentIndex=V$?.index??0,x.currentActivityState=V$?.activityState,x.lastActivityAt=V$?.lastActivityAt,x.currentTool=V$?.currentTool,x.currentToolStartedAt=V$?.currentToolStartedAt,x.currentPath=V$?.currentPath,x.turnCount=V$?.turnCount,x.tokens=V$?.tokens,x.toolCount=V$?.toolCount,x.updatedAt=Date.now()}O(F$)}:void 0,c=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),l=await C8(Y.cwd,X,Z.agent,E,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:z,interruptSignal:v.signal,allowIntercomDetach:T.systemPrompt?.includes(v1)===!0,intercomEvents:J.pi.events,runId:H,sessionDir:V(0),sessionFile:K(Z.agent,0),share:G,artifactsDir:B.enabled?W:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:g,outputMode:b,maxSubagentDepth:h,onUpdate:$$,controlConfig:L,onControlEvent:M,intercomSessionName:F,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:x?.nestedRoute,index:0,modelOverride:k,thinkingOverride:U(Z.agent,0),availableModels:j,preferredModelProvider:S,modelScope:$.modelScope,skills:w,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(F$)=>nZ(J.state,{runId:H,mode:"single",cwd:Q,index:0,result:F$}),timeoutMs:$.timeoutMs,deadlineAt:c,turnBudget:$.turnBudget,toolBudget:I.toolBudget});if(x?.currentIndex===0)x.interrupt=void 0,x.currentActivityState=l.progress?.activityState,x.lastActivityAt=l.progress?.lastActivityAt,x.currentTool=l.progress?.currentTool,x.currentToolStartedAt=l.progress?.currentToolStartedAt,x.currentPath=l.progress?.currentPath,x.turnCount=l.progress?.turnCount,x.tokens=l.progress?.tokens,x.toolCount=l.progress?.toolCount,x.updatedAt=Date.now();if(T8(Z.agent,n,l.exitCode,l.progressSummary?.durationMs??0),l.progress)R.push(l.progress);if(l.artifactPaths)C.push(l.artifactPaths);let D$=U0(l),d=eX({fullOutput:D$,truncatedOutput:l.truncation?.text,outputPath:g,outputMode:l.outputMode,exitCode:l.exitCode,savedPath:l.savedOutputPath,outputReference:l.outputReference,saveError:l.outputSaveError});if(x)d2(x),d1(H,[l],x.nestedChildren);let z$=H8({mode:"single",runId:H,results:[l],...$.turnBudget?{turnBudget:$.turnBudget}:{},...I.toolBudget?{toolBudget:I.toolBudget}:{},progress:Z.includeProgress?R:void 0,artifacts:C.length?{dir:W,files:C}:void 0,truncation:l.truncation,totalChildUsage:zJ([l]),totalCost:z8([l])});if(uZ(J.state,{runId:H,mode:"single",cwd:Q,results:z$.results}),!l.detached&&!l.interrupted){if(x)d2(x);let F$=await lZ({pi:J.pi,intercomBridge:$.intercomBridge,runId:H,mode:"single",details:z$,...x?.nestedChildren?.length?{nestedChildren:x.nestedChildren}:{}});if(F$)return{content:[{type:"text",text:F$.text}],details:F$.details,...l.exitCode!==0?{isError:!0}:{}}}if(l.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:z$};if(l.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:z$};if(l.exitCode!==0)return{content:[{type:"text",text:KA(l,d.displayOutput)}],details:z$,isError:!0};return{content:[{type:"text",text:d.displayOutput||"(no output)"}],details:z$}}function kA($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function IA($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:kA($),results:[]}}}function cz($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var PA=new Set(["assistant","default","general","generic","subagent"]);function bA($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((Y)=>Y.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(Boolean($.task?.trim())&&(!Z||PA.has(Z.toLowerCase())))||!J.some((Y)=>Y.name==="worker"))return $;return{...$,agent:"worker"}}function rz($){let J=async(Q,X,Y,z,H)=>{$.state.baseCwd=H.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let V=cz(X),K=gO(H.cwd,V.cwd),U=V.cwd===void 0?V:{...V,cwd:K},G=U.action;if(G){if(G==="doctor"){let Z$=null,t=$.state.currentSessionId,f$;try{Z$=H.sessionManager.getSessionFile()??null,t=H.sessionManager.getSessionId()}catch(G$){f$=G$ instanceof Error?`${G$.name}: ${G$.message}`:String(G$)}let o;try{o=G6($.pi.getSessionName(),H.sessionManager.getSessionId())}catch(G$){if(!f$)f$=G$ instanceof Error?`${G$.name}: ${G$.message}`:String(G$)}return{content:[{type:"text",text:aY({cwd:K,config:$.config,state:$.state,context:U.context,requestedSessionDir:U.sessionDir,currentSessionFile:Z$,currentSessionId:t,orchestratorTarget:o,sessionError:f$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(G==="status"){let Z$=U.id??U.runId,t=B4($),f$=mO(H,$);if(U.view==="fleet")return a6(U,{state:$.state,nested:t,sessionRoots:f$});if(Z$)try{let o=o1(Z$,{state:$.state,nested:t});if(o?.kind==="foreground"){let G$=mZ($.state,o.id);if(G$){if(U.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return gz(G$)}}}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}else{let o=mZ($.state,void 0);if(o&&U.view!=="transcript")return gz(o);if(o&&U.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return a6(U,{state:$.state,nested:t,sessionRoots:f$})}if(G==="resume")return UA({params:U,requestCwd:K,ctx:H,deps:$});if(G==="steer"){let Z$=(U.message??U.task??"").trim();if(!Z$)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let t=U.runId??U.id;if(U.dir)try{let o=i2(U,d$,w$),G$=o.resolvedId??t??y$.basename(o.asyncDir??U.dir);return mz({state:$.state,runId:G$,message:Z$,index:U.index,kill:$.kill,location:o})}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}if(!t)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let f$;try{f$=o1(t,{state:$.state,nested:B4($)})}catch(o){return{content:[{type:"text",text:o instanceof Error?o.message:String(o)}],isError:!0,details:{mode:"management",results:[]}}}if(f$?.kind==="nested")return VA({target:f$,message:Z$,index:U.index});if(f$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(f$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${t}'.`}],isError:!0,details:{mode:"management",results:[]}};return mz({state:$.state,runId:f$.id,message:Z$,index:U.index,kill:$.kill,location:f$.location})}if(G==="append-step")return aO({params:U,requestCwd:K,ctx:H,deps:$});if(G==="schedule"||G==="schedule-list"||G==="schedule-status"||G==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${G}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(U,H)}if(G==="interrupt"){let Z$=U.runId??U.id,t;if(Z$)try{t=o1(Z$,{state:$.state,nested:B4($)})}catch(G$){return{content:[{type:"text",text:G$ instanceof Error?G$.message:String(G$)}],isError:!0,details:{mode:"management",results:[]}}}if(t?.kind==="nested")return zA(t);let f$=mZ($.state,t?.kind==="foreground"?t.id:Z$);if(f$?.interrupt){if(f$.interrupt())return f$.updatedAt=Date.now(),f$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${f$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${f$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let o=rO($.state,t?.kind==="async"?t.id:Z$,$.kill,t?.kind==="async"?t.location:void 0);if(o)return o;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!w9.includes(G))return{content:[{type:"text",text:`Unknown action: ${G}. Valid: ${w9.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&vO.has(G))return{content:[{type:"text",text:`Action '${G}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return bY(G,U,{...H,cwd:K,config:$.config})}let{blocked:B,depth:W,maxDepth:O}=P9($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${W}, max=${O}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let A=NA(U);if(A.error)return A.error;let L=A.params,_=vz(L,W,$.config.forceTopLevelAsync===!0),M=_A(_);if(M.error)return g8(_,M.error);let F=MA(_,$.config);if(F.error)return g8(_,F.error);let R=W4(_.toolBudget,"toolBudget");if(R.error)return g8(_,R.error);let C=W4($.config.toolBudget,"config.toolBudget");if(C.error)return g8(_,C.error);let T=y6(_.agentScope),I=_.cwd??H.cwd,S=H.sessionManager.getSessionFile()??null;$.state.currentSessionId=I1(H.sessionManager);let j=$.discoverAgents(I,T),E=j.agents,k=j.modelScope;_=bA(_,E);let D=OA(_,E);_=D.params;let q=G6($.pi.getSessionName(),H.sessionManager.getSessionId()),f=w5({config:$.config.intercomBridge,context:_.context,orchestratorTarget:q}),b=f.active?E.map((Z$)=>k5(Z$,f)):E,y=L2().slice(0,8),h=D8(),n=h?S8():void 0,g=h??mY(y),P=_.share===!0,w=(_.chain?.length??0)>0,v=(_.tasks?.length??0)>0,x=!w&&!v&&Boolean(_.agent),$$=w&&_.clarify===!0&&H.hasUI&&!(_.chain?.some(T$)??!1),c=WA(_,b,w,v,x,$$);if(c)return c;let l=()=>{return},D$=()=>{return};try{let Z$=zz(H.sessionManager,D.usesFork?"fork":void 0);l=Z$.sessionFileForIndex,D$=Z$.thinkingOverrideForIndex}catch(Z$){return K4(_,Z$)}let d=_.async??$.asyncByDefault,z$=(w||v)&&d&&_.clarify===!0,F$=d&&_.clarify!==!0,V$=B6($.config.control,_.control),J$={...j2,enabled:_.artifacts!==!1},H$=P2(S,I),O$;if(_.sessionDir)O$=y$.resolve($.expandTilde(_.sessionDir));else{let Z$=$.config.defaultSessionDir?y$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(S);O$=y$.join(Z$,y)}try{U1.mkdirSync(O$,{recursive:!0})}catch(Z$){let t=Z$ instanceof Error?Z$.message:String(Z$);return K4(_,Error(`Failed to create session directory '${O$}': ${t}`))}let q$=(Z$)=>y$.join(O$,`run-${Z$??0}`),m=(Z$,t)=>y0(D,Z$)?l(t):void 0,a=(Z$,t)=>y0(D,Z$)?D$(t):void 0,s$=(Z$,t)=>m(Z$,t)??y$.join(q$(t),"session.jsonl"),U$=(Z$)=>y$.join(q$(Z$),"session.jsonl");try{EA(_,D,m,$.config.chain?.dynamicFanout?.maxItems)}catch(Z$){return K4(_,Z$)}let a$=FA(_,$.config.chain?.dynamicFanout?.maxItems);if(a$)return a$;let R$=z?(Z$)=>z(q2(Z$,_.context)):void 0,K$=w?"chain":v?"parallel":"single",N$=cO({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:uO(_,$.config),mode:K$});if(N$)return N$;let W$={params:_,effectiveCwd:I,ctx:H,signal:Y,onUpdate:R$,agents:b,runId:y,shareEnabled:P,sessionRoot:O$,sessionDirForIndex:q$,sessionFileForIndex:U$,sessionFileForTask:s$,thinkingOverrideForTask:a,artifactConfig:J$,artifactsDir:H$,backgroundRequestedWhileClarifying:z$,effectiveAsync:F$,controlConfig:V$,intercomBridge:f,nestedRoute:g,timeoutMs:M.timeoutMs,turnBudget:F.turnBudget,toolBudget:R.toolBudget,configToolBudget:C.toolBudget,contextPolicy:D,modelScope:k},i=F$?void 0:{runId:y,mode:K$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:g,interrupt:void 0};if(i)$.state.foregroundControls.set(y,i),$.state.lastForegroundControlId=y;let P$=(Z$,t)=>{if(!h||!n)return;let f$=Date.now(),o=t?.details,G$=Z$==="subagent.nested.started"?"running":t?.isError||o?.results.some((u)=>u.exitCode!==0)?"failed":o?.results.some((u)=>u.interrupted)?"paused":"complete",X0=t?.isError?t.content.find((u)=>u.type==="text")?.text:void 0,c$=v&&_.tasks?_.tasks.map((u)=>u.agent):w&&_.chain?_.chain.flatMap((u)=>T$(u)?u.parallel.map((M$)=>M$.agent):[u.agent]):_.agent?[_.agent]:[],a1=f.active&&c$[0]?$0(y,c$[0],0):void 0;try{n2(h,{type:Z$,ts:f$,parentRunId:n.parentRunId,parentStepIndex:n.parentStepIndex,child:{id:y,parentRunId:n.parentRunId,parentStepIndex:n.parentStepIndex,depth:n.depth,path:n.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:a1,intercomTarget:a1,ownerState:G$==="running"?"live":"gone",mode:K$,state:G$,agent:c$[0],agents:c$,startedAt:i?.startedAt??f$,...G$!=="running"?{endedAt:f$}:{},lastUpdate:f$,...o?.totalCost?{totalCost:o.totalCost}:{},...X0?{error:X0}:{},...o?.results.length?{steps:o.results.map((u)=>({agent:u.agent,status:u.interrupted?"paused":u.exitCode===0?"complete":"failed",...u.sessionFile?{sessionFile:u.sessionFile}:{},...u.error?{error:u.error}:{}}))}:{}}})}catch(u){console.error("Failed to emit nested foreground status event:",u)}},H0=!1;try{let Z$=CA(W$,$);if(Z$)return q2(Z$,_.context);if(i)P$("subagent.nested.started"),H0=!0;if(w&&_.chain){let t=await TA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(v&&_.tasks){let t=await SA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(x){let t=await wA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}}catch(Z$){let t=K4(_,Z$);if(H0)P$("subagent.nested.completed",t);return t}finally{if(i){if(P8($.state,y),$.state.foregroundControls.delete(y),$.state.lastForegroundControlId===y)$.state.lastForegroundControlId=null}}return q2({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,z,H)=>{let V=cz(X);if(V.action)return J(Q,V,Y,z,H);if($.state.subagentInProgress===!0)return IA(V);$.state.subagentInProgress=!0;try{return await J(Q,V,Y,z,H)}finally{$.state.subagentInProgress=!1}}}}import*as C1 from"node:fs";import*as $9 from"node:path";var xA=65536,vA=1048576,rZ=2097152;function sz($,J,Z,Q={}){let X=Q.completionRetentionMs??1e4,Y=Q.pollIntervalMs??a8,z=Q.resultsDir??w$,H=(M,F=Array.from(J.asyncJobs.values()))=>{Q6(M,F),M.ui.requestRender?.()},V=(M)=>{try{return C1.statSync($9.join(M,"events.jsonl")).size}catch(F){if(F.code==="ENOENT")return 0;throw F}},K=(M)=>{let F=X1(M.parallelGroups,M.steps.length,M.chainStepCount??M.steps.length),R=M.currentStep!==void 0?F.find((T)=>M.currentStep>=T.start&&M.currentStep<T.start+T.count):void 0,C=R?M.steps.slice(R.start,R.start+R.count).map((T,I)=>({...T,index:R.start+I})):M.steps.map((T,I)=>({...T,index:I}));return{asyncId:M.id,asyncDir:M.asyncDir,status:M.state,sessionId:M.sessionId,activityState:M.activityState,lastActivityAt:M.lastActivityAt,currentTool:M.currentTool,currentToolStartedAt:M.currentToolStartedAt,currentPath:M.currentPath,turnCount:M.turnCount,toolCount:M.toolCount,mode:M.mode,agents:C.map((T)=>T.agent),currentStep:M.currentStep,chainStepCount:M.chainStepCount,parallelGroups:F,steps:C,stepsTotal:C.length,runningSteps:C.filter((T)=>T.status==="running").length,completedSteps:C.filter((T)=>T.status==="complete"||T.status==="completed").length,hasParallelGroups:F.length>0,activeParallelGroup:Boolean(R),startedAt:M.startedAt,updatedAt:M.lastUpdate??M.startedAt,timeoutMs:M.timeoutMs,deadlineAt:M.deadlineAt,timedOut:M.timedOut,turnBudget:M.turnBudget,turnBudgetExceeded:M.turnBudgetExceeded,wrapUpRequested:M.wrapUpRequested,sessionDir:M.sessionDir,outputFile:M.outputFile,totalTokens:M.totalTokens,sessionFile:M.sessionFile,controlEventCursor:V(M.asyncDir),nestedChildren:M.nestedChildren}},U=(M)=>{let F=J.cleanupTimers.get(M);if(!F)return;clearTimeout(F),J.cleanupTimers.delete(M)},G=(M)=>{U(M);let F=setTimeout(()=>{if(J.cleanupTimers.delete(M),J.asyncJobs.delete(M),J.lastUiContext)H(J.lastUiContext)},X);J.cleanupTimers.set(M,F)},B=(M)=>{let F=$9.join(M.asyncDir,"events.jsonl"),R;try{R=C1.openSync(F,"r")}catch(C){if(C.code==="ENOENT")return;console.error(`Failed to open async control events for '${M.asyncDir}':`,C);return}try{let C=C1.fstatSync(R),T=M.controlEventCursor,I=C.size<(T??0)?0:T??0,S=T===void 0&&C.size>rZ;if(S)I=C.size-rZ;if(C.size<=I)return;let j=Math.min(C.size,I+rZ),E=(h)=>{if(!h.trim())return;let n;try{n=JSON.parse(h)}catch(w){console.error(`Ignoring malformed async control event in '${F}':`,w);return}if(!n||typeof n!=="object"||n.type!=="subagent.control")return;let g=n;if(!g.event||!Array.isArray(g.channels))return;let P={event:g.event,source:"async",asyncDir:M.asyncDir,childIntercomTarget:g.childIntercomTarget,noticeText:g.noticeText??G2(g.event,g.childIntercomTarget)};if(g.channels.includes("event"))$.events.emit($2,P);if(g.event.type!=="active_long_running"&&g.channels.includes("intercom")&&g.intercom?.to&&g.intercom.message)$.events.emit(Q8,{...P,to:g.intercom.to,message:g.intercom.message})},k=I,D=I,q=[],f=0,b=S,y=(h)=>{if(h.length===0||b)return;if(f+h.length>vA){q=[],f=0,b=!0;return}q.push(h),f+=h.length};while(k<j){let h=Math.min(xA,j-k),n=Buffer.alloc(h),g=C1.readSync(R,n,0,h,k);if(g<=0)break;let P=g===n.length?n:n.subarray(0,g),w=0;for(let v=0;v<P.length;v++){if(P[v]!==10)continue;if(y(P.subarray(w,v)),!b&&f>0)E(Buffer.concat(q,f).toString("utf-8"));q=[],f=0,b=!1,D=k+v+1,w=v+1}if(y(P.subarray(w)),k+=g,b)M.controlEventCursor=k}if(D>I)M.controlEventCursor=D;else if(j<C.size||S)M.controlEventCursor=j}catch(C){console.error(`Failed to read async control events for '${M.asyncDir}':`,C)}finally{C1.closeSync(R)}},W=()=>{if(J.poller)return;J.poller=setInterval(()=>{if(J.asyncJobs.size===0){if(J.lastUiContext?.hasUI)H(J.lastUiContext,[]);if(J.poller)clearInterval(J.poller),J.poller=null;return}let M=!1;for(let F of J.asyncJobs.values()){let R=$6(F),C=!1,T=()=>{try{WZ(F)}catch(S){C=!0,console.error(`Failed to refresh nested async descendants for '${F.asyncDir}':`,S)}},I=()=>{try{if(F.nestedRoute)p2(F.nestedRoute,{resultsDir:z,kill:Q.kill,now:Q.now})}catch(S){C=!0,console.error(`Failed to refresh nested async descendants for '${F.asyncDir}':`,S)}T()};try{B(F),I();let j=E0(F.asyncDir,{resultsDir:z,kill:Q.kill,now:Q.now,startedRun:{runId:F.asyncId,pid:F.pid,sessionId:F.sessionId,mode:F.mode,agents:F.agents,chainStepCount:F.chainStepCount,parallelGroups:F.parallelGroups,startedAt:F.startedAt,sessionFile:F.sessionFile}}).status??u0(F.asyncDir);if(j){let E=F.status;if(F.status=j.state,F.status!=="complete"&&F.status!=="failed"&&F.status!=="paused")U(F.asyncId);if(F.sessionId=j.sessionId??F.sessionId,F.activityState=j.activityState,F.lastActivityAt=j.lastActivityAt??F.lastActivityAt,F.currentTool=j.currentTool,F.currentToolStartedAt=j.currentToolStartedAt,F.currentPath=j.currentPath,F.turnCount=j.turnCount??F.turnCount,F.toolCount=j.toolCount??F.toolCount,F.mode=j.mode,F.currentStep=j.currentStep??F.currentStep,F.chainStepCount=j.chainStepCount??F.chainStepCount,F.startedAt=j.startedAt??F.startedAt,j.lastUpdate!==void 0)F.updatedAt=j.lastUpdate;if(j.steps?.length){let k=X1(j.parallelGroups,j.steps.length,j.chainStepCount??j.steps.length);F.parallelGroups=k.length?k:F.parallelGroups,F.hasParallelGroups=k.length>0||F.hasParallelGroups;let D=j.currentStep!==void 0?k.find((f)=>j.currentStep>=f.start&&j.currentStep<f.start+f.count):void 0,q=D?j.steps.slice(D.start,D.start+D.count).map((f,b)=>({...f,index:D.start+b})):j.steps.map((f,b)=>({...f,index:b}));if(F.activeParallelGroup=Boolean(D),F.agents=q.map((f)=>f.agent),F.steps=q,T(),F.stepsTotal=q.length,F.runningSteps=q.filter((f)=>f.status==="running").length,F.completedSteps=q.filter((f)=>f.status==="complete"||f.status==="completed").length,j.state==="complete")F.completedSteps=q.length}if(F.sessionDir=j.sessionDir??F.sessionDir,F.outputFile=j.outputFile??F.outputFile,F.totalTokens=j.totalTokens??F.totalTokens,F.timeoutMs=j.timeoutMs??F.timeoutMs,F.deadlineAt=j.deadlineAt??F.deadlineAt,F.timedOut=j.timedOut??F.timedOut,F.turnBudget=j.turnBudget??F.turnBudget,F.turnBudgetExceeded=j.turnBudgetExceeded??F.turnBudgetExceeded,F.wrapUpRequested=j.wrapUpRequested??F.wrapUpRequested,F.sessionFile=j.sessionFile??F.sessionFile,(F.status==="complete"||F.status==="failed"||F.status==="paused")&&!C&&!R8(F.nestedChildren)&&(E!==F.status||!J.cleanupTimers.has(F.asyncId)))G(F.asyncId);if($6(F)!==R)M=!0;continue}if(F.status==="queued")F.status="running",F.updatedAt=Date.now()}catch(S){if(F.status!=="failed")console.error(`Failed to read async status for '${F.asyncDir}':`,S),F.status="failed",F.updatedAt=Date.now();if(!R8(F.nestedChildren)&&!J.cleanupTimers.has(F.asyncId))G(F.asyncId)}if($6(F)!==R)M=!0}if(M&&J.lastUiContext?.hasUI)H(J.lastUiContext)},Y),J.poller.unref?.()};return{ensurePoller:W,handleStarted:(M)=>{let F=M;if(!F.id)return;if(typeof J.currentSessionId==="string"&&F.sessionId!==J.currentSessionId)return;let R=Date.now(),C=F.asyncDir??$9.join(Z,F.id),T=F.agents?.length?F.agents:F.chain&&F.chain.length>0?F.chain:F.agent?[F.agent]:void 0,I=X1(F.parallelGroups,Number.MAX_SAFE_INTEGER,F.chainStepCount??Number.MAX_SAFE_INTEGER),j=I.find((k)=>k.start===0)?.count,E=j&&j>0?T?.slice(0,j):T;if(J.asyncJobs.set(F.id,{asyncId:F.id,asyncDir:C,status:"queued",pid:typeof F.pid==="number"?F.pid:void 0,...typeof F.sessionId==="string"?{sessionId:F.sessionId}:{},mode:F.mode??(F.chain?"chain":"single"),agents:E,chainStepCount:F.chainStepCount,parallelGroups:I,nestedRoute:F.nestedRoute,stepsTotal:j??E?.length,hasParallelGroups:I.length>0,activeParallelGroup:Boolean(j&&j>0),startedAt:R,updatedAt:R,timeoutMs:F.timeoutMs,deadlineAt:F.deadlineAt,turnBudget:F.turnBudget,controlEventCursor:0}),W(),J.lastUiContext)H(J.lastUiContext)},handleComplete:(M)=>{let F=M;if(typeof J.currentSessionId==="string"&&F.sessionId!==J.currentSessionId)return;let R=F.id;if(!R)return;let C=J.asyncJobs.get(R),T=!1;if(C){if(C.status=F.success?"complete":"failed",C.updatedAt=Date.now(),F.asyncDir)C.asyncDir=F.asyncDir;try{WZ(C)}catch(I){T=!0,console.error(`Failed to refresh nested async descendants for '${C.asyncDir}':`,I)}}if(J.lastUiContext)H(J.lastUiContext);if(!T&&!R8(C?.nestedChildren))G(R)},resetJobs:(M)=>{for(let F of J.cleanupTimers.values())clearTimeout(F);if(J.cleanupTimers.clear(),J.asyncJobs.clear(),J.foregroundControls?.clear(),J.lastForegroundControlId=null,J.resultFileCoalescer.clear(),M?.hasUI)J.lastUiContext=M,H(M,[])},restoreActiveJobs:(M)=>{if(M?.hasUI)J.lastUiContext=M;if(!J.currentSessionId)return;let F;try{F=p1(Z,{states:["queued","running"],sessionId:J.currentSessionId,resultsDir:z,kill:Q.kill,now:Q.now})}catch(R){console.error(`Failed to restore active async jobs from '${Z}':`,R);return}for(let R of F)J.asyncJobs.set(R.id,K(R));if(F.length===0)return;if(W(),J.lastUiContext?.hasUI)H(J.lastUiContext)}}}import*as mA from"node:fs";import*as JH from"node:path";function sZ($){if(typeof $!=="string")return;let J=$.trim();return J.length>0?J:void 0}function aZ($){if(typeof $!=="number")return;return Number.isFinite($)?$:void 0}function J9($,J){let Z=sZ($.id);if(Z)return`id:${Z}`;let Q=sZ($.sessionId)??"no-session",X=sZ($.agent)??"unknown",Y=aZ($.timestamp),z=aZ($.taskIndex),H=aZ($.totalTasks),V=typeof $.success==="boolean"?$.success?"1":"0":"?";return["meta",Q,X,Y!==void 0?String(Y):"no-ts",z!==void 0?String(z):"-",H!==void 0?String(H):"-",V,J].join(":")}function gA($,J,Z){for(let[Q,X]of $.entries())if(J-X>Z)$.delete(Q)}function Z9($,J,Z,Q){if(gA($,Z,Q),$.has(J))return!0;return $.set(J,Z),!1}function az($){let J=globalThis,Z=J[$];if(Z instanceof Map)return Z;let Q=new Map;return J[$]=Q,Q}var hA={setTimeout:($,J)=>setTimeout($,J),clearTimeout:($)=>clearTimeout($)};function tz($,J,Z=hA){let Q=new Map;return{schedule(X,Y=J){if(Q.has(X))return!1;let z=Z.setTimeout(()=>{Q.delete(X),$(X)},Y);return Q.set(X,z),!0},clear(){for(let X of Q.values())Z.clearTimeout(X);Q.clear()}}}var cA=3000,uA=3000;function ez($,J,Z){if($===void 0)return;if(!Array.isArray($)){console.error(`Ignoring invalid nested children in subagent result file '${J}' at ${Z}: expected an array.`);return}let Q=$.map((X)=>k8(X)).filter((X)=>Boolean(X));if(Q.length!==$.length)console.error(`Ignoring ${$.length-Q.length} invalid nested child record(s) in subagent result file '${J}' at ${Z}.`);return Q.length?Q:void 0}function eZ($){return typeof $==="object"&&$!==null&&"code"in $?$.code:void 0}function $H($){return eZ($)==="ENOENT"}function tZ($){let J=eZ($);return J==="EMFILE"||J==="ENOSPC"}function nA($,J){try{return $.realpathSync.native(J)}catch{return J}}function ZH($,J,Z,Q,X={}){let Y=X.fs??mA,z=X.timers??{setTimeout,clearTimeout,setInterval,clearInterval},H=async(W)=>{let O=JH.join(Z,W);if(!Y.existsSync(O))return;try{let A=JSON.parse(Y.readFileSync(O,"utf-8"));if(typeof A.sessionId!=="string"||A.sessionId!==J.currentSessionId)return;let L=A.runId??A.id??W.replace(/\.json$/i,""),_=A.nestedChildren!==void 0,M=o2(ez(A.nestedChildren,O,"nestedChildren"));if(!M?.length&&!_)try{M=o2(x6(L)?.children)}catch(j){console.error(`Failed to enrich subagent result file '${O}' with nested registry children; will retry later:`,j);return}let F=Date.now(),R=J9(A,`result:${W}`);if(Z9(J.completionSeen,R,F,Q)){Y.unlinkSync(O);return}let C=Array.isArray(A.results)&&A.results.length>0,T=C?A.results:[{agent:A.agent,output:A.summary,success:A.success}],I=n6(L,T.map((j={},E)=>{let k=j.output??A.summary,D=typeof k==="string"&&k.trim().length>0,q=D?k:"(no output)",f=j.success===!1&&j.error?`${j.error}${D?`
|
|
232
232
|
|
|
233
233
|
Output:
|
|
234
234
|
${k}`:""}`:q,b=j.sessionFile??(T.length===1?A.sessionFile:void 0),y=ez(j.children,O,`results[${E}].children`);return{agent:j.agent??A.agent??`step-${E+1}`,status:x8({success:j.success,state:A.state==="paused"||typeof j.success!=="boolean"?A.state:void 0}),summary:f,index:E,artifactPath:j.artifactPaths?.outputPath,...typeof b==="string"&&Y.existsSync(b)?{sessionPath:b}:{},...j.intercomTarget?{intercomTarget:j.intercomTarget}:{},...y?{children:y}:{}}}),M),S=A.intercomTarget?.trim();if(S){let j=A.mode==="single"||A.mode==="parallel"||A.mode==="chain"?A.mode:T.length>1?"chain":"single",E=d6({to:S,runId:L,mode:j,source:"async",children:I,asyncId:A.id,asyncDir:A.asyncDir});if(!await l6($.events,E))console.error(`Subagent async grouped result intercom delivery was not acknowledged for '${O}'.`)}$.events.emit(e1,{...A,runId:L,...M?.length?{nestedChildren:M}:{},...Array.isArray(A.results)?{results:C?I.map((j,E)=>({...A.results[E],agent:j.agent,status:j.status,summary:j.summary,index:j.index,artifactPath:j.artifactPath,sessionPath:j.sessionPath,children:j.children})):[]}:{}}),Y.unlinkSync(O)}catch(A){if($H(A))return;console.error(`Failed to process subagent result file '${O}':`,A)}};J.resultFileCoalescer=tz((W)=>{H(W)},50);let V=()=>{try{Y.readdirSync(Z).filter((W)=>W.endsWith(".json")).forEach((W)=>J.resultFileCoalescer.schedule(W,0))}catch(W){if($H(W))return;console.error(`Failed to scan subagent result directory '${Z}':`,W)}},K=(W)=>{if(J.watcher?.close(),J.watcher=null,J.watcherRestartTimer)return;console.error(`Subagent result watcher for '${Z}' fell back to polling because native fs.watch is unavailable (${eZ(W)??"unknown error"}).`),V(),J.watcherRestartTimer=z.setInterval(V,uA),J.watcherRestartTimer.unref?.()},U=()=>{if(J.watcherRestartTimer)return;J.watcherRestartTimer=z.setTimeout(()=>{J.watcherRestartTimer=null;try{Y.mkdirSync(Z,{recursive:!0}),G()}catch(W){if(tZ(W)){K(W);return}console.error(`Failed to restart subagent result watcher for '${Z}':`,W),U()}},cA),J.watcherRestartTimer.unref?.()},G=()=>{if(J.watcher)return;if(J.watcherRestartTimer)z.clearTimeout(J.watcherRestartTimer),z.clearInterval(J.watcherRestartTimer),J.watcherRestartTimer=null;try{let W=nA(Y,Z);J.watcher=Y.watch(W,(O,A)=>{if(O!=="rename"||!A)return;let L=A.toString();if(!L.endsWith(".json"))return;J.resultFileCoalescer.schedule(L)}),J.watcher.on("error",(O)=>{if(tZ(O)){K(O);return}console.error(`Subagent result watcher failed for '${Z}':`,O),J.watcher?.close(),J.watcher=null,U()}),J.watcher.unref?.()}catch(W){if(tZ(W)){K(W);return}console.error(`Failed to start subagent result watcher for '${Z}':`,W),J.watcher=null,U()}};return{startResultWatcher:G,primeExistingResults:V,stopResultWatcher:()=>{if(J.watcher?.close(),J.watcher=null,J.watcherRestartTimer)z.clearTimeout(J.watcherRestartTimer),z.clearInterval(J.watcherRestartTimer);J.watcherRestartTimer=null,J.resultFileCoalescer.clear()}}}import{createHash as dA,randomUUID as lA}from"node:crypto";import*as Q9 from"node:fs";import*as O4 from"node:path";var VH=O4.join(Y0,"scheduled-subagent-runs");var oA=2147483647,pA=300000,iA=20;function QH($){return $.scheduledRuns?.enabled===!0}function rA($,J,Z=VH){let Q=dA("sha256").update(`${O4.resolve($)}\x00${J}`).digest("hex").slice(0,20);return O4.join(Z,`${Q}.json`)}function sA($,J=Date.now()){let Z=$.trim(),Q=Z.match(/^\+(\d+)(s|m|h|d)$/);if(Q){let X=Number(Q[1]);if(!Number.isSafeInteger(X)||X<1)throw Error(`Invalid schedule "${$}". Relative schedules must be positive, such as "+10m".`);let Y={s:1000,m:60000,h:3600000,d:86400000}[Q[2]],z=J+X*Y;if(!Number.isSafeInteger(z)||Number.isNaN(new Date(z).getTime()))throw Error(`Invalid schedule "${$}". Relative delay is too large.`);return z}if(/^\d{4}-\d{2}-\d{2}T/.test(Z)){let X=Z.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2})$/);if(!X)throw Error(`Invalid schedule "${$}". Absolute ISO timestamps must include a timezone, such as "2030-01-01T09:00:00Z".`);let Y=Number(X[1]),z=Number(X[2]),H=Number(X[3]),V=Number(X[4]),K=Number(X[5]),U=X[6]===void 0?0:Number(X[6]),G=X[7],B=G==="Z"?0:Number(G.slice(1,3)),W=G==="Z"?0:Number(G.slice(4,6)),O=z>=1&&z<=12?new Date(Date.UTC(Y,z,0)).getUTCDate():0;if(z<1||z>12||H<1||H>O||V>23||K>59||U>59||B>23||W>59)throw Error(`Invalid schedule "${$}". Use a valid future ISO timestamp.`);let A=new Date(Z).getTime();if(!Number.isNaN(A)){if(A<=J)throw Error(`Scheduled time ${new Date(A).toISOString()} is in the past.`);return A}}throw Error(`Invalid schedule "${$}". Use a one-shot relative delay like "+10m" or a future ISO timestamp with timezone.`)}function XH($,J,Z){if(!Q9.existsSync($))return{version:1,cwd:J,sessionId:Z,jobs:[]};let Q;try{Q=JSON.parse(Q9.readFileSync($,"utf-8"))}catch(H){let V=H instanceof Error?H.message:String(H);throw Error(`Failed to parse scheduled subagent store '${$}': ${V}`,{cause:H instanceof Error?H:void 0})}if(!Q||typeof Q!=="object"||Array.isArray(Q))throw Error(`Scheduled subagent store '${$}' must be a JSON object.`);let X=Q;if(X.version!==1)throw Error(`Unsupported scheduled subagent store version in '${$}'.`);if(!Array.isArray(X.jobs))throw Error(`Scheduled subagent store '${$}' must contain a jobs array.`);let Y=[],z=new Set(["scheduled","running","fired","canceled","missed","failed"]);for(let[H,V]of X.jobs.entries()){if(!V||typeof V!=="object"||Array.isArray(V))throw Error(`Scheduled subagent store '${$}' job ${H} must be an object.`);let K=V;if(typeof K.id!=="string"||typeof K.name!=="string"||typeof K.schedule!=="string"||typeof K.cwd!=="string"||typeof K.sessionId!=="string")throw Error(`Scheduled subagent store '${$}' job ${H} has invalid string fields.`);if([K.runAt,K.createdAt,K.updatedAt].some((G)=>typeof G!=="number"||!Number.isFinite(G)||Number.isNaN(new Date(G).getTime())))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid timestamps.`);if(!K.state||!z.has(K.state))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid state.`);if(!K.params||typeof K.params!=="object"||Array.isArray(K.params))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid params.`);Y.push(K)}return{version:1,cwd:typeof X.cwd==="string"?X.cwd:J,sessionId:typeof X.sessionId==="string"?X.sessionId:Z,jobs:Y}}class UH{filePath;cwd;sessionId;constructor($,J,Z){this.filePath=$,this.cwd=J,this.sessionId=Z}list(){return XH(this.filePath,this.cwd,this.sessionId).jobs}get($){return this.list().find((J)=>J.id===$)}mutate($){let J=XH(this.filePath,this.cwd,this.sessionId),Z=$(J);return L0(this.filePath,J),Z}}function YH($){let J=$.scheduledRuns?.maxLatenessMs;return Number.isInteger(J)&&J>=0?J:pA}function aA($){let J=$.scheduledRuns?.maxPending;return Number.isInteger(J)&&J>=1?J:iA}function tA($){return $==="fired"||$==="canceled"||$==="missed"||$==="failed"}function zH($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function eA($){if(($.chain?.length??0)>0)return`chain (${$.chain.length})`;if(($.tasks?.length??0)>0)return`parallel (${$.tasks.length})`;return $.agent?`agent ${$.agent}`:"subagent run"}function P0($,J=!1){return{content:[{type:"text",text:$}],...J?{isError:!0}:{},details:{mode:"management",results:[]}}}function HH($,J){let Z=$.find((X)=>X.id===J);if(Z)return Z;let Q=$.filter((X)=>X.id.startsWith(J));if(Q.length===1)return Q[0];if(Q.length>1)throw Error(`Ambiguous scheduled run id prefix '${J}' matched: ${Q.map((X)=>X.id).join(", ")}. Provide a longer id.`);throw Error(`Scheduled run '${J}' not found.`)}function $_($){let J=($.chain?.length??0)>0,Z=($.tasks?.length??0)>0,Q=!J&&!Z&&Boolean($.agent);if(Number(J)+Number(Z)+Number(Q)!==1)return{error:"action='schedule' requires exactly one execution mode: agent, tasks, or chain."};if(!$.schedule?.trim())return{error:"action='schedule' requires schedule, such as '+10m' or a future ISO timestamp."};if($.context==="fork")return{error:"Scheduled subagent runs require fresh context. Forked parent-session context is not safe at fire time."};if($.async===!1)return{error:"Scheduled subagent runs are always async; omit async or set async: true."};if($.clarify===!0)return{error:"Scheduled subagent runs cannot open clarify UI; omit clarify or set clarify: false."};let{action:X,id:Y,runId:z,dir:H,index:V,message:K,chainName:U,config:G,schedule:B,scheduleName:W,...O}=$;return{params:{...O,async:!0,clarify:!1,context:"fresh"}}}class GH{store;ctx;timers=new Map;storeRoot;now;randomId;timersApi;deps;constructor($){this.deps=$,this.storeRoot=$.storeRoot??VH,this.now=$.now??Date.now,this.randomId=$.randomId??(()=>lA().slice(0,8)),this.timersApi=$.timers??globalThis}bindSession($){if(this.stopTimers(),this.ctx=$,!QH(this.deps.config)){this.store=void 0;return}let J=I1($.sessionManager);this.store=new UH(rA($.cwd,J,this.storeRoot),$.cwd,J),this.rearmScheduledJobs()}stop(){this.stopTimers(),this.store=void 0,this.ctx=void 0}async handleToolCall($,J){this.ctx=J;try{if(!QH(this.deps.config))return P0('Scheduled subagent runs are disabled. Set { "scheduledRuns": { "enabled": true } } in ~/.dm/agent/extensions/subagent/config.json, then reload Pi. Schedule only explicit delayed runs the user asked for.',!0);if(!this.store)this.bindSession(J);if(!this.store)return P0("Scheduled subagent store is unavailable for this session.",!0);switch($.action){case"schedule":return this.createJob($,J);case"schedule-list":return this.listJobs();case"schedule-status":return this.statusJob($);case"schedule-cancel":return this.cancelJob($);default:return P0(`Unknown scheduled-run action: ${$.action}`,!0)}}catch(Z){let Q=Z instanceof Error?Z.message:String(Z);return P0(Q,!0)}}createJob($,J){let Z=this.requireStore(),Q=$_($);if(Q.error)return P0(Q.error,!0);let X=$.schedule.trim(),Y=sA(X,this.now()),z=Z.list().filter((O)=>O.state==="scheduled"||O.state==="running").length,H=aA(this.deps.config);if(z>=H)return P0(`Scheduled subagent limit reached (${z}/${H} pending or running). Cancel an existing scheduled run before adding another.`,!0);let V=this.randomId(),K=I1(J.sessionManager),U=$.scheduleName?.trim(),G=Q.params,B=this.now(),W={id:V,name:U||eA(G),schedule:X,runAt:Y,state:"scheduled",createdAt:B,updatedAt:B,cwd:J.cwd,sessionId:K,params:G};return Z.mutate((O)=>{O.jobs.push(W)}),this.arm(W),P0([`Scheduled subagent run ${W.id}.`,`Name: ${W.name}`,`When: ${new Date(W.runAt).toISOString()}`,`Mode: ${zH(G)}`,"Context: fresh (scheduled runs never fork parent-session context)",`Status: subagent({ action: "schedule-status", id: "${W.id}" })`,`Cancel before it fires: subagent({ action: "schedule-cancel", id: "${W.id}" })`].join(`
|
|
@@ -225,4 +225,4 @@ ${X$}
|
|
|
225
225
|
|
|
226
226
|
${J$}`:`${A$}
|
|
227
227
|
|
|
228
|
-
${X$}`}],details:_$}}finally{if(l)A2(l)}}async function Mz($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:H,runId:U,sessionDirForIndex:j,sessionFileForTask:G,thinkingOverrideForTask:z,shareEnabled:V,artifactConfig:B,artifactsDir:K,onUpdate:W,sessionRoot:A,controlConfig:O,contextPolicy:_}=$,f=B9($,J),F=$.intercomBridge.active?u$(U,Z.agent,0):void 0,y=[],C=[],T=X.find((O$)=>O$.name===Z.agent);if(!T)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let h=l7({runBudget:$.toolBudget,agentBudget:T.toolBudget,configBudget:$.configToolBudget});if(h.error)return k2(Z,Error(h.error));let b=Y.model?.provider,w=Y.modelRegistry.getAvailable().map(y0),q=Z.task??"",S=B0(Z.model??T.model,Y.model,w,b,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),M=X0(Z.skill),N=Z.output!==void 0?Z.output:T.output,E=qJ(N,T.output),n=Z.outputMode??"inline",L=r0(J.config.maxSubagentDepth),k=s0(L,T.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let O$=P0(T,{output:E,skills:M}),z$=I0(Q),Y$=await Y.ui.custom((K$,_$,R,i)=>new VJ(K$,_$,[T],[q],q,void 0,[O$],w,b,z$,i,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!Y$||!Y$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};q=Y$.templates[0];let Z$=Y$.behaviorOverrides[0];if(Z$?.model)S=B0(Z$.model,Y.model,w,b,{scope:$.modelScope,source:"explicit"});if(Z$?.output!==void 0)E=qJ(Z$.output,T.output);if(Z$?.skills!==void 0)M=Z$.skills;if(Y$.runInBackground){if(!I1())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let K$=P1(),_$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return x8(K$,{agent:Z.agent,task:A0(_,Z.agent)?i0(q):q,agentConfig:T,ctx:_$,availableModels:w,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?K:void 0,artifactConfig:B,shareEnabled:V,sessionRoot:A,sessionFile:G(Z.agent,0),skills:M===!1?[]:M,output:E,outputMode:n,outputBaseDir:t8(J,K,K$),modelOverride:S,thinkingOverride:z(Z.agent,0),maxSubagentDepth:k,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:O,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(R,i)=>u$(K$,R,i):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:h.toolBudget})}}if(A0(_,Z.agent))q=i0(q);let o=q,g=y1(E,Y.cwd,Q,t8(J,K,U)),I=b0(n,g,`Single run (${Z.agent})`);if(I)return{content:[{type:"text",text:I}],isError:!0,details:{mode:"single",results:[]}};q=FJ(q,g);let a;if(M===!1)a=[];else a=M;let F$=new AbortController,P=J.state.foregroundControls.get(U);if(P)P.currentAgent=Z.agent,P.currentIndex=0,P.currentActivityState=void 0,P.updatedAt=Date.now(),P.interrupt=()=>{if(F$.signal.aborted)return!1;return F$.abort(),P.currentActivityState=void 0,P.updatedAt=Date.now(),!0};let w$=W?(O$)=>{if(P){let z$=O$.details?.progress?.[0];P.currentAgent=Z.agent,P.currentIndex=z$?.index??0,P.currentActivityState=z$?.activityState,P.lastActivityAt=z$?.lastActivityAt,P.currentTool=z$?.currentTool,P.currentToolStartedAt=z$?.currentToolStartedAt,P.currentPath=z$?.currentPath,P.turnCount=z$?.turnCount,P.tokens=z$?.tokens,P.toolCount=z$?.toolCount,P.updatedAt=Date.now()}W(O$)}:void 0,$$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),l=await LJ(Y.cwd,X,Z.agent,q,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:H,interruptSignal:F$.signal,allowIntercomDetach:T.systemPrompt?.includes(V1)===!0,intercomEvents:J.pi.events,runId:U,sessionDir:j(0),sessionFile:G(Z.agent,0),share:V,artifactsDir:B.enabled?K:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:g,outputMode:n,maxSubagentDepth:k,onUpdate:w$,controlConfig:O,onControlEvent:f,intercomSessionName:F,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:P?.nestedRoute,index:0,modelOverride:S,thinkingOverride:z(Z.agent,0),availableModels:w,preferredModelProvider:b,modelScope:$.modelScope,skills:a,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(O$)=>G9(J.state,{runId:U,mode:"single",cwd:Q,index:0,result:O$}),timeoutMs:$.timeoutMs,deadlineAt:$$,turnBudget:$.turnBudget,toolBudget:h.toolBudget});if(P?.currentIndex===0)P.interrupt=void 0,P.currentActivityState=l.progress?.activityState,P.lastActivityAt=l.progress?.lastActivityAt,P.currentTool=l.progress?.currentTool,P.currentToolStartedAt=l.progress?.currentToolStartedAt,P.currentPath=l.progress?.currentPath,P.turnCount=l.progress?.turnCount,P.tokens=l.progress?.tokens,P.toolCount=l.progress?.toolCount,P.updatedAt=Date.now();if(MJ(Z.agent,o,l.exitCode,l.progressSummary?.durationMs??0),l.progress)y.push(l.progress);if(l.artifactPaths)C.push(l.artifactPaths);let v$=f0(l),c=iZ({fullOutput:v$,truncatedOutput:l.truncation?.text,outputPath:g,outputMode:l.outputMode,exitCode:l.exitCode,savedPath:l.savedOutputPath,outputReference:l.outputReference,saveError:l.outputSaveError});if(P)i1(P),D1(U,[l],P.nestedChildren);let H$=UJ({mode:"single",runId:U,results:[l],...$.turnBudget?{turnBudget:$.turnBudget}:{},...h.toolBudget?{toolBudget:h.toolBudget}:{},progress:Z.includeProgress?y:void 0,artifacts:C.length?{dir:K,files:C}:void 0,truncation:l.truncation,totalChildUsage:uJ([l]),totalCost:HJ([l])});if(z9(J.state,{runId:U,mode:"single",cwd:Q,results:H$.results}),!l.detached&&!l.interrupted){if(P)i1(P);let O$=await K9({pi:J.pi,intercomBridge:$.intercomBridge,runId:U,mode:"single",details:H$,...P?.nestedChildren?.length?{nestedChildren:P.nestedChildren}:{}});if(O$)return{content:[{type:"text",text:O$.text}],details:O$.details,...l.exitCode!==0?{isError:!0}:{}}}if(l.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:H$};if(l.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:H$};if(l.exitCode!==0)return{content:[{type:"text",text:Jz(l,c.displayOutput)}],details:H$,isError:!0};return{content:[{type:"text",text:c.displayOutput||"(no output)"}],details:H$}}function Nz($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function Ez($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:Nz($),results:[]}}}function c7($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var Tz=new Set(["assistant","default","general","generic","subagent"]);function Sz($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((X)=>X.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(!Z&&Boolean($.task?.trim())||Boolean(Z&&Tz.has(Z.toLowerCase())))||!J.some((X)=>X.name==="worker"))return $;return{...$,agent:"worker"}}function QA($){let J=async(Q,X,Y,H,U)=>{$.state.baseCwd=U.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let j=c7(X),G=yV(U.cwd,j.cwd),z=j.cwd===void 0?j:{...j,cwd:G},V=z.action;if(V){if(V==="doctor"){let s=null,p=$.state.currentSessionId,M$;try{s=U.sessionManager.getSessionFile()??null,p=U.sessionManager.getSessionId()}catch(Q$){M$=Q$ instanceof Error?`${Q$.name}: ${Q$.message}`:String(Q$)}let x;try{x=s2($.pi.getSessionName(),U.sessionManager.getSessionId())}catch(Q$){if(!M$)M$=Q$ instanceof Error?`${Q$.name}: ${Q$.message}`:String(Q$)}return{content:[{type:"text",text:p3({cwd:G,config:$.config,state:$.state,context:z.context,requestedSessionDir:z.sessionDir,currentSessionFile:s,currentSessionId:p,orchestratorTarget:x,sessionError:M$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(V==="status"){let s=z.id??z.runId,p=P2($),M$=DV(U,$);if(z.view==="fleet")return s8(z,{state:$.state,nested:p,sessionRoots:M$});if(s)try{let x=F1(s,{state:$.state,nested:p});if(x?.kind==="foreground"){let Q$=j9($.state,x.id);if(Q$){if(z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return h7(Q$)}}}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}else{let x=j9($.state,void 0);if(x&&z.view!=="transcript")return h7(x);if(x&&z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return s8(z,{state:$.state,nested:p,sessionRoots:M$})}if(V==="resume")return eV({params:z,requestCwd:G,ctx:U,deps:$});if(V==="steer"){let s=(z.message??z.task??"").trim();if(!s)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let p=z.runId??z.id;if(z.dir)try{let x=y2(z,Q0,h$),Q$=x.resolvedId??p??T$.basename(x.asyncDir??z.dir);return m7({state:$.state,runId:Q$,message:s,index:z.index,kill:$.kill,location:x})}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}if(!p)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let M$;try{M$=F1(p,{state:$.state,nested:P2($)})}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}if(M$?.kind==="nested")return tV({target:M$,message:s,index:z.index});if(M$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(M$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${p}'.`}],isError:!0,details:{mode:"management",results:[]}};return m7({state:$.state,runId:M$.id,message:s,index:z.index,kill:$.kill,location:M$.location})}if(V==="append-step")return cV({params:z,requestCwd:G,ctx:U,deps:$});if(V==="schedule"||V==="schedule-list"||V==="schedule-status"||V==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${V}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(z,U)}if(V==="interrupt"){let s=z.runId??z.id,p;if(s)try{p=F1(s,{state:$.state,nested:P2($)})}catch(Q$){return{content:[{type:"text",text:Q$ instanceof Error?Q$.message:String(Q$)}],isError:!0,details:{mode:"management",results:[]}}}if(p?.kind==="nested")return sV(p);let M$=j9($.state,p?.kind==="foreground"?p.id:s);if(M$?.interrupt){if(M$.interrupt())return M$.updatedAt=Date.now(),M$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${M$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${M$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let x=gV($.state,p?.kind==="async"?p.id:s,$.kill,p?.kind==="async"?p.location:void 0);if(x)return x;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!X4.includes(V))return{content:[{type:"text",text:`Unknown action: ${V}. Valid: ${X4.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&RV.has(V))return{content:[{type:"text",text:`Action '${V}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return D3(V,z,{...U,cwd:G,config:$.config})}let{blocked:B,depth:K,maxDepth:W}=U4($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${K}, max=${W}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let A=Gz(z);if(A.error)return A.error;let O=A.params,_=v7(O,K,$.config.forceTopLevelAsync===!0),f=Uz(_);if(f.error)return DJ(_,f.error);let F=jz(_,$.config);if(F.error)return DJ(_,F.error);let y=x2(_.toolBudget,"toolBudget");if(y.error)return DJ(_,y.error);let C=x2($.config.toolBudget,"config.toolBudget");if(C.error)return DJ(_,C.error);let T=T8(_.agentScope),h=_.cwd??U.cwd,b=U.sessionManager.getSessionFile()??null;$.state.currentSessionId=g8(U.sessionManager);let w=$.discoverAgents(h,T),q=w.agents,S=w.modelScope;_=Sz(_,q);let M=Yz(_,q);_=M.params;let N=s2($.pi.getSessionName(),U.sessionManager.getSessionId()),E=R4({config:$.config.intercomBridge,context:_.context,orchestratorTarget:N}),n=E.active?q.map((s)=>y4(s,E)):q,L=P1().slice(0,8),k=SJ(),o=k?CJ():void 0,g=k??P3(L),I=_.share===!0,a=(_.chain?.length??0)>0,F$=(_.tasks?.length??0)>0,P=!a&&!F$&&Boolean(_.agent),w$=a&&_.clarify===!0&&U.hasUI&&!(_.chain?.some(E$)??!1),$$=Qz(_,n,a,F$,P,w$);if($$)return $$;let l=()=>{return},v$=()=>{return};try{let s=J7(U.sessionManager,M.usesFork?"fork":void 0);l=s.sessionFileForIndex,v$=s.thinkingOverrideForIndex}catch(s){return k2(_,s)}let c=_.async??$.asyncByDefault,H$=(a||F$)&&c&&_.clarify===!0,O$=c&&_.clarify!==!0,z$=t2($.config.control,_.control),Y$={...g2,enabled:_.artifacts!==!1},Z$=n2(b,h),K$;if(_.sessionDir)K$=T$.resolve($.expandTilde(_.sessionDir));else{let s=$.config.defaultSessionDir?T$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(b);K$=T$.join(s,L)}try{n0.mkdirSync(K$,{recursive:!0})}catch(s){let p=s instanceof Error?s.message:String(s);return k2(_,Error(`Failed to create session directory '${K$}': ${p}`))}let _$=(s)=>T$.join(K$,`run-${s??0}`),R=(s,p)=>A0(M,s)?l(p):void 0,i=(s,p)=>A0(M,s)?v$(p):void 0,n$=(s,p)=>R(s,p)??T$.join(_$(p),"session.jsonl"),J$=(s)=>T$.join(_$(s),"session.jsonl");try{Bz(_,M,R,$.config.chain?.dynamicFanout?.maxItems)}catch(s){return k2(_,s)}let c$=Xz(_,$.config.chain?.dynamicFanout?.maxItems);if(c$)return c$;let N$=H?(s)=>H(k1(s,_.context)):void 0,X$=a?"chain":F$?"parallel":"single",A$=bV({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:wV(_,$.config),mode:X$});if(A$)return A$;let j$={params:_,effectiveCwd:h,ctx:U,signal:Y,onUpdate:N$,agents:n,runId:L,shareEnabled:I,sessionRoot:K$,sessionDirForIndex:_$,sessionFileForIndex:J$,sessionFileForTask:n$,thinkingOverrideForTask:i,artifactConfig:Y$,artifactsDir:Z$,backgroundRequestedWhileClarifying:H$,effectiveAsync:O$,controlConfig:z$,intercomBridge:E,nestedRoute:g,timeoutMs:f.timeoutMs,turnBudget:F.turnBudget,toolBudget:y.toolBudget,configToolBudget:C.toolBudget,contextPolicy:M,modelScope:S},m=O$?void 0:{runId:L,mode:X$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:g,interrupt:void 0};if(m)$.state.foregroundControls.set(L,m),$.state.lastForegroundControlId=L;let R$=(s,p)=>{if(!k||!o)return;let M$=Date.now(),x=p?.details,Q$=s==="subagent.nested.started"?"running":p?.isError||x?.results.some((D)=>D.exitCode!==0)?"failed":x?.results.some((D)=>D.interrupted)?"paused":"complete",p$=p?.isError?p.content.find((D)=>D.type==="text")?.text:void 0,I$=F$&&_.tasks?_.tasks.map((D)=>D.agent):a&&_.chain?_.chain.flatMap((D)=>E$(D)?D.parallel.map((G$)=>G$.agent):[D.agent]):_.agent?[_.agent]:[],O1=E.active&&I$[0]?u$(L,I$[0],0):void 0;try{p1(k,{type:s,ts:M$,parentRunId:o.parentRunId,parentStepIndex:o.parentStepIndex,child:{id:L,parentRunId:o.parentRunId,parentStepIndex:o.parentStepIndex,depth:o.depth,path:o.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:O1,intercomTarget:O1,ownerState:Q$==="running"?"live":"gone",mode:X$,state:Q$,agent:I$[0],agents:I$,startedAt:m?.startedAt??M$,...Q$!=="running"?{endedAt:M$}:{},lastUpdate:M$,...x?.totalCost?{totalCost:x.totalCost}:{},...p$?{error:p$}:{},...x?.results.length?{steps:x.results.map((D)=>({agent:D.agent,status:D.interrupted?"paused":D.exitCode===0?"complete":"failed",...D.sessionFile?{sessionFile:D.sessionFile}:{},...D.error?{error:D.error}:{}}))}:{}}})}catch(D){console.error("Failed to emit nested foreground status event:",D)}},i$=!1;try{let s=Kz(j$,$);if(s)return k1(s,_.context);if(m)R$("subagent.nested.started"),i$=!0;if(a&&_.chain){let p=await Wz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}if(F$&&_.tasks){let p=await Lz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}if(P){let p=await Mz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}}catch(s){let p=k2(_,s);if(i$)R$("subagent.nested.completed",p);return p}finally{if(m){if(i3($.state,L),$.state.foregroundControls.delete(L),$.state.lastForegroundControlId===L)$.state.lastForegroundControlId=null}}return k1({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,H,U)=>{let j=c7(X);if(j.action)return J(Q,j,Y,H,U);if($.state.subagentInProgress===!0)return Ez(j);$.state.subagentInProgress=!0;try{return await J(Q,j,Y,H,U)}finally{$.state.subagentInProgress=!1}}}}export{QA as createSubagentExecutor};
|
|
228
|
+
${X$}`}],details:_$}}finally{if(l)A2(l)}}async function Mz($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:H,runId:U,sessionDirForIndex:j,sessionFileForTask:G,thinkingOverrideForTask:z,shareEnabled:V,artifactConfig:B,artifactsDir:K,onUpdate:W,sessionRoot:A,controlConfig:O,contextPolicy:_}=$,f=B9($,J),F=$.intercomBridge.active?u$(U,Z.agent,0):void 0,y=[],C=[],T=X.find((O$)=>O$.name===Z.agent);if(!T)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let h=l7({runBudget:$.toolBudget,agentBudget:T.toolBudget,configBudget:$.configToolBudget});if(h.error)return k2(Z,Error(h.error));let b=Y.model?.provider,w=Y.modelRegistry.getAvailable().map(y0),q=Z.task??"",S=B0(Z.model??T.model,Y.model,w,b,{scope:$.modelScope,source:Z.model?"explicit":"inherited"}),M=X0(Z.skill),N=Z.output!==void 0?Z.output:T.output,E=qJ(N,T.output),n=Z.outputMode??"inline",L=r0(J.config.maxSubagentDepth),k=s0(L,T.maxSubagentDepth);if(Z.clarify===!0&&Y.hasUI){let O$=P0(T,{output:E,skills:M}),z$=I0(Q),Y$=await Y.ui.custom((K$,_$,R,i)=>new VJ(K$,_$,[T],[q],q,void 0,[O$],w,b,z$,i,"single"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!Y$||!Y$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"single",results:[]}};q=Y$.templates[0];let Z$=Y$.behaviorOverrides[0];if(Z$?.model)S=B0(Z$.model,Y.model,w,b,{scope:$.modelScope,source:"explicit"});if(Z$?.output!==void 0)E=qJ(Z$.output,T.output);if(Z$?.skills!==void 0)M=Z$.skills;if(Y$.runInBackground){if(!I1())return{content:[{type:"text",text:"Background mode requires upstream jiti for TypeScript execution but it could not be found. Ensure the dm-subagents package dependencies are installed."}],isError:!0,details:{mode:"single",results:[]}};let K$=P1(),_$={pi:J.pi,cwd:Y.cwd,currentSessionId:J.state.currentSessionId,parentSessionId:Y.sessionManager.getSessionId()??void 0,currentModelProvider:Y.model?.provider,currentModel:Y.model,modelScope:$.modelScope};return x8(K$,{agent:Z.agent,task:A0(_,Z.agent)?i0(q):q,agentConfig:T,ctx:_$,availableModels:w,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?K:void 0,artifactConfig:B,shareEnabled:V,sessionRoot:A,sessionFile:G(Z.agent,0),skills:M===!1?[]:M,output:E,outputMode:n,outputBaseDir:t8(J,K,K$),modelOverride:S,thinkingOverride:z(Z.agent,0),maxSubagentDepth:k,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:O,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(R,i)=>u$(K$,R,i):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:h.toolBudget})}}if(A0(_,Z.agent))q=i0(q);let o=q,g=y1(E,Y.cwd,Q,t8(J,K,U)),I=b0(n,g,`Single run (${Z.agent})`);if(I)return{content:[{type:"text",text:I}],isError:!0,details:{mode:"single",results:[]}};q=FJ(q,g);let a;if(M===!1)a=[];else a=M;let F$=new AbortController,P=J.state.foregroundControls.get(U);if(P)P.currentAgent=Z.agent,P.currentIndex=0,P.currentActivityState=void 0,P.updatedAt=Date.now(),P.interrupt=()=>{if(F$.signal.aborted)return!1;return F$.abort(),P.currentActivityState=void 0,P.updatedAt=Date.now(),!0};let w$=W?(O$)=>{if(P){let z$=O$.details?.progress?.[0];P.currentAgent=Z.agent,P.currentIndex=z$?.index??0,P.currentActivityState=z$?.activityState,P.lastActivityAt=z$?.lastActivityAt,P.currentTool=z$?.currentTool,P.currentToolStartedAt=z$?.currentToolStartedAt,P.currentPath=z$?.currentPath,P.turnCount=z$?.turnCount,P.tokens=z$?.tokens,P.toolCount=z$?.toolCount,P.updatedAt=Date.now()}W(O$)}:void 0,$$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),l=await LJ(Y.cwd,X,Z.agent,q,{parentSessionId:Y.sessionManager.getSessionId()??void 0,cwd:Q,signal:H,interruptSignal:F$.signal,allowIntercomDetach:T.systemPrompt?.includes(V1)===!0,intercomEvents:J.pi.events,runId:U,sessionDir:j(0),sessionFile:G(Z.agent,0),share:V,artifactsDir:B.enabled?K:void 0,artifactConfig:B,maxOutput:Z.maxOutput,outputPath:g,outputMode:n,maxSubagentDepth:k,onUpdate:w$,controlConfig:O,onControlEvent:f,intercomSessionName:F,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,nestedRoute:P?.nestedRoute,index:0,modelOverride:S,thinkingOverride:z(Z.agent,0),availableModels:w,preferredModelProvider:b,modelScope:$.modelScope,skills:a,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(O$)=>G9(J.state,{runId:U,mode:"single",cwd:Q,index:0,result:O$}),timeoutMs:$.timeoutMs,deadlineAt:$$,turnBudget:$.turnBudget,toolBudget:h.toolBudget});if(P?.currentIndex===0)P.interrupt=void 0,P.currentActivityState=l.progress?.activityState,P.lastActivityAt=l.progress?.lastActivityAt,P.currentTool=l.progress?.currentTool,P.currentToolStartedAt=l.progress?.currentToolStartedAt,P.currentPath=l.progress?.currentPath,P.turnCount=l.progress?.turnCount,P.tokens=l.progress?.tokens,P.toolCount=l.progress?.toolCount,P.updatedAt=Date.now();if(MJ(Z.agent,o,l.exitCode,l.progressSummary?.durationMs??0),l.progress)y.push(l.progress);if(l.artifactPaths)C.push(l.artifactPaths);let v$=f0(l),c=iZ({fullOutput:v$,truncatedOutput:l.truncation?.text,outputPath:g,outputMode:l.outputMode,exitCode:l.exitCode,savedPath:l.savedOutputPath,outputReference:l.outputReference,saveError:l.outputSaveError});if(P)i1(P),D1(U,[l],P.nestedChildren);let H$=UJ({mode:"single",runId:U,results:[l],...$.turnBudget?{turnBudget:$.turnBudget}:{},...h.toolBudget?{toolBudget:h.toolBudget}:{},progress:Z.includeProgress?y:void 0,artifacts:C.length?{dir:K,files:C}:void 0,truncation:l.truncation,totalChildUsage:uJ([l]),totalCost:HJ([l])});if(z9(J.state,{runId:U,mode:"single",cwd:Q,results:H$.results}),!l.detached&&!l.interrupted){if(P)i1(P);let O$=await K9({pi:J.pi,intercomBridge:$.intercomBridge,runId:U,mode:"single",details:H$,...P?.nestedChildren?.length?{nestedChildren:P.nestedChildren}:{}});if(O$)return{content:[{type:"text",text:O$.text}],details:O$.details,...l.exitCode!==0?{isError:!0}:{}}}if(l.detached)return{content:[{type:"text",text:`Detached for intercom coordination: ${Z.agent}. Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:H$};if(l.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:H$};if(l.exitCode!==0)return{content:[{type:"text",text:Jz(l,c.displayOutput)}],details:H$,isError:!0};return{content:[{type:"text",text:c.displayOutput||"(no output)"}],details:H$}}function Nz($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function Ez($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:Nz($),results:[]}}}function c7($){let J=$.action?.toLowerCase();if(J==="single"&&($.agent!==void 0||$.task!==void 0)){let Z={...$};return delete Z.action,Z}if((J==="parallel"||J==="tasks")&&($.tasks?.length??0)>0){let Z={...$};return delete Z.action,Z}return $}var Tz=new Set(["assistant","default","general","generic","subagent"]);function Sz($,J){if(($.tasks?.length??0)>0||($.chain?.length??0)>0)return $;let Z=$.agent?.trim();if(Z&&J.some((Y)=>Y.name===Z))return Z===$.agent?$:{...$,agent:Z};if(!(Boolean($.task?.trim())&&(!Z||Tz.has(Z.toLowerCase())))||!J.some((Y)=>Y.name==="worker"))return $;return{...$,agent:"worker"}}function QA($){let J=async(Q,X,Y,H,U)=>{$.state.baseCwd=U.cwd,$.state.foregroundRuns??=new Map,$.state.foregroundControls??=new Map,$.state.lastForegroundControlId??=null;let j=c7(X),G=yV(U.cwd,j.cwd),z=j.cwd===void 0?j:{...j,cwd:G},V=z.action;if(V){if(V==="doctor"){let s=null,p=$.state.currentSessionId,M$;try{s=U.sessionManager.getSessionFile()??null,p=U.sessionManager.getSessionId()}catch(Q$){M$=Q$ instanceof Error?`${Q$.name}: ${Q$.message}`:String(Q$)}let x;try{x=s2($.pi.getSessionName(),U.sessionManager.getSessionId())}catch(Q$){if(!M$)M$=Q$ instanceof Error?`${Q$.name}: ${Q$.message}`:String(Q$)}return{content:[{type:"text",text:p3({cwd:G,config:$.config,state:$.state,context:z.context,requestedSessionDir:z.sessionDir,currentSessionFile:s,currentSessionId:p,orchestratorTarget:x,sessionError:M$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(V==="status"){let s=z.id??z.runId,p=P2($),M$=DV(U,$);if(z.view==="fleet")return s8(z,{state:$.state,nested:p,sessionRoots:M$});if(s)try{let x=F1(s,{state:$.state,nested:p});if(x?.kind==="foreground"){let Q$=j9($.state,x.id);if(Q$){if(z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Persisted session transcript becomes inspectable after the foreground run completes when sessions are enabled."}],details:{mode:"management",results:[]}};return h7(Q$)}}}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}else{let x=j9($.state,void 0);if(x&&z.view!=="transcript")return h7(x);if(x&&z.view==="transcript")return{content:[{type:"text",text:"Live foreground transcript is already visible in the expanded running subagent result. Pass an async run id to inspect a background transcript."}],details:{mode:"management",results:[]}}}return s8(z,{state:$.state,nested:p,sessionRoots:M$})}if(V==="resume")return eV({params:z,requestCwd:G,ctx:U,deps:$});if(V==="steer"){let s=(z.message??z.task??"").trim();if(!s)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let p=z.runId??z.id;if(z.dir)try{let x=y2(z,Q0,h$),Q$=x.resolvedId??p??T$.basename(x.asyncDir??z.dir);return m7({state:$.state,runId:Q$,message:s,index:z.index,kill:$.kill,location:x})}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}if(!p)return{content:[{type:"text",text:"action='steer' requires id or dir."}],isError:!0,details:{mode:"management",results:[]}};let M$;try{M$=F1(p,{state:$.state,nested:P2($)})}catch(x){return{content:[{type:"text",text:x instanceof Error?x.message:String(x)}],isError:!0,details:{mode:"management",results:[]}}}if(M$?.kind==="nested")return tV({target:M$,message:s,index:z.index});if(M$?.kind==="foreground")return{content:[{type:"text",text:"action='steer' currently supports live async DM child sessions only; use action='interrupt' or action='resume' for foreground runs."}],isError:!0,details:{mode:"management",results:[]}};if(M$?.kind!=="async")return{content:[{type:"text",text:`No async run found for '${p}'.`}],isError:!0,details:{mode:"management",results:[]}};return m7({state:$.state,runId:M$.id,message:s,index:z.index,kill:$.kill,location:M$.location})}if(V==="append-step")return cV({params:z,requestCwd:G,ctx:U,deps:$});if(V==="schedule"||V==="schedule-list"||V==="schedule-status"||V==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${V}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(z,U)}if(V==="interrupt"){let s=z.runId??z.id,p;if(s)try{p=F1(s,{state:$.state,nested:P2($)})}catch(Q$){return{content:[{type:"text",text:Q$ instanceof Error?Q$.message:String(Q$)}],isError:!0,details:{mode:"management",results:[]}}}if(p?.kind==="nested")return sV(p);let M$=j9($.state,p?.kind==="foreground"?p.id:s);if(M$?.interrupt){if(M$.interrupt())return M$.updatedAt=Date.now(),M$.currentActivityState=void 0,{content:[{type:"text",text:`Interrupt requested for foreground run ${M$.runId}.`}],details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Foreground run ${M$.runId} has no active child step to interrupt.`}],isError:!0,details:{mode:"management",results:[]}}}let x=gV($.state,p?.kind==="async"?p.id:s,$.kill,p?.kind==="async"?p.location:void 0);if(x)return x;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!X4.includes(V))return{content:[{type:"text",text:`Unknown action: ${V}. Valid: ${X4.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&RV.has(V))return{content:[{type:"text",text:`Action '${V}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return D3(V,z,{...U,cwd:G,config:$.config})}let{blocked:B,depth:K,maxDepth:W}=U4($.config.maxSubagentDepth);if(B)return{content:[{type:"text",text:`Nested subagent call blocked (depth=${K}, max=${W}). You are running at the maximum subagent nesting depth. Complete your current task directly without delegating to further subagents.`}],isError:!0,details:{mode:"single",results:[]}};let A=Gz(z);if(A.error)return A.error;let O=A.params,_=v7(O,K,$.config.forceTopLevelAsync===!0),f=Uz(_);if(f.error)return DJ(_,f.error);let F=jz(_,$.config);if(F.error)return DJ(_,F.error);let y=x2(_.toolBudget,"toolBudget");if(y.error)return DJ(_,y.error);let C=x2($.config.toolBudget,"config.toolBudget");if(C.error)return DJ(_,C.error);let T=T8(_.agentScope),h=_.cwd??U.cwd,b=U.sessionManager.getSessionFile()??null;$.state.currentSessionId=g8(U.sessionManager);let w=$.discoverAgents(h,T),q=w.agents,S=w.modelScope;_=Sz(_,q);let M=Yz(_,q);_=M.params;let N=s2($.pi.getSessionName(),U.sessionManager.getSessionId()),E=R4({config:$.config.intercomBridge,context:_.context,orchestratorTarget:N}),n=E.active?q.map((s)=>y4(s,E)):q,L=P1().slice(0,8),k=SJ(),o=k?CJ():void 0,g=k??P3(L),I=_.share===!0,a=(_.chain?.length??0)>0,F$=(_.tasks?.length??0)>0,P=!a&&!F$&&Boolean(_.agent),w$=a&&_.clarify===!0&&U.hasUI&&!(_.chain?.some(E$)??!1),$$=Qz(_,n,a,F$,P,w$);if($$)return $$;let l=()=>{return},v$=()=>{return};try{let s=J7(U.sessionManager,M.usesFork?"fork":void 0);l=s.sessionFileForIndex,v$=s.thinkingOverrideForIndex}catch(s){return k2(_,s)}let c=_.async??$.asyncByDefault,H$=(a||F$)&&c&&_.clarify===!0,O$=c&&_.clarify!==!0,z$=t2($.config.control,_.control),Y$={...g2,enabled:_.artifacts!==!1},Z$=n2(b,h),K$;if(_.sessionDir)K$=T$.resolve($.expandTilde(_.sessionDir));else{let s=$.config.defaultSessionDir?T$.resolve($.expandTilde($.config.defaultSessionDir)):$.getSubagentSessionRoot(b);K$=T$.join(s,L)}try{n0.mkdirSync(K$,{recursive:!0})}catch(s){let p=s instanceof Error?s.message:String(s);return k2(_,Error(`Failed to create session directory '${K$}': ${p}`))}let _$=(s)=>T$.join(K$,`run-${s??0}`),R=(s,p)=>A0(M,s)?l(p):void 0,i=(s,p)=>A0(M,s)?v$(p):void 0,n$=(s,p)=>R(s,p)??T$.join(_$(p),"session.jsonl"),J$=(s)=>T$.join(_$(s),"session.jsonl");try{Bz(_,M,R,$.config.chain?.dynamicFanout?.maxItems)}catch(s){return k2(_,s)}let c$=Xz(_,$.config.chain?.dynamicFanout?.maxItems);if(c$)return c$;let N$=H?(s)=>H(k1(s,_.context)):void 0,X$=a?"chain":F$?"parallel":"single",A$=bV({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:wV(_,$.config),mode:X$});if(A$)return A$;let j$={params:_,effectiveCwd:h,ctx:U,signal:Y,onUpdate:N$,agents:n,runId:L,shareEnabled:I,sessionRoot:K$,sessionDirForIndex:_$,sessionFileForIndex:J$,sessionFileForTask:n$,thinkingOverrideForTask:i,artifactConfig:Y$,artifactsDir:Z$,backgroundRequestedWhileClarifying:H$,effectiveAsync:O$,controlConfig:z$,intercomBridge:E,nestedRoute:g,timeoutMs:f.timeoutMs,turnBudget:F.turnBudget,toolBudget:y.toolBudget,configToolBudget:C.toolBudget,contextPolicy:M,modelScope:S},m=O$?void 0:{runId:L,mode:X$,startedAt:Date.now(),updatedAt:Date.now(),currentAgent:void 0,currentIndex:void 0,currentActivityState:void 0,nestedRoute:g,interrupt:void 0};if(m)$.state.foregroundControls.set(L,m),$.state.lastForegroundControlId=L;let R$=(s,p)=>{if(!k||!o)return;let M$=Date.now(),x=p?.details,Q$=s==="subagent.nested.started"?"running":p?.isError||x?.results.some((D)=>D.exitCode!==0)?"failed":x?.results.some((D)=>D.interrupted)?"paused":"complete",p$=p?.isError?p.content.find((D)=>D.type==="text")?.text:void 0,I$=F$&&_.tasks?_.tasks.map((D)=>D.agent):a&&_.chain?_.chain.flatMap((D)=>E$(D)?D.parallel.map((G$)=>G$.agent):[D.agent]):_.agent?[_.agent]:[],O1=E.active&&I$[0]?u$(L,I$[0],0):void 0;try{p1(k,{type:s,ts:M$,parentRunId:o.parentRunId,parentStepIndex:o.parentStepIndex,child:{id:L,parentRunId:o.parentRunId,parentStepIndex:o.parentStepIndex,depth:o.depth,path:o.path,ownerIntercomTarget:process.env.DM_SUBAGENT_INTERCOM_SESSION_NAME,leafIntercomTarget:O1,intercomTarget:O1,ownerState:Q$==="running"?"live":"gone",mode:X$,state:Q$,agent:I$[0],agents:I$,startedAt:m?.startedAt??M$,...Q$!=="running"?{endedAt:M$}:{},lastUpdate:M$,...x?.totalCost?{totalCost:x.totalCost}:{},...p$?{error:p$}:{},...x?.results.length?{steps:x.results.map((D)=>({agent:D.agent,status:D.interrupted?"paused":D.exitCode===0?"complete":"failed",...D.sessionFile?{sessionFile:D.sessionFile}:{},...D.error?{error:D.error}:{}}))}:{}}})}catch(D){console.error("Failed to emit nested foreground status event:",D)}},i$=!1;try{let s=Kz(j$,$);if(s)return k1(s,_.context);if(m)R$("subagent.nested.started"),i$=!0;if(a&&_.chain){let p=await Wz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}if(F$&&_.tasks){let p=await Lz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}if(P){let p=await Mz(j$,$);return R$("subagent.nested.completed",p),k1(p,_.context)}}catch(s){let p=k2(_,s);if(i$)R$("subagent.nested.completed",p);return p}finally{if(m){if(i3($.state,L),$.state.foregroundControls.delete(L),$.state.lastForegroundControlId===L)$.state.lastForegroundControlId=null}}return k1({content:[{type:"text",text:"Invalid params"}],isError:!0,details:{mode:"single",results:[]}},_.context)};return{execute:async(Q,X,Y,H,U)=>{let j=c7(X);if(j.action)return J(Q,j,Y,H,U);if($.state.subagentInProgress===!0)return Ez(j);$.state.subagentInProgress=!0;try{return await J(Q,j,Y,H,U)}finally{$.state.subagentInProgress=!1}}}}export{QA as createSubagentExecutor};
|