@duckmind/dm-windows-x64 0.60.6 → 0.60.9
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.exe +0 -0
- package/extensions/.dm-extensions.json +70 -123
- package/extensions/dm-9router-ext/src/index.js +410 -5
- package/extensions/dm-caveman/extensions/caveman.js +283 -12
- package/extensions/dm-cliproxy/index.js +182 -2
- package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
- package/extensions/dm-cliproxy/src/apply.js +228 -1
- package/extensions/dm-cliproxy/src/cache.js +42 -1
- package/extensions/dm-cliproxy/src/commands.js +50 -2
- package/extensions/dm-cliproxy/src/compat.js +81 -1
- package/extensions/dm-cliproxy/src/config.js +192 -2
- package/extensions/dm-cliproxy/src/conflicts.js +46 -1
- package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
- package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
- package/extensions/dm-cliproxy/src/log.js +23 -1
- package/extensions/dm-cliproxy/src/status-quota.js +77 -1
- package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
- package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
- package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
- package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
- package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
- package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
- package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
- package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
- package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
- package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
- package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
- package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
- package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
- package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
- package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
- package/extensions/dm-context/src/context.js +144 -1
- package/extensions/dm-context/src/index.js +339 -7
- package/extensions/dm-context/src/utils.js +9 -1
- package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
- package/extensions/dm-cua/index.js +75 -6
- package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
- package/extensions/dm-cua/src/browser-install.mjs +331 -2
- package/extensions/dm-fff/src/index.js +688 -12
- package/extensions/dm-fff/src/query.js +60 -1
- package/extensions/dm-goal/src/goal.js +894 -23
- package/extensions/dm-image2/index.js +103 -9
- package/extensions/dm-image2/src/image-lib.mjs +1275 -8
- package/extensions/dm-subagents/install.mjs +62 -8
- package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
- package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
- package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
- package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
- package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
- package/extensions/dm-subagents/src/agents/agents.js +1139 -11
- package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
- package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
- package/extensions/dm-subagents/src/agents/identity.js +29 -1
- package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
- package/extensions/dm-subagents/src/agents/skills.js +614 -6
- package/extensions/dm-subagents/src/extension/config.js +35 -2
- package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
- package/extensions/dm-subagents/src/extension/doctor.js +172 -15
- package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
- package/extensions/dm-subagents/src/extension/index.js +521 -359
- package/extensions/dm-subagents/src/extension/rpc.js +266 -7
- package/extensions/dm-subagents/src/extension/schemas.js +275 -1
- package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
- package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
- package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
- package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
- package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
- package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
- package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
- package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
- package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
- package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
- package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
- package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
- package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
- package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
- package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
- package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
- package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
- package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
- package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
- package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
- package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
- package/extensions/dm-subagents/src/shared/formatters.js +98 -7
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
- package/extensions/dm-subagents/src/shared/model-info.js +62 -1
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
- package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
- package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
- package/extensions/dm-subagents/src/shared/settings.js +198 -11
- package/extensions/dm-subagents/src/shared/status-format.js +53 -1
- package/extensions/dm-subagents/src/shared/types.js +184 -6
- package/extensions/dm-subagents/src/shared/utils.js +462 -2
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
- package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
- package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
- package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
- package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
- package/extensions/dm-subagents/src/tui/render.js +1542 -4
- package/extensions/dm-usage/index.js +1294 -9
- package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
- package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
- package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
- package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
- package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
- package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
- package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
- package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
- package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
- package/extensions/greedysearch-dm/bin/search.mjs +620 -540
- package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
- package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
- package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
- package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
- package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
- package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
- package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
- package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
- package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
- package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
- package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
- package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
- package/extensions/greedysearch-dm/index.js +123 -23
- package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
- package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
- package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
- package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
- package/extensions/greedysearch-dm/src/github.mjs +222 -7
- package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
- package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
- package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
- package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
- package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
- package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
- package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
- package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
- package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
- package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
- package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
- package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
- package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
- package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
- package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
- package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
- package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
- package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
- package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
- package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
- package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
- package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
- package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
- package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
- package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
- package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
- package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
- package/package.json +1 -1
|
@@ -1,361 +1,401 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
`),B=G.match(/^([ \t]+)/m)?.[1]??"",W=B?G.replace(new RegExp(`^${H7(B)}`,"gm"),"").replace(/^\n/,""):G;J[H]=W}return{frontmatter:J,body:Y}}import*as Q1 from"node:fs";import*as V7 from"node:os";import*as HJ from"node:path";import{Compile as OG}from"typebox/compile";var G7="DM_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA",K7="DM_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";function VJ($,J="outputSchema"){if(!$||typeof $!=="object"||Array.isArray($))throw Error(`${J} must be a JSON Schema object.`)}function GJ($,J){VJ($);let Z=J??V7.tmpdir();Q1.mkdirSync(Z,{recursive:!0});let Q=Q1.mkdtempSync(HJ.join(Z,"dm-subagent-structured-")),X=HJ.join(Q,"schema.json"),Y=HJ.join(Q,"output.json");return Q1.writeFileSync(X,JSON.stringify($),{mode:384}),{schema:$,schemaPath:X,outputPath:Y}}function l9($,J){let Z;try{Z=OG($)}catch(X){return{status:"invalid",message:`invalid outputSchema: ${X instanceof Error?X.message:String(X)}`}}if(Z.Check(J))return{status:"valid"};return{status:"invalid",message:[...Z.Errors(J)].slice(0,8).map((X)=>{return`${X.instancePath?X.instancePath.replace(/^\//,"").replace(/\//g,"."):"root"}: ${X.message}`}).join("; ")||"schema validation failed"}}function U7($){if(!Q1.existsSync($.outputPath))return{error:"Missing structured_output call; this step has outputSchema and must finish by calling structured_output."};let J;try{J=JSON.parse(Q1.readFileSync($.outputPath,"utf-8"))}catch(Q){return{error:`Failed to read structured output: ${Q instanceof Error?Q.message:String(Q)}`}}let Z=l9($.schema,J);if(Z.status==="invalid")return{error:`Structured output validation failed: ${Z.message}`};return{value:J}}class _$ extends Error{}var AG=/^[A-Za-z_][A-Za-z0-9_]*$/,_G=/^[A-Za-z_][A-Za-z0-9_]*$/,UJ=/\{([A-Za-z_][A-Za-z0-9_]*)(?:\.([^{}]+))?\}/g,MG=new Set(["task","previous","chain_dir","outputs"]),F7=new Set(["expand","parallel","collect","concurrency","failFast","phase","label","acceptance"]),qG=new Set([...F7,"effectiveAcceptance","sessionFiles","thinkingOverrides"]),LG=new Set(["from","item","key","maxItems","onEmpty"]),NG=new Set(["output","path"]),O7=new Set(["agent","task","phase","label","outputSchema","cwd","output","outputMode","reads","progress","skill","model","toolBudget","acceptance"]),EG=new Set([...O7,"outputName","structured","inheritProjectContext","inheritSkills","skills","outputPath","maxSubagentDepth","structuredOutput","structuredOutputSchema","tools","extensions","subagentOnlyExtensions","mcpDirectTools","completionGuard","systemPrompt","systemPromptMode","thinking","modelCandidates","sessionFile","effectiveAcceptance","parentSessionId"]),CG=new Set(["as","outputSchema"]);function B7($){return AG.test($)}function p9($,J){if($==="")return;if(!$.startsWith("/"))throw new _$(`${J} must be a JSON Pointer starting with '/'.`);for(let Z of $.slice(1).split("/"))if(/~(?![01])/.test(Z))throw new _$(`${J} contains invalid JSON Pointer escape.`)}function TG($){return $.replace(/~1/g,"/").replace(/~0/g,"~")}function i9($,J,Z){if(p9(J,Z),J==="")return $;let Q=$;for(let X of J.slice(1).split("/")){let Y=TG(X);if(Array.isArray(Q)){if(!/^(0|[1-9][0-9]*)$/.test(Y))throw new _$(`${Z} segment '${Y}' does not address an array index.`);let H=Number(Y);if(H>=Q.length)throw new _$(`${Z} does not exist.`);Q=Q[H];continue}if(!Q||typeof Q!=="object")throw new _$(`${Z} does not exist.`);let z=Q;if(!Object.prototype.hasOwnProperty.call(z,Y))throw new _$(`${Z} does not exist.`);Q=z[Y]}return Q}function jG($,J){if(typeof $==="string"||typeof $==="number"||typeof $==="boolean"){let Z=String($);if(!Z.trim())throw new _$(`${J} resolved to an empty key.`);if(/[\u0000-\u001F\u007F]/.test(Z))throw new _$(`${J} resolved to an unsafe key.`);if(Z.length>200)throw new _$(`${J} resolved to a key longer than 200 characters.`);return Z}throw new _$(`${J} must resolve to a string, number, or boolean.`)}function fG($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"item"}function RG($,J){if($===void 0)throw new _$(`Unresolved item reference '${J}'.`);if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean"||$===null)return String($);return JSON.stringify($)}function yG($,J,Z){if(!J)return $;let Q=`/${J.split(".").map((X)=>X.replace(/~/g,"~0").replace(/\//g,"~1")).join("/")}`;return i9($,Q,Z)}function W7($,J,Z){return $.replace(UJ,(Q,X,Y)=>{if(X!==J)return Q;if(Y!==void 0&&(!Y.trim()||Y.includes("..")))throw new _$(`Invalid item reference '${Q}'.`);return RG(yG(Z,Y,Q),Q)})}function KJ($,J,Z){if(!$||typeof $!=="object"||Array.isArray($))throw new _$(`${Z} must be an object.`);for(let Q of Object.keys($))if(!J.has(Q))throw new _$(`${Z} does not support field '${Q}'.`)}function DG($,J,Z){for(let Q of $.matchAll(/\{([^{}]*)\}/g)){let X=Q[0],Y=Q[1];if(Y===J||Y.startsWith(`${J}.`)){if(!UJ.test(X)||Y===`${J}.`||Y.includes(".."))throw new _$(`Invalid item reference '${X}' in ${Z}.`);UJ.lastIndex=0;continue}UJ.lastIndex=0;let z=Y.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];if(z===J)throw new _$(`Invalid item reference '${X}' in ${Z}.`);if(z&&MG.has(z))continue;if(z)throw new _$(`Unsupported template reference '${X}' in ${Z}.`)}if(UJ.lastIndex=0,$.includes(`{${J}.}`)||new RegExp(`\\{${J}(?:\\.|$)[^}]*$`).test($))throw new _$(`Invalid item reference in ${Z}.`)}function A7($){return!!$&&typeof $==="object"&&!Array.isArray($)&&(Object.prototype.hasOwnProperty.call($,"expand")||Object.prototype.hasOwnProperty.call($,"collect"))}function r9($,J,Z={}){let Q=`Dynamic chain step ${J+1}`;if(KJ($,Z.allowRunnerFields?qG:F7,Q),!$.expand||!$.expand.from)throw new _$(`${Q} requires expand.from.`);if(KJ($.expand,LG,`${Q} expand`),KJ($.expand.from,NG,`${Q} expand.from`),!B7($.expand.from.output))throw new _$(`${Q} has invalid expand.from.output '${$.expand.from.output}'.`);if(p9($.expand.from.path,`${Q} expand.from.path`),$.expand.key!==void 0)p9($.expand.key,`${Q} expand.key`);let X=$.expand.item??"item";if(!_G.test(X))throw new _$(`${Q} has invalid expand.item '${X}'.`);if($.expand.maxItems===void 0&&Z.maxItems===void 0)throw new _$(`${Q} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);if($.expand.maxItems!==void 0&&(!Number.isInteger($.expand.maxItems)||$.expand.maxItems<0))throw new _$(`${Q} expand.maxItems must be an integer >= 0.`);if(Z.maxItems!==void 0&&(!Number.isInteger(Z.maxItems)||Z.maxItems<0))throw new _$("config.chain.dynamicFanout.maxItems must be an integer >= 0.");if(!$.parallel||Array.isArray($.parallel))throw new _$(`${Q} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);if(KJ($.parallel,Z.allowRunnerFields?EG:O7,`${Q} parallel`),"expand"in $.parallel)throw new _$(`${Q} does not support nested dynamic fanout.`);if(!$.parallel.agent)throw new _$(`${Q} parallel.agent is required.`);if(!$.collect?.as||!B7($.collect.as))throw new _$(`${Q} requires collect.as with a safe output name.`);KJ($.collect,CG,`${Q} collect`);for(let[Y,z]of[["parallel.task",$.parallel.task],["parallel.label",$.parallel.label]])if(z)DG(z,X,`${Q} ${Y}`)}function SG($,J,Z,Q={}){r9($,Z,Q);let X=$.expand.from.output,Y=J[X];if(!Y)throw new _$(`Dynamic chain step ${Z+1} references unknown output '${X}'.`);if(Y.structured===void 0)throw new _$(`Dynamic chain step ${Z+1} requires structured output '${X}'.`);let z=i9(Y.structured,$.expand.from.path,`Dynamic chain step ${Z+1} expand.from.path`);if(!Array.isArray(z))throw new _$(`Dynamic chain step ${Z+1} expand.from.path must resolve to an array.`);let H=$.expand.maxItems??Q.maxItems;if(H===void 0)throw new _$(`Dynamic chain step ${Z+1} requires an effective maxItems.`);if(z.length>H)throw new _$(`Dynamic chain step ${Z+1} resolved ${z.length} items, exceeding maxItems ${H}.`);let V=new Set,U=new Set;return z.map((G,K)=>{let B=$.expand.key===void 0?String(K):jG(i9(G,$.expand.key,`Dynamic chain step ${Z+1} expand.key`),`Dynamic chain step ${Z+1} expand.key`);if(V.has(B))throw new _$(`Dynamic chain step ${Z+1} produced duplicate item key '${B}'.`);V.add(B);let W=fG(B);if(U.has(W))throw new _$(`Dynamic chain step ${Z+1} produced colliding item id '${W}'.`);return U.add(W),{index:K,key:B,idKey:W,item:G}})}function _7($,J,Z,Q={}){let X=SG($,J,Z,Q);if(X.length===0){if(($.expand.onEmpty??"skip")==="fail")throw new _$(`Dynamic chain step ${Z+1} source array is empty.`);return{items:X,parallel:[],collectedOnEmpty:[]}}let Y=$.expand.item??"item",z=X.map((H)=>{let V=W7($.parallel.task??"{previous}",Y,H.item),U=$.parallel.label?W7($.parallel.label,Y,H.item):void 0;return{...$.parallel,task:V,...U!==void 0?{label:U}:{}}});return{items:X,parallel:z}}function M7($,J,Z){return J.map((Q,X)=>{let Y=Z[X],z=Y?"output"in Y&&typeof Y.output==="string"?Y.output:G0(Y):"";return{key:Q.key,index:Q.index,item:Q.item,agent:Y?.agent??$.parallel.agent,exitCode:Y?.exitCode??null,text:z,...Y?.structuredOutput!==void 0?{structured:Y.structuredOutput}:{},...Y?.error?{error:Y.error}:{},...Y?.timedOut?{timedOut:!0}:{},...Y?.savedOutputPath?{outputPath:Y.savedOutputPath}:{},...Y?.artifactPaths?{artifactPaths:Y.artifactPaths}:{}}})}function s9($,J){if(!$)return;let Z=l9($,J);if(Z.status==="invalid")throw new _$(`Collected output validation failed: ${Z.message}`)}var L7=/\{outputs\.([^}]*)\}/g,a9=/^[A-Za-z_][A-Za-z0-9_]*$/;class K0 extends Error{}function q7($){if(T$($))return $.parallel.map((Z)=>Z.as).filter((Z)=>Boolean(Z));if(k$($))return[$.collect.as];let J=$.as;return J?[J]:[]}function wG($){if(T$($))return $.parallel.map((J)=>J.task??"{previous}");if(k$($))return[$.parallel.task??"{previous}",$.parallel.label??""].filter(Boolean);return[$.task??"{previous}"]}function K8($,J={}){P4($,J)}function P4($,J={},Z={}){let Q=[...Z.priorOutputNames??[]],X=new Set(Q),Y=new Set(Q);for(let z=0;z<$.length;z++){let H=(Z.startStepIndex??0)+z+1,V=$[z];if(A7(V)){if(!k$(V))throw new K0(`Dynamic chain step ${H} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);try{r9(V,H-1,J)}catch(U){if(U instanceof _$)throw new K0(U.message);throw U}if(!X.has(V.expand.from.output))throw new K0(`Dynamic chain step ${H} references unknown output '${V.expand.from.output}'. Named outputs are only available after producing step/group completes.`)}for(let U of q7(V)){if(!a9.test(U))throw new K0(`Invalid chain output name '${U}' at step ${H}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);if(Y.has(U))throw new K0(`Duplicate chain output name '${U}'. Each as name must be unique.`);Y.add(U)}for(let U of wG(V))for(let G of U.matchAll(L7)){let K=G[0],B=G[1];if(!a9.test(B))throw new K0(`Invalid chain output reference '${K}' at step ${H}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);if(!X.has(B))throw new K0(`Unknown chain output reference '${K}' at step ${H}. Named outputs are only available after producing step/group completes.`)}for(let U of q7(V))X.add(U)}}function t9($,J){return $.replace(L7,(Z,Q)=>{if(!a9.test(Q))throw new K0(`Invalid chain output reference '${Z}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);let X=J[Q];if(!X)throw new K0(`Unknown chain output reference '${Z}'.`);return X.text})}function kG($){return JSON.stringify($)}function e9($,J){return{text:$.structuredOutput!==void 0?kG($.structuredOutput):G0($),...$.structuredOutput!==void 0?{structured:$.structuredOutput}:{},agent:$.agent,stepIndex:J}}import{spawn as IG}from"node:child_process";import{spawnSync as PG}from"node:child_process";import*as C7 from"node:path";var U8={none:0,attested:1,checked:2,verified:3,reviewed:4},N7=new Set(["auto","none","attested","checked","verified","reviewed"]),$5=new Set(["changed-files","tests-added","commands-run","validation-output","residual-risks","no-staged-files","diff-summary","review-findings","manual-notes"]),bG=new Set(["level","criteria","evidence","verify","review","stopRules","reason"]),xG=new Set(["id","must","evidence","severity"]),vG=new Set(["id","command","timeoutMs","cwd","env","allowFailure"]),gG=new Set(["agent","focus","required"]);function hG($){return $??"auto"}function T7($){return[...new Set($)]}function J5($){switch($){case"none":return[];case"attested":return["manual-notes","residual-risks"];case"checked":return["changed-files","tests-added","commands-run","residual-risks","no-staged-files"];case"verified":case"reviewed":return["changed-files","tests-added","commands-run","validation-output","residual-risks","no-staged-files"]}}function mG($){let J=$.agentName.toLowerCase(),Z=$.task?.toLowerCase()??"",Q=[],X=/\b(?:reviewer|scout|context-builder|researcher|analyst)\b/.test(J),Y=/\b(?:read[- ]only|review[- ]only|do not edit|don't edit|no edits|without edits|inspect|summari[sz]e)\b/.test(Z),z=/\b(?:fix|implement|update|write|edit|modify|migrate|release|security|delete|remove|refactor|commit)\b/.test(Z)||/\bworker\b/.test(J);if(Boolean($.async&&z)||Boolean($.dynamic)||Boolean($.dynamicGroup)||/\b(?:release|migration|migrate|security|data[- ]loss|destructive|post-review|fix pass)\b/.test(Z)){if(Q.push($.async?"async write-capable or risky run":"risky write-capable run"),$.dynamic||$.dynamicGroup)Q.push("dynamic fanout context");return{level:"reviewed",reasons:Q,criteria:["Implement the requested change without widening scope","Return evidence sufficient for an independent acceptance review"],evidence:J5("reviewed"),review:{agent:"reviewer",required:!0}}}if(z&&!Y)return Q.push("write-capable worker/task"),{level:"checked",reasons:Q,criteria:["Implement the requested change without widening scope"],evidence:J5("checked")};if(X||Y)return Q.push(X?"read-only/reviewer-style agent":"read-only task wording"),{level:"attested",reasons:Q,criteria:["Return concrete findings with file paths and severity when applicable"],evidence:["review-findings","residual-risks"]};return Q.push("default lightweight attestation"),{level:"attested",reasons:Q,criteria:["Return a concise result and residual risks when applicable"],evidence:["manual-notes","residual-risks"]}}function cG($){if($===void 0||$==="auto")return{level:"auto"};if($===!1)return{level:"none",reason:"disabled by deprecated false shorthand"};if(typeof $==="string")return{level:$};return{...$}}function uG($){return $.level==="none"&&typeof $.reason==="string"&&$.reason.trim().length>0}function p0($,J="acceptance"){let Z=[];if($===void 0)return Z;if($===!1)return Z;if(typeof $==="string"){if(!N7.has($))Z.push(`${J} has invalid level '${$}'.`);return Z}if(!$||typeof $!=="object"||Array.isArray($))return Z.push(`${J} must be a string level, false, or an object.`),Z;let Q=$;for(let X of Object.keys(Q))if(!bG.has(X))Z.push(`${J}.${X} is not supported.`);if(Q.level!==void 0&&(typeof Q.level!=="string"||!N7.has(Q.level)))Z.push(`${J}.level must be one of auto, none, attested, checked, verified, reviewed.`);if(Q.level==="none"&&(typeof Q.reason!=="string"||!Q.reason.trim()))Z.push(`${J}.reason is required when level is none.`);if(Q.reason!==void 0&&typeof Q.reason!=="string")Z.push(`${J}.reason must be a string.`);if(Q.criteria!==void 0&&!Array.isArray(Q.criteria))Z.push(`${J}.criteria must be an array.`);if(Array.isArray(Q.criteria))for(let[X,Y]of Q.criteria.entries()){if(typeof Y==="string")continue;let z=`${J}.criteria[${X}]`;if(!Y||typeof Y!=="object"||Array.isArray(Y)){Z.push(`${z} must be a string or an object.`);continue}let H=Y;for(let V of Object.keys(H))if(!xG.has(V))Z.push(`${z}.${V} is not supported.`);if(typeof H.id!=="string"||!H.id.trim())Z.push(`${z}.id is required.`);if(typeof H.must!=="string"||!H.must.trim())Z.push(`${z}.must is required.`);if(H.evidence!==void 0&&!Array.isArray(H.evidence))Z.push(`${z}.evidence must be an array.`);if(Array.isArray(H.evidence)){for(let[V,U]of H.evidence.entries())if(typeof U!=="string"||!$5.has(U))Z.push(`${z}.evidence[${V}] is not a supported evidence kind.`)}if(H.severity!==void 0&&H.severity!=="required"&&H.severity!=="recommended")Z.push(`${z}.severity must be required or recommended.`)}if(Array.isArray(Q.evidence)){for(let[X,Y]of Q.evidence.entries())if(typeof Y!=="string"||!$5.has(Y))Z.push(`${J}.evidence[${X}] is not a supported evidence kind.`)}else if(Q.evidence!==void 0)Z.push(`${J}.evidence must be an array.`);if(Q.verify!==void 0&&!Array.isArray(Q.verify))Z.push(`${J}.verify must be an array.`);if(Array.isArray(Q.verify))for(let[X,Y]of Q.verify.entries()){if(!Y||typeof Y!=="object"||Array.isArray(Y)){Z.push(`${J}.verify[${X}] must be an object.`);continue}let z=Y;for(let H of Object.keys(z))if(!vG.has(H))Z.push(`${J}.verify[${X}].${H} is not supported.`);if(typeof z.id!=="string"||!z.id.trim())Z.push(`${J}.verify[${X}].id is required.`);if(typeof z.command!=="string"||!z.command.trim())Z.push(`${J}.verify[${X}].command is required.`);if(z.timeoutMs!==void 0&&(typeof z.timeoutMs!=="number"||!Number.isInteger(z.timeoutMs)||z.timeoutMs<1))Z.push(`${J}.verify[${X}].timeoutMs must be an integer >= 1.`);if(z.cwd!==void 0&&typeof z.cwd!=="string")Z.push(`${J}.verify[${X}].cwd must be a string.`);if(z.env!==void 0){if(!z.env||typeof z.env!=="object"||Array.isArray(z.env))Z.push(`${J}.verify[${X}].env must be an object.`);else for(let[H,V]of Object.entries(z.env))if(typeof V!=="string")Z.push(`${J}.verify[${X}].env.${H} must be a string.`)}if(z.allowFailure!==void 0&&typeof z.allowFailure!=="boolean")Z.push(`${J}.verify[${X}].allowFailure must be a boolean.`)}if(Q.review!==void 0&&Q.review!==!1)if(!Q.review||typeof Q.review!=="object"||Array.isArray(Q.review))Z.push(`${J}.review must be false or an object.`);else{let X=Q.review;for(let Y of Object.keys(X))if(!gG.has(Y))Z.push(`${J}.review.${Y} is not supported.`);if(X.agent!==void 0&&typeof X.agent!=="string")Z.push(`${J}.review.agent must be a string.`);if(X.focus!==void 0&&typeof X.focus!=="string")Z.push(`${J}.review.focus must be a string.`);if(X.required!==void 0&&typeof X.required!=="boolean")Z.push(`${J}.review.required must be a boolean.`)}if(Q.stopRules!==void 0&&!Array.isArray(Q.stopRules))Z.push(`${J}.stopRules must be an array.`);if(Array.isArray(Q.stopRules)){for(let[X,Y]of Q.stopRules.entries())if(typeof Y!=="string")Z.push(`${J}.stopRules[${X}] must be a string.`)}return Z}function nG($,J){return($??[]).map((Z,Q)=>{if(typeof Z==="string")return{id:`criterion-${Q+1}`,must:Z,evidence:J,severity:"required"};return{id:Z.id?.trim()||`criterion-${Q+1}`,must:Z.must??"",evidence:Z.evidence?.filter((X)=>$5.has(X))??J,severity:Z.severity??"required"}}).filter((Z)=>Z.must.trim())}function k1($){let J=cG($.explicit),Z=mG($),Q=hG(J.level),X=uG(J)?"none":Q==="auto"?Z.level:U8[Q]>=U8[Z.level]?Q:Z.level,Y=T7([...X===Z.level?Z.evidence:J5(X),...J.evidence??[]]),z=nG(J.criteria?.length?J.criteria:Z.criteria,Y),H=J.review!==void 0?J.review:Z.review;if(X==="reviewed"&&Q!=="auto"&&Q!=="reviewed"&&J.review===void 0&&H&&H!==!1)H={...H,required:!1};return{level:X,explicit:$.explicit!==void 0,inferredReason:Z.reasons,criteria:z,evidence:Y,verify:J.verify??[],review:H,stopRules:J.stopRules??[],reason:J.reason}}function j7($){if($.level==="none")return"";let J=["","## Acceptance Contract",`Acceptance level: ${$.level}`,"Completion is not accepted from prose alone. End with a structured acceptance report.","","Criteria:",...$.criteria.length?$.criteria.map((Z)=>`- ${Z.id}: ${Z.must}`):["- Return the requested result."],"",`Required evidence: ${$.evidence.join(", ")||"none"}`];if($.verify.length>0){J.push("","Runtime verification commands configured by parent:");for(let Z of $.verify)J.push(`- ${Z.id}: ${Z.command}`)}if($.review&&$.review!==!1){if(J.push("",`Review gate: ${$.review.required===!1?"optional":"required"}${$.review.agent?` by ${$.review.agent}`:""}.`),$.review.focus)J.push(`Review focus: ${$.review.focus}`)}if($.stopRules.length>0)J.push("","Stop rules:",...$.stopRules.map((Z)=>`- ${Z}`));return J.push("","Finish with a fenced JSON block tagged `acceptance-report` in this shape:","Use empty arrays when no items apply; array fields contain strings unless object entries are shown.","```acceptance-report",JSON.stringify({criteriaSatisfied:[{id:"criterion-1",status:"satisfied",evidence:"specific proof"}],changedFiles:["src/file.ts"],testsAddedOrUpdated:["test/file.test.ts"],commandsRun:[{command:"command",result:"passed",summary:"short result"}],validationOutput:["validation output or concise summary"],residualRisks:["none"],noStagedFiles:!0,diffSummary:"short description of the diff",reviewFindings:["blocker: file.ts:12 - issue found, or no blockers"],manualNotes:"anything else the parent should know"},null,2),"```"),J.join(`
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
`,"utf-8")}function x4($,J){if($===void 0)return;if($===!1)return!1;if(!Array.isArray($))throw Error(`Builtin override '${J.name}' in '${J.filePath}' has invalid '${J.field}'; expected an array of strings or false.`);let Z=[];for(let Q of $){if(typeof Q!=="string")throw Error(`Builtin override '${J.name}' in '${J.filePath}' has invalid '${J.field}'; expected an array of strings or false.`);let X=Q.trim();if(X)Z.push(X)}return Z}function EK($,J,Z){if(!J||typeof J!=="object"||Array.isArray(J))throw Error(`Builtin override '${$}' in '${Z}' must be an object.`);let Q=J,X={};if("model"in Q)if(typeof Q.model==="string"||Q.model===!1)X.model=Q.model;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'model'; expected a string or false.`);if("thinking"in Q)if(typeof Q.thinking==="string"||Q.thinking===!1)X.thinking=Q.thinking;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'thinking'; expected a string or false.`);if("systemPromptMode"in Q)if(Q.systemPromptMode==="append"||Q.systemPromptMode==="replace")X.systemPromptMode=Q.systemPromptMode;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'systemPromptMode'; expected 'append' or 'replace'.`);if("inheritProjectContext"in Q)if(typeof Q.inheritProjectContext==="boolean")X.inheritProjectContext=Q.inheritProjectContext;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'inheritProjectContext'; expected a boolean.`);if("inheritSkills"in Q)if(typeof Q.inheritSkills==="boolean")X.inheritSkills=Q.inheritSkills;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'inheritSkills'; expected a boolean.`);if("defaultContext"in Q)if(Q.defaultContext==="fresh"||Q.defaultContext==="fork"||Q.defaultContext===!1)X.defaultContext=Q.defaultContext;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'defaultContext'; expected 'fresh', 'fork', or false.`);if("disabled"in Q)if(typeof Q.disabled==="boolean")X.disabled=Q.disabled;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'disabled'; expected a boolean.`);if("completionGuard"in Q)if(typeof Q.completionGuard==="boolean")X.completionGuard=Q.completionGuard;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'completionGuard'; expected a boolean.`);if("toolBudget"in Q)if(Q.toolBudget===!1)X.toolBudget=!1;else if(Q.toolBudget&&typeof Q.toolBudget==="object"&&!Array.isArray(Q.toolBudget))X.toolBudget=Q.toolBudget;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'toolBudget'; expected an object or false.`);if("systemPrompt"in Q)if(typeof Q.systemPrompt==="string")X.systemPrompt=Q.systemPrompt;else throw Error(`Builtin override '${$}' in '${Z}' has invalid 'systemPrompt'; expected a string.`);let Y=x4(Q.fallbackModels,{filePath:Z,name:$,field:"fallbackModels"});if(Y!==void 0)X.fallbackModels=Y;let z=x4(Q.skills,{filePath:Z,name:$,field:"skills"});if(z!==void 0)X.skills=z;let H=x4(Q.tools,{filePath:Z,name:$,field:"tools"});if(H!==void 0)X.tools=H;let V=x4(Q.subagentOnlyExtensions,{filePath:Z,name:$,field:"subagentOnlyExtensions"});if(V!==void 0)X.subagentOnlyExtensions=V;return Object.keys(X).length>0?X:void 0}function m4($){if(!$)return g4;let Z=c4($).subagents;if(!Z||typeof Z!=="object"||Array.isArray(Z))return g4;let Q=Z,X;if("disableBuiltins"in Q)if(typeof Q.disableBuiltins==="boolean")X=Q.disableBuiltins;else throw Error(`Subagent settings in '${$}' have invalid 'disableBuiltins'; expected a boolean.`);let Y;if("disableThinking"in Q)if(typeof Q.disableThinking==="boolean")Y=Q.disableThinking;else throw Error(`Subagent settings in '${$}' have invalid 'disableThinking'; expected a boolean.`);let z;if("defaultModel"in Q)if(typeof Q.defaultModel==="string"&&Q.defaultModel.trim())z=Q.defaultModel.trim();else throw Error(`Subagent settings in '${$}' have invalid 'defaultModel'; expected a non-empty string.`);let H=g7(Q.modelScope,{filePath:$}),V={},U=Q.agentOverrides;if(!U||typeof U!=="object"||Array.isArray(U))return{overrides:V,defaultModel:z,disableBuiltins:X,disableThinking:Y,modelScope:H};for(let[G,K]of Object.entries(U)){let B=EK(G,K,$);if(B)V[G]=B}return{overrides:V,defaultModel:z,disableBuiltins:X,disableThinking:Y,modelScope:H}}function r7($,J,Z,Q){if(Q&&J.defaultModel!==void 0)return{type:"subagents.defaultModel",scope:"project",path:Q,model:J.defaultModel};return $.defaultModel!==void 0?{type:"subagents.defaultModel",scope:"user",path:Z,model:$.defaultModel}:void 0}function X2($,J){if(!J)return $;return $.map((Z)=>{if(Z.model!==void 0)return Z;let Q={...Z,model:J.model,modelSource:J},X=h4.get(Z);if(X)h4.set(Q,X);return Q})}function v4($,J,Z){let Q={...$,override:{...Z,base:_5($)}};if(J.model!==void 0)Q.model=J.model===!1?void 0:J.model;if(J.fallbackModels!==void 0)Q.fallbackModels=J.fallbackModels===!1?void 0:[...J.fallbackModels];if(J.thinking!==void 0)Q.thinking=J.thinking===!1?void 0:J.thinking;if(J.systemPromptMode!==void 0)Q.systemPromptMode=J.systemPromptMode;if(J.inheritProjectContext!==void 0)Q.inheritProjectContext=J.inheritProjectContext;if(J.inheritSkills!==void 0)Q.inheritSkills=J.inheritSkills;if(J.defaultContext!==void 0)Q.defaultContext=J.defaultContext===!1?void 0:J.defaultContext;if(J.disabled!==void 0)Q.disabled=J.disabled;if(J.systemPrompt!==void 0)Q.systemPrompt=J.systemPrompt;if(J.skills!==void 0)Q.skills=J.skills===!1?void 0:[...J.skills];if(J.tools!==void 0){let{tools:X,mcpDirectTools:Y}=i7(J.tools===!1?[]:J.tools);Q.tools=X,Q.mcpDirectTools=Y}if(J.subagentOnlyExtensions!==void 0)Q.subagentOnlyExtensions=J.subagentOnlyExtensions===!1?void 0:[...J.subagentOnlyExtensions];if(J.completionGuard!==void 0)Q.completionGuard=J.completionGuard;if(J.toolBudget!==void 0)Q.toolBudget=J.toolBudget===!1?void 0:J.toolBudget;return Q}function CK($,J){if($.thinking===void 0)return $;return{...$,thinking:void 0,override:$.override??{...J,base:_5($)}}}function s7($,J,Z,Q,X){let Y=Z.disableBuiltins===!0&&X!==null,z=Z.disableBuiltins===void 0&&J.disableBuiltins===!0,H=Z.disableThinking!==void 0&&X!==null,V=H?Z.disableThinking===!0:J.disableThinking===!0,U=H?{scope:"project",path:X}:{scope:"user",path:Q},G=(K,B)=>{if(!V||B)return K;return CK(K,U)};return $.map((K)=>{let B=Z.overrides[K.name];if(B&&X)return G(v4(K,B,{scope:"project",path:X}),B.thinking!==void 0);if(Y&&X)return G(v4(K,{disabled:!0},{scope:"project",path:X}),!1);let W=J.overrides[K.name];if(W)return G(v4(K,W,{scope:"user",path:Q}),!H&&W.thinking!==void 0);if(z)return G(v4(K,{disabled:!0},{scope:"user",path:Q}),!1);return G(K,!1)})}function o7($,...J){let Z=h4.get($);return Z?J.some((Q)=>Z.has(Q)):!1}function l7($,J,Z){let Q,X=!1,Y=()=>{return Q??={...$},Q},z=(H,V,U)=>{if(o7($,...V))return;Y()[H]=U,X=!0};if(J.model!==void 0)z("model",["model"],J.model===!1?void 0:J.model);if(J.fallbackModels!==void 0)z("fallbackModels",["fallbackModels"],J.fallbackModels===!1?void 0:[...J.fallbackModels]);if(J.thinking!==void 0)z("thinking",["thinking"],J.thinking===!1?void 0:J.thinking);if(J.systemPromptMode!==void 0)z("systemPromptMode",["systemPromptMode"],J.systemPromptMode);if(J.inheritProjectContext!==void 0)z("inheritProjectContext",["inheritProjectContext"],J.inheritProjectContext);if(J.inheritSkills!==void 0)z("inheritSkills",["inheritSkills"],J.inheritSkills);if(J.defaultContext!==void 0)z("defaultContext",["defaultContext"],J.defaultContext===!1?void 0:J.defaultContext);if(J.disabled!==void 0&&$.disabled===void 0)Y().disabled=J.disabled,X=!0;if(J.skills!==void 0)z("skills",["skill","skills"],J.skills===!1?void 0:[...J.skills]);if(J.tools!==void 0&&!o7($,"tools")){let{tools:H,mcpDirectTools:V}=i7(J.tools===!1?[]:J.tools),U=Y();U.tools=H,U.mcpDirectTools=V,X=!0}if(J.subagentOnlyExtensions!==void 0)z("subagentOnlyExtensions",["subagentOnlyExtensions"],J.subagentOnlyExtensions===!1?void 0:[...J.subagentOnlyExtensions]);if(J.completionGuard!==void 0)z("completionGuard",["completionGuard"],J.completionGuard);if(J.toolBudget!==void 0)z("toolBudget",["toolBudget"],J.toolBudget===!1?void 0:J.toolBudget);if(!X||!Q)return $;return Q.override={...Z,base:_5($)},Q}function W8($,J,Z,Q,X){return $.map((Y)=>{let z=Z.overrides[Y.name];if(z&&X)return l7(Y,z,{scope:"project",path:X});let H=J.overrides[Y.name];if(H)return l7(Y,H,{scope:"user",path:Q});return Y})}function a7($,J,Z){let Q=Z==="project"?EJ($):NJ();if(!Q)throw Error("Project override is not available here. No project config root was found.");if(!o$.existsSync(Q))return{path:Q,removed:!1};let X=c4(Q),Y=X.subagents;if(!Y||typeof Y!=="object"||Array.isArray(Y))return{path:Q,removed:!1};let z={...Y},H=z.agentOverrides;if(!H||typeof H!=="object"||Array.isArray(H))return{path:Q,removed:!1};let V={...H};if(!Object.prototype.hasOwnProperty.call(V,J))return{path:Q,removed:!1};if(delete V[J],Object.keys(V).length>0)z.agentOverrides=V;else delete z.agentOverrides;if(Object.keys(z).length>0)X.subagents=z;else delete X.subagents;return M5(Q,X),{path:Q,removed:!0}}function t7($,J,Z,Q){let X=Z==="project"?EJ($):NJ();if(!X)throw Error("Project override is not available here. No project config root was found.");let Y=c4(X),z=Y.subagents&&typeof Y.subagents==="object"&&!Array.isArray(Y.subagents)?{...Y.subagents}:{},H=z.agentOverrides&&typeof z.agentOverrides==="object"&&!Array.isArray(z.agentOverrides)?{...z.agentOverrides}:{},V=H[J],U=V&&typeof V==="object"&&!Array.isArray(V)?V:{};return H[J]={...U,...NK(Q)},z.agentOverrides=H,Y.subagents=z,M5(X,Y),X}function e7($,J,Z,Q){let X=Z==="project"?EJ($):NJ();if(!X)throw Error("Project override is not available here. No project config root was found.");if(!o$.existsSync(X))return{path:X,removed:!1};let Y=c4(X),z=Y.subagents;if(!z||typeof z!=="object"||Array.isArray(z))return{path:X,removed:!1};let H=z.agentOverrides;if(!H||typeof H!=="object"||Array.isArray(H))return{path:X,removed:!1};let V=H[J];if(!V||typeof V!=="object"||Array.isArray(V))return{path:X,removed:!1};let U={...V},G=!1;for(let B of Q)if(Object.prototype.hasOwnProperty.call(U,B))delete U[B],G=!0;if(!G)return{path:X,removed:!1};let K={...z};if(Object.keys(U).length>0)K.agentOverrides[J]=U;else{let B={...H};if(delete B[J],Object.keys(B).length>0)K.agentOverrides=B;else delete K.agentOverrides}if(Object.keys(K).length>0)Y.subagents=K;else delete Y.subagents;return M5(X,Y),{path:X,removed:!0}}function q5($,J){let Z=[];if(!o$.existsSync($))return Z;let Q;try{Q=o$.readdirSync($,{withFileTypes:!0}).sort((X,Y)=>X.name.localeCompare(Y.name))}catch{return Z}for(let X of Q){let Y=A$.join($,X.name);if(X.isDirectory()){Z.push(...q5(Y,J));continue}if(!X.isFile()&&!X.isSymbolicLink())continue;if(!J(X.name))continue;Z.push(Y)}return Z}function TK($,J){let Q=A$.relative($,J).split(A$.sep).map((X)=>X.toLowerCase());if(A$.basename($).toLowerCase()===".agents")Q.unshift(".agents");return Q.some((X,Y)=>X===".agents"&&Q[Y+1]==="skills")}function i0($,J){let Z=[];for(let Q of q5($,(X)=>X.endsWith(".md")&&!X.endsWith(".chain.md"))){if(TK($,Q))continue;let X;try{X=o$.readFileSync(Q,"utf-8")}catch{continue}let{frontmatter:Y,body:z}=Q2(X);if(!Y.name||!Y.description)continue;let H=Y.name,V=Z2(Y.package,`Agent '${H}' package`);if(V.error)continue;let U=V.packageName,G=F1(H,U),K=Y.tools?.split(",").map((q)=>q.trim()).filter(Boolean),B=[],W=[];if(K)for(let q of K)if(q.startsWith("mcp:"))B.push(q.slice(4));else W.push(q);let O=Y.defaultReads?.split(",").map((q)=>q.trim()).filter(Boolean),L=(Y.skill||Y.skills)?.split(",").map((q)=>q.trim()).filter(Boolean),_=Y.fallbackModels?.split(",").map((q)=>q.trim()).filter(Boolean),M=Y.systemPromptMode==="replace"?"replace":Y.systemPromptMode==="append"?"append":F5(H),F=Y.inheritProjectContext==="true"?!0:Y.inheritProjectContext==="false"?!1:O5(H),R=Y.inheritSkills==="true"?!0:Y.inheritSkills==="false"?!1:A5(),C=Y.defaultContext==="fork"?"fork":Y.defaultContext==="fresh"?"fresh":void 0,T;if(Y.extensions!==void 0)T=Y.extensions.split(",").map((q)=>q.trim()).filter(Boolean);let I;if(Y.subagentOnlyExtensions!==void 0)I=Y.subagentOnlyExtensions.split(",").map((q)=>q.trim()).filter(Boolean);let S={};for(let[q,f]of Object.entries(Y))if(!d9.has(q))S[q]=f;let j=Number(Y.maxSubagentDepth),E;if(Y.toolBudget!==void 0&&Y.toolBudget.trim()){let q=JSON.parse(Y.toolBudget);if(!q||typeof q!=="object"||Array.isArray(q))throw Error(`Agent '${H}' has invalid toolBudget frontmatter; expected a JSON object.`);E=q}let k=Y.completionGuard==="false"?!1:Y.completionGuard==="true"?!0:void 0,D={name:G,localName:H,packageName:U,description:Y.description,tools:W.length>0?W:void 0,mcpDirectTools:B.length>0?B:void 0,model:Y.model,fallbackModels:_&&_.length>0?_:void 0,thinking:Y.thinking,systemPromptMode:M,inheritProjectContext:F,inheritSkills:R,defaultContext:C,systemPrompt:z,source:J,filePath:Q,skills:L&&L.length>0?L:void 0,extensions:T,subagentOnlyExtensions:I,output:Y.output,defaultReads:O&&O.length>0?O:void 0,defaultProgress:Y.defaultProgress==="true",interactive:Y.interactive==="true",maxSubagentDepth:Number.isInteger(j)&&j>=0?j:void 0,completionGuard:k,toolBudget:E,memory:u7(Y.memory),extraFields:Object.keys(S).length>0?S:void 0};h4.set(D,new Set(Object.keys(Y))),Z.push(D)}return Z}function B5($,J){let Z=new Map,Q=[];for(let X of q5($,(Y)=>Y.endsWith(".chain.md")||Y.endsWith(".chain.json"))){let Y;try{Y=o$.readFileSync(X,"utf-8")}catch{continue}try{let z=X.endsWith(".chain.json")?P7(Y,J,X):I7(Y,J,X),H=Z.get(z.name);if(H&&H.filePath.endsWith(".chain.json")&&X.endsWith(".chain.md"))continue;Z.set(z.name,z)}catch(z){Q.push({source:J,filePath:X,error:z instanceof Error?z.message:String(z)});continue}}return{chains:Array.from(Z.values()),diagnostics:Q}}function LJ($){try{return o$.statSync($).isDirectory()}catch{return!1}}function $Q($){let J=B8($);if(!J)return{readDirs:[],preferredDir:null};let Z=A$.join(J,".agents"),Q=A$.join(l$(J),"agents"),X=[];if(LJ(Z))X.push(Z);if(LJ(Q))X.push(Q);return{readDirs:X,preferredDir:Q}}function jK($){let J=B8($);if(!J)return{readDirs:[],preferredDir:null};let Z=A$.join(l$(J),"chains");return{readDirs:LJ(Z)?[Z]:[],preferredDir:Z}}var JQ=A$.resolve(A$.dirname(UK(import.meta.url)),"..","..","agents"),fK="DM_SUBAGENT_EXTRA_AGENT_DIRS";function ZQ(){let $=process.env[fK];if(!$)return[];return $.split(A$.delimiter).map((J)=>J.trim()).filter((J)=>J.length>0)}function I2($,J){let Z=A$.join(b$(),"agents"),Q=A$.join(qJ.homedir(),".agents"),{readDirs:X,preferredDir:Y}=$Q($),z=NJ(),H=EJ($),V=J==="project"?g4:m4(z),U=J==="user"?g4:m4(H),G=r7(V,U,z,H),K=U.modelScope??V.modelScope,B=p7($,{includeUser:J!=="project",includeProject:J!=="user"}),W=s7(X2(i0(JQ,"builtin"),G),V,U,z,H),O=J==="project"?[]:ZQ().flatMap((C)=>i0(C,"user")),A=J==="project"?[]:i0(Z,"user"),L=J==="project"?[]:i0(Q,"user"),_=W8(X2([...O,...A,...L],G),V,U,z,H),M=W8(X2(J==="user"?[]:X.flatMap((C)=>i0(C,"project")),G),V,U,z,H),F=W8(X2(B.agents.flatMap((C)=>i0(C,"package")),G),V,U,z,H);return{agents:x7(J,_,M,W,F).filter((C)=>C.disabled!==!0),projectAgentsDir:Y,modelScope:K}}function Q0($){let J=A$.join(b$(),"agents"),Z=A$.join(qJ.homedir(),".agents"),Q=BK(),{readDirs:X,preferredDir:Y}=$Q($),{readDirs:z,preferredDir:H}=jK($),V=NJ(),U=EJ($),G=m4(V),K=m4(U),B=r7(G,K,V,U),W=p7($),O=s7(X2(i0(JQ,"builtin"),B),G,K,V,U),A=W8(X2([...ZQ().flatMap((D)=>i0(D,"user")),...i0(J,"user"),...i0(Z,"user")],B),G,K,V,U),L=new Map;for(let D of W.agents)for(let q of i0(D,"package"))if(!L.has(q.name))L.set(q.name,q);let _=W8(X2(Array.from(L.values()),B),G,K,V,U),M=new Map;for(let D of X)for(let q of i0(D,"project"))M.set(q.name,q);let F=W8(X2(Array.from(M.values()),B),G,K,V,U),R=new Map,C=[],T=new Map;for(let D of W.chains){let q=B5(D,"package");C.push(...q.diagnostics);for(let f of q.chains)if(!T.has(f.name))T.set(f.name,f)}let I=[];for(let D of z){let q=B5(D,"project");I.push(...q.diagnostics);for(let f of q.chains)R.set(f.name,f)}let S=B5(Q,"user"),j=[...Array.from(T.values()),...S.chains,...Array.from(R.values())],E=[...C,...S.diagnostics,...I],k=process.env.DM_CODING_AGENT_DIR?J:o$.existsSync(Z)?Z:J;return{builtin:O,package:_,user:A,project:F,chains:j,chainDiagnostics:E,userDir:k,projectDir:Y,userChainDir:Q,projectChainDir:H,userSettingsPath:V,projectSettingsPath:U}}import*as z0 from"node:fs";import*as C0 from"node:path";var QQ=".last-cleanup",RK=".dm-subagents";function XQ($){return C0.join($,RK)}function yK($){return C0.join(XQ($),"artifacts")}function YQ($){return C0.join(XQ($),"chain-runs")}function P2($,J){if(J)return yK(J);if($){let Z=C0.dirname($);return C0.join(Z,"subagent-artifacts")}return w9}function zQ($,J,Z,Q){let X=Q!==void 0?`_${Q}`:"",Y=Z.replace(/[^\w.-]/g,"_"),z=`${J}_${Y}${X}`;return{inputPath:C0.join($,`${z}_input.md`),outputPath:C0.join($,`${z}_output.md`),jsonlPath:C0.join($,`${z}.jsonl`),transcriptPath:C0.join($,`${z}_transcript.jsonl`),metadataPath:C0.join($,`${z}_meta.json`)}}function HQ($){z0.mkdirSync($,{recursive:!0})}function n4($,J){z0.writeFileSync($,J,"utf-8")}function VQ($,J){z0.writeFileSync($,JSON.stringify(J,null,2),"utf-8")}function GQ($,J){z0.appendFileSync($,`${J}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
`).find((J)=>J.trim())?.trim()??""}function SQ($,J){if($.detached)return $.detachedReason?`Detached: ${$.detachedReason}`:"Detached";if($.interrupted)return"Paused";if($.exitCode!==0)return`Error: ${$.error??(DQ(J)||`exit ${$.exitCode}`)}`;if($.acceptance?.status&&$.acceptance.status!=="not-required")return`Done · acceptance: ${$.acceptance.status}`;if(v2($.task,J))return"Done (no text output)";return"Done"}function wQ($,J,Z,Q=$.progress?.status==="running",X=o4($.progress??$.progressSummary),Y){if(Q){if(Y!==void 0)return Z.fg("accent",P1((X??0)+Y));return Z.fg("accent",P1(X))}if($.detached)return Z.fg("warning","■");if($.interrupted)return Z.fg("warning","■");if($.exitCode!==0)return Z.fg("error","✗");if(v2($.task,J))return Z.fg("warning","✓");return Z.fg("success","✓")}function kQ($){let J=l4($);return p4($,A1()-4,!1,J)??b1($,J)??"thinking…"}function $6($){return JSON.stringify({asyncDir:$.asyncDir,status:$.status,activityState:$.activityState,lastActivityAt:$.lastActivityAt,currentTool:$.currentTool,currentToolStartedAt:$.currentToolStartedAt,currentPath:$.currentPath,turnCount:$.turnCount,toolCount:$.toolCount,mode:$.mode,agents:$.agents,currentStep:$.currentStep,chainStepCount:$.chainStepCount,parallelGroups:$.parallelGroups,steps:$.steps,nestedChildren:$.nestedChildren,stepsTotal:$.stepsTotal,runningSteps:$.runningSteps,completedSteps:$.completedSteps,activeParallelGroup:$.activeParallelGroup,startedAt:$.startedAt,updatedAt:$.updatedAt,totalTokens:$.totalTokens})}function IQ($){let J=[...new Set($)];if(J.length===1&&$.length>1)return`${J[0]} ×${$.length}`;if($.length>3)return`${$.slice(0,2).join(", ")} +${$.length-2} more`;return $.join(", ")}function i4($){if($.mode==="parallel")return"parallel";if($.mode==="chain")return"chain";if($.mode==="single"&&$.agents?.length===1)return $.agents[0];if($.agents?.length)return IQ($.agents);return $.mode??"subagent"}function r4($){let J=[];if($.currentTool&&$.currentToolStartedAt!==void 0&&$.updatedAt!==void 0)J.push(`${$.currentTool} ${x$(Math.max(0,$.updatedAt-$.currentToolStartedAt))}`);else if($.currentTool)J.push($.currentTool);if($.currentPath)J.push(j$($.currentPath));if($.turnCount!==void 0)J.push(`${$.turnCount} turns`);if($.toolCount!==void 0)J.push(`${$.toolCount} tools`);let Z=b1($,$.updatedAt);if(Z&&J.length)return`${Z} · ${J.join(" · ")}`;if(Z)return Z;if(J.length)return J.join(" · ");if($.status==="running")return"thinking…";if($.status==="queued")return"queued…";if($.status==="paused")return"Paused";if($.status==="failed")return"Failed";return"Done"}function J6($,J){return z2(J,$.index,$.toolCount,$.turnCount,$.tokens?.total,$.lastActivityAt,$.currentToolStartedAt,$.durationMs)}function PQ($){let J;for(let[Z,Q]of($??[]).entries())J=z2(J,J6(Q,Z));return J}function bQ($){return z2($.updatedAt,$.lastActivityAt,$.toolCount,$.turnCount,$.totalTokens?.total,$.currentStep,$.runningSteps,$.completedSteps,PQ($.steps))}function f5($){let J;for(let Z of $)J=z2(J,bQ(Z));return J}function s4($,J){if($.status==="running")return J.fg("accent",P1(bQ($)));if($.status==="queued")return J.fg("muted","◦");if($.status==="complete")return J.fg("success","✓");if($.status==="paused")return J.fg("warning","■");return J.fg("error","✗")}function fJ($,J,Z){if($==="running")return J.fg("accent",P1(Z));if($==="complete"||$==="completed")return J.fg("success","✓");if($==="failed")return J.fg("error","✗");if($==="paused")return J.fg("warning","■");return J.fg("muted","◦")}function RJ($,J){if($==="running")return J.fg("accent","running");if($==="complete"||$==="completed")return J.fg("success","complete");if($==="failed")return J.fg("error","failed");if($==="paused")return J.fg("warning","paused");return J.fg("dim",$)}function gK($,J){let Z=[];if($.currentTool&&$.currentToolStartedAt!==void 0&&J!==void 0)Z.push(`${$.currentTool} ${x$(Math.max(0,J-$.currentToolStartedAt))}`);else if($.currentTool)Z.push($.currentTool);if($.currentPath)Z.push(j$($.currentPath));if($.turnCount!==void 0)Z.push(`${$.turnCount} turns`);if($.toolCount!==void 0)Z.push(`${$.toolCount} tools`);if($.tokens?.total)Z.push(e4($.tokens.total));let Q=b1($,J);if(Q&&Z.length)return`${Q} · ${Z.join(" · ")}`;if(Q)return Q;return Z.join(" · ")}function xQ($,J,Z=!1,Q=A1()){if(!$.steps?.length)return[];let X=$.chainStepCount??$.steps.length,Y=[];for(let z of cK(X,$.steps.length,$.parallelGroups)){let H=$.steps.slice(z.start,z.start+z.count);if(z.isParallel){let U=BQ(H);Y.push(` ${fJ(U,J,PQ(H))} Step ${z.stepIndex+1}/${X}: ${_1(J,"parallel group")} ${J.fg("dim","·")} ${J.fg("dim",CJ(H,z.count))}`);continue}let V=H[0];if(!V){Y.push(` ${J.fg("dim",`◦ Step ${z.stepIndex+1}/${X}: pending`)}`);continue}Y.push(...cQ($,J,V,"Step",z.stepIndex+1,X,Z,Q))}return Y}function _Q($,J,Z=!1,Q=A1()){if(!$.steps?.length)return[];if($.mode!=="parallel"&&$.mode!=="chain")return[];if($.mode==="chain"&&!$.activeParallelGroup&&$.parallelGroups?.length)return xQ($,J,Z,Q);let X=$.stepsTotal??$.steps.length,Y=[];for(let[z,H]of $.steps.entries()){let V=z===$.steps.length-1?"└":"├",U=gK(H,$.updatedAt),G=$.mode==="parallel"||$.activeParallelGroup?"Agent":"Step",K=yJ(J,H.model,H.thinking);Y.push(` ${J.fg("dim",`${V} ${fJ(H.status,J,J6(H,z))} ${G} ${z+1}/${X}: ${H.agent} · ${RJ(H.status,J)}${K}${U?` · ${U}`:""}`)}`);for(let B of TJ(H.children,J,Q,Z,$.updatedAt,Z?8:1))Y.push(` ${B}`)}return Y}function hK($){if(!$||!$.startsWith("[")||!$.endsWith("]"))return;let J=$.slice(1,-1).trim();if(!J)return 0;return J.split("+").map((Z)=>Z.trim()).filter(Boolean).length}function Z6($){if($.workflowGraph?.nodes?.length){let Q=[],X=0;for(let Y of $.workflowGraph.nodes){if(Y.stepIndex===void 0)continue;if(Y.kind==="parallel-group"||Y.kind==="dynamic-parallel-group"){let H=(Y.children??[]).map((G)=>G.flatIndex).filter((G)=>typeof G==="number"),V=H.length?Math.min(...H):X,U=Y.children?.length??0;Q.push({stepIndex:Y.stepIndex,start:V,count:U,isParallel:!0,status:Y.status,label:Y.label,error:Y.error}),X=Math.max(X,V+U);continue}let z=Y.flatIndex??X;Q.push({stepIndex:Y.stepIndex,start:z,count:1,isParallel:!1,status:Y.status,label:Y.label,error:Y.error}),X=Math.max(X,z+1)}if(Q.length)return Q.sort((Y,z)=>Y.stepIndex-z.stepIndex)}if(!$.chainAgents?.length)return[];let J=[],Z=0;for(let Q=0;Q<$.chainAgents.length;Q++){let X=$.chainAgents[Q],Y=hK(X),z=Y??1;J.push({stepIndex:Q,start:Z,count:z,isParallel:Y!==void 0}),Z+=z}return J}function mK($){if($.mode!=="chain")return!1;if($.currentStepIndex===void 0)return!1;return Z6($).some((J)=>J.stepIndex===$.currentStepIndex&&J.isParallel)}function cK($,J,Z=[]){let Q=[],X=0;for(let Y=0;Y<$;Y++){let z=Z.find((H)=>H.stepIndex===Y);if(z){Q.push({stepIndex:Y,start:z.start,count:z.count,isParallel:!0}),X=Math.max(X,z.start+z.count);continue}Q.push({stepIndex:Y,start:X,count:X<J?1:0,isParallel:!1}),X++}return Q}function d4($){let J=$.progress?.status;if(J==="completed")return!0;if(J==="running"||J==="pending")return!1;if($.interrupted||$.detached)return!1;return $.exitCode===0}function A8($,J){return $.workflowGraph?.nodes.some((Z)=>J.includes(Z.status))??!1}function vQ($,J){if($.mode!=="chain"||!J.hasParallelInChain||J.showActiveGroupOnly)return;let Z=[];for(let Q of Z6($)){if(Q.isParallel&&Q.count===0){Z.push({kind:"placeholder",rowNumber:Q.stepIndex+1,stepLabel:`Step ${Q.stepIndex+1}`,agentName:Q.label??$.chainAgents?.[Q.stepIndex]??`step-${Q.stepIndex+1}`,status:Q.status??"pending",error:Q.error});continue}for(let X=Q.start;X<Q.start+Q.count;X++)Z.push({kind:"result",resultIndex:X,rowNumber:X+1,agentName:$.results[X]?.agent??$.chainAgents?.[Q.stepIndex]??`step-${Q.stepIndex+1}`})}return Z}function gQ($,J){let Z=Z6($),Q=$.mode==="chain"&&Z.some((G)=>G.isParallel),X=mK($),Y=$.mode==="parallel"||X?"Agent":"Step";if($.mode==="parallel"){let G=$.totalSteps??$.results.length,K=Array(G).fill("pending");for(let A of $.progress??[])if(A.index>=0&&A.index<G)K[A.index]=A.status;for(let A=0;A<$.results.length;A++){let L=$.results[A],_=$.progress?.find((R)=>R.index===A)||$.progress?.find((R)=>R.agent===L.agent&&R.status==="running"),M=L.progress?.index??_?.index??A;if(M<0||M>=G)continue;let F=L.progress?.status??(L.interrupted||L.detached?"detached":L.exitCode===0?"completed":"failed");K[M]=F}let B=K.filter((A)=>A==="running").length,W=K.filter((A)=>A==="completed").length;return{headerLabel:J?`${b2(B)} · ${W}/${G} done`:`${W}/${G} done`,itemTitle:Y,totalCount:G,hasParallelInChain:Q,activeParallelGroup:X,groupStartIndex:0,groupEndIndex:G,showActiveGroupOnly:!1}}if(X){let G=$.currentStepIndex,K=Z[G],B=K?.count??1,W=K?.start??0,O=W+B,A=0,L=0;for(let F=W;F<O;F++){let R=$.progress?.find((T)=>T.index===F),C=$.results.find((T)=>T.progress?.index===F);if(R?.status==="running"){A++;continue}if(R?.status==="completed"){L++;continue}if(C&&d4(C))L++}let _=$.totalSteps??$.chainAgents?.length??1;return{headerLabel:J?`step ${G+1}/${_} · parallel group: ${b2(A)} · ${L}/${B} done`:`step ${G+1}/${_} · parallel group: ${L}/${B} done`,itemTitle:Y,totalCount:B,hasParallelInChain:Q,activeParallelGroup:X,groupStartIndex:W,groupEndIndex:O,showActiveGroupOnly:!0}}if($.mode==="chain"&&$.chainAgents?.length){let G=$.totalSteps??$.chainAgents.length,K=Z.filter((O)=>{if(O.status&&O.status!=="completed")return!1;if(O.count===0)return O.status==="completed";for(let A=O.start;A<O.start+O.count;A++){let L=$.progress?.find((M)=>M.index===A),_=$.results.find((M)=>M.progress?.index===A)??$.results[A];if(L?.status==="running"||L?.status==="pending"||L?.status==="failed")return!1;if(!_||!d4(_))return!1}return!0}).length,B=$.currentStepIndex!==void 0?$.currentStepIndex+1:Math.min(G,K+(J?1:0));return{headerLabel:J?`step ${B}/${G}`:`step ${K}/${G}`,itemTitle:Y,totalCount:G,hasParallelInChain:Q,activeParallelGroup:X,groupStartIndex:0,groupEndIndex:$.results.length,showActiveGroupOnly:!1}}let z=$.totalSteps??$.results.length,H=$.currentStepIndex!==void 0?$.currentStepIndex+1:Math.min(z,$.results.filter(d4).length+(J?1:0)),V=$.results.filter(d4).length;return{headerLabel:J?`step ${H}/${z}`:`step ${V}/${z}`,itemTitle:Y,totalCount:z,hasParallelInChain:Q,activeParallelGroup:X,groupStartIndex:0,groupEndIndex:$.results.length,showActiveGroupOnly:!1}}function a4($,J,Z,Q){if($.mode==="chain"&&J.hasParallelInChain){let X=Z6($).find((Y)=>Z>=Y.start&&Z<Y.start+Y.count);if(X?.isParallel)return`Agent ${Z-X.start+1}/${X.count}`;if(X)return`Step ${X.stepIndex+1}`}if(J.itemTitle==="Agent")return`Agent ${J.activeParallelGroup?Math.max(1,Q-J.groupStartIndex):Q}/${J.totalCount}`;return`Step ${Q}`}function t4($,J){let Z=[],Q=$.stepsTotal??($.agents?.length??1);if($.activeParallelGroup){let X=$.runningSteps??($.status==="running"?1:0),Y=$.completedSteps??($.status==="complete"?Q:0);if($.mode==="parallel"){if($.status==="running"&&X>0)Z.push(b2(X));if(Q>0)Z.push(`${Y}/${Q} done`)}else{let H=($.currentStep!==void 0?$.parallelGroups?.find((G)=>$.currentStep>=G.start&&$.currentStep<G.start+G.count):$.parallelGroups?.find((G)=>G.start===0))?.stepIndex??$.currentStep??0,V=$.chainStepCount??Q,U=[`${Y}/${Q} done`];if($.status==="running"&&X>0)U.unshift(b2(X));Z.push(`step ${H+1}/${V} · parallel group: ${U.join(" · ")}`)}}else if($.currentStep!==void 0)if($.mode==="chain"&&$.parallelGroups?.length){let X=$.chainStepCount??Q;Z.push(`step ${F8($.currentStep,X,$.parallelGroups)+1}/${X}`)}else Z.push(`step ${$.currentStep+1}/${Q}`);else if(Q>1)Z.push(`steps ${Q}`);if($.toolCount!==void 0)Z.push(j5($.toolCount));if($.totalTokens?.total)Z.push(e4($.totalTokens.total));if($.startedAt!==void 0&&$.updatedAt!==void 0)Z.push(x$(Math.max(0,$.updatedAt-$.startedAt)));return jJ(J,Z)}function hQ($,J){return jJ($,[J.turnCount!==void 0?`${J.turnCount} turns`:"",J.toolCount!==void 0?j5(J.toolCount):"",J.tokens?.total?e4(J.tokens.total):"",J.durationMs!==void 0?x$(J.durationMs):""])}function yJ($,J,Z){let Q=w1(J,Z);return Q?$.fg("dim",` (${Q})`):""}function mQ($,J,Z,Q){let X=p4($,J,Z,Q);if(X)return X;let Y=b1($,Q);if(Y)return Y;if($.status==="running")return"thinking…";return""}function uK($,J){if(typeof J.index!=="number")return;return TQ.join($.asyncDir,`output-${J.index}.log`)}function nK($){if($.agent)return $.agent;if($.agents?.length)return IQ($.agents);return $.id}function MQ($,J,Z){if($==="running")return J.fg("accent",P1(Z));if($==="complete"||$==="completed")return J.fg("success","✓");if($==="failed")return J.fg("error","✗");if($==="paused")return J.fg("warning","■");return J.fg("muted","◦")}function dK($){return z2($.lastUpdate,$.lastActivityAt,$.currentStep,$.toolCount,$.turnCount,$.totalTokens?.total,$.currentToolStartedAt)}function qQ($,J,Z){let Q=[];if($.currentTool&&$.currentToolStartedAt!==void 0&&Z!==void 0)Q.push(`${$.currentTool} ${x$(Math.max(0,Z-$.currentToolStartedAt))}`);else if($.currentTool)Q.push($.currentTool);if($.currentPath)Q.push(j$($.currentPath));if($.turnCount!==void 0)Q.push(`${$.turnCount} turns`);if($.toolCount!==void 0)Q.push(`${$.toolCount} tools`);let X=b1($,Z);if(X&&Q.length)return`${X} · ${Q.join(" · ")}`;if(X)return X;if(Q.length)return Q.join(" · ");if(J==="running")return"thinking…";if(J==="queued"||J==="pending")return"queued…";if(J==="paused")return"Paused";if(J==="failed")return"Failed";return"Done"}function TJ($,J,Z,Q,X,Y=Q?12:1){if(!$?.length||Y<=0)return[];if(!Q){let U=Y2($);return U?[J.fg("dim",`↳ ${U}`)]:[]}let z=[],H=2,V=(U,G,K)=>{if(!U?.length||z.length>=Y)return;if(G>H){let B=Y2(U);if(B&&z.length<Y)z.push(J.fg("dim",`${K}↳ ${B}`));return}for(let B=0;B<U.length;B++){let W=U[B];if(z.length>=Y){let L=Y2(U.slice(B));if(L)z[z.length-1]=J.fg("dim",`${K}↳ ${L}`);return}let O=qQ(W,W.state,X??W.lastUpdate),A=W.error?` · ${W.error}`:"";if(z.push(J.fg("dim",`${K}↳ ${MQ(W.state,J,dK(W))} ${nK(W)} · ${W.state} · ${O}${A}`)),G===H){let L=Y2([...W.steps?.flatMap((_)=>_.children??[])??[],...W.children??[]]);if(L&&z.length<Y)z.push(J.fg("dim",`${K} ↳ ${L}`));continue}for(let L of W.steps??[]){if(z.length>=Y)return;z.push(J.fg("dim",`${K} ↳ ${MQ(L.status,J)} ${L.agent} · ${L.status} · ${qQ(L,L.status,X??W.lastUpdate)}`)),V(L.children,G+1,`${K} `)}V(W.children,G+1,`${K} `)}};return V($,0,""),z.map((U)=>S$(U,Z))}function cQ($,J,Z,Q,X,Y,z,H){let V=RJ(Z.status,J),U=hQ(J,Z),G=yJ(J,Z.model,Z.thinking),K=[` ${fJ(Z.status,J,J6(Z,X-1))} ${Q} ${X}/${Y}: ${_1(J,Z.agent)} ${J.fg("dim","·")} ${V}${G}${U?` ${J.fg("dim","·")} ${U}`:""}`],B=mQ(Z,H,z,$.updatedAt);if(B)K.push(` ${J.fg("dim",`⎿ ${B}`)}`);for(let W of TJ(Z.children,J,H,z,$.updatedAt))K.push(` ${W}`);if(Z.status==="running"){if(!z)K.push(` ${J.fg("accent",_8())}`);let W=uK($,Z);if(W)K.push(` ${J.fg("dim",`output: ${j$(W)}`)}`);if(z){let O=b1(Z,$.updatedAt);if(O&&O!==B)K.push(` ${J.fg("accent",O)}`);for(let A of Z.recentTools?.slice(-3)??[]){let L=Math.max(40,H-30),_=A.args.length<=L?A.args:`${A.args.slice(0,L)}...`;K.push(` ${J.fg("dim",`${A.tool}${_?`: ${_}`:""}`)}`)}for(let A of Z.recentOutput?.slice(-5)??[])K.push(` ${J.fg("dim",A)}`)}}return K}function oK($,J,Z,Q){if(!$.steps?.length)return[` ${J.fg("dim",`⎿ ${r4($)}`)}`,...TJ($.nestedChildren,J,Q,Z,$.updatedAt).map((U)=>` ${U}`)];if($.mode==="chain"&&!$.activeParallelGroup&&$.parallelGroups?.length)return xQ($,J,Z,Q);let X=$.stepsTotal??$.steps.length,Y=$.mode==="parallel"||$.activeParallelGroup?"Agent":"Step",z=[];for(let[U,G]of $.steps.entries())z.push(...cQ($,J,G,Y,U+1,X,Z,Q));let H=new Set($.steps.flatMap((U)=>U.children?.map((G)=>G.id)??[])),V=$.nestedChildren?.filter((U)=>!H.has(U.id))??[];for(let U of TJ(V,J,Q,Z,$.updatedAt))z.push(` ${U}`);return z}function uQ($,J,Z,Q){let X=t4($,J),Y=$.mode==="chain"?$.chainStepCount:$.stepsTotal??$.agents?.length??$.steps?.length,z=i4($),H=`async subagent ${z}${Y&&Y>1?` (${Y})`:""}`;return[`${J.fg("toolTitle",_1(J,H))} ${J.fg("dim","· background")}`,`${s4($,J)} ${_1(J,z)}${X?` ${J.fg("dim","·")} ${X}`:""}`,...oK($,J,Q,Z)].map((V)=>S$(V,Z))}function lK($,J,Z){let Q=uQ($,J,Z,!1);if(Q.length<=10||!$.steps?.length||$.mode!=="parallel"&&!$.activeParallelGroup)return Q;let X=$.stepsTotal??$.steps.length,Y=$.mode==="parallel"||$.activeParallelGroup?"Agent":"Step",z=Q.slice(0,2);for(let[H,V]of $.steps.entries()){let U=RJ(V.status,J),G=mQ(V,Z,!1,$.updatedAt),K=hQ(J,V),B=G?` ${J.fg("dim","·")} ${J.fg("dim",G)}`:"",W=yJ(J,V.model,V.thinking);z.push(` ${fJ(V.status,J,J6(V,H))} ${Y} ${H+1}/${X}: ${_1(J,V.agent)} ${J.fg("dim","·")} ${U}${W}${B}${K?` ${J.fg("dim","·")} ${K}`:""}`);for(let O of TJ(V.children,J,Z,!1,$.updatedAt))z.push(` ${O}`)}if($.steps.some((H)=>H.status==="running"))z.push(J.fg("accent",` ${_8()}`));return z.map((H)=>S$(H,Z))}var pK=19,d0;function nQ(){d0=void 0}function iK(){let $=process.stdout.rows||30;return Math.max(1,$-pK)}function dQ(){return process.stdout.rows||30}function oQ(){return process.stdout.columns||120}function rK($){return d0?.expanded===$&&d0.rows===dQ()&&d0.columns===oQ()}function R5($){return{running:$.filter((J)=>J.status==="running"),queued:$.filter((J)=>J.status==="queued"),complete:$.filter((J)=>J.status==="complete"),failed:$.filter((J)=>J.status==="failed"),paused:$.filter((J)=>J.status==="paused")}}function C5($,J,Z){let Q=R5($),X=Q.running.length>0||Q.queued.length>0,Y=Q.running.length>0?P1(f5(Q.running)):X?"●":"○",z=[];if(Q.running.length>0)z.push(`${Q.running.length}/${$.length} running`);if(Q.queued.length>0)z.push(`${Q.queued.length} queued`);if(Q.failed.length>0)z.push(`${Q.failed.length} failed`);if(Q.paused.length>0)z.push(`${Q.paused.length} paused`);if(!X&&Q.complete.length>0)z.push(`${Q.complete.length}/${$.length} done`);return[S$(`${J.fg(X?"accent":"dim",Y)} ${J.fg(X?"accent":"dim","subagents")} (${z.join(", ")||`${$.length} total`})`,Z)]}function LQ($){return[...$.filter((J)=>J.status==="running"),...$.filter((J)=>J.status==="queued"),...$.filter((J)=>J.status!=="running"&&J.status!=="queued")]}function x2($){return $.asyncId}function L5($){return $?.status==="running"||$?.status==="queued"}function sK($,J,Z){if(Z<=0)return[];let Q=new Map($.map((z)=>[x2(z),z])),X=[],Y=(z)=>{if(X.includes(z)||!Q.has(z))return;X.push(z)};for(let z of J){if(!L5(Q.get(z)))continue;if(Y(z),X.length>=Z)return X}for(let z of LQ($)){if(!L5(z))continue;let H=x2(z);if(Y(H),X.length>=Z)break}if(X.length>=Z)return X;for(let z of J){if(L5(Q.get(z)))continue;if(Y(z),X.length>=Z)return X}for(let z of LQ($)){let H=x2(z);if(Y(H),X.length>=Z)break}return X}function aK($,J,Z){let Q=R5($),X=Q.running.length>0||Q.queued.length>0,Y=Q.running.length>0?P1(f5(Q.running)):X?"●":"○",z=[];if(Q.running.length>0)z.push(b2(Q.running.length));if(Q.queued.length>0)z.push(`${Q.queued.length} queued`);if(!X){if(Q.failed.length>0)z.push(`${Q.failed.length} failed`);if(Q.paused.length>0)z.push(`${Q.paused.length} paused`);if(Q.complete.length>0)z.push(`${Q.complete.length}/${$.length} done`)}return S$(`${J.fg(X?"accent":"dim",Y)} ${J.fg(X?"accent":"dim","Async agents")} ${J.fg("dim","·")} ${J.fg("dim",z.join(", ")||`${$.length} total`)}`,Z)}function tK($,J,Z){let Q=t4($,J),X=r4($),Y=$.status==="complete"?"done":$.status,z=[_1(J,i4($)),J.fg("dim",Y),Q,X&&X.toLowerCase()!==Y?J.fg("dim",X):""].filter(Boolean);return S$(` ${s4($,J)} ${z.join(` ${J.fg("dim","·")} `)}`,Z)}function eK($,J,Z){let Q=R5($),X=[];if(Q.running.length>0)X.push(`${Q.running.length} running`);if(Q.queued.length>0)X.push(`${Q.queued.length} queued`);let Y=Q.complete.length+Q.failed.length+Q.paused.length;if(Y>0)X.push(`${Y} finished`);return S$(J.fg("dim",` +${$.length} more${X.length?` (${X.join(", ")})`:""}`),Z)}function NQ($,J,Z,Q,X){let Y=Math.max(1,Q);if(Y===1)return{lines:C5($,J,Z),visibleJobKeys:[]};let z=Y-1,H=sK($,X,z),V=new Map($.map((W)=>[x2(W),W])),U=H.map((W)=>V.get(W)).filter((W)=>Boolean(W)),G=$.filter((W)=>!H.includes(x2(W)));if(G.length>0&&U.length>=z&&z>0)U=U.slice(0,z-1),H=U.map(x2),G=$.filter((W)=>!H.includes(x2(W)));let B=[aK($,J,Z),...U.map((W)=>tK(W,J,Z))];if(G.length>0&&B.length<Y)B.push(eK(G,J,Z));while(B.length<Y)B.push(" ");return{lines:B.slice(0,Y),visibleJobKeys:H}}function lQ($){return Math.max(10,Math.min(14,Math.floor($*0.35)))}function EQ($,J,Z,Q){let X=process.stdout.rows||30,Y=Q?Math.max(12,Math.min(24,Math.floor(X*0.55))):lQ(X);if($.length<=Y)return $;let z=Math.max(1,Y-1),H=$.length-z,V=Q?`… ${H} live-detail lines hidden`:`… ${H} lines hidden · ${jQ()} expands`;return[...$.slice(0,z),S$(J.fg("dim",V),Z)]}function $U($,J,Z,Q,X){if(X)return nQ(),EQ(J,Z,Q,!0);let Y=rK(X),z=dQ(),H=oQ(),V=iK();if(Y&&d0?.tier==="single-line")return C5($,Z,Q);if(Y&&d0?.tier==="progressive"&&d0.lockedRows!==void 0){let K=NQ($,Z,Q,d0.lockedRows,d0.visibleJobKeys);return d0.visibleJobKeys=K.visibleJobKeys,K.lines}if(J.length<=V)return d0={expanded:X,rows:z,columns:H,tier:"full",visibleJobKeys:[]},EQ(J,Z,Q,!1);if(V<=2)return d0={expanded:X,rows:z,columns:H,tier:"single-line",visibleJobKeys:[]},C5($,Z,Q);let U=Math.min(V,lQ(z)),G=NQ($,Z,Q,U,[]);return d0={expanded:X,rows:z,columns:H,tier:"progressive",lockedRows:U,visibleJobKeys:G.visibleJobKeys},G.lines}function JU($,J){return(Z,Q)=>{let X=A1(),Y=J?CQ($,Q,X,!0):$.length===1?lK($[0],Q,X):CQ($,Q,X,!1),z=new O8;for(let H of $U($,Y,Q,X,J))z.addChild(new Q$(H,1,0));return z}}function CQ($,J,Z=A1(),Q=!1){if($.length===0)return[];if($.length===1)return uQ($[0],J,Z,Q);let X=$.filter((_)=>_.status==="running"),Y=$.filter((_)=>_.status==="queued"),z=$.filter((_)=>_.status!=="running"&&_.status!=="queued"),H=[],V=X.length>0||Y.length>0,U=X.length>0?P1(f5(X)):V?"●":"○";H.push(S$(`${J.fg(V?"accent":"dim",U)} ${J.fg(V?"accent":"dim","Async agents")} ${J.fg("dim","· background")}`,Z));let G=[],K=0,B=0,W=!1,O=h3;for(let _ of X){if(O<=0){K++;continue}let M=t4(_,J);G.push([`${s4(_,J)} ${_1(J,i4(_))}${M?` ${J.fg("dim","·")} ${M}`:""}`,` ${J.fg("dim",`⎿ ${r4(_)}`)}`,..._Q(_,J,Q,Z)]),O--}if(Y.length>0&&O>0)G.push([`${J.fg("muted","◦")} ${J.fg("dim",`${Y.length} queued`)}`]),W=!0,O--;for(let _ of z){if(O<=0){B++;continue}let M=t4(_,J);G.push([`${s4(_,J)} ${_1(J,i4(_))}${M?` ${J.fg("dim","·")} ${M}`:""}`,` ${J.fg("dim",`⎿ ${r4(_)}`)}`,..._Q(_,J,Q,Z)]),O--}let A=Y.length>0&&!W?Y.length:0,L=K+B+A;if(L>0){let _=[];if(K>0)_.push(`${K} running`);if(A>0)_.push(`${A} queued`);if(B>0)_.push(`${B} finished`);G.push([J.fg("dim",`+${L} more (${_.join(", ")})`)])}for(let _=0;_<G.length;_++){let M=G[_],F=_===G.length-1,R=F?"└─":"├─",C=F?" ":"│ ";H.push(S$(`${J.fg("dim",R)} ${M[0]}`,Z));for(let T of M.slice(1))H.push(S$(`${J.fg("dim",C)} ${T}`,Z))}return H}function Q6($,J){if(J.length===0){if(nQ(),$.hasUI)$.ui.setWidget(s8,void 0);return}if(!$.hasUI)return;$.ui.setWidget(s8,JU(J,$.ui.getToolsExpanded?.()??!1))}function ZU($,J,Z,Q){let X=J.truncation?.text||G0(J),Y=J.progress||J.progressSummary,z=J.progress?.status==="running",H=$.context==="fork"?Z.fg("warning"," [fork]"):"",V=jJ(Z,[J.usage?.turns?`⟳ ${J.usage.turns}`:"",E5(Z,Y)]),U=new O8,G=A1()-4,K=yJ(Z,J.model);if(U.addChild(new Q$(S$(`${wQ(J,X,Z,z,void 0,Q)} ${Z.fg("toolTitle",Z.bold(J.agent))}${K}${H}${V?` ${Z.fg("dim","·")} ${V}`:""}`,G),0,0)),z&&J.progress){let W=l4(J.progress),O=kQ(J.progress);U.addChild(new Q$(S$(Z.fg("dim",` ⎿ ${O}`),G),0,0));let A=b1(J.progress,W);if(A&&A!==O)U.addChild(new Q$(S$(Z.fg("dim",` ${A}`),G),0,0));if(U.addChild(new Q$(S$(Z.fg("accent",` ${_8()}`),G),0,0)),J.artifactPaths)U.addChild(new Q$(S$(Z.fg("dim",` output: ${j$(J.artifactPaths.outputPath)}`),G),0,0));return U}U.addChild(new Q$(S$(Z.fg("dim",` ⎿ ${SQ(J,X)}`),G),0,0));let B=DQ(X);if(B&&J.exitCode===0&&!v2(J.task,X))U.addChild(new Q$(S$(Z.fg("dim",` ${B}`),G),0,0));if(J.sessionFile)U.addChild(new Q$(S$(Z.fg("dim",` session: ${j$(J.sessionFile)}`),G),0,0));if(J.artifactPaths)U.addChild(new Q$(S$(Z.fg("dim",` output: ${j$(J.artifactPaths.outputPath)}`),G),0,0));if(J.truncation?.artifactPath)U.addChild(new Q$(S$(Z.fg("dim",` full output: ${j$(J.truncation.artifactPath)}`),G),0,0));return U}function QU($,J,Z){let Q=$.progress?.some((F)=>F.status==="running")||$.results.some((F)=>F.progress?.status==="running")||A8($,["running"]),X=$.results.some((F)=>F.exitCode!==0&&F.progress?.status!=="running")||A8($,["failed"]),Y=$.results.some((F)=>(F.interrupted||F.detached)&&F.progress?.status!=="running")||A8($,["paused","detached"]),z=$.progressSummary;if(!z){let F=!1,R={toolCount:0,tokens:0,durationMs:0};for(let C of $.results){let T=C.progress||C.progressSummary;if(!T)continue;F=!0,R.toolCount+=T.toolCount,R.tokens+=T.tokens,R.durationMs=$.mode==="chain"?R.durationMs+T.durationMs:Math.max(R.durationMs,T.durationMs)}if(F)z=R}let H=gQ($,Q),V=H.itemTitle,U=jJ(J,[H.headerLabel,E5(J,z),yQ($.totalCost)]),G=Q?J.fg("accent",P1(Z!==void 0?(z2(o4(z),$.currentStepIndex)??0)+Z:z2(o4(z),$.currentStepIndex))):X?J.fg("error","✗"):Y?J.fg("warning","■"):J.fg("success","✓"),K=$.context==="fork"?J.fg("warning"," [fork]"):"",B=new O8,W=A1()-4;B.addChild(new Q$(S$(`${G} ${J.fg("toolTitle",J.bold($.mode))}${K}${U?` ${J.fg("dim","·")} ${U}`:""}`,W),0,0));let O=H.hasParallelInChain||!$.chainAgents?.length,A=H.showActiveGroupOnly?H.groupStartIndex:0,L=H.showActiveGroupOnly?H.groupEndIndex:O?$.results.length:$.chainAgents.length,_=vQ($,H),M=_??Array.from({length:L-A},(F,R)=>{let C=A+R,T=$.results[C],I=V.toLowerCase(),S=H.showActiveGroupOnly?C-H.groupStartIndex+1:C+1;return{kind:"result",resultIndex:C,rowNumber:S,agentName:O?T?.agent||`${I}-${S}`:$.chainAgents[C]||T?.agent||`${I}-${S}`}});for(let F of M){if(F.kind==="placeholder"){let P=fJ(F.status,J),w=RJ(F.status,J);if(B.addChild(new Q$(S$(` ${P} ${F.stepLabel}: ${_1(J,F.agentName)} ${J.fg("dim","·")} ${w}`,W),0,0)),F.error)B.addChild(new Q$(S$(J.fg("error",` ⎿ Error: ${F.error}`),W),0,0));continue}let R=F.resultIndex,C=$.results[R],T=F.rowNumber,I=F.agentName;if(!C){let P=_?a4($,H,R,T):`${V} ${T}`;B.addChild(new Q$(S$(J.fg("dim",` ◦ ${P}: ${I} · pending`),W),0,0));continue}let S=G0(C),j=$.progress?.find((P)=>P.index===R)||$.progress?.find((P)=>P.agent===C.agent&&P.status==="running"),E=C.progress||j||C.progressSummary,k=E&&"status"in E&&E.status==="running",D=E&&"status"in E&&E.status==="pending",q=C.progress?.index!==void 0?C.progress.index+1:j?.index!==void 0?j.index+1:R+1,f=E5(J,E),b=D?J.fg("dim","◦"):wQ(C,S,J,k,o4(E),Z),y=D?` ${J.fg("dim","· pending")}`:"",h=a4($,H,R,q),n=`${b} ${h}: ${_1(J,I)}${f?` ${J.fg("dim","·")} ${f}`:""}${y}`;if(B.addChild(new Q$(S$(` ${n}`,W),0,0)),k&&E&&"status"in E){let P=kQ(E);B.addChild(new Q$(S$(J.fg("dim",` ⎿ ${P}`),W),0,0)),B.addChild(new Q$(S$(J.fg("accent",` ${_8()}`),W),0,0))}else if(!D&&(C.exitCode!==0||C.interrupted||C.detached||v2(C.task,S)))B.addChild(new Q$(S$(J.fg(C.exitCode!==0?"error":"dim",` ⎿ ${SQ(C,S)}`),W),0,0));let g=T5(C.task);if(g)B.addChild(new Q$(S$(J.fg("dim",` output: ${g}`),W),0,0));if(C.artifactPaths)B.addChild(new Q$(S$(J.fg("dim",` output: ${j$(C.artifactPaths.outputPath)}`),W),0,0))}if($.artifacts)B.addChild(new Q$(S$(J.fg("dim",` artifacts: ${j$($.artifacts.dir)}`),W),0,0));return B}function y5($,J,Z,Q){let X=$.details;if(!X||!X.results.length){let q=$.content[0],f=q?.type==="text"?q.text:"(no output)",b=X?.context==="fork"?`${Z.fg("warning","[fork]")} `:"",y=A1()-4;if(!f.includes(`
|
|
73
|
-
`))return new Q$(S$(`${b}${f}`,y),0,0);let h=new O8,n=xK(`${b}${f}`,y);for(let g of n)h.addChild(new Q$(g,0,0));return h}let Y=J.expanded,z=IK();if(X.mode==="single"&&X.results.length===1){let q=X.results[0];if(!Y)return ZU(X,q,Z,Q);let f=q.progress?.status==="running",b=f?Z.fg("warning","running"):q.detached?Z.fg("warning","detached"):q.exitCode===0?Z.fg("success","ok"):Z.fg("error","failed"),y=X.context==="fork"?Z.fg("warning"," [fork]"):"",h=q.truncation?.text||G0(q),n=f&&q.progress?` | ${q.progress.toolCount} tools, ${t$(q.progress.tokens)} tok, ${x$(q.progress.durationMs)}`:q.progressSummary?` | ${q.progressSummary.toolCount} tools, ${t$(q.progressSummary.tokens)} tok, ${x$(q.progressSummary.durationMs)}`:"",g=A1()-4,P=(c)=>Y?c:S$(c,g),w=AQ(q,Y),v=new O8;v.addChild(new Q$(P(`${b} ${Z.fg("toolTitle",Z.bold(q.agent))}${y}${n}`),0,0)),v.addChild(new r0(1));let x=Math.max(20,g-8),$$=Y||q.task.length<=x?q.task:`${q.task.slice(0,x)}...`;if(v.addChild(new Q$(P(Z.fg("dim",`Task: ${$$}`)),0,0)),v.addChild(new r0(1)),f&&q.progress){let c=l4(q.progress),o=p4(q.progress,g,Y,c);if(o)v.addChild(new Q$(P(Z.fg("warning",`> ${o}`)),0,0));let D$=b1(q.progress,c);if(D$)v.addChild(new Q$(P(Z.fg("accent",D$)),0,0));if(v.addChild(new Q$(P(Z.fg("accent",_8())),0,0)),q.artifactPaths)v.addChild(new Q$(P(Z.fg("dim",`Artifacts: ${j$(q.artifactPaths.outputPath)}`)),0,0));if(q.progress.recentTools?.length)for(let d of q.progress.recentTools.slice(-3)){let z$=Math.max(40,g-24),F$=Y||d.args.length<=z$?d.args:`${d.args.slice(0,z$)}...`;v.addChild(new Q$(P(Z.fg("dim",`${d.tool}: ${F$}`)),0,0))}for(let d of(q.progress.recentOutput??[]).slice(-5))v.addChild(new Q$(P(Z.fg("dim",` ${d}`)),0,0));if(o||D$||q.progress.recentTools?.length||q.progress.recentOutput?.length||q.artifactPaths)v.addChild(new r0(1))}if(Y){for(let c of w)v.addChild(new Q$(P(Z.fg("muted",c)),0,0));if(w.length)v.addChild(new r0(1))}if(h)v.addChild(new bK(h,0,0,z));if(v.addChild(new r0(1)),q.skills?.length)v.addChild(new Q$(P(Z.fg("dim",`Skills: ${q.skills.join(", ")}`)),0,0));if(q.skillsWarning)v.addChild(new Q$(P(Z.fg("warning",`Warning: ${q.skillsWarning}`)),0,0));if(q.attemptedModels&&q.attemptedModels.length>1)v.addChild(new Q$(P(Z.fg("dim",`Fallbacks: ${q.attemptedModels.join(" → ")}`)),0,0));if(v.addChild(new Q$(P(Z.fg("dim",e3(q.usage,q.model))),0,0)),q.sessionFile)v.addChild(new Q$(P(Z.fg("dim",`Session: ${j$(q.sessionFile)}`)),0,0));if(!f&&q.artifactPaths)v.addChild(new r0(1)),v.addChild(new Q$(P(Z.fg("dim",`Artifacts: ${j$(q.artifactPaths.outputPath)}`)),0,0));return v}if(!Y)return QU(X,Z,Q);let H=X.progress?.some((q)=>q.status==="running")||X.results.some((q)=>q.progress?.status==="running")||A8(X,["running"]),V=X.results.filter((q)=>q.progress?.status==="completed"||q.exitCode===0&&q.progress?.status!=="running").length,U=X.results.some((q)=>q.exitCode===0&&q.progress?.status!=="running"&&v2(q.task,G0(q))),G=A8(X,["failed"]),K=A8(X,["paused","detached"]),B=H?Z.fg("warning","running"):U?Z.fg("warning","warning"):G?Z.fg("error","failed"):K?Z.fg("warning","paused"):V===X.results.length?Z.fg("success","ok"):Z.fg("error","failed"),W=X.progressSummary||X.results.reduce((q,f)=>{let b=f.progress||f.progressSummary;if(b)q.toolCount+=b.toolCount,q.tokens+=b.tokens,q.durationMs=X.mode==="chain"?q.durationMs+b.durationMs:Math.max(q.durationMs,b.durationMs);return q},{toolCount:0,tokens:0,durationMs:0}),O=[W.toolCount||W.tokens?`${W.toolCount} tools, ${t$(W.tokens)} tok, ${x$(W.durationMs)}`:"",yQ(X.totalCost)].filter(Boolean),A=O.length?` | ${O.join(", ")}`:"",L=X.mode,_=X.context==="fork"?Z.fg("warning"," [fork]"):"",M=gQ(X,H),F=M.itemTitle,R=X.chainAgents?.length&&!M.hasParallelInChain?X.chainAgents.map((q,f)=>{let b=X.results[f],y=b&&b.exitCode!==0&&b.progress?.status!=="running",h=b&&b.exitCode===0&&b.progress?.status!=="running",n=Boolean(b)&&Boolean(h)&&v2(b.task,G0(b)),g=f===(X.currentStepIndex??X.results.length);return`${y?Z.fg("error","failed"):n?Z.fg("warning","warning"):h?Z.fg("success","done"):g&&H?Z.fg("warning","running"):Z.fg("dim","pending")} ${q}`}).join(Z.fg("dim"," → ")):null,C=A1()-4,T=(q)=>Y?q:S$(q,C),I=new O8;if(I.addChild(new Q$(T(`${B} ${Z.fg("toolTitle",Z.bold(L))}${_} · ${M.headerLabel}${A}`),0,0)),R)I.addChild(new Q$(T(` ${R}`),0,0));let S=M.hasParallelInChain||!X.chainAgents?.length,j=M.showActiveGroupOnly?M.groupStartIndex:0,E=M.showActiveGroupOnly?M.groupEndIndex:S?X.results.length:X.chainAgents.length,k=vQ(X,M),D=k??Array.from({length:E-j},(q,f)=>{let b=j+f,y=X.results[b],h=M.showActiveGroupOnly?b-M.groupStartIndex+1:b+1;return{kind:"result",resultIndex:b,rowNumber:h,agentName:S?y?.agent||`step-${h}`:X.chainAgents[b]||y?.agent||`step-${h}`}});I.addChild(new r0(1));for(let q of D){if(q.kind==="placeholder"){let J$=RJ(q.status,Z);if(I.addChild(new Q$(T(` ${J$} ${q.stepLabel}: ${Z.bold(q.agentName)}`),0,0)),I.addChild(new Q$(Z.fg(q.status==="failed"?"error":"dim",` status: ${q.status}`),0,0)),q.error)I.addChild(new Q$(Z.fg("error",` error: ${q.error}`),0,0));I.addChild(new r0(1));continue}let f=q.resultIndex,b=X.results[f],y=q.rowNumber,h=q.agentName;if(!b){let J$=k?a4(X,M,f,y):`${F} ${y}`;I.addChild(new Q$(T(Z.fg("dim",` ${J$}: ${h}`)),0,0)),I.addChild(new Q$(Z.fg("dim"," status: pending"),0,0)),I.addChild(new r0(1));continue}let n=X.progress?.find((J$)=>J$.index===f)||X.progress?.find((J$)=>J$.agent===b.agent&&J$.status==="running"),g=b.progress||n||b.progressSummary,P=g?.status==="running",w=typeof g?.index==="number"?g.index+1:f+1,v=G0(b),x=P?Z.fg("warning","running"):b.exitCode!==0?Z.fg("error","failed"):v2(b.task,v)?Z.fg("warning","warning"):Z.fg("success","done"),$$=g?` | ${g.toolCount} tools, ${x$(g.durationMs)}`:"",c=yJ(Z,b.model),o=a4(X,M,f,w),D$=P?`${x} ${o}: ${Z.bold(Z.fg("warning",b.agent))}${c}${$$}`:`${x} ${o}: ${Z.bold(b.agent)}${c}${$$}`,d=AQ(b,Y);I.addChild(new Q$(T(D$),0,0));let z$=Math.max(20,C-12),F$=Y||b.task.length<=z$?b.task:`${b.task.slice(0,z$)}...`;I.addChild(new Q$(T(Z.fg("dim",` task: ${F$}`)),0,0));let V$=T5(b.task);if(V$)I.addChild(new Q$(T(Z.fg("dim",` output: ${V$}`)),0,0));if(b.skills?.length)I.addChild(new Q$(T(Z.fg("dim",` skills: ${b.skills.join(", ")}`)),0,0));if(b.skillsWarning)I.addChild(new Q$(T(Z.fg("warning",` Warning: ${b.skillsWarning}`)),0,0));if(b.attemptedModels&&b.attemptedModels.length>1)I.addChild(new Q$(T(Z.fg("dim",` fallbacks: ${b.attemptedModels.join(" → ")}`)),0,0));if(P&&g){if(g.skills?.length)I.addChild(new Q$(T(Z.fg("accent",` skills: ${g.skills.join(", ")}`)),0,0));let J$=l4(g),H$=p4(g,C,Y,J$);if(H$)I.addChild(new Q$(T(Z.fg("warning",` > ${H$}`)),0,0));let O$=b1(g,J$);if(O$)I.addChild(new Q$(T(Z.fg("accent",` ${O$}`)),0,0));if(I.addChild(new Q$(T(Z.fg("accent",` ${_8()}`)),0,0)),b.artifactPaths)I.addChild(new Q$(T(Z.fg("dim",` artifacts: ${j$(b.artifactPaths.outputPath)}`)),0,0));if(g.recentTools?.length)for(let m of g.recentTools.slice(-3)){let a=Math.max(40,C-30),s$=Y||m.args.length<=a?m.args:`${m.args.slice(0,a)}...`;I.addChild(new Q$(T(Z.fg("dim",` ${m.tool}: ${s$}`)),0,0))}let q$=(g.recentOutput??[]).slice(-5);for(let m of q$)I.addChild(new Q$(T(Z.fg("dim",` ${m}`)),0,0))}if(!P&&b.artifactPaths)I.addChild(new Q$(T(Z.fg("dim",` artifacts: ${j$(b.artifactPaths.outputPath)}`)),0,0));if(Y&&!P){for(let J$ of d)I.addChild(new Q$(T(Z.fg("muted",` ${J$}`)),0,0));if(d.length)I.addChild(new r0(1))}I.addChild(new r0(1))}if(X.artifacts)I.addChild(new r0(1)),I.addChild(new Q$(T(Z.fg("dim",`Artifacts dir: ${j$(X.artifacts.dir)}`)),0,0));return I}import{Type as N}from"typebox";function pQ($){return iQ($,[])}function iQ($,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"&&!XU(J))continue;if("value"in X){let Y=typeof Q==="string"?[...J,Q]:J;X.value=iQ(X.value,Y)}Object.defineProperty(Z,Q,X)}return Z}function XU($){return $.length===2&&$[0]==="properties"}var DJ=N.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)"}),X6=N.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output filename/path (string), or false to disable file output"}),SJ=N.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."}),Y6=N.Unsafe({anyOf:[{type:"array",items:{type:"string"}},{type:"boolean"}],description:"Files to read before running (array of filenames), or false to disable"}),z6=N.Unsafe({type:"object",additionalProperties:!0,description:"JSON Schema object for strict structured output. Non-object roots are rejected."}),wJ=N.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."}),YU=N.Object({maxTurns:N.Integer({minimum:1}),graceTurns:N.Optional(N.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."}),zU=N.Unsafe({anyOf:[{type:"array",minItems:1,items:{type:"string",minLength:1}},{type:"string",enum:["*"]}]}),kJ=N.Object({soft:N.Optional(N.Integer({minimum:1})),hard:N.Integer({minimum:1}),block:N.Optional(zU)},{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."}),HU=N.Object({agent:N.String(),task:N.String(),cwd:N.Optional(N.String()),count:N.Optional(N.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:N.Optional(X6),outputMode:N.Optional(SJ),reads:N.Optional(Y6),progress:N.Optional(N.Boolean({description:"Enable progress.md tracking for this task"})),model:N.Optional(N.String({description:"Override model for this task (e.g. 'google/gemini-3-pro')"})),skill:N.Optional(DJ),toolBudget:N.Optional(kJ),acceptance:N.Optional(wJ)}),VU=N.Object({agent:N.String(),task:N.Optional(N.String({description:"Task template with {task}, {previous}, {chain_dir} variables. Defaults to {previous}."})),phase:N.Optional(N.String({description:"Optional phase/group label for status and graph rendering."})),label:N.Optional(N.String({description:"Optional user-facing label for this parallel task."})),as:N.Optional(N.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:N.Optional(z6),cwd:N.Optional(N.String()),count:N.Optional(N.Integer({minimum:1,description:"Repeat this parallel task N times with the same settings."})),output:N.Optional(X6),outputMode:N.Optional(SJ),reads:N.Optional(Y6),progress:N.Optional(N.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:N.Optional(DJ),model:N.Optional(N.String({description:"Override model for this task"})),toolBudget:N.Optional(kJ),acceptance:N.Optional(wJ)}),GU=N.Object({from:N.Object({output:N.String({description:"Prior named structured output to expand from."}),path:N.String({description:"JSON Pointer into the structured output, e.g. /items."})},{additionalProperties:!1}),item:N.Optional(N.String({description:"Template variable name for each item. Defaults to item."})),key:N.Optional(N.String({description:"JSON Pointer relative to each item for stable child ids."})),maxItems:N.Optional(N.Integer({minimum:0,description:"Required fanout bound unless configured globally."})),onEmpty:N.Optional(N.String({enum:["skip","fail"],description:"Empty input behavior. Defaults to skip."}))},{additionalProperties:!1}),KU=N.Object({agent:N.String(),task:N.Optional(N.String({description:"Task template with {item}, {item.path}, {task}, {previous}, {chain_dir}, and {outputs.name} variables."})),phase:N.Optional(N.String({description:"Optional phase/group label for status and graph rendering."})),label:N.Optional(N.String({description:"Optional user-facing label; item templates are supported."})),outputSchema:N.Optional(z6),cwd:N.Optional(N.String()),output:N.Optional(X6),outputMode:N.Optional(SJ),reads:N.Optional(Y6),progress:N.Optional(N.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:N.Optional(DJ),model:N.Optional(N.String({description:"Override model for this task"})),toolBudget:N.Optional(kJ),acceptance:N.Optional(wJ)},{additionalProperties:!1}),UU=N.Object({as:N.String({description:"Safe output name for the ordered collected result array."}),outputSchema:N.Optional(z6)},{additionalProperties:!1}),BU=N.Object({agent:N.Optional(N.String({description:"Sequential step agent name"})),task:N.Optional(N.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:N.Optional(N.String({description:"Optional phase/group label for status and graph rendering."})),label:N.Optional(N.String({description:"Optional user-facing label for this chain step."})),as:N.Optional(N.String({description:"Optional safe identifier used as {outputs.name} in later chain steps."})),outputSchema:N.Optional(z6),cwd:N.Optional(N.String()),output:N.Optional(X6),outputMode:N.Optional(SJ),reads:N.Optional(Y6),progress:N.Optional(N.Boolean({description:"Enable progress.md tracking in {chain_dir}"})),skill:N.Optional(DJ),model:N.Optional(N.String({description:"Override model for this step"})),toolBudget:N.Optional(kJ),acceptance:N.Optional(wJ),parallel:N.Optional(N.Unsafe({anyOf:[N.Array(VU,{minItems:1,description:"Tasks to run in parallel"}),KU],description:"Static parallel tasks array, or a single dynamic fanout child template when expand/collect are present."})),expand:N.Optional(GU),collect:N.Optional(UU),concurrency:N.Optional(N.Number({description:"Max concurrent tasks (default: 4)"})),failFast:N.Optional(N.Boolean({description:"Stop on first failure (default: false)"})),worktree:N.Optional(N.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}),WU=N.Object({enabled:N.Optional(N.Boolean({description:"Enable/disable subagent control attention tracking for this run"})),needsAttentionAfterMs:N.Optional(N.Integer({minimum:1,description:"No-observed-activity window before a run needs attention"})),activeNoticeAfterMs:N.Optional(N.Integer({minimum:1,description:"Active-long-running notice threshold by elapsed ms (default: 240000)"})),activeNoticeAfterTurns:N.Optional(N.Integer({minimum:1,description:"Optional active-long-running notice threshold by assistant turns (disabled by default)"})),activeNoticeAfterTokens:N.Optional(N.Integer({minimum:1,description:"Optional active-long-running notice threshold by total tokens (disabled by default)"})),failedToolAttemptsBeforeAttention:N.Optional(N.Integer({minimum:1,description:"Consecutive mutating-tool failures before escalating to needs_attention (default: 3)"})),notifyOn:N.Optional(N.Array(N.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:N.Optional(N.Array(N.String({enum:["event","async","intercom"]}),{description:"Notification channels to use when available. Defaults to event, async, and intercom."}))}),FU=N.Object({agent:N.Optional(N.String({description:"Agent name (SINGLE mode) or target for management get/update/delete"})),task:N.Optional(N.String({description:"Task (SINGLE mode, optional for self-contained agents)"})),action:N.Optional(N.String({description:"Management/control action only. Must be omitted for execution mode (single, parallel, or chain)."})),id:N.Optional(N.String({description:"Run id or prefix for action='status', action='interrupt', action='resume', action='steer', or action='append-step'."})),runId:N.Optional(N.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:N.Optional(N.String({description:"Async run directory for action='status', action='resume', or action='steer'."})),index:N.Optional(N.Integer({minimum:0,description:"Zero-based child index for actions that target a specific child or transcript."})),view:N.Optional(N.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:N.Optional(N.Integer({minimum:1,maximum:500,description:"Maximum transcript lines for action='status', view='transcript'. Defaults to 80."})),message:N.Optional(N.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:N.Optional(N.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:N.Optional(N.String({description:"Optional display name for action='schedule'."})),chainName:N.Optional(N.String({description:"Chain name for get/update/delete management actions"})),config:N.Optional(N.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:N.Optional(N.Array(HU,{description:"PARALLEL mode: [{agent, task, count?, output?, outputMode?, reads?, progress?}, ...]"})),concurrency:N.Optional(N.Integer({minimum:1,description:"Top-level PARALLEL mode only: max concurrent tasks. Defaults to config.parallel.concurrency or 4."})),worktree:N.Optional(N.Boolean({description:"Create isolated git worktrees for parallel tasks; requires clean git state."})),chain:N.Optional(N.Array(BU,{description:"CHAIN mode: sequential steps; each result becomes {previous}. append-step takes one tail step and may use {chain_dir}/{outputs.name}."})),context:N.Optional(N.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:N.Optional(N.String({description:"Persistent chain artifact directory; defaults to user-scoped temp storage."})),async:N.Optional(N.Boolean({description:"Run in background (default: false, or per config)"})),timeoutMs:N.Optional(N.Integer({minimum:1,description:"Optional run-level timeout in ms for foreground and async/background runs. Alias of maxRuntimeMs."})),maxRuntimeMs:N.Optional(N.Integer({minimum:1,description:"Alias of timeoutMs for optional run-level timeout in foreground and async/background runs."})),turnBudget:N.Optional(YU),toolBudget:N.Optional(kJ),agentScope:N.Optional(N.String({description:"Agent discovery scope: 'user', 'project', or 'both' (default: 'both'; project wins on name collisions)"})),cwd:N.Optional(N.String()),artifacts:N.Optional(N.Boolean({description:"Write debug artifacts (default: true)"})),includeProgress:N.Optional(N.Boolean({description:"Include full progress in result (default: false)"})),share:N.Optional(N.Boolean({description:"Upload session to GitHub Gist for sharing (default: false)"})),sessionDir:N.Optional(N.String({description:"Directory to store session logs (default: temp; enables sessions even if share=false)"})),clarify:N.Optional(N.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:N.Optional(WU),output:N.Optional(N.Unsafe({anyOf:[{type:"string"},{type:"boolean"}],description:"Output file for single agent (string), or false to disable. Relative paths resolve against cwd."})),outputMode:N.Optional(SJ),skill:N.Optional(DJ),model:N.Optional(N.String({description:"Override model for single agent (e.g. 'anthropic/claude-sonnet-4')"})),acceptance:N.Optional(wJ)}),H6=pQ(FU),OU=N.Object({id:N.Optional(N.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:N.Optional(N.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:N.Optional(N.Integer({minimum:1,description:"Give up waiting after this many milliseconds (the runs keep going regardless). Defaults to 1800000 (30 minutes)."}))}),rQ=pQ(OU);import{randomUUID as L2}from"node:crypto";import*as G1 from"node:fs";import*as y$ from"node:path";import{matchesKey as B$,visibleWidth as PJ,truncateToWidth as W0}from"@duckmind/dm-tui";function g2($){let J=$.lastIndexOf(":");if(J===-1)return{baseModel:$,thinkingSuffix:""};return{baseModel:$.substring(0,J),thinkingSuffix:$.substring(J)}}var AU="inherit";function H2($){return $.toLowerCase().replace(/[._]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function sQ($,J,Z){let Q=Number($),X=Number(J),Y=Number(Z);return Q>=1900&&Q<=2099&&X>=1&&X<=12&&Y>=1&&Y<=31}function aQ($){let J=/^(.*)-(\d{4})-(\d{2})-(\d{2})$/.exec($);if(J&&sQ(J[2],J[3],J[4]))return J[1];let Z=/^(.*)-(\d{4})(\d{2})(\d{2})$/.exec($);if(Z&&sQ(Z[2],Z[3],Z[4]))return Z[1];return $}function tQ($,J,Z){if($.includes("/")){let Q=J.find((X)=>X.fullId===$);if(Q)return Q.fullId}else{let Q=J.filter((X)=>X.id===$);if(Z){let X=Q.find((Y)=>Y.provider===Z);if(X)return X.fullId}if(Q.length===1)return Q[0].fullId}return _U($,J,Z)}function _U($,J,Z){let Q,X=$,Y=$.indexOf("/");if(Y!==-1)Q=H2($.slice(0,Y)),X=$.slice(Y+1);else{let U=[":","."];for(let G of U){let K=$.indexOf(G);if(K<=0)continue;let B=H2($.slice(0,K));if(!J.some((W)=>H2(W.provider)===B))continue;Q=B,X=$.slice(K+1);break}}let z=H2(X),H=aQ(z),V=J.filter((U)=>{let G=H2(U.id);if(G!==z&&aQ(G)!==H)return!1;if(Q!==void 0&&H2(U.provider)!==Q)return!1;return!0});if(V.length===0)return;if(Z){let U=H2(Z),G=V.find((K)=>H2(K.provider)===U);if(G)return G.fullId}if(V.length===1)return V[0].fullId;return}function V6($,J,Z){if(!$)return;if(!J||J.length===0)return $;let Q=tQ($,J,Z);if(Q)return Q;let{baseModel:X,thinkingSuffix:Y}=g2($);if(!Y)return $;let z=tQ(X,J,Z);if(z)return`${z}${Y}`;return $}function eQ($){console.warn(`[dm-subagents] ${$.message}`)}function T0($,J,Z,Q,X){let Y=typeof $==="string"?$.trim():"",z=Y&&Y!==AU?Y:void 0,H;if(z===void 0)H=J?`${J.provider}/${J.id}`:void 0;else H=V6(z,Z,Q);if(H&&X?.scope?.enforce){let V=z===void 0?"inherited":X.source??"inherited",U=V5(H,X.scope,V);if(U){if(U.severity==="error")throw Error(U.message);(X.onWarn??eQ)(U)}}return H}function IJ($,J,Z,Q,X){let Y=new Set,z=[],H=[$,...J??[]];for(let V=0;V<H.length;V++){let U=H[V];if(!U)continue;let G=V6(U.trim(),Z,Q);if(!G||Y.has(G))continue;if(V>0&&X?.scope?.enforce){let K=V5(G,X.scope,"inherited");if(K)(X.onWarn??eQ)(K)}Y.add(G),z.push(G)}return z}var MU=[/rate\s*limit/i,/too many requests/i,/\b429\b/,/quota/i,/billing/i,/credit/i,/auth(?:entication)?/i,/unauthori[sz]ed/i,/forbidden/i,/api key/i,/token expired/i,/invalid key/i,/provider.*unavailable/i,/model.*unavailable/i,/model.*disabled/i,/model.*not found/i,/unknown model/i,/overloaded/i,/service unavailable/i,/temporar(?:ily)? unavailable/i,/connection refused/i,/fetch failed/i,/network error/i,/socket hang up/i,/upstream/i,/timed? out/i,/timeout/i,/\b502\b/,/\b503\b/,/\b504\b/,/cold.?start/i,/empty response/i,/no output/i,/model.*(?:load|fail|error)/i];function $X($){if(!$)return!1;return MU.some((J)=>J.test($))}function JX($,J){let Z=$.error?.trim()||`exit ${$.exitCode??1}`;return J?`[fallback] ${$.model} failed: ${Z}. Retrying with ${J}.`:`[fallback] ${$.model} failed: ${Z}.`}function D5($=""){return{buffer:$,cursor:0,viewportOffset:0}}function bJ($,J){if(J<=0)return{lines:[$],starts:[0]};if($.length===0)return{lines:[""],starts:[0]};let Z=[],Q=[],X=0,Y=$.split(`
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
`,K=Buffer.byteLength(G,"utf-8");if(H+K>V)return;try{let B=X.write(G);if(H+=K,!B&&!Y)Y=!0,J.pause(),X.once("drain",()=>{if(Y=!1,!z)J.resume()})}catch{}},async close(){if(!X||z)return;z=!0;let U=X;X=void 0,await new Promise((G)=>U.end(()=>G()))}}}function Y1($,J){try{return $.kill(J)}catch{return!1}}function wX($,J){let{idleMs:Z,hardMs:Q}=J,X=!1,Y=!1,z=!1,H,V,U=()=>{if(!Y)try{$.stdout?.destroy()}catch{}if(!z)try{$.stderr?.destroy()}catch{}},G=()=>{if(H)clearTimeout(H),H=void 0;if(V)clearTimeout(V),V=void 0},K=()=>{if(!X)return;if(H)clearTimeout(H);H=setTimeout(U,Z),H.unref?.()};return $.stdout?.on("data",K),$.stderr?.on("data",K),$.stdout?.on("end",()=>{if(Y=!0,Y&&z)G()}),$.stderr?.on("end",()=>{if(z=!0,Y&&z)G()}),$.on("exit",()=>{if(X=!0,K(),V)return;V=setTimeout(U,Q),V.unref?.()}),$.on("close",G),$.on("error",G),G}import*as o0 from"node:fs";import*as n5 from"node:os";import*as F0 from"node:path";import{fileURLToPath as dX}from"node:url";import*as PX from"node:path";var XB=128,YB=4;function m5($){return typeof $==="string"&&$.length>0&&$.length<=XB&&!PX.isAbsolute($)&&!$.includes("/")&&!$.includes("\\")&&!$.includes("..")}function kX($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function IX($,J){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function O6($){if(!Array.isArray($))return[];return $.map((J)=>{if(!J||typeof J!=="object")return;let Z=J;if(!m5(Z.runId))return;return{runId:Z.runId,...kX(Z.stepIndex)!==void 0?{stepIndex:kX(Z.stepIndex)}:{},...IX(Z.agent,128)?{agent:IX(Z.agent,128)}:{}}}).filter((J)=>Boolean(J)).slice(0,YB)}function A6($){if(!$)return[];try{return O6(JSON.parse($))}catch{return[]}}function bX($){let J=O6($);return J.length?JSON.stringify(J):""}import{createHash as zB}from"node:crypto";import*as q8 from"node:fs";import*as z1 from"node:os";import*as j0 from"node:path";var HB=1,VB=604800000,xX=new Set(["read","bash","edit","write","grep","find","ls","mcp"]),vX=j0.join(z1.homedir(),".config","mcp","mcp.json"),mX={cursor:[j0.join(z1.homedir(),".cursor","mcp.json")],"claude-code":[j0.join(z1.homedir(),".claude","mcp.json"),j0.join(z1.homedir(),".claude.json"),j0.join(z1.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[j0.join(z1.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[j0.join(z1.homedir(),".codex","config.json")],windsurf:[j0.join(z1.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};function cX($,J=process.cwd()){if(!$?.length)return[];try{let Z=KB(J),Q=GB();if(!Q)return[];return MB(Z,Q,EB(Z.settings?.toolPrefix),$)}catch{return[]}}function GB(){let $=j0.join(b$(),"mcp-cache.json"),J;try{J=JSON.parse(q8.readFileSync($,"utf-8"))}catch{return null}if(!J||typeof J!=="object")return null;let Z=J;if(Z.version!==HB||!Z.servers||typeof Z.servers!=="object"||Array.isArray(Z.servers))return null;return Z}function KB($){let J={mcpServers:{}};for(let Z of UB($)){let Q=BB(Z);if(!Q)continue;J=FB(J,OB(Q,$))}return J}function UB($){let J=j0.join(b$(),"mcp.json"),Z=j0.resolve($,".mcp.json"),Q=j0.resolve(l$($),"mcp.json"),X=[];if(vX!==J)X.push(vX);if(X.push(J),Z!==J)X.push(Z);if(Q!==J&&Q!==Z)X.push(Q);return X}function BB($){let J;try{J=JSON.parse(q8.readFileSync($,"utf-8"))}catch{return null}return WB(J)}function WB($){if(!$||typeof $!=="object"||Array.isArray($))return{mcpServers:{}};let J=$,Z=J.mcpServers??J["mcp-servers"]??{};return{mcpServers:Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{},imports:Array.isArray(J.imports)?J.imports.filter((Q)=>CB(Q)):void 0,settings:J.settings&&typeof J.settings==="object"&&!Array.isArray(J.settings)?J.settings:void 0}}function FB($,J){let Z=[...$.imports??[],...J.imports??[]];return{mcpServers:{...$.mcpServers,...J.mcpServers},imports:Z.length?[...new Set(Z)]:void 0,settings:J.settings?{...$.settings,...J.settings}:$.settings}}function OB($,J){if(!$.imports?.length)return $;let Z={};for(let Q of $.imports){let X=AB(Q,J);if(!X)continue;let Y;try{Y=JSON.parse(q8.readFileSync(X,"utf-8"))}catch{continue}for(let[z,H]of Object.entries(_B(Y,Q)))if(!Z[z])Z[z]=H}return{imports:$.imports,settings:$.settings,mcpServers:{...Z,...$.mcpServers}}}function AB($,J){for(let Z of mX[$]){let Q=Z.startsWith(".")?j0.resolve(J,Z):Z;if(q8.existsSync(Q))return Q}return null}function _B($,J){if(!$||typeof $!=="object"||Array.isArray($))return{};let Z=$,Q=J==="cursor"||J==="windsurf"||J==="vscode"?Z.mcpServers??Z["mcp-servers"]:Z.mcpServers;return Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:{}}function MB($,J,Z,Q){let X=[],Y=new Set,{servers:z,tools:H}=qB(Q);for(let[V,U]of Object.entries($.mcpServers)){let G=J.servers[V];if(!LB(G,U))continue;let K=z.has(V)?!0:H.get(V);if(!K)continue;for(let B of Array.isArray(G.tools)?G.tools:[]){if(typeof B?.name!=="string"||!B.name)continue;if(K!==!0&&!K.has(B.name))continue;if(gX(B.name,V,Z,U.excludeTools))continue;let W=hJ(B.name,V,Z);if(xX.has(W)||Y.has(W))continue;Y.add(W),X.push(W)}if(U.exposeResources===!1)continue;for(let B of Array.isArray(G.resources)?G.resources:[]){if(typeof B?.name!=="string"||!B.name||typeof B.uri!=="string"||!B.uri)continue;let W=`get_${jB(B.name)}`;if(K!==!0&&!K.has(W))continue;if(gX(W,V,Z,U.excludeTools))continue;let O=hJ(W,V,Z);if(xX.has(O)||Y.has(O))continue;Y.add(O),X.push(O)}}return X}function qB($){let J=new Set,Z=new Map;for(let Q of $)if(Q=Q.replace(/\/+$/,""),Q.includes("/")){let[X,Y]=Q.split("/",2);if(X&&Y){if(!Z.has(X))Z.set(X,new Set);Z.get(X).add(Y)}else if(X)J.add(X)}else if(Q)J.add(Q);return{servers:J,tools:Z}}function LB($,J){if(!$||$.configHash!==NB(J))return!1;if(!$.cachedAt||typeof $.cachedAt!=="number")return!1;return Date.now()-$.cachedAt<=VB}function NB($){let J={command:$.command,args:$.args,env:hX($.env),cwd:fB($.cwd),url:$.url,headers:hX($.headers),auth:$.auth,bearerToken:RB($),bearerTokenEnv:$.bearerTokenEnv,exposeResources:$.exposeResources,excludeTools:$.excludeTools};return zB("sha256").update(c5(J)).digest("hex")}function EB($){return $==="none"||$==="short"||$==="server"?$:"server"}function CB($){return typeof $==="string"&&Object.hasOwn(mX,$)}function TB($,J){if(J==="none")return"";if(J==="short")return $.replace(/-?mcp$/i,"").replace(/-/g,"_")||"mcp";return $.replace(/-/g,"_")}function hJ($,J,Z){let Q=TB(J,Z);return Q?`${Q}_${$}`:$}function gX($,J,Z,Q){if(!Array.isArray(Q)||Q.length===0)return!1;let X=new Set([gJ($),gJ(hJ($,J,Z)),gJ(hJ($,J,"server")),gJ(hJ($,J,"short"))]);return Q.some((Y)=>typeof Y==="string"&&X.has(gJ(Y)))}function gJ($){return $.replace(/-/g,"_")}function jB($){let J=$.replace(/[^a-zA-Z0-9]/g,"_").replace(/_+/g,"_").replace(/^_+/,"").replace(/_+$/,"").toLowerCase();if(!J||/^\d/.test(J))J=`resource${J?`_${J}`:""}`;return J}function hX($){if(!$||typeof $!=="object"||Array.isArray($))return;let J={};for(let[Z,Q]of Object.entries($))if(typeof Q==="string")J[Z]=u5(Q);return J}function u5($){return $.replace(/\$\{(\w+)\}/g,(J,Z)=>process.env[Z]??"").replace(/\$env:(\w+)/g,(J,Z)=>process.env[Z]??"")}function fB($){if(typeof $!=="string")return;let J=u5($);if(J==="~")return z1.homedir();if(J.startsWith("~/")||J.startsWith("~\\"))return j0.join(z1.homedir(),J.slice(2));return J}function RB($){if(typeof $.bearerToken==="string")return u5($.bearerToken);return typeof $.bearerTokenEnv==="string"?process.env[$.bearerTokenEnv]:void 0}function c5($){if($===null||$===void 0||typeof $!=="object"){let Z=JSON.stringify($);return Z===void 0?"undefined":Z}if(Array.isArray($))return`[${$.map((Z)=>c5(Z)).join(",")}]`;let J=$;return`{${Object.keys(J).sort().map((Z)=>`${JSON.stringify(Z)}:${c5(J[Z])}`).join(",")}}`}var yB=["off","minimal","low","medium","high","xhigh"],DB=8000;function E6($,J){let Z=dX($),Q=F0.extname(Z),X=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(Q)?Q:".ts";return F0.join(F0.dirname(Z),`${J}${X}`)}function oX($){return F0.basename(dX($)).startsWith("dm-args.")}function SB($=import.meta.url){let J=oX($)?"subagent-prompt-runtime":F0.join("..","runs","shared","subagent-prompt-runtime");return E6($,J)}function wB($=import.meta.url){let J=oX($)?F0.join("..","..","extension","fanout-child"):"fanout-child";return E6($,J)}var uX=SB(),kB=wB(),C6="DM_SUBAGENT_CHILD",lX="DM_SUBAGENT_ORCHESTRATOR_TARGET",pX="DM_SUBAGENT_ORCHESTRATOR_SESSION_ID",iX="DM_SUBAGENT_SUPERVISOR_CHANNEL_DIR",d5="DM_SUBAGENT_RUN_ID",rX="DM_SUBAGENT_CHILD_AGENT",sX="DM_SUBAGENT_CHILD_INDEX",IB="DM_SUBAGENT_FANOUT_CHILD",mJ="DM_SUBAGENT_PARENT_EVENT_SINK",_6="DM_SUBAGENT_PARENT_CONTROL_INBOX",cJ="DM_SUBAGENT_PARENT_ROOT_RUN_ID",M6="DM_SUBAGENT_PARENT_RUN_ID",q6="DM_SUBAGENT_PARENT_CHILD_INDEX",L6="DM_SUBAGENT_PARENT_DEPTH",N6="DM_SUBAGENT_PARENT_PATH",uJ="DM_SUBAGENT_PARENT_CAPABILITY_TOKEN",nJ="DM_SUBAGENT_PARENT_SESSION",PB="DM_SUBAGENT_STEER_INBOX";function nX($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function bB($,J,Z){return F0.join(Y0,"supervisor-channels",`${nX($)}-${nX(J)}-${Z}`)}function B2($,J,Z=!1){if(!$||!J)return $;let Q=$.lastIndexOf(":");if(Q!==-1&&yB.includes($.substring(Q+1)))return Z?`${$.slice(0,Q)}:${J}`:$;return`${$}:${J}`}function aX($){let J=[...$.baseArgs];if($.sessionFile)o0.mkdirSync(F0.dirname($.sessionFile),{recursive:!0}),J.push("--session",$.sessionFile);else{if(!$.sessionEnabled)J.push("--no-session");if($.sessionDir)o0.mkdirSync($.sessionDir,{recursive:!0}),J.push("--session-dir",$.sessionDir)}let Z=B2($.model,$.thinking);if(Z)J.push("--model",Z);let Q=$.tools?.filter((_)=>!(_.includes("/")||_.endsWith(".ts")||_.endsWith(".js")))??[],X=$.requireReadTool&&$.tools?.length&&!Q.includes("read")?["read",...Q]:Q,Y=X.includes("subagent"),z=[];if($.tools?.length){let _=[...X];for(let M of $.tools)if(!X.includes(M)&&(M.includes("/")||M.endsWith(".ts")||M.endsWith(".js")))z.push(M);if(_.length>0){if($.mcpDirectTools?.length)_.push(...cX($.mcpDirectTools,$.cwd));J.push("--tools",_.join(","))}}let H=Y?[uX,kB]:[uX];if($.extensions!==void 0){J.push("--no-extensions");for(let _ of[...new Set([...H,...z,...$.extensions,...$.subagentOnlyExtensions??[]])])J.push("--extension",_)}else for(let _ of[...new Set([...H,...z,...$.subagentOnlyExtensions??[]])])J.push("--extension",_);if(!$.inheritSkills)J.push("--no-skills");let V;if($.systemPrompt!==void 0&&$.systemPrompt!==null){V=o0.mkdtempSync(F0.join(n5.tmpdir(),"dm-subagent-"));let _=($.promptFileStem??"prompt").replace(/[^\w.-]/g,"_"),M=F0.join(V,`${_}.md`);o0.writeFileSync(M,$.systemPrompt,{mode:384}),J.push($.systemPromptMode==="replace"?"--system-prompt":"--append-system-prompt",M)}if($.task.length>DB){if(!V)V=o0.mkdtempSync(F0.join(n5.tmpdir(),"dm-subagent-"));let _=F0.join(V,"task.md");o0.writeFileSync(_,`Task: ${$.task}`,{mode:384}),J.push(`@${_}`)}else J.push(`Task: ${$.task}`);let U={};U[C6]="1",U[IB]=Y?"1":"0";let G=Boolean(process.env[mJ]&&process.env[cJ]&&process.env[uJ]),K=$.parentRunId??$.runId??(G?process.env[d5]:void 0)??process.env[M6]??"",B=$.parentChildIndex!==void 0?String($.parentChildIndex):$.childIndex!==void 0?String($.childIndex):process.env[q6]??"",W=Number(process.env[L6]),O=$.parentDepth??(G&&Number.isFinite(W)?W+1:1),A=$.parentPath??[...A6(process.env[N6]),...K?[{runId:K,...B&&/^\d+$/.test(B)?{stepIndex:Number(B)}:{},...$.childAgentName?{agent:$.childAgentName}:{}}]:[]];if(U[mJ]=Y?$.parentEventSink??process.env[mJ]??"":"",U[_6]=Y?$.parentControlInbox??process.env[_6]??"":"",U[cJ]=Y?$.parentRootRunId??process.env[cJ]??$.runId??"":"",U[M6]=Y?K:"",U[q6]=Y?B:"",U[L6]=Y?String(O):"",U[N6]=Y?bX(A):"",U[uJ]=Y?$.parentCapabilityToken??process.env[uJ]??"":"",U.DM_SUBAGENT_INHERIT_PROJECT_CONTEXT=$.inheritProjectContext?"1":"0",U.DM_SUBAGENT_INHERIT_SKILLS=$.inheritSkills?"1":"0",$.intercomSessionName)U.DM_SUBAGENT_INTERCOM_SESSION_NAME=$.intercomSessionName;if($.orchestratorIntercomTarget)U[lX]=$.orchestratorIntercomTarget;if($.parentSessionId)U[pX]=$.parentSessionId;if($.orchestratorIntercomTarget&&$.parentSessionId&&$.runId&&$.childAgentName){let _=$.childIndex??0,M=bB($.runId,$.childAgentName,_);o0.mkdirSync(F0.join(M,"requests"),{recursive:!0}),o0.mkdirSync(F0.join(M,"replies"),{recursive:!0}),U[iX]=M}if($.runId)U[d5]=$.runId;if($.childAgentName)U[rX]=$.childAgentName;if($.childIndex!==void 0)U[sX]=String($.childIndex);if($.mcpDirectTools?.length)U.MCP_DIRECT_TOOLS=$.mcpDirectTools.join(",");else U.MCP_DIRECT_TOOLS="__none__";if($.structuredOutput)U[K7]=$.structuredOutput.outputPath,U[G7]=$.structuredOutput.schemaPath;if($.steerInboxDir)U[PB]=$.steerInboxDir;let L=k7($.toolBudget);if(L)U[S7]=L;return U[nJ]=$.parentSessionId??process.env[nJ]??"",{args:J,env:U,tempDir:V}}function o5($){if(!$)return;try{o0.rmSync($,{recursive:!0,force:!0})}catch{}}import*as g1 from"node:fs";import*as q1 from"node:path";function L8($,J){if($===!1||$==="false")return!1;if($===!0||$==="true")return J;if(typeof $==="string"&&$.length>0)return $;return}function W2($,J,Z,Q){if(typeof $!=="string"||!$||$==="false"||$==="true")return;if(q1.isAbsolute($))return $;if(Q)return q1.resolve(Q,$);let X=Z?q1.isAbsolute(Z)?Z:q1.resolve(J,Z):J;return q1.resolve(X,$)}function tX($){return[`Write your findings to exactly this path: ${$}`,"This path is authoritative for this run.","Ignore any other output filename or output path mentioned elsewhere, including output destinations in the base agent prompt, system prompt, or task instructions."].join(`
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
`);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
${J}`:$}function oJ($){return{...$,outcome:"within-budget",turnCount:0}}function r5($,J,Z){return{...$,turnCount:J,outcome:Z?"exceeded":"wrap-up-requested",wrapUpRequestedAtTurn:$.maxTurns,...Z?{exceededAtTurn:J}:{}}}function YY($,J,Z){let Q=$.maxTurns+$.graceTurns;if(J<Q)return!1;if(J>Q)return!0;return!Z}var HY=new WeakMap,VY=new WeakMap;function E8(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0}}function cB($,J){$.input+=J.input,$.output+=J.output,$.cacheRead+=J.cacheRead,$.cacheWrite+=J.cacheWrite,$.cost+=J.cost,$.turns+=J.turns}function GY($){return`Subagent timed out after ${$}ms.`}function uB($){if($.timeoutMs===void 0)return;let J=$.deadlineAt??Date.now()+$.timeoutMs;return{timeoutMs:$.timeoutMs,remainingMs:Math.max(0,J-Date.now()),message:GY($.timeoutMs)}}function zY($,J){return{status:$.level==="none"?"not-required":"rejected",explicit:$.explicit,effectiveAcceptance:$,inferredReason:$.inferredReason,criteria:$.criteria,runtimeChecks:$.level==="none"?[]:[{id:J.id,status:"failed",message:J.message}],verifyRuns:[]}}function s5($,J){if(J.length===0)return;if($.recentOutput.push(...J.filter((Z)=>Z.trim())),$.recentOutput.length>50)$.recentOutput.splice(0,$.recentOutput.length-50)}function nB($){for(let J of $??[]){if(J.role!=="assistant"||!Array.isArray(J.content))continue;for(let Z of J.content)if(Z.type==="text"&&"text"in Z&&typeof Z.text==="string")Z.text=b4(Z.text)}}function a5($){return{...$,skills:$.skills?[...$.skills]:void 0,recentTools:$.recentTools.map((J)=>({...J})),recentOutput:[...$.recentOutput]}}function t5($,J){return{...$,messages:$.outputMode==="file-only"&&$.savedOutputPath?void 0:$.messages?[...$.messages]:void 0,usage:{...$.usage},skills:$.skills?[...$.skills]:void 0,attemptedModels:$.attemptedModels?[...$.attemptedModels]:void 0,modelAttempts:$.modelAttempts?$.modelAttempts.map((Z)=>({...Z,usage:Z.usage?{...Z.usage}:void 0})):void 0,controlEvents:$.controlEvents?$.controlEvents.map((Z)=>({...Z})):void 0,progress:J,progressSummary:$.progressSummary?{...$.progressSummary}:void 0,artifactPaths:$.artifactPaths?{...$.artifactPaths}:void 0,truncation:$.truncation?{...$.truncation}:void 0,outputReference:$.outputReference?{...$.outputReference}:void 0}}async function dB($,J,Z,Q,X,Y){let z=X.thinkingOverride??J.thinking,H=B2(Q,z,X.thinkingOverride!==void 0),{args:V,env:U,tempDir:G}=aX({baseArgs:["--mode","json","-p"],task:Z,sessionEnabled:Y.sessionEnabled,sessionDir:X.sessionDir,sessionFile:X.sessionFile,model:H,thinking:z,systemPromptMode:J.systemPromptMode,inheritProjectContext:J.inheritProjectContext,inheritSkills:J.inheritSkills,requireReadTool:Boolean(Y.resolvedSkillNames?.length),tools:J.tools,extensions:J.extensions,subagentOnlyExtensions:J.subagentOnlyExtensions,systemPrompt:QY(Y.systemPrompt,X.turnBudget),mcpDirectTools:J.mcpDirectTools,cwd:X.cwd??$,promptFileStem:J.name,intercomSessionName:X.intercomSessionName,orchestratorIntercomTarget:X.orchestratorIntercomTarget,runId:X.runId,childAgentName:J.name,childIndex:X.index??0,parentEventSink:X.nestedRoute?.eventSink,parentControlInbox:X.nestedRoute?.controlInbox,parentRootRunId:X.nestedRoute?.rootRunId,parentCapabilityToken:X.nestedRoute?.capabilityToken,parentSessionId:X.parentSessionId,structuredOutput:X.structuredOutput,toolBudget:X.toolBudget}),K={agent:J.name,task:Y.originalTask??Z,exitCode:0,messages:[],usage:E8(),model:H,artifactPaths:Y.artifactPaths,transcriptPath:Y.transcriptWriter?Y.artifactPaths?.transcriptPath:void 0,skills:Y.resolvedSkillNames,skillsWarning:Y.skillsWarning,...X.turnBudget?{turnBudget:oJ(X.turnBudget)}:{},...X.toolBudget?{toolBudget:w7(X.toolBudget)}:{}},B=Date.now();if(X.structuredOutput)try{if(e5(X.structuredOutput.outputPath))mB(X.structuredOutput.outputPath)}catch{}let W=X.controlConfig??G2,O=!1,A=[],L=[],_=new Set,M=(k)=>{if(!vJ(W,k))return;if(!OX(W,k,_))return;A.push(k),L.push(k),X.onControlEvent?.(k)},F={index:X.index??0,agent:J.name,status:"running",task:Z,skills:Y.resolvedSkillNames,recentTools:[],recentOutput:[...Y.attemptNotes],toolCount:0,tokens:0,durationMs:0,lastActivityAt:B};K.progress=F;let R=uB(X);if(R?.remainingMs===0)return K.exitCode=1,K.timedOut=!0,K.error=R.message,K.finalOutput=R.message,F.status="failed",F.error=R.message,K.progressSummary={toolCount:F.toolCount,tokens:F.tokens,durationMs:F.durationMs},K;let C={...process.env,...U,...n3(X.maxSubagentDepth)},T=!1,I=await new Promise((k)=>{let D=yX(V),q=hB(D.command,D.args,{cwd:X.cwd??$,env:C,stdio:["ignore","pipe","pipe"],windowsHide:!0}),f=SX(Y.jsonlPath,q.stdout),b="",y=!1,h=!1,n=!1,g=!1,P,w,v,x,$$,c,o,D$=!1,d,z$,F$=()=>{if(d)clearTimeout(d),d=void 0;if(z$)clearTimeout(z$),z$=void 0},V$=()=>{if($$)clearTimeout($$),$$=void 0;if(c)clearTimeout(c),c=void 0;if(o)clearTimeout(o),o=void 0},J$=()=>{n=!0,y=!0,K.detached=!0,K.detachedReason="intercom coordination",F.status="detached",F.durationMs=Date.now()-B,K.progressSummary={toolCount:F.toolCount,tokens:F.tokens,durationMs:F.durationMs},N$(-2)},H$=1000,O$=3000,q$=!1,m=!1,a=!1,s$,G$,a$=()=>{if(s$)clearTimeout(s$),s$=void 0;if(G$)clearTimeout(G$),G$=void 0},R$=()=>{if(q$||s$||h||y||n)return;s$=setTimeout(()=>{if(h||y||n)return;if(!Y1(q,"SIGTERM"))return;if(m=!0,!a&&!P)K.error=K.error??`Subagent process did not exit within ${H$}ms after its final message. Forcing termination.`;G$=setTimeout(()=>{if(h||y||n)return;m=Y1(q,"SIGKILL")||m},O$),G$.unref?.()},H$),s$.unref?.()},U$=X.intercomEvents?.on?.(x3,(p)=>{if(!X.allowIntercomDetach||n||y||!g)return;if(!p||typeof p!=="object")return;let s=p.requestId;if(typeof s!=="string"||s.length===0)return;X.intercomEvents?.emit(v3,{requestId:s,accepted:!0}),J$()}),N$=(p)=>{if(h)return;if(h=!0,a$(),Z0(),V$(),F$(),x)clearInterval(x),x=void 0;U$?.(),w?.(),v?.(),k(p)},W$=()=>{if(L.length===0)return;let p=L;return L=[],p},i=!1,P$,H0=EX(),Z$=300000,t=(p)=>F.currentToolStartedAt?Math.max(0,p-F.currentToolStartedAt):void 0,f$=(p,s={})=>{if(!W.enabled)return!1;let C$=F.activityState;F.activityState="needs_attention";let v$=W6({type:"needs_attention",from:C$,to:"needs_attention",runId:X.runId,agent:J.name,index:X.index,ts:p,lastActivityAt:F.lastActivityAt,message:s.message,reason:s.reason??"idle",turns:K.usage.turns,tokens:F.tokens,toolCount:F.toolCount,currentTool:s.currentTool??F.currentTool,currentToolDurationMs:s.currentToolDurationMs??t(p),currentPath:s.currentPath??F.currentPath,recentFailureSummary:s.recentFailureSummary});return M(v$),C$!=="needs_attention"},l=(p,s)=>{if(!W.enabled||i||F.activityState==="needs_attention")return!1;i=!0;let C$=F.activityState;return F.activityState="active_long_running",M(W6({type:"active_long_running",from:C$,to:"active_long_running",runId:X.runId,agent:J.name,index:X.index,ts:p,message:`${J.name} is still active but long-running`,reason:s,turns:K.usage.turns,tokens:F.tokens,toolCount:F.toolCount,currentTool:F.currentTool,currentToolDurationMs:t(p),currentPath:F.currentPath,elapsedMs:p-B})),!0},K$=(p)=>{let s=X.turnBudget;if(!s||K.timedOut||K.turnBudgetExceeded||O||y||h||n)return;let C$=i5(s,p);K.turnBudgetExceeded=!0,K.wrapUpRequested=!0,K.turnBudget=r5(s,p,!0),K.error=C$,K.finalOutput=C$,F.status="failed",F.error=C$,F.durationMs=Date.now()-B,u(),Y1(q,"SIGINT"),d=setTimeout(()=>{if(y||h||n||K.timedOut)return;Y1(q,"SIGTERM")},1000),d.unref?.(),z$=setTimeout(()=>{if(y||h||n||K.timedOut)return;Y1(q,"SIGKILL")},4000),z$.unref?.()},X0=(p,s)=>{let C$=X.turnBudget;if(!C$||K.timedOut||K.turnBudgetExceeded)return;if(p<C$.maxTurns){K.turnBudget={...C$,outcome:"within-budget",turnCount:p};return}if(!D$)D$=!0,K.wrapUpRequested=!0,s5(F,[p5(C$,p)]);if(K.turnBudget=r5(C$,p,!1),YY(C$,p,s))K$(p)},c$=(p)=>{if(!W.enabled)return!1;if(FX({config:W,startedAt:B,lastActivityAt:F.lastActivityAt,now:p})==="needs_attention")return F.activityState==="needs_attention"?!1:f$(p);let C$=LX(W,{startedAt:B,now:p,turns:K.usage.turns,tokens:F.tokens});return C$?l(p,C$):!1},a1=(p)=>{if(!X.onUpdate||y)return;let s=a5(F),C$=t5(K,s),v$=W$();X.onUpdate({content:[{type:"text",text:p}],details:{mode:"single",results:[C$],progress:[s],controlEvents:v$}})},u=()=>{if(!X.onUpdate||y)return;F.durationMs=Date.now()-B;let p=(K.timedOut||K.turnBudgetExceeded)&&K.finalOutput?K.finalOutput:Y8(K.messages);a1(p||"(running...)")},M$=(p)=>{if(!p.trim())return;f.writeLine(p);let s;try{s=JSON.parse(p)}catch{Y.transcriptWriter?.writeStdoutLine(p);return}Y.transcriptWriter?.writeChildEvent(s);let C$=Date.now();if(F.durationMs=C$-B,F.lastActivityAt=C$,c$(C$),s.type==="tool_execution_start"){let v$=s.args&&typeof s.args==="object"&&!Array.isArray(s.args)?s.args:{},h$=!1;if(X.allowIntercomDetach&&(s.toolName==="intercom"||s.toolName==="contact_supervisor"))g=!0,h$=s.toolName==="intercom"&&v$.action==="ask"||s.toolName==="contact_supervisor"&&(v$.reason==="need_decision"||v$.reason==="interview_request");if(F.toolCount++,X.toolBudget)K.toolBudget=Y5(X.toolBudget,F.toolCount);F.currentTool=s.toolName,F.currentToolArgs=I4(v$),F.currentToolStartedAt=C$,F.currentPath=_X(s.toolName,v$);let K1=MX(s.toolName,v$);if(T=T||K1,P$={tool:s.toolName??"tool",path:F.currentPath,mutates:K1,startedAt:C$},u(),h$&&!n&&!y)J$()}if(s.type==="tool_execution_end"){if(F.currentTool)F.recentTools.push({tool:F.currentTool,args:F.currentToolArgs||"",endMs:C$});F.currentTool=void 0,F.currentToolArgs=void 0,F.currentToolStartedAt=void 0,F.currentPath=void 0,u()}if(s.type==="message_end"&&s.message){if(K.messages.push(s.message),s.message.role==="assistant"){K.usage.turns++,F.turnCount=K.usage.turns;let v$=s.message.stopReason,h$=Array.isArray(s.message.content)&&s.message.content.some((PV)=>PV.type==="toolCall"),K1=v$==="stop"&&!h$;X0(K.usage.turns,K1);let e2=s.message.usage;if(e2)K.usage.input+=e2.input||0,K.usage.output+=e2.output||0,K.usage.cacheRead+=e2.cacheRead||0,K.usage.cacheWrite+=e2.cacheWrite||0,K.usage.cost+=e2.cost?.total||0,F.tokens=K.usage.input+K.usage.output;if(!K.model&&s.message.model)K.model=s.message.model;if(s.message.errorMessage)P=s.message.errorMessage;let D3=V8(s.message.content);if(s5(F,D3.split(`
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
${Y}`}function LY($){if($.stepBudget!==void 0){let Z=k0($.stepBudget,"toolBudget");return{toolBudget:Z.budget,error:Z.error}}if($.runBudget!==void 0)return{toolBudget:$.runBudget};if($.agentBudget!==void 0){let Z=k0($.agentBudget,"agent.toolBudget");return{toolBudget:Z.budget,error:Z.error}}let J=k0($.configBudget,"config.toolBudget");return{toolBudget:J.budget,error:J.error}}async function qY($){let J=$.step.concurrency??S9,Z=$.step.failFast??!1,Q=!1;return await e8($.step.parallel,J,async(Y,z)=>{if(Q&&Z)return{agent:Y.agent,task:"(skipped)",exitCode:-1,messages:[],usage:{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0,turns:0},error:"Skipped due to fail-fast"};let H=$.parallelTemplates[z]??"{previous}",V=$1($.parallelBehaviors[z],H,$.originalTask),U=H.includes("{previous}"),{prefix:G,suffix:K}=S1(V,$.chainDir,!1,U?void 0:$.prev),B=t9(H,$.outputs);B=B.replace(/\{task\}/g,$.originalTask),B=B.replace(/\{previous\}/g,$.prev),B=B.replace(/\{chain_dir\}/g,$.chainDir);let W=B;B=G+B+K;let O=$.agents.find((I)=>I.name===Y.agent),A=T0(Y.model??O?.model,$.ctx.model,$.availableModels,$.ctx.model?.provider,{scope:$.modelScope,source:Y.model?"explicit":"inherited"}),L=W1($.maxSubagentDepth,O?.maxSubagentDepth),_=LY({stepBudget:Y.toolBudget,runBudget:$.toolBudget,agentBudget:O?.toolBudget,configBudget:$.configToolBudget});if(_.error)throw Error(_.error);let M=$.worktreeSetup?$.worktreeSetup.worktrees[z].agentCwd:J1($.cwd??$.ctx.cwd,Y.cwd),F=typeof V.output==="string"?q0.isAbsolute(V.output)?V.output:q0.join($.chainDir,V.output):void 0,R=new AbortController;if($.foregroundControl)$.foregroundControl.currentAgent=Y.agent,$.foregroundControl.currentIndex=$.globalTaskIndex+z,$.foregroundControl.currentActivityState=void 0,$.foregroundControl.updatedAt=Date.now(),$.foregroundControl.interrupt=()=>{if(R.signal.aborted)return!1;return R.abort(),$.foregroundControl.currentActivityState=void 0,$.foregroundControl.updatedAt=Date.now(),!0};let C=Y.outputSchema?GJ(Y.outputSchema,q0.join($.chainDir,"structured-output")):void 0,T=await C8($.ctx.cwd,$.agents,Y.agent,B,{parentSessionId:$.ctx.sessionManager.getSessionId()??void 0,cwd:M,signal:$.signal,interruptSignal:R.signal,allowIntercomDetach:O?.systemPrompt?.includes(v1)===!0,intercomEvents:$.intercomEvents,runId:$.runId,index:$.globalTaskIndex+z,sessionDir:$.sessionDirForIndex($.globalTaskIndex+z),sessionFile:$.sessionFileForTask?.(Y.agent,$.globalTaskIndex+z)??$.sessionFileForIndex?.($.globalTaskIndex+z),thinkingOverride:$.thinkingOverrideForTask?.(Y.agent,$.globalTaskIndex+z),share:$.shareEnabled,artifactsDir:$.artifactConfig.enabled?$.artifactsDir:void 0,artifactConfig:$.artifactConfig,outputPath:F,outputMode:V.outputMode,maxSubagentDepth:L,controlConfig:$.controlConfig,onControlEvent:$.onControlEvent,intercomSessionName:$.childIntercomTarget?.(Y.agent,$.globalTaskIndex+z),orchestratorIntercomTarget:$.orchestratorIntercomTarget,nestedRoute:$.nestedRoute,modelOverride:A,availableModels:$.availableModels,preferredModelProvider:$.ctx.model?.provider,modelScope:$.modelScope,skills:V.skills===!1?[]:V.skills,structuredOutput:C,acceptance:Y.acceptance,acceptanceContext:{mode:"chain"},timeoutMs:$.timeoutMs,deadlineAt:$.deadlineAt,turnBudget:$.turnBudget,onDetachedExit:$.onDetachedExit?(I)=>$.onDetachedExit?.($.globalTaskIndex+z,I):void 0,toolBudget:_.toolBudget,onUpdate:$.onUpdate?(I)=>{let S=I.details?.results||[],j=I.details?.progress||[];if($.foregroundControl&&j.length>0){let E=j[0];$.foregroundControl.currentAgent=Y.agent,$.foregroundControl.currentIndex=$.globalTaskIndex+z,$.foregroundControl.currentActivityState=E?.activityState,$.foregroundControl.lastActivityAt=E?.lastActivityAt,$.foregroundControl.currentTool=E?.currentTool,$.foregroundControl.currentToolStartedAt=E?.currentToolStartedAt,$.foregroundControl.currentPath=E?.currentPath,$.foregroundControl.turnCount=E?.turnCount,$.foregroundControl.tokens=E?.tokens,$.foregroundControl.toolCount=E?.toolCount,$.foregroundControl.updatedAt=Date.now()}$.onUpdate?.({...I,details:{mode:"chain",results:$.results.concat(S),progress:$.allProgress.concat(j),controlEvents:I.details?.controlEvents,chainAgents:$.chainAgents,totalSteps:$.totalSteps,currentStepIndex:$.stepIndex,outputs:$.outputs,workflowGraph:j8({runId:$.runId,mode:"chain",steps:$.chainSteps,results:$.results.concat(S),currentStepIndex:$.stepIndex,currentFlatIndex:$.globalTaskIndex+z,dynamicChildren:$.dynamicChildren,dynamicGroupStatuses:$.dynamicGroupStatuses})}})}:void 0});if($.foregroundControl?.currentIndex===$.globalTaskIndex+z)$.foregroundControl.interrupt=void 0,$.foregroundControl.updatedAt=Date.now();if(T.exitCode!==0&&Z)Q=!0;return T8(Y.agent,W,T.exitCode,T.progressSummary?.durationMs??0),T},$.globalSemaphore)}async function NY($){let{chain:J,agents:Z,ctx:Q,signal:X,runId:Y,cwd:z,shareEnabled:H,sessionDirForIndex:V,sessionFileForIndex:U,sessionFileForTask:G,thinkingOverrideForTask:K,artifactsDir:B,artifactConfig:W,includeProgress:O,clarify:A,onUpdate:L,onControlEvent:_,controlConfig:M,onDetachedExit:F,childIntercomTarget:R,orchestratorIntercomTarget:C,foregroundControl:T,intercomEvents:I,chainSkills:S,chainDir:j,modelScope:E}=$,k=S??[],D=[],q={},f={},b={},y=[],h=[],n=J.map((m)=>T$(m)?`[${m.parallel.map((a)=>a.agent).join("+")}]`:k$(m)?`expand:${m.parallel.agent}`:m.agent),g=J.length,P=(m={})=>({results:D,...O!==void 0?{includeProgress:O}:{},allProgress:y,allArtifactPaths:h,artifactsDir:B,chainAgents:n,chainSteps:J,totalSteps:g,runId:Y,outputs:q,dynamicChildren:f,dynamicGroupStatuses:b,...m}),w=J[0],v=$.task??(T$(w)?w.parallel[0].task:k$(w)?w.parallel.task:w.task);try{K8(J,{maxItems:$.dynamicFanoutMaxItems})}catch(m){if(m instanceof K0)return{content:[{type:"text",text:m.message}],isError:!0,details:f0(P())};throw m}let x=i3(Y,j),$$=J.some((m)=>T$(m)||k$(m)),c=s3(J),o=A===!0&&Q.hasUI&&!$$,D$,d=Q.modelRegistry.getAvailable().map(A0),z$=t0(z??Q.cwd);if(o){let m=J,a=[];for(let U$ of m){let N$=Z.find((W$)=>W$.name===U$.agent);if(!N$)return $J(x),{content:[{type:"text",text:`Unknown agent: ${U$.agent}`}],isError:!0,details:f0(P({currentStepIndex:m.indexOf(U$)}))};a.push(N$)}let s$=m.map((U$)=>({output:U$.output,outputMode:U$.outputMode,reads:U$.reads,progress:U$.progress,skills:O0(U$.skill),model:U$.model})),G$=a.map((U$,N$)=>e0(U$,s$[N$],k)),a$=c,R$=await Q.ui.custom((U$,N$,W$,i)=>new M8(U$,N$,a,a$,v,x,G$,d,Q.model?.provider,z$,i),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!R$||!R$.confirmed)return $J(x),{content:[{type:"text",text:"Chain cancelled"}],details:f0(P())};if(R$.runInBackground){$J(x);let U$=J.map((N$,W$)=>{if(T$(N$))return N$;let i=R$.behaviorOverrides[W$];return{...N$,task:R$.templates[W$],...i?.model?{model:i.model}:{},...i?.output!==void 0?{output:i.output}:{},..."outputMode"in N$&&N$.outputMode!==void 0?{outputMode:N$.outputMode}:{},...i?.reads!==void 0?{reads:i.reads}:{},...i?.progress!==void 0?{progress:i.progress}:{},...i?.skills!==void 0?{skill:i.skills}:{}}});return{content:[{type:"text",text:"Launching in background..."}],details:f0(P()),requestedAsync:{chain:U$,chainSkills:k}}}c=R$.templates,D$=R$.behaviorOverrides}let F$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),V$=new t8($.globalConcurrencyLimit??S4),J$="",H$=0,O$=!1;for(let m=0;m<J.length;m++){let a=J[m],s$=c[m];if(T$(a)){let G$=s$,a$=J1(z??Q.cwd,a.cwd),R$;if(a.worktree){let U$=pJ(a.parallel,a$);if(U$)return H1(`parallel chain step ${m+1}: ${iJ(U$,a$)}`,P({currentStepIndex:m,currentFlatIndex:H$}));try{R$=f6(a$,`${Y}-s${m}`,a.parallel.length,{agents:a.parallel.map((N$)=>N$.agent),setupHook:$.worktreeSetupHook?{hookPath:$.worktreeSetupHook,timeoutMs:$.worktreeSetupHookTimeoutMs}:void 0,baseDir:$.worktreeBaseDir})}catch(N$){let W$=N$ instanceof Error?N$.message:String(N$);return H1(W$,P({currentStepIndex:m,currentFlatIndex:H$}))}}try{let U$=a.parallel.map((l)=>l.agent),N$=g9(a.parallel,Z,m,k).map((l,K$)=>$1(l,G$[K$]??a.parallel[K$]?.task,v));for(let l=0;l<a.parallel.length;l++){let K$=N$[l],X0=typeof K$.output==="string"?q0.isAbsolute(K$.output)?K$.output:q0.join(x,K$.output):void 0,c$=s0(K$.outputMode,X0,`Parallel chain step ${m+1} task ${l+1} (${a.parallel[l].agent})`);if(c$)return H1(c$,P({currentStepIndex:m,currentFlatIndex:H$+l}))}O$=MY(x,O$,N$),h9(x,m,a.parallel.length,U$);let W$=await qY({step:a,parallelTemplates:G$,parallelBehaviors:N$,agents:Z,stepIndex:m,availableModels:d,modelScope:E,chainDir:x,prev:J$,originalTask:v,ctx:Q,intercomEvents:I,cwd:z,runId:Y,globalTaskIndex:H$,sessionDirForIndex:V,sessionFileForIndex:U,sessionFileForTask:G,thinkingOverrideForTask:K,shareEnabled:H,artifactConfig:W,artifactsDir:B,signal:X,onUpdate:L,results:D,allProgress:y,outputs:q,chainAgents:n,chainSteps:J,totalSteps:g,dynamicChildren:f,dynamicGroupStatuses:b,controlConfig:M,onControlEvent:_,childIntercomTarget:R,orchestratorIntercomTarget:C,foregroundControl:T,nestedRoute:$.nestedRoute,worktreeSetup:R$,maxSubagentDepth:$.maxSubagentDepth,timeoutMs:$.timeoutMs,deadlineAt:F$,turnBudget:$.turnBudget,onDetachedExit:F,toolBudget:$.toolBudget,configToolBudget:$.configToolBudget,globalSemaphore:V$});H$+=a.parallel.length;for(let l of W$){if(D.push(l),l.progress)y.push(l.progress);if(l.artifactPaths)h.push(l.artifactPaths)}let i=W$.findIndex((l)=>l.interrupted),P$=i>=0?W$[i]:void 0;if(P$)return{content:[{type:"text",text:`Chain paused after interrupt at step ${m+1} (${P$.agent}). Waiting for explicit next action.`}],details:f0(P({currentStepIndex:m,currentFlatIndex:H$-a.parallel.length+i}))};let H0=W$.findIndex((l)=>l.detached),Z$=H0>=0?W$[H0]:void 0;if(Z$)return{content:[{type:"text",text:`Chain detached for intercom coordination at step ${m+1} (${Z$.agent}). Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:f0(P({currentStepIndex:m,currentFlatIndex:H$-a.parallel.length+H0}))};let t=W$.map((l,K$)=>({...l,originalIndex:K$})).filter((l)=>l.exitCode!==0&&l.exitCode!==-1);if(t.length>0){let l=t.map((c$)=>`- Task ${c$.originalIndex+1} (${c$.agent}): ${c$.error||"failed"}`).join(`
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
${h$}`:h$}}catch{}if(G$.as)q[G$.as]=e9(p,m);J$=G0(p)}}return{content:[{type:"text",text:ZJ(J,D,x,"completed")}],details:f0(P())}}function D6($){if($==="user"||$==="project"||$==="both")return $;return"both"}import*as J0 from"node:fs";import*as h1 from"node:path";var OW=["reviewer","context-builder","delegate"];function EY($){if(typeof $!=="number")return;if(!Number.isInteger($)||!Number.isFinite($)||$<1)return;return $}function TY($){if($===!1)return{enabled:!1,minReferences:2,maxRecommendations:3,preferredAgent:"reviewer"};let J=EY($?.maxRecommendations)??3;return{enabled:$?.enabled??!0,minReferences:EY($?.minReferences)??2,maxRecommendations:Math.min(J,5),preferredAgent:typeof $?.preferredAgent==="string"&&$.preferredAgent.trim()?$.preferredAgent.trim():"reviewer"}}function AW($){if($===!1||$===!0||$===void 0||$===null)return[];if(Array.isArray($))return[...new Set($.filter((J)=>typeof J==="string").map((J)=>J.trim()).filter(Boolean))];if(typeof $==="string")return[...new Set($.split(",").map((J)=>J.trim()).filter(Boolean))];return[]}function ZZ($,J){for(let Q of AW($.skills??$.skill))J.add(Q);let Z=$.parallel;if(!Z)return;if(Array.isArray(Z)){for(let Q of Z)if(Q&&typeof Q==="object"&&!Array.isArray(Q))ZZ(Q,J);return}if(typeof Z==="object")ZZ(Z,J)}function _W($,J){let Z=$.filter((Q)=>!Q.disabled);if(Z.some((Q)=>Q.name===J))return J;for(let Q of OW)if(Z.some((X)=>X.name===Q))return Q;return Z[0]?.name}function CY($,J,Z){if(J==="dm-subagents")return;let Q=$.get(J)??new Set;Q.add(Z),$.set(J,Q)}function MW($){let J=TY($.config);if(!J.enabled)return[];let Z=_W($.agents,J.preferredAgent);if(!Z)return[];let Q=$.availableSkills?new Map($.availableSkills.map((Y)=>[Y.name,Y])):void 0,X=new Map;for(let Y of $.agents){if(Y.disabled)continue;for(let z of Y.skills??[])CY(X,z,`agent:${Y.name}`)}for(let Y of $.chains??[]){let z=new Set;for(let H of Y.steps)ZZ(H,z);for(let H of z)CY(X,H,`chain:${Y.name}`)}return[...X.entries()].filter(([Y,z])=>z.size>=J.minReferences&&(!Q||Q.has(Y))).map(([Y,z])=>({skill:Y,agent:Z,references:z.size,sources:[...z].sort((H,V)=>H.localeCompare(V)),description:Q?.get(Y)?.description,reason:`referenced by ${z.size} configured agents/chains`})).sort((Y,z)=>z.references-Y.references||Y.skill.localeCompare(z.skill)).slice(0,J.maxRecommendations)}function qW($){if($.length===0)return[];return["Proactive skill subagent suggestions:",...$.map((J)=>{let Z=J.sources.slice(0,3).join(", "),Q=J.sources.length>3?`, +${J.sources.length-3} more`:"",X=J.description?` - ${J.description}`:"";return`- ${J.skill} via ${J.agent} (${J.reason}; ${Z}${Q})${X}`}),"Guardrails: use these for broad tasks where a skill-specialist pass is useful; keep fanout small, use fresh context unless private/session context is explicitly needed, and skip when the user asks for a direct answer."]}function jY($){if(!TY($.config).enabled)return[];let J;try{J=$.discoverAvailableSkills()}catch{J=[]}return qW(MW({agents:$.agents,chains:$.chains,availableSkills:J,config:$.config}))}function r($,J=!1){return{content:[{type:"text",text:$}],isError:J,details:{mode:"management",results:[]}}}function f8($){return[...new Set($.split(",").map((J)=>J.trim()).filter(Boolean))]}function DY($){let J=$;if(typeof J==="string")try{J=JSON.parse(J)}catch(Z){return{error:`config must be valid JSON: ${Z instanceof Error?Z.message:String(Z)}`}}if(!J||typeof J!=="object"||Array.isArray(J))return{};return{value:J}}function e($,J){return Object.prototype.hasOwnProperty.call($,J)}function aJ($){if($==="user"||$==="project")return $;return}function k6($,J){if($===void 0)return{scope:"user"};let Z=aJ($);return Z?{scope:Z}:{error:r(`agentScope must be 'user' or 'project' for ${J}.`,!0)}}function LW($){if($===void 0)return"both";if($==="user"||$==="project"||$==="both")return $;return}function F2($){return $.toLowerCase().trim().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"")}function QZ($){return Z2($,"config.package")}function tJ($){return[...$.builtin,...$.package,...$.user,...$.project]}function c2($,J){let Z=Q0($),Q=J==="agent"?tJ(Z):Z.chains;return[...new Set(Q.map((X)=>X.name))].sort((X,Y)=>X.localeCompare(Y))}function XZ($,J,Z="both"){let Q=Q0(J),X=$.trim(),Y=F2(X);return tJ(Q).filter((z)=>(Z==="both"||z.source===Z)&&(z.name===X||z.name===Y)).sort((z,H)=>z.source.localeCompare(H.source))}function YZ($,J,Z="both"){let Q=$.trim(),X=F2(Q);return Q0(J).chains.filter((Y)=>(Z==="both"||Y.source===Z)&&(Y.name===Q||Y.name===X)).sort((Y,z)=>Y.source.localeCompare(z.source))}var fY={builtin:0,package:1,user:2,project:3};function S6($,J){let Z=J.trim(),Q=F2(Z),X=tJ($).filter((Y)=>Y.name===Z||Y.name===Q);if(X.length===0)return;return X.reduce((Y,z)=>fY[z.source]>fY[Y.source]?z:Y)}function zZ($,J,Z,Q){let X=Q0($);for(let Y of J==="user"?X.user:X.project)if(Y.name===Z&&Y.filePath!==Q)return!0;for(let Y of X.chains)if(Y.source===J&&Y.name===Z&&Y.filePath!==Q)return!0;return!1}function NW($){return $==="user"||$==="project"}function SY($,J){let Z=Q0($),Q=new Set(tJ(Z).map((X)=>X.name));return[...new Set(J.map((X)=>X.agent).filter((X)=>!Q.has(X)))].sort((X,Y)=>X.localeCompare(Y))}function wY($,J){let Z=[],Q=new Set(t0($.cwd).map((X)=>X.name));for(let X=0;X<J.length;X++){let Y=J[X];if(Y.model){if(!$.modelRegistry.getAvailable().some((H)=>`${H.provider}/${H.id}`===Y.model||H.id===Y.model))Z.push(`Warning: step ${X+1} (${Y.agent}): model '${Y.model}' is not in the current model registry.`)}if(Array.isArray(Y.skills)&&Y.skills.length>0){let z=Y.skills.filter((H)=>!Q.has(H));if(z.length)Z.push(`Warning: step ${X+1} (${Y.agent}): skills not found: ${z.join(", ")}.`)}}return Z}function kY($,J){if(!J)return;return $.modelRegistry.getAvailable().some((Q)=>`${Q.provider}/${Q.id}`===J||Q.id===J)?void 0:`Warning: model '${J}' is not in the current model registry.`}function IY($,J){if(!J||J.length===0)return;let Z=new Set($.modelRegistry.getAvailable().flatMap((X)=>[`${X.provider}/${X.id}`,X.id])),Q=J.filter((X)=>!Z.has(X));return Q.length?`Warning: fallback models not in the current model registry: ${Q.join(", ")}.`:void 0}function PY($,J){if(!J||J.length===0)return;let Z=new Set(t0($).map((X)=>X.name)),Q=J.filter((X)=>!Z.has(X));return Q.length?`Warning: skills not found: ${Q.join(", ")}.`:void 0}function EW($){let J=$.override?.base;if(!J)return{...$};return{...$,model:J.model,fallbackModels:J.fallbackModels?[...J.fallbackModels]:void 0,thinking:J.thinking,systemPromptMode:J.systemPromptMode,inheritProjectContext:J.inheritProjectContext,inheritSkills:J.inheritSkills,defaultContext:J.defaultContext,disabled:J.disabled,systemPrompt:J.systemPrompt,skills:J.skills?[...J.skills]:void 0,tools:J.tools?[...J.tools]:void 0,mcpDirectTools:J.mcpDirectTools?[...J.mcpDirectTools]:void 0,subagentOnlyExtensions:J.subagentOnlyExtensions?[...J.subagentOnlyExtensions]:void 0,completionGuard:J.completionGuard,override:void 0}}function CW($){try{let{frontmatter:J}=Q2(J0.readFileSync($,"utf-8"));return new Set(Object.keys(J))}catch{return new Set}}function TW($,J){let Z=CW($.filePath),Q=(...X)=>{for(let Y of X)Z.delete(Y)};if(e(J,"name"))Q("name");if(e(J,"package"))Q("package");if(e(J,"description"))Q("description");if(e(J,"systemPrompt"))Q("systemPrompt");if(e(J,"model"))Q("model");if(e(J,"fallbackModels"))Q("fallbackModels");if(e(J,"tools"))Q("tools");if(e(J,"skills"))Q("skill","skills");if(e(J,"extensions"))Q("extensions");if(e(J,"subagentOnlyExtensions"))Q("subagentOnlyExtensions");if(e(J,"thinking")){if(Q("thinking"),J.thinking==="off")Z.add("thinking")}if(e(J,"systemPromptMode"))Q("systemPromptMode"),Z.add("systemPromptMode");if(e(J,"inheritProjectContext"))Q("inheritProjectContext"),Z.add("inheritProjectContext");if(e(J,"inheritSkills"))Q("inheritSkills"),Z.add("inheritSkills");if(e(J,"defaultContext"))Q("defaultContext");if(e(J,"output"))Q("output");if(e(J,"reads"))Q("defaultReads");if(e(J,"progress"))Q("defaultProgress");if(e(J,"maxSubagentDepth"))Q("maxSubagentDepth");if(e(J,"completionGuard")){if(Q("completionGuard"),J.completionGuard===!0)Z.add("completionGuard")}if(e(J,"toolBudget"))Q("toolBudget");return Z}function bY($){if(!Array.isArray($))return{error:"config.steps must be an array."};if($.length===0)return{error:"config.steps must include at least one step."};let J=[];for(let Z=0;Z<$.length;Z++){let Q=$[Z];if(!Q||typeof Q!=="object"||Array.isArray(Q))return{error:`config.steps[${Z}] must be an object.`};let X=Q;if(typeof X.agent!=="string"||!X.agent.trim())return{error:`config.steps[${Z}].agent must be a non-empty string.`};let Y={agent:X.agent.trim(),task:typeof X.task==="string"?X.task:""};if(e(X,"phase"))if(typeof X.phase==="string")Y.phase=X.phase;else return{error:`config.steps[${Z}].phase must be a string.`};if(e(X,"label"))if(typeof X.label==="string")Y.label=X.label;else return{error:`config.steps[${Z}].label must be a string.`};if(e(X,"as"))if(typeof X.as==="string")Y.as=X.as;else return{error:`config.steps[${Z}].as must be a string.`};if(e(X,"outputSchema"))if(typeof X.outputSchema==="string")Y.outputSchema=X.outputSchema;else return{error:`config.steps[${Z}].outputSchema must be a schema file path string for saved chains.`};if(e(X,"output"))if(X.output===!1)Y.output=!1;else if(typeof X.output==="string")Y.output=X.output;else return{error:`config.steps[${Z}].output must be a string or false.`};if(e(X,"outputMode"))if(X.outputMode==="inline"||X.outputMode==="file-only")Y.outputMode=X.outputMode;else return{error:`config.steps[${Z}].outputMode must be 'inline' or 'file-only'.`};if(e(X,"reads"))if(X.reads===!1)Y.reads=!1;else if(Array.isArray(X.reads))Y.reads=X.reads.filter((z)=>typeof z==="string").map((z)=>z.trim()).filter(Boolean);else return{error:`config.steps[${Z}].reads must be an array or false.`};if(e(X,"model"))if(typeof X.model==="string")Y.model=X.model;else return{error:`config.steps[${Z}].model must be a string.`};if(e(X,"skills"))if(X.skills===!1)Y.skills=!1;else if(Array.isArray(X.skills))Y.skills=X.skills.filter((z)=>typeof z==="string").map((z)=>z.trim()).filter(Boolean);else return{error:`config.steps[${Z}].skills must be an array or false.`};if(e(X,"progress"))if(typeof X.progress==="boolean")Y.progress=X.progress;else return{error:`config.steps[${Z}].progress must be a boolean.`};if(e(X,"toolBudget")){let z=k0(X.toolBudget,`config.steps[${Z}].toolBudget`);if(z.error)return{error:z.error};Y.toolBudget=X.toolBudget}J.push(Y)}return{steps:J}}function jW($){let J=[],Z=[];for(let Q of f8($))if(Q.startsWith("mcp:")){let X=Q.slice(4).trim();if(X)Z.push(X)}else J.push(Q);return{tools:J.length?J:void 0,mcpDirectTools:Z.length?Z:void 0}}function xY($,J){if(e(J,"systemPrompt"))if(J.systemPrompt===!1||J.systemPrompt==="")$.systemPrompt="";else if(typeof J.systemPrompt==="string")$.systemPrompt=J.systemPrompt;else return"config.systemPrompt must be a string or false when provided.";if(e(J,"model"))if(J.model===!1||J.model==="")$.model=void 0;else if(typeof J.model==="string")$.model=J.model.trim()||void 0;else return"config.model must be a string or false when provided.";if(e(J,"fallbackModels"))if(J.fallbackModels===!1||J.fallbackModels==="")$.fallbackModels=void 0;else if(typeof J.fallbackModels==="string"){let Z=f8(J.fallbackModels);$.fallbackModels=Z.length?Z:void 0}else if(Array.isArray(J.fallbackModels)){let Z=J.fallbackModels.filter((Q)=>typeof Q==="string").map((Q)=>Q.trim()).filter(Boolean);$.fallbackModels=Z.length?[...new Set(Z)]:void 0}else return"config.fallbackModels must be a comma-separated string, string array, or false when provided.";if(e(J,"tools"))if(J.tools===!1||J.tools==="")$.tools=void 0,$.mcpDirectTools=void 0;else if(typeof J.tools==="string"){let Z=jW(J.tools);$.tools=Z.tools,$.mcpDirectTools=Z.mcpDirectTools}else return"config.tools must be a comma-separated string or false when provided.";if(e(J,"skills"))if(J.skills===!1||J.skills==="")$.skills=void 0;else if(typeof J.skills==="string"){let Z=f8(J.skills);$.skills=Z.length?Z:void 0}else return"config.skills must be a comma-separated string or false when provided.";if(e(J,"extensions"))if(J.extensions===!1)$.extensions=void 0;else if(J.extensions==="")$.extensions=[];else if(typeof J.extensions==="string")$.extensions=f8(J.extensions);else return"config.extensions must be a comma-separated string, empty string, or false when provided.";if(e(J,"subagentOnlyExtensions"))if(J.subagentOnlyExtensions===!1)$.subagentOnlyExtensions=void 0;else if(J.subagentOnlyExtensions==="")$.subagentOnlyExtensions=[];else if(typeof J.subagentOnlyExtensions==="string")$.subagentOnlyExtensions=f8(J.subagentOnlyExtensions);else return"config.subagentOnlyExtensions must be a comma-separated string, empty string, or false when provided.";if(e(J,"thinking"))if(J.thinking===!1||J.thinking==="")$.thinking=void 0;else if(typeof J.thinking==="string")$.thinking=J.thinking.trim()||void 0;else return"config.thinking must be a string or false when provided.";if(e(J,"systemPromptMode"))if(J.systemPromptMode==="append"||J.systemPromptMode==="replace")$.systemPromptMode=J.systemPromptMode;else return"config.systemPromptMode must be 'append' or 'replace' when provided.";if(e(J,"inheritProjectContext")){if(typeof J.inheritProjectContext!=="boolean")return"config.inheritProjectContext must be a boolean when provided.";$.inheritProjectContext=J.inheritProjectContext}if(e(J,"inheritSkills")){if(typeof J.inheritSkills!=="boolean")return"config.inheritSkills must be a boolean when provided.";$.inheritSkills=J.inheritSkills}if(e(J,"defaultContext"))if(J.defaultContext===!1||J.defaultContext==="")$.defaultContext=void 0;else if(J.defaultContext==="fresh"||J.defaultContext==="fork")$.defaultContext=J.defaultContext;else return"config.defaultContext must be 'fresh', 'fork', or false when provided.";if(e(J,"output"))if(J.output===!1||J.output==="")$.output=void 0;else if(typeof J.output==="string")$.output=J.output;else return"config.output must be a string or false when provided.";if(e(J,"reads"))if(J.reads===!1||J.reads==="")$.defaultReads=void 0;else if(typeof J.reads==="string"){let Z=f8(J.reads);$.defaultReads=Z.length?Z:void 0}else return"config.reads must be a comma-separated string or false when provided.";if(e(J,"progress")){if(typeof J.progress!=="boolean")return"config.progress must be a boolean when provided.";$.defaultProgress=J.progress}if(e(J,"maxSubagentDepth"))if(J.maxSubagentDepth===!1||J.maxSubagentDepth==="")$.maxSubagentDepth=void 0;else if(typeof J.maxSubagentDepth==="number"&&Number.isInteger(J.maxSubagentDepth)&&J.maxSubagentDepth>=0)$.maxSubagentDepth=J.maxSubagentDepth;else return"config.maxSubagentDepth must be an integer >= 0 or false when provided.";if(e(J,"completionGuard")){if(typeof J.completionGuard!=="boolean")return"config.completionGuard must be a boolean when provided.";$.completionGuard=J.completionGuard}if(e(J,"toolBudget"))if(J.toolBudget===!1||J.toolBudget==="")$.toolBudget=void 0;else{let Z=k0(J.toolBudget,"config.toolBudget");if(Z.error)return Z.error;$.toolBudget=J.toolBudget}return}function w6($,J,Z,Q,X){let Y=Z.filter((V)=>NW(V.source));if(Y.length===0){if(Z.length>0)return r(`${$==="agent"?"Agent":"Chain"} '${J}' is read-only and cannot be modified. Create a same-named ${$} in user or project scope to override it.`,!0);let V=c2(Q,$);return r(`${$==="agent"?"Agent":"Chain"} '${J}' not found. Available: ${V.join(", ")||"none"}.`,!0)}if(Y.length===1)return Y[0];let z=aJ(X);if(!z){let V=Y.map((U)=>`${U.source}: ${U.filePath}`).join(`
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
${H}`:z,G=(($.steps?.length)?$.steps:[{agent:"subagent",status:"running"}]).map((W)=>W.status==="running"||W.status==="pending"?{...W,status:"failed",activityState:void 0,endedAt:W.endedAt??Z,durationMs:W.startedAt!==void 0&&W.durationMs===void 0?Math.max(0,Z-W.startedAt):W.durationMs,exitCode:W.exitCode??1,error:W.error??V}:W),K={...$,state:"failed",activityState:void 0,lastUpdate:Z,endedAt:Z,steps:G},B=G[$.currentStep??0]?.agent??G[0]?.agent??"subagent";return{status:K,message:V,result:{id:X,agent:B,mode:$.mode,success:!1,state:"failed",summary:V,results:G.map((W)=>({agent:W.agent,output:W.status==="complete"||W.status==="completed"?"":V,error:W.status==="complete"||W.status==="completed"?void 0:W.error??V,success:W.status==="complete"||W.status==="completed",model:W.model,attemptedModels:W.attemptedModels,modelAttempts:W.modelAttempts,sessionFile:W.sessionFile})),exitCode:1,timestamp:Z,durationMs:Math.max(0,Z-$.startedAt),asyncDir:J,sessionId:$.sessionId,sessionFile:$.sessionFile}}}function Fz($,J,Z,Q,X){let Y=YO(J,$,Q,X);return L0(Z,Y.result),L0(g0.join($,"status.json"),Y.status),eF(g0.join($,"events.jsonl"),{type:"subagent.run.repaired_stale",ts:Q,runId:Y.status.runId,pid:J.pid,resultPath:Z,message:Y.message}),{status:Y.status,repaired:!0,resultPath:Z,message:Y.message}}function Oz($){return $==="complete"||$==="failed"||$==="paused"}function*SZ($){for(let J of $??[])yield J,yield*SZ(J.children),yield*SZ(J.steps?.flatMap((Z)=>Z.children??[]))}function p2($,J={}){let Z=O2($);for(let Q of SZ(Z.children)){if(Q.state!=="running"&&Q.state!=="queued")continue;let X=w8($.rootRunId,Q);if(!X)continue;let Y=E0(X,{...J,resultsDir:g0.join(J.resultsDir??w$,"nested",$.rootRunId)}),z=Y.status;if(!z)continue;if(!Y.repaired&&!Oz(z.state))continue;let H=J.now?.()??Date.now();n2($,{type:Oz(z.state)?"subagent.nested.completed":"subagent.nested.updated",ts:H,parentRunId:Q.parentRunId,parentStepIndex:Q.parentStepIndex,child:iY(z,X,{id:Q.id,parentRunId:Q.parentRunId,parentStepIndex:Q.parentStepIndex,depth:Q.depth,path:Q.path,mode:Q.mode,ts:H})})}}function zO($,J=process.kill){try{return J($,0),"alive"}catch(Z){let Q=typeof Z==="object"&&Z!==null&&"code"in Z?Z.code:void 0;if(Q==="ESRCH")return"dead";if(Q==="EPERM")return"unknown";return"unknown"}}function E0($,J={}){let Z=J.now?.()??Date.now(),Q=$O($),X=!Q&&J.startedRun?XO($,J.startedRun,Z):void 0,Y=Q??X;if(!Y)return{status:null,repaired:!1};let z=Y.runId||g0.basename($),H=g0.join(J.resultsDir??w$,`${z}.json`);if(N0.existsSync(H)){let U=Y.state==="running"||Y.state==="queued"?QO(Y,H,Z):void 0;if(U)return L0(g0.join($,"status.json"),U),{status:U,repaired:!0,resultPath:H,message:"Existing async result file was used to repair stale running status."};return{status:Y,repaired:!1,resultPath:H}}if(Y.state!=="running"||typeof Y.pid!=="number")return{status:Q??null,repaired:!1,resultPath:H};if(!Q){let U=J.startedRun?.startedAt??Y.startedAt;if(Z-U<(J.missingStatusGraceMs??1000))return{status:null,repaired:!1,resultPath:H}}if(zO(Y.pid,J.kill)!=="dead"){let U=J.staleAlivePidMs??86400000,G=Y.lastUpdate??Y.startedAt;if(Z-G<=U)return{status:Q??null,repaired:!1,resultPath:H};let K=`Async runner process ${Y.pid} still has a live PID, but status has not updated for ${Z-G}ms. Marked run failed by stale-run reconciliation because PID ownership cannot be verified.`;return Fz($,Y,H,Z,K)}return Fz($,Y,H,Z)}var HO=process.platform==="win32"?"SIGBREAK":"SIGUSR2";function Lz($){let J=$.target.runId;if(!$.target.asyncDir)return{ok:!1,message:`Async run ${J} is live but does not have an async directory to interrupt.`};let Z=E0($.target.asyncDir,{resultsDir:$.resultsDir,kill:$.kill,now:$.now}).status;if(!Z||Z.state!=="running"||typeof Z.pid!=="number")return{ok:!1,message:`Async run ${J} is live but no interrupt-capable runner pid was found.`};try{Y4({asyncDir:$.target.asyncDir,pid:Z.pid,kill:$.kill,signal:HO,now:$.now,source:"async-resume"});let Q=$.state?.asyncJobs.get(J);if(Q)Q.activityState=void 0,Q.updatedAt=$.now?.()??Date.now();return{ok:!0,asyncId:J}}catch(Q){let X=Q instanceof Error?Q.message:String(Q);return{ok:!1,message:`Failed to interrupt async run ${J}: ${X}`}}}function _z($){return $ instanceof Error?$.message:String($)}function Mz($,J){if(!$||typeof $!=="object"||Array.isArray($))throw Error(`Async result file '${J}' must contain a JSON object.`);return $}function N1($,J,Z,Q=J){let X=$[J];if(X===void 0)return;if(typeof X!=="string")throw Error(`Invalid async result file '${Z}': ${Q} must be a string.`);return X}function VO($,J){let Z=Mz($,J),Q=Z.results,X;if(Q!==void 0){if(!Array.isArray(Q))throw Error(`Invalid async result file '${J}': results must be an array.`);X=Q.map((z,H)=>{let V=Mz(z,`${J} results[${H}]`),U=N1(V,"agent",J,`results[${H}].agent`),G=N1(V,"sessionFile",J,`results[${H}].sessionFile`),K=N1(V,"intercomTarget",J,`results[${H}].intercomTarget`),B=V.success;if(B!==void 0&&typeof B!=="boolean")throw Error(`Invalid async result file '${J}': results[${H}].success must be a boolean.`);return{agent:U,sessionFile:G,intercomTarget:K,...typeof B==="boolean"?{success:B}:{}}})}let Y=Z.success;if(Y!==void 0&&typeof Y!=="boolean")throw Error(`Invalid async result file '${J}': success must be a boolean.`);return{id:N1(Z,"id",J),runId:N1(Z,"runId",J),agent:N1(Z,"agent",J),mode:N1(Z,"mode",J),state:N1(Z,"state",J),cwd:N1(Z,"cwd",J),sessionFile:N1(Z,"sessionFile",J),...typeof Y==="boolean"?{success:Y}:{},...X?{results:X}:{}}}function GO($){let J;try{J=V1.readFileSync($,"utf-8")}catch(Z){throw Error(`Failed to read async result file '${$}': ${_z(Z)}`,{cause:Z instanceof Error?Z:void 0})}try{return VO(JSON.parse(J),$)}catch(Z){if(Z instanceof SyntaxError)throw Error(`Failed to parse async result file '${$}': ${_z(Z)}`,{cause:Z});throw Z}}function wZ($,J){if($===void 0)return;if($.trim()==="")throw Error(`${J} must not be empty.`);if(n$.isAbsolute($)||/[\\/]/.test($)||$.includes(".."))throw Error(`${J} must be an async run id or prefix, not a path.`);return $}function p6($,J,Z){let Q=n$.resolve($),X=n$.resolve(J),Y=n$.relative(Q,X);if(Y===""||!Y.startsWith("..")&&!n$.isAbsolute(Y))return;throw Error(`${Z} must be inside ${Q}.`)}function qz($,J,Z=""){if(!V1.existsSync($))return[];return V1.readdirSync($).filter((Q)=>Q.startsWith(J)&&(!Z||Q.endsWith(Z))).map((Q)=>Z?Q.slice(0,-Z.length):Q).sort()}function kZ($,J){let Z=n$.join($,`${J}.json`);return p6($,Z,"Async result file"),V1.existsSync(Z)?Z:null}function IZ($,J,Z){let Q=wZ($,"id");if(!Q)return[];let X=n$.resolve(J),Y=n$.resolve(Z);return[...new Set([...qz(X,Q),...qz(Y,Q,".json")])].sort().map((H)=>{let V=n$.join(X,H);return p6(X,V,"Async run directory"),{id:H,location:{asyncDir:V1.existsSync(V)?V:null,resultPath:kZ(Y,H),resolvedId:H}}})}function i2($,J,Z){let Q=n$.resolve(J),X=n$.resolve(Z),Y=wZ($.id,"id")??wZ($.runId,"runId");if($.dir){let U=n$.resolve($.dir);p6(Q,U,"Async run directory");let G=Y??n$.basename(U);if(Y&&Y!==n$.basename(U))throw Error(`Async run id '${Y}' does not match directory '${n$.basename(U)}'.`);return{asyncDir:U,resultPath:kZ(X,G),resolvedId:G}}if(!Y)return{asyncDir:null,resultPath:null};let z=n$.join(Q,Y);p6(Q,z,"Async run directory");let H=kZ(X,Y);if(V1.existsSync(z)||H)return{asyncDir:V1.existsSync(z)?z:null,resultPath:H,resolvedId:Y};let V=IZ(Y,Q,X);if(V.length===0)return{asyncDir:null,resultPath:null,resolvedId:Y};if(V.length>1)throw Error(`Ambiguous async run id prefix '${Y}' matched: ${V.map((U)=>U.id).join(", ")}. Provide a longer id.`);return V[0].location}function KO($){if($.state==="complete"||$.state==="failed"||$.state==="paused"||$.state==="running"||$.state==="queued")return $.state;return $.success?"complete":"failed"}function UO($,J){if(!$)return;if(typeof $.runId!=="string")throw Error(`Invalid async status '${J}': runId must be a string.`);if($.sessionId!==void 0&&typeof $.sessionId!=="string")throw Error(`Invalid async status '${J}': sessionId must be a string.`);if($.cwd!==void 0&&typeof $.cwd!=="string")throw Error(`Invalid async status '${J}': cwd must be a string.`);if($.sessionFile!==void 0&&typeof $.sessionFile!=="string")throw Error(`Invalid async status '${J}': sessionFile must be a string.`);if($.steps!==void 0){if(!Array.isArray($.steps))throw Error(`Invalid async status '${J}': steps must be an array.`);$.steps.forEach((Z,Q)=>{if(!Z||typeof Z!=="object"||Array.isArray(Z))throw Error(`Invalid async status '${J}': steps[${Q}] must be an object.`);if(typeof Z.agent!=="string")throw Error(`Invalid async status '${J}': steps[${Q}].agent must be a string.`);if(Z.sessionFile!==void 0&&typeof Z.sessionFile!=="string")throw Error(`Invalid async status '${J}': steps[${Q}].sessionFile must be a string.`)})}}function BO($,J){if(n$.extname(J)!==".jsonl")throw Error(`Async run '${$}' session file must be a .jsonl file: ${J}`);let Z=n$.resolve(J);if(!V1.existsSync(Z))throw Error(`Async run '${$}' session file does not exist: ${J}`);return Z}function Nz($,J={},Z={}){let Q=J.asyncDirRoot??d$,X=J.resultsDir??w$,Y=Z.requireSessionFile??!0,z=i2($,Q,X);if(!z.asyncDir&&!z.resultPath)throw Error("Async run not found. Provide id or dir.");let V=(z.asyncDir?E0(z.asyncDir,{resultsDir:X,kill:J.kill,now:J.now}):void 0)?.status??null;UO(V,z.asyncDir?n$.join(z.asyncDir,"status.json"):"status.json");let U=z.resultPath?GO(z.resultPath):void 0,G=V?.runId??U?.runId??U?.id??z.resolvedId??(z.asyncDir?n$.basename(z.asyncDir):"unknown"),K=V?.state??(U?KO(U):void 0);if(!K)throw Error(`Status file not found for async run '${G}'.`);let B=V?.steps??[],W=U?.results??[],O=B.length||W.length||(U?.agent?1:0),A=$.index;if(A!==void 0&&!Number.isInteger(A))throw Error(`Async run '${G}' index must be an integer.`);let L=new Set(["complete","completed","failed","paused"]);if(K==="running")if(A!==void 0){if(A<0||A>=O)throw Error(`Async run '${G}' has ${O} children. Index ${A} is out of range.`);let C=B[A];if(C?.status==="running")return{kind:"live",runId:G,asyncDir:z.asyncDir??void 0,state:K,agent:C.agent,index:A,intercomTarget:$0(G,C.agent,A),cwd:V?.cwd??U?.cwd,sessionFile:C.sessionFile??V?.sessionFile??U?.sessionFile};if(C?.status==="pending")throw Error(`Async run '${G}' child ${A} is pending and has not started yet. Wait for it to run or complete before resuming.`);if(C&&!L.has(C.status))throw Error(`Async run '${G}' child ${A} is ${C.status} and cannot be revived yet.`)}else{let C=B.map((I,S)=>({step:I,index:S})).filter(({step:I})=>I.status==="running"),T=C.length===1?C[0]:void 0;if(!T)throw Error(`Async run '${G}' has ${C.length} running children. Provide index to choose one.`);return{kind:"live",runId:G,asyncDir:z.asyncDir??void 0,state:K,agent:T.step.agent,index:T.index,intercomTarget:$0(G,T.step.agent,T.index),cwd:V?.cwd??U?.cwd,sessionFile:T.step.sessionFile??V?.sessionFile??U?.sessionFile}}if(O>1&&A===void 0)throw Error(`Async run '${G}' has ${O} children. Provide index to choose one.`);let _=A??0;if(!Number.isInteger(_))throw Error(`Async run '${G}' index must be an integer.`);if(_<0||_>=O)throw Error(`Async run '${G}' has ${O} children. Index ${_} is out of range.`);let M=B[_]?.agent??W[_]?.agent??U?.agent;if(!M)throw Error(`Could not determine child agent for async run '${G}'.`);let F=B[_]?.sessionFile??W[_]?.sessionFile??(O===1?V?.sessionFile??U?.sessionFile:void 0);if(!F&&Y)throw Error(`Async run '${G}' child ${_} does not have a persisted session file to resume from.`);let R=F?BO(G,F):void 0;return{kind:"revive",runId:G,asyncDir:z.asyncDir??void 0,state:K,agent:M,index:_,intercomTarget:$0(G,M,_),cwd:V?.cwd??U?.cwd,...R?{sessionFile:R}:{}}}function Ez($,J){return["You are reviving a previous subagent conversation.","",`Original run: ${$.runId}`,`Original agent: ${$.agent}`,$.sessionFile?`Original session file: ${$.sessionFile}`:void 0,"","Use the stored session context as background. Answer the orchestrator's follow-up below. Do not assume the original child process is still alive.","","Follow-up:",J].filter((Z)=>Z!==void 0).join(`
|
|
202
|
-
`)}import*as Cz from"node:path";function Tz($,J){return Cz.join($,`${J}.json`)}import*as z4 from"node:fs";import*as PZ from"node:path";function WO($,J,Z){let Q=PZ.join(J,$),X=PZ.join(Z,`${$}.json`);if(!z4.existsSync(Q)&&!z4.existsSync(X))return;return{asyncDir:z4.existsSync(Q)?Q:null,resultPath:z4.existsSync(X)?X:null,resolvedId:$}}function FO($){if(!$)return[];return[...new Set([...$.foregroundControls.keys(),...$.foregroundRuns?.keys()??[]])]}function OO($){if(!$)return;let J=[],Z=new Set,Q=(X)=>{if(!X)return;let Y=`${X.rootRunId}:${X.eventSink}:${X.controlInbox}`;if(Z.has(Y))return;Z.add(Y),J.push(X)};for(let X of $.foregroundControls.values())Q(X.nestedRoute);for(let X of $.asyncJobs.values())Q(X.nestedRoute);return{routes:J}}function AO($,J,Z){return IZ($,J,Z)}function l1($,J={}){KZ("id",$);let Z=J.asyncDirRoot??d$,Q=J.resultsDir??w$,X=J.nested??OO(J.state);if(J.state?.foregroundControls.has($)||J.state?.foregroundRuns?.has($))return{kind:"foreground",id:$};let Y=WO($,Z,Q);if(Y)return{kind:"async",id:$,location:Y};let z=WZ($,X?{scope:X}:{});if(z.length>1)throw Error(`Nested run id '${$}' is ambiguous across authorized registries. Provide the full id after stale registries are cleaned up.`);if(z[0])return{kind:"nested",id:$,match:z[0]};let H=[];for(let G of FO(J.state).filter((K)=>K.startsWith($)))H.push({kind:"foreground",id:G});for(let G of AO($,Z,Q))H.push({kind:"async",id:G.id,location:G.location});for(let G of WZ($,X?{prefix:!0,scope:X}:{prefix:!0}))H.push({kind:"nested",id:G.run.id,match:G});let U=[...new Map(H.map((G)=>[`${G.kind}:${G.id}`,G])).values()];if(U.length>1)throw Error(`Ambiguous subagent run id prefix '${$}' matched: ${U.map((G)=>`${G.kind}:${G.id}`).join(", ")}. Provide a longer id.`);return U[0]}import*as E1 from"node:fs";import*as a6 from"node:path";import*as V4 from"node:fs";import*as l0 from"node:path";function H4($){return $ instanceof Error?$.message:String($)}function bZ($){return typeof $==="object"&&$!==null&&"code"in $&&$.code==="ENOENT"}function _O($,J){let Z=l0.join($,J);try{return V4.statSync(Z).isDirectory()}catch(Q){if(bZ(Q))return!1;throw Error(`Failed to inspect async run path '${Z}': ${H4(Q)}`,{cause:Q instanceof Error?Q:void 0})}}function MO($){if(!$)return;try{return V4.statSync($).mtimeMs}catch(J){if(bZ(J))return;throw Error(`Failed to inspect async output file '${$}': ${H4(J)}`,{cause:J instanceof Error?J:void 0})}}function qO($,J){if(J.state!=="running")return{activityState:J.activityState,lastActivityAt:J.lastActivityAt};let Z=J.outputFile?l0.isAbsolute(J.outputFile)?J.outputFile:l0.join($,J.outputFile):void 0,Q=typeof J.currentStep==="number"?J.steps?.[J.currentStep]:void 0;return{activityState:J.activityState,lastActivityAt:J.lastActivityAt??MO(Z)??Q?.lastActivityAt??Q?.startedAt??J.startedAt}}function LO($,J,Z=[],Q){if(J.sessionId!==void 0&&typeof J.sessionId!=="string")throw Error(`Invalid async status '${l0.join($,"status.json")}': sessionId must be a string.`);let{activityState:X,lastActivityAt:Y}=qO($,J),z=J.steps??[],H=J.chainStepCount??z.length,V=X1(J.parallelGroups,z.length,H),U=[];if(Z.length===0&&Q)try{U=O2(Q)?.children??[]}catch(K){Z.push(`Nested status unavailable: ${H4(K)}`)}let G=z.map((K,B)=>{let{activityState:W,lastActivityAt:O}=K;return{index:B,agent:K.agent,...K.label?{label:K.label}:{},...K.phase?{phase:K.phase}:{},...K.outputName?{outputName:K.outputName}:{},...K.structured?{structured:K.structured}:{},status:K.status,...W?{activityState:W}:{},...O?{lastActivityAt:O}:{},...K.currentTool?{currentTool:K.currentTool}:{},...K.currentToolArgs?{currentToolArgs:K.currentToolArgs}:{},...K.currentToolStartedAt?{currentToolStartedAt:K.currentToolStartedAt}:{},...K.currentPath?{currentPath:K.currentPath}:{},...K.recentTools?{recentTools:K.recentTools.map((A)=>({...A}))}:{},...K.recentOutput?{recentOutput:[...K.recentOutput]}:{},...K.turnCount!==void 0?{turnCount:K.turnCount}:{},...K.toolCount!==void 0?{toolCount:K.toolCount}:{},...K.steerCount!==void 0?{steerCount:K.steerCount}:{},...K.lastSteerAt!==void 0?{lastSteerAt:K.lastSteerAt}:{},...K.durationMs!==void 0?{durationMs:K.durationMs}:{},...K.tokens?{tokens:K.tokens}:{},...K.totalCost?{totalCost:K.totalCost}:{},...K.skills?{skills:K.skills}:{},...K.model?{model:K.model}:{},...K.thinking?{thinking:K.thinking}:{},...K.attemptedModels?{attemptedModels:K.attemptedModels}:{},...K.error?{error:K.error}:{},...K.timedOut!==void 0?{timedOut:K.timedOut}:{},...K.turnBudget?{turnBudget:K.turnBudget}:{},...K.turnBudgetExceeded!==void 0?{turnBudgetExceeded:K.turnBudgetExceeded}:{},...K.wrapUpRequested!==void 0?{wrapUpRequested:K.wrapUpRequested}:{},...K.children?.length?{children:K.children}:{}}});return d1(J.runId||l0.basename($),G,U),{id:J.runId||l0.basename($),asyncDir:$,...J.sessionId?{sessionId:J.sessionId}:{},state:J.state,...J.error?{error:J.error}:{},activityState:X,lastActivityAt:Y,currentTool:J.currentTool,currentToolStartedAt:J.currentToolStartedAt,currentPath:J.currentPath,turnCount:J.turnCount,toolCount:J.toolCount,steerCount:J.steerCount,lastSteerAt:J.lastSteerAt,mode:J.mode,cwd:J.cwd,startedAt:J.startedAt,lastUpdate:J.lastUpdate,endedAt:J.endedAt,...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{},...J.deadlineAt!==void 0?{deadlineAt:J.deadlineAt}:{},...J.timedOut!==void 0?{timedOut:J.timedOut}:{},...J.turnBudget?{turnBudget:J.turnBudget}:{},...J.turnBudgetExceeded!==void 0?{turnBudgetExceeded:J.turnBudgetExceeded}:{},...J.wrapUpRequested!==void 0?{wrapUpRequested:J.wrapUpRequested}:{},currentStep:J.currentStep,...J.chainStepCount!==void 0?{chainStepCount:J.chainStepCount}:{},...J.pendingAppends!==void 0?{pendingAppends:J.pendingAppends}:{},...V.length?{parallelGroups:V}:{},steps:G,...U.length?{nestedChildren:U}:{},...Z.length?{nestedWarnings:Z}:{},...J.sessionDir?{sessionDir:J.sessionDir}:{},...J.outputFile?{outputFile:J.outputFile}:{},...J.totalTokens?{totalTokens:J.totalTokens}:{},...J.totalCost?{totalCost:J.totalCost}:{},...J.sessionFile?{sessionFile:J.sessionFile}:{}}}function NO($){let J=(Z)=>{switch(Z){case"running":return 0;case"queued":return 1;case"failed":return 2;case"paused":return 2;case"complete":return 3}};return[...$].sort((Z,Q)=>{let X=J(Z.state)-J(Q.state);if(X!==0)return X;let Y=Z.lastUpdate??Z.endedAt??Z.startedAt;return(Q.lastUpdate??Q.endedAt??Q.startedAt)-Y})}function p1($,J={}){let Z;try{Z=V4.readdirSync($).filter((V)=>_O($,V))}catch(V){if(bZ(V))return[];throw Error(`Failed to list async runs in '${$}': ${H4(V)}`,{cause:V instanceof Error?V:void 0})}let Q=J.states?new Set(J.states):void 0,X=[],Y,z=(V)=>{if(!Y)Y=dY();return Y.get(V)};for(let V of Z){let U=l0.join($,V),K=(J.reconcile===!1?void 0:E0(U,{resultsDir:J.resultsDir,kill:J.kill,now:J.now}))?.status??c0(U);if(!K)continue;if(Q&&!Q.has(K.state))continue;if(J.sessionId&&K.sessionId!==J.sessionId)continue;let B=[],W;try{if(W=z(K.runId||l0.basename(U)),W)p2(W,{resultsDir:J.resultsDir,kill:J.kill,now:J.now})}catch(A){B.push(`Nested status unavailable: ${H4(A)}`)}let O=LO(U,K,B,W);X.push(O)}let H=NO(X);return J.limit!==void 0?H.slice(0,J.limit):H}function jz($){let J=[];if($.currentTool&&$.currentToolStartedAt!==void 0)J.push(`tool ${$.currentTool} ${x$(Math.max(0,Date.now()-$.currentToolStartedAt))}`);else if($.currentTool)J.push(`tool ${$.currentTool}`);if($.currentPath)J.push(j$($.currentPath));if($.turnCount!==void 0)J.push(`${$.turnCount} turns`);if($.turnBudgetExceeded&&$.turnBudget)J.push(`turn budget exceeded ${$.turnBudget.turnCount}/${$.turnBudget.maxTurns}+${$.turnBudget.graceTurns}`);else if($.wrapUpRequested&&$.turnBudget)J.push(`wrap-up requested ${$.turnBudget.turnCount}/${$.turnBudget.maxTurns}`);else if($.turnBudget)J.push(`turn budget ${$.turnBudget.turnCount}/${$.turnBudget.maxTurns}+${$.turnBudget.graceTurns}`);if($.toolCount!==void 0)J.push(`${$.toolCount} tools`);if($.steerCount!==void 0)J.push(`${$.steerCount} steers`);if(typeof $.lastSteerAt==="number"&&Number.isFinite($.lastSteerAt))J.push(`last steer ${new Date($.lastSteerAt).toISOString()}`);let Z=n0($.lastActivityAt,$.activityState);return Z||J.length?[Z,...J].filter(Boolean).join(" | "):void 0}function EO($){let J=$.label?`${$.label} (${$.agent})`:$.agent,Z=$.phase?`[${$.phase}] `:"",Q=[`${$.index+1}. ${Z}${J}`,$.status],X=jz($);if(X)Q.push(X);let Y=w1($.model,$.thinking);if(Y)Q.push(Y);if($.durationMs!==void 0)Q.push(x$($.durationMs));if($.tokens)Q.push(`${t$($.tokens.total)} tok`);return Q.join(" | ")}function G4($){if(!$.outputFile)return;return l0.isAbsolute($.outputFile)?$.outputFile:l0.join($.asyncDir,$.outputFile)}function K4($){let J=$.steps.length||1,Z=$.chainStepCount??J,Q=X1($.parallelGroups,$.steps.length,Z),X=$.currentStep!==void 0?Q.find((Y)=>$.currentStep>=Y.start&&$.currentStep<Y.start+Y.count):void 0;if(X){let Y=$.steps.slice(X.start,X.start+X.count),z=CJ(Y,X.count,{showRunning:$.state==="running"});if($.mode==="parallel")return z;return`step ${X.stepIndex+1}/${Z} · parallel group: ${z}`}if($.mode==="parallel")return CJ($.steps,J,{showRunning:$.state==="running"});if($.mode==="chain"&&$.currentStep!==void 0&&Q.length>0)return`step ${F8($.currentStep,Z,Q)+1}/${Z}`;return $.currentStep!==void 0?`step ${$.currentStep+1}/${J}`:`steps ${J}`}function CO($){let J=K4($),Z=$.cwd?j$($.cwd):j$($.asyncDir),Q=jz($),X=$.pendingAppends?` | ${$.pendingAppends} pending append${$.pendingAppends===1?"":"s"}`:"";return`${$.id} | ${$.state}${Q?` | ${Q}`:""} | ${$.mode} | ${J}${X} | ${Z}`}function fz($,J="Active async runs"){if($.length===0)return`No ${J.toLowerCase()}.`;let Z=[`${J}: ${$.length}`,""];for(let Q of $){Z.push(`- ${CO(Q)}`);for(let H of Q.steps)Z.push(` ${EO(H)}`),Z.push(...b0(H.children,{indent:" ",maxLines:12}));let X=new Set(Q.steps.flatMap((H)=>H.children?.map((V)=>V.id)??[])),Y=Q.nestedChildren?.filter((H)=>!X.has(H.id))??[];if(Z.push(...b0(Y,{indent:" ",maxLines:12})),Q.error)Z.push(` Error: ${Q.error}`);for(let H of Q.nestedWarnings??[])Z.push(` Warning: ${H}`);let z=G4(Q);if(z)Z.push(` output: ${j$(z)}`);if(Q.sessionFile)Z.push(` session: ${j$(Q.sessionFile)}`);Z.push("")}return Z.join(`
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
`)}],details:{mode:"management",results:[]}}}function dz($){if(!$.foregroundRuns)return;while($.foregroundRuns.size>50){let J=[...$.foregroundRuns.values()].sort((Z,Q)=>Z.updatedAt-Q.updatedAt)[0];if(!J)break;$.foregroundRuns.delete(J.runId)}}function nZ($,J){$.foregroundRuns??=new Map;let Z=$.foregroundRuns.get(J.runId),Q=Date.now();$.foregroundRuns.set(J.runId,{runId:J.runId,mode:J.mode,cwd:J.cwd,updatedAt:Q,children:J.results.map((X,Y)=>{let z={agent:X.agent,index:Y,status:x8({exitCode:X.exitCode,interrupted:X.interrupted,detached:X.detached}),updatedAt:Q,...X.exitCode!==void 0?{exitCode:X.exitCode}:{},...X.finalOutput?{finalOutput:X.finalOutput}:{},...X.sessionFile?{sessionFile:X.sessionFile}:{},...X.artifactPaths?{artifactPaths:X.artifactPaths}:{},...X.transcriptPath?{transcriptPath:X.transcriptPath}:{},...X.transcriptError?{transcriptError:X.transcriptError}:{},...X.detachedReason?{detachedReason:X.detachedReason}:{}},H=Z?.children[Y];return z.status==="detached"&&H&&H.status!=="detached"?H:z})}),dz($)}function dZ($,J){$.foregroundRuns??=new Map;let Z=Date.now(),Q=$.foregroundRuns.get(J.runId);if(!Q)Q={runId:J.runId,mode:J.mode,cwd:J.cwd,updatedAt:Z,children:[]},$.foregroundRuns.set(J.runId,Q);Q.updatedAt=Z;let X=Q.children[J.index]??{agent:J.result.agent,index:J.index,status:"detached"};Q.children[J.index]={...X,agent:J.result.agent,index:J.index,status:x8({exitCode:J.result.exitCode,interrupted:J.result.interrupted,detached:!1}),updatedAt:Z,...J.result.exitCode!==void 0?{exitCode:J.result.exitCode}:{},...J.result.finalOutput?{finalOutput:J.result.finalOutput}:{},...J.result.sessionFile?{sessionFile:J.result.sessionFile}:{},...J.result.artifactPaths?{artifactPaths:J.result.artifactPaths}:{},...J.result.transcriptPath?{transcriptPath:J.result.transcriptPath}:{},...J.result.transcriptError?{transcriptError:J.result.transcriptError}:{},...J.result.detachedReason?{detachedReason:J.result.detachedReason}:{}},dz($)}function pO($,J){let Z=($.id??$.runId)?.trim();if(!Z||!J.foregroundRuns?.size)return;let Q=J.foregroundRuns.get(Z),X=Q?[Q]:[...J.foregroundRuns.values()].filter((U)=>U.runId.startsWith(Z));if(X.length===0)return;if(X.length>1)throw Error(`Ambiguous foreground run id prefix '${Z}' matched: ${X.map((U)=>U.runId).join(", ")}. Provide a longer id.`);let Y=X[0];if(Y.children.length>1&&$.index===void 0)throw Error(`Foreground run '${Y.runId}' has ${Y.children.length} children. Provide index to choose one.`);let z=$.index??0;if(!Number.isInteger(z))throw Error(`Foreground run '${Y.runId}' index must be an integer.`);if(z<0||z>=Y.children.length)throw Error(`Foreground run '${Y.runId}' has ${Y.children.length} children. Index ${z} is out of range.`);let H=Y.children[z];if(H.status==="detached")throw Error(`Foreground run '${Y.runId}' child ${z} is detached for intercom coordination and cannot be revived safely from the remembered foreground state. Reply to the supervisor request first; after the child exits, start a fresh follow-up if needed.`);if(!H.sessionFile)throw Error(`Foreground run '${Y.runId}' child ${z} does not have a persisted session file to resume from.`);if(y$.extname(H.sessionFile)!==".jsonl")throw Error(`Foreground run '${Y.runId}' child ${z} session file must be a .jsonl file: ${H.sessionFile}`);let V=y$.resolve(H.sessionFile);if(!G1.existsSync(V))throw Error(`Foreground run '${Y.runId}' child ${z} session file does not exist: ${H.sessionFile}`);return{runId:Y.runId,mode:Y.mode,state:"complete",agent:H.agent,index:z,intercomTarget:$0(Y.runId,H.agent,z),cwd:Y.cwd,sessionFile:V}}function iO($){return $ instanceof Error&&$.message.startsWith("Async run not found.")}function uZ($){return $ instanceof Error&&/Ambiguous .*run id prefix/.test($.message)}function e6($,J){return $?.runId===J}function rO($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cz($,J,Z){if(!($ instanceof Error)||!Z)return!1;return new RegExp(`\\b${J} run '${rO(Z)}'`,"i").test($.message)}function sO($,J,Z={}){let Q=($.id??$.runId)?.trim()??"",X,Y,z,H;try{let V=pO($,J);if(V)X={kind:"revive",source:"foreground",...V}}catch(V){Y=V}try{z={source:"async",...Nz($,{},{requireSessionFile:Z.asyncRequireSessionFile})}}catch(V){H=V}if(X&&z){let V=e6(X,Q),U=e6(z,Q);if(V&&!U)return X;if(U&&!V)return z;throw Error(`Resume id '${Q}' is ambiguous between foreground run '${X.runId}' and async run '${z.runId}'. Provide a full run id.`)}if(X){if(cz(H,"async",Q))throw H;if(uZ(H)&&!e6(X,Q))throw H;return X}if(z){if(cz(Y,"foreground",Q))throw Y;if(uZ(Y)&&!e6(z,Q))throw Y;return z}if(Y&&!iO(H))throw Y;if(Y)throw Y;if(H)throw H;throw Error("Run not found. Provide id or runId.")}function aO($,J,Z){if(Z?.asyncDir)return{asyncId:Z.resolvedId??J??y$.basename(Z.asyncDir),asyncDir:Z.asyncDir};if(J){let X=$.asyncJobs.get(J);if(X)return{asyncId:X.asyncId,asyncDir:X.asyncDir}}let Q;for(let X of $.asyncJobs.values()){if(X.status!=="running")continue;if(!Q||(X.updatedAt??0)>Q.updatedAt)Q={asyncId:X.asyncId,asyncDir:X.asyncDir,updatedAt:X.updatedAt??0}}return Q?{asyncId:Q.asyncId,asyncDir:Q.asyncDir}:void 0}function tO($){if(!vJ($.controlConfig,$.event))return;let J=$.intercomBridge.active?$0($.event.runId,$.event.agent,$.event.index):void 0,Z={event:$.event,source:"foreground",childIntercomTarget:J,noticeText:K2($.event,J)};if($.controlConfig.notifyChannels.includes("event"))$.pi.events.emit($2,Z);if($.event.type!=="active_long_running"&&$.controlConfig.notifyChannels.includes("intercom")&&$.intercomBridge.active&&$.intercomBridge.orchestratorTarget)$.pi.events.emit(Q8,{...Z,to:$.intercomBridge.orchestratorTarget,message:AX($.event,J)})}function eO($,J,Z,Q){let X=aO($,J,Q);if(!X)return null;let Y=E0(X.asyncDir,{kill:Z}).status;if(!Y||Y.state!=="running"||typeof Y.pid!=="number")return{content:[{type:"text",text:`No running async run with an interrupt-capable pid was found for '${J??"current"}'.`}],isError:!0,details:{mode:"management",results:[]}};try{Y4({asyncDir:X.asyncDir,pid:Y.pid,kill:Z,source:"interrupt-action"});let z=$.asyncJobs.get(X.asyncId);if(z)z.activityState=void 0,z.updatedAt=Date.now();return{content:[{type:"text",text:`Interrupt requested for async run ${X.asyncId}.`}],details:{mode:"management",results:[]}}}catch(z){let H=z instanceof Error?z.message:String(z);return{content:[{type:"text",text:`Failed to interrupt async run ${X.asyncId}: ${H}`}],isError:!0,details:{mode:"management",results:[]}}}}function uz($){if(!$.location.asyncDir)return{content:[{type:"text",text:`Async run '${$.runId}' has no live run directory to steer.`}],isError:!0,details:{mode:"management",results:[]}};let J=E0($.location.asyncDir,{kill:$.kill}).status;if(!J||J.state!=="running"&&J.state!=="queued")return{content:[{type:"text",text:`Async run '${$.runId}' is not running or queued and cannot be steered.`}],isError:!0,details:{mode:"management",results:[]}};let Z=J.steps??[];if($.index!==void 0){if($.index<0||$.index>=Z.length)return{content:[{type:"text",text:`Async run '${J.runId}' has ${Z.length} children. Index ${$.index} is out of range.`}],isError:!0,details:{mode:"management",results:[]}};let Y=Z[$.index];if(Y&&Y.status!=="running"&&Y.status!=="pending")return{content:[{type:"text",text:`Async run '${J.runId}' child ${$.index} is ${Y.status} and cannot be steered.`}],isError:!0,details:{mode:"management",results:[]}}}else if(Z.filter((z)=>z.status==="running").length===0&&Z.length>1)return{content:[{type:"text",text:`Async run '${J.runId}' has no running child yet. Provide index to steer a queued child.`}],isError:!0,details:{mode:"management",results:[]}};yZ($.location.asyncDir,{message:$.message,targetIndex:$.index,source:"steer-action"});let Q=$.state.asyncJobs.get(J.runId);if(Q)Q.updatedAt=Date.now();let X=$.index!==void 0?` child ${$.index}`:" running child";return{content:[{type:"text",text:`Steering queued for async run ${J.runId}${X}. Delivery requires a live DM child session that supports mid-run steering.`}],details:{mode:"management",results:[]}}}function $A($){let J=new Set,Z=new Set;for(let Q of $)if(J.has(Q))Z.add(Q);else J.add(Q);return[...Z]}function JA($){let J=$.params.id??$.params.runId;if(!J)return{content:[{type:"text",text:"action='append-step' requires id."}],isError:!0,details:{mode:"management",results:[]}};if(!$.params.chain||$.params.chain.length!==1)return{content:[{type:"text",text:"action='append-step' requires chain with exactly one step."}],isError:!0,details:{mode:"management",results:[]}};let Z=lz($.params);if(Z.length>0)return{content:[{type:"text",text:`Cannot append step: ${Z.join(" ")}`}],isError:!0,details:{mode:"management",results:[]}};let Q;try{Q=l1(J,{state:$.deps.state,nested:B4($.deps)})}catch(R){return{content:[{type:"text",text:R instanceof Error?R.message:String(R)}],isError:!0,details:{mode:"management",results:[]}}}if(!Q)return{content:[{type:"text",text:`No async chain run found for '${J}'.`}],isError:!0,details:{mode:"management",results:[]}};if(Q.kind!=="async"||!Q.location.asyncDir)return{content:[{type:"text",text:`Run '${Q.id}' is not an append-capable async chain run.`}],isError:!0,details:{mode:"management",results:[]}};let X=c0(Q.location.asyncDir);if(!X)return{content:[{type:"text",text:`No async run status found for '${Q.id}'.`}],isError:!0,details:{mode:"management",results:[]}};if(X.mode!=="chain")return{content:[{type:"text",text:`Run '${Q.id}' is ${X.mode}; only active chain runs accept appended steps.`}],isError:!0,details:{mode:"management",results:[]}};if(X.state!=="running")return{content:[{type:"text",text:`Run '${Q.id}' is ${X.state}; only running chain runs accept appended steps.`}],isError:!0,details:{mode:"management",results:[]}};if(!((X.steps??[]).some((R)=>R.status==="running"||R.status==="pending")||(X.pendingAppends??0)>0))return{content:[{type:"text",text:`Run '${Q.id}' has no running or pending chain steps left; append-step must target an in-progress chain.`}],isError:!0,details:{mode:"management",results:[]}};let z=Xz(Q.location.asyncDir),H=new Set([...Object.keys(X.outputs??{}),...(X.steps??[]).map((R)=>R.outputName).filter((R)=>Boolean(R)),...z.flatMap((R)=>u6(R.steps))]);try{P4($.params.chain,{maxItems:$.deps.config.chain?.dynamicFanout?.maxItems},{priorOutputNames:H,startStepIndex:X.chainStepCount??X.steps?.length??0})}catch(R){if(!(R instanceof K0))throw R;return{content:[{type:"text",text:`Cannot append step to run '${Q.id}': ${R.message}`}],isError:!0,details:{mode:"management",results:[]}}}let V=D6($.params.agentScope),U=$.deps.discoverAgents($.requestCwd,V),G=U.agents,K=iZ($.params),B=O0($.params.skill),W=B===!1?[]:B??[],O={pi:$.deps.pi,cwd:$.ctx.cwd,currentSessionId:I1($.ctx.sessionManager),parentSessionId:$.ctx.sessionManager.getSessionId()??void 0,currentModelProvider:$.ctx.model?.provider,currentModel:$.ctx.model,modelScope:U.modelScope},A=qZ(Q.id,{chain:F4($.params.chain,K),task:$.params.task,resultMode:"chain",agents:G,ctx:O,availableModels:$.ctx.modelRegistry.getAvailable().map(A0),cwd:X.cwd??$.requestCwd,chainSkills:W,dynamicFanoutMaxItems:$.deps.config.chain?.dynamicFanout?.maxItems,maxSubagentDepth:B1($.deps.config.maxSubagentDepth),asyncDir:Q.location.asyncDir,validateOutputBindings:!1});if("error"in A)return{content:[{type:"text",text:A.error}],isError:!0,details:{mode:"management",results:[]}};let L=u6(A.steps),_=$A(L);if(_.length>0)return{content:[{type:"text",text:`Cannot append step to run '${Q.id}': duplicate output name in appended step: ${_.join(", ")}.`}],isError:!0,details:{mode:"management",results:[]}};let M=new Set(z.flatMap((R)=>u6(R.steps))),F=L.filter((R)=>M.has(R));if(F.length>0)return{content:[{type:"text",text:`Cannot append step to run '${Q.id}': output name already belongs to a pending append: ${F.join(", ")}.`}],isError:!0,details:{mode:"management",results:[]}};try{let R=Qz({asyncDir:Q.location.asyncDir,runId:Q.id,steps:A.steps}),C=A.steps.length===1?"step":"steps";return{content:[{type:"text",text:`Append queued for chain run ${Q.id}: ${A.steps.length} ${C}. It becomes eligible after the chain's already-queued steps finish. Pending appends: ${R.pendingCount}.`}],details:{mode:"management",results:[],asyncId:Q.id,asyncDir:Q.location.asyncDir}}}catch(R){let C=R instanceof Error?R.message:String(R);return{content:[{type:"text",text:`Failed to append step to chain run ${Q.id}: ${C}`}],isError:!0,details:{mode:"management",results:[]}}}}function ZA($){return $.sessionFile??($.steps?.length===1?$.steps[0]?.sessionFile:void 0)}function QA($){return $.agent??$.agents?.[0]??($.steps?.length===1?$.steps[0]?.agent:void 0)}function XA($,J){let Z=y$.resolve($),Q=y$.resolve(J);return Q===Z||Q.startsWith(`${Z}${y$.sep}`)}function YA($,J){let Z=ZA($);if(!Z)throw Error(`Nested run '${$.id}' does not have a persisted session file to resume from.`);if(y$.extname(Z)!==".jsonl")throw Error(`Nested run '${$.id}' session file must be a .jsonl file: ${Z}`);let Q=y$.resolve(Z);if(!y$.isAbsolute(Z))throw Error(`Nested run '${$.id}' session file must be absolute: ${Z}`);if(!G1.existsSync(Q))throw Error(`Nested run '${$.id}' session file does not exist: ${Z}`);let X=G1.lstatSync(Q);if(!X.isFile()||X.isSymbolicLink())throw Error(`Nested run '${$.id}' session file is not a regular file: ${Z}`);let Y=G1.realpathSync(Q);if(!J.filter((H)=>G1.existsSync(H)).map((H)=>G1.realpathSync(H)).some((H)=>XA(H,Y)))throw Error(`Nested run '${$.id}' session file is outside trusted nested session roots: ${Z}`);if(!Y.split(y$.sep).includes($.id))throw Error(`Nested run '${$.id}' session file is not under that nested run's session directory: ${Z}`);return Y}function zA($,J){let Z=$.match.run;if(Z.state==="running"||Z.state==="queued")throw Error(`Nested run '${Z.id}' is live; route the follow-up to the owner process instead.`);let Q=QA(Z);if(!Q)throw Error(`Could not determine child agent for nested run '${Z.id}'.`);let X=Z.state==="complete"||Z.state==="failed"||Z.state==="paused"?Z.state:"failed",Y=w8($.match.rootRunId,Z);return{kind:"revive",source:"nested",runId:Z.id,state:X,agent:Q,index:0,intercomTarget:$0(Z.id,Q,0),cwd:Y?y$.dirname(Y):void 0,sessionFile:YA(Z,J)}}async function HA($,J,Z=1000){let Q=Date.now()+Z;while(Date.now()<Q){let X=pY($.match.route).find((Y)=>Y.requestId===J&&Y.targetRunId===$.match.run.id);if(X)return X;await new Promise((Y)=>setTimeout(Y,50))}return}async function oz($,J,Z){let Q=L2();return lY($.match.route,{ts:Date.now(),requestId:Q,targetRunId:$.match.run.id,action:J,...Z?{message:Z}:{}}),HA($,Q)}function VA($){let J=$.match.run,Z=w8($.match.rootRunId,J);if(!Z)return;let Q=E0(Z,{resultsDir:y$.join(w$,"nested",$.match.rootRunId)}).status,X=typeof Q?.pid==="number"&&Q.pid>0?Q.pid:J.pid;if(!Q||Q.state!=="running"||typeof X!=="number"||X<=0)return;try{return Y4({asyncDir:Z,pid:X,source:"nested-interrupt"}),{content:[{type:"text",text:`Interrupt requested for nested async run ${J.id}.`}],details:{mode:"management",results:[]}}}catch(Y){let z=Y instanceof Error?Y.message:String(Y);return{content:[{type:"text",text:`Failed to interrupt nested async run ${J.id}: ${z}`}],isError:!0,details:{mode:"management",results:[]}}}}function GA($){let J=$.target.match.run,Z=w8($.target.match.rootRunId,J);if(!Z)return;let Q=E0(Z,{resultsDir:y$.join(w$,"nested",$.target.match.rootRunId)}).status;if(!Q||Q.state!=="running"&&Q.state!=="queued")return;let X=Q.steps??[];if($.index!==void 0){if($.index<0||$.index>=X.length)return{content:[{type:"text",text:`Nested async run ${J.id} has ${X.length} children. Index ${$.index} is out of range.`}],isError:!0,details:{mode:"management",results:[]}};let Y=X[$.index];if(Y&&Y.status!=="running"&&Y.status!=="pending")return{content:[{type:"text",text:`Nested async run ${J.id} child ${$.index} is ${Y.status} and cannot be steered.`}],isError:!0,details:{mode:"management",results:[]}}}return yZ(Z,{message:$.message,targetIndex:$.index,source:"nested-steer"}),{content:[{type:"text",text:`Steering queued for nested async run ${J.id}. Delivery requires a live DM child session that supports mid-run steering.`}],details:{mode:"management",results:[]}}}async function KA($){let J=$.match.run;if(J.state==="complete")return{content:[{type:"text",text:`Nested run ${J.id} is already complete and cannot be interrupted.`}],isError:!0,details:{mode:"management",results:[]}};if(J.state==="failed")return{content:[{type:"text",text:`Nested run ${J.id} has failed and cannot be interrupted.`}],isError:!0,details:{mode:"management",results:[]}};if(J.state==="paused")return{content:[{type:"text",text:`Nested run ${J.id} is already paused.`}],isError:!0,details:{mode:"management",results:[]}};let Z=await oz($,"interrupt");if(Z)return{content:[{type:"text",text:Z.message}],isError:Z.ok?void 0:!0,details:{mode:"management",results:[]}};let Q=VA($);if(Q)return Q;return{content:[{type:"text",text:`Nested run ${J.id} owner is not reachable and no safe direct async interrupt fallback is available.`}],isError:!0,details:{mode:"management",results:[]}}}async function UA($){let J=$.target.match.run,Z=await oz($.target,"resume",$.message);if(Z)return{content:[{type:"text",text:Z.message}],isError:Z.ok?void 0:!0,details:{mode:"management",results:[]}};return{content:[{type:"text",text:`Nested run ${J.id} appears live but its owner route is not reachable. Wait for completion, then retry action='resume'.`}],isError:!0,details:{mode:"management",results:[]}}}function BA($){let J=$.target.match.run;if(J.state!=="running"&&J.state!=="queued")return{content:[{type:"text",text:`Nested run ${J.id} is ${J.state} and cannot be steered.`}],isError:!0,details:{mode:"management",results:[]}};let Z=GA($);if(Z)return Z;return{content:[{type:"text",text:`Nested run ${J.id} is not a live async DM child session with a steering inbox. action='steer' cannot target foreground nested runs.`}],isError:!0,details:{mode:"management",results:[]}}}async function WA($){let J=($.params.message??$.params.task??"").trim(),Z=($.params.chain?.length??0)>0?$.params.chain:void 0;if(!J&&!Z)return{content:[{type:"text",text:"action='resume' requires message."}],isError:!0,details:{mode:"management",results:[]}};let Q,X=$.ctx.sessionManager.getSessionFile()??null;try{let E=$.params.id??$.params.runId,k;try{k=E?l1(E,{state:$.deps.state,nested:B4($.deps)}):void 0}catch(D){let q=D instanceof Error?D.message:"",f=q.match(/async:/g)?.length??0;if(!uZ(D)||!q.includes("foreground:")||f!==1)throw D}if(k?.kind==="nested"){if(Z)return{content:[{type:"text",text:"Attaching a running subagent as a chain root is currently available for top-level async runs only."}],isError:!0,details:{mode:"management",results:[]}};if(k.match.run.state==="running"||k.match.run.state==="queued")return UA({target:k,message:J});let D=[...$.deps.config.defaultSessionDir?[y$.resolve($.deps.expandTilde($.deps.config.defaultSessionDir))]:[],...X?[$.deps.getSubagentSessionRoot(X)]:[]];Q=zA(k,D)}else Q=sO($.params,$.deps.state,{asyncRequireSessionFile:!Z})}catch(E){return{content:[{type:"text",text:E instanceof Error?E.message:String(E)}],isError:!0,details:{mode:"management",results:[]}}}if(Q.kind==="live"&&!Z){let E=Lz({target:Q,state:$.deps.state,kill:$.deps.kill,resultsDir:w$});if(!E.ok)return{content:[{type:"text",text:E.message}],isError:!0,details:{mode:"management",results:[]}};if(await fZ($.deps.pi.events,Q.intercomTarget,`Follow-up for async run ${Q.runId} (${Q.agent}):
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
`)}function oZ($,J){return(Z)=>tO({pi:J.pi,controlConfig:$.controlConfig,intercomBridge:$.intercomBridge,event:Z})}async function AA($){if(!$.intercomBridge.active||!$.intercomBridge.orchestratorTarget)return null;let J=$.results.flatMap((X,Y)=>X.detached?[]:[{agent:X.agent,status:x8({exitCode:X.exitCode,interrupted:X.interrupted,detached:X.detached}),summary:FA(X),index:Y,artifactPath:X.artifactPaths?.outputPath,sessionPath:X.sessionFile,intercomTarget:$0($.runId,X.agent,Y)}]);if(J.length===0)return null;let Z=o6({to:$.intercomBridge.orchestratorTarget,runId:$.runId,mode:$.mode,source:"foreground",children:d6($.runId,J,$.nestedChildren),...typeof $.chainSteps==="number"?{chainSteps:$.chainSteps}:{}});if(!await l6($.pi.events,Z))return null;return Z}async function lZ($){let J=await AA({pi:$.pi,intercomBridge:$.intercomBridge,runId:$.runId,mode:$.mode,results:$.details.results,...typeof $.details.totalSteps==="number"?{chainSteps:$.details.totalSteps}:{},...$.nestedChildren?.length?{nestedChildren:$.nestedChildren}:{}});if(!J)return null;return{text:Uz({mode:$.mode,runId:$.runId,payload:J}),details:Kz($.details)}}function _A($,J,Z,Q,X,Y){if(Number(Z)+Number(Q)+Number(X)!==1)return{content:[{type:"text",text:`Provide exactly one mode. Agents: ${J.map((H)=>H.name).join(", ")||"none"}`}],isError:!0,details:{mode:"single",results:[]}};let z=lz($);if(z.length>0)return{content:[{type:"text",text:z.join(" ")}],isError:!0,details:{mode:pZ($),results:[]}};if(X&&$.agent&&!J.find((H)=>H.name===$.agent))return{content:[{type:"text",text:`Unknown agent: ${$.agent}`}],isError:!0,details:{mode:"single",results:[]}};if(Q&&$.tasks)for(let H=0;H<$.tasks.length;H++){let V=$.tasks[H];if(!J.find((U)=>U.name===V.agent))return{content:[{type:"text",text:`Unknown agent: ${V.agent} (task ${H+1})`}],isError:!0,details:{mode:"parallel",results:[]}}}if(Z&&$.chain){if($.chain.length===0)return{content:[{type:"text",text:"Chain must have at least one step"}],isError:!0,details:{mode:"chain",results:[]}};let H=$.chain[0];if(T$(H)){let V=H.parallel.findIndex((U)=>!U.task);if(V!==-1)return{content:[{type:"text",text:`First parallel step: task ${V+1} must have a task (no previous output to reference)`}],isError:!0,details:{mode:"chain",results:[]}}}else if(k$(H))return{content:[{type:"text",text:"First step in chain cannot be dynamic fanout; expand.from requires a prior structured named output"}],isError:!0,details:{mode:"chain",results:[]}};else if(!H.task&&!$.task&&!Y)return{content:[{type:"text",text:"First step in chain must have a task"}],isError:!0,details:{mode:"chain",results:[]}};for(let V=0;V<$.chain.length;V++){let U=$.chain[V],G=k4(U);for(let K of G)if(!J.find((B)=>B.name===K))return{content:[{type:"text",text:`Unknown agent: ${K} (step ${V+1})`}],isError:!0,details:{mode:"chain",results:[]}};if(T$(U)&&U.parallel.length===0)return{content:[{type:"text",text:`Parallel step ${V+1} must have at least one task`}],isError:!0,details:{mode:"chain",results:[]}}}}return null}function MA($,J){if(($.chain?.length??0)===0)return null;try{P4($.chain,{maxItems:J})}catch(Z){if(Z instanceof K0)return{content:[{type:"text",text:Z.message}],isError:!0,details:{mode:"chain",results:[]}};throw Z}return null}function lz($){let J=[];J.push(...p0($.acceptance,"acceptance"));for(let[Z,Q]of($.tasks??[]).entries())J.push(...p0(Q.acceptance,`tasks[${Z}].acceptance`));for(let[Z,Q]of($.chain??[]).entries())if(J.push(...p0(Q.acceptance,`chain[${Z}].acceptance`)),T$(Q))for(let[X,Y]of Q.parallel.entries())J.push(...p0(Y.acceptance,`chain[${Z}].parallel[${X}].acceptance`));else if(k$(Q))J.push(...p0(Q.parallel.acceptance,`chain[${Z}].parallel.acceptance`));return J}function pZ($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";if($.agent)return"single";return"single"}function qA($,J){if($.context!==void 0)return iZ($);let Z=new Map(J.map((Y)=>[Y.name,Y])),Q=(Y)=>Z.get(Y)?.defaultContext==="fork"?"fork":"fresh",X=LA($).some((Y)=>Q(Y)==="fork");return{params:X?{...$,context:"fork"}:$,contextForAgent:Q,usesFork:X}}function iZ($){let J=$.context==="fork"?"fork":"fresh";return{params:$,contextForAgent:()=>J,usesFork:J==="fork"}}function LA($){let J=[];if($.agent)J.push($.agent);for(let Z of $.tasks??[])J.push(Z.agent);for(let Z of $.chain??[])J.push(...k4(Z));return J}function y0($,J){return $.contextForAgent(J)==="fork"}function g8($,J){return q2({content:[{type:"text",text:J}],isError:!0,details:{mode:pZ($),results:[]}},$.context)}function NA($){let{timeoutMs:J,maxRuntimeMs:Z}=$;if(J===void 0&&Z===void 0)return{};for(let[Q,X]of[["timeoutMs",J],["maxRuntimeMs",Z]]){if(X===void 0)continue;if(typeof X!=="number"||!Number.isInteger(X)||X<=0)return{error:`${Q} must be a positive integer.`}}if(J!==void 0&&Z!==void 0&&J!==Z)return{error:"timeoutMs and maxRuntimeMs are aliases; provide only one value or use the same value for both."};return{timeoutMs:J??Z}}function EA($,J){let Z=$.turnBudget??J.turnBudget;if(Z===void 0)return{};if(!Z||typeof Z!=="object"||Array.isArray(Z))return{error:"turnBudget must be an object with maxTurns and optional graceTurns."};if(typeof Z.maxTurns!=="number"||!Number.isInteger(Z.maxTurns)||Z.maxTurns<1)return{error:"turnBudget.maxTurns must be an integer >= 1."};let Q=Z.graceTurns??ZY;if(typeof Q!=="number"||!Number.isInteger(Q)||Q<0)return{error:"turnBudget.graceTurns must be an integer >= 0."};return{turnBudget:{maxTurns:Z.maxTurns,graceTurns:Q}}}function W4($,J="toolBudget"){let Z=k0($,J);return{toolBudget:Z.budget,error:Z.error}}function pz($){if($.stepBudget!==void 0)return W4($.stepBudget,"toolBudget");if($.runBudget!==void 0)return{toolBudget:$.runBudget};if($.agentBudget!==void 0)return W4($.agentBudget,"agent.toolBudget");return W4($.configBudget,"config.toolBudget")}function CA($){let J=[];for(let Z=0;Z<$.length;Z++){let Q=$[Z],X=Q.count;if(X!==void 0&&(typeof X!=="number"||!Number.isInteger(X)||X<1))return{error:`tasks[${Z}].count must be an integer >= 1`};let{count:Y,...z}=Q;for(let H=0;H<(X??1);H++)J.push({...z})}return{tasks:J}}function TA($){let J=[];for(let Z=0;Z<$.length;Z++){let Q=$[Z];if(!T$(Q)){J.push(Q);continue}let X=[];for(let Y=0;Y<Q.parallel.length;Y++){let z=Q.parallel[Y],H=z.count;if(H!==void 0&&(typeof H!=="number"||!Number.isInteger(H)||H<1))return{error:`chain[${Z}].parallel[${Y}].count must be an integer >= 1`};let{count:V,...U}=z;for(let G=0;G<(H??1);G++)X.push({...U})}J.push({...Q,parallel:X})}return{chain:J}}function jA($){if($.tasks){let J=CA($.tasks);if(J.error)return{error:g8($,J.error)};return{params:{...$,tasks:J.tasks}}}if($.chain){let J=TA($.chain);if(J.error)return{error:g8($,J.error)};return{params:{...$,chain:J.chain}}}return{params:$}}function q2($,J){if(J!=="fork"||!$.details)return $;return{...$,details:{...$.details,context:"fork"}}}function U4($,J){let Z=J instanceof Error?J.message:String(J);return q2({content:[{type:"text",text:Z}],isError:!0,details:{mode:pZ($),results:[]}},$.context)}function iz($,J,Z){let Q=[],X=0;for(let Y of $){if(T$(Y)){for(let z of Y.parallel)Q.push(J(z.agent,X)),X++;continue}if(k$(Y)){let z=Y.expand.maxItems??Z??0;for(let H=0;H<z;H++)Q.push(J(Y.parallel.agent,X)),X++;continue}Q.push(J(Y.agent,X)),X++}return Q}function rz($,J,Z){let Q=[],X=0;for(let Y of $){if(T$(Y)){for(let z of Y.parallel)Q.push(J(z.agent,X)),X++;continue}if(k$(Y)){let z=Y.expand.maxItems??Z??0;for(let H=0;H<z;H++)Q.push(J(Y.parallel.agent,X)),X++;continue}Q.push(J(Y.agent,X)),X++}return Q}function F4($,J){return $.map((Z,Q)=>{if(T$(Z))return{...Z,parallel:Z.parallel.map((Y)=>({...Y,task:y0(J,Y.agent)?U1(Y.task??"{previous}"):Y.task}))};if(k$(Z))return{...Z,parallel:{...Z.parallel,task:y0(J,Z.parallel.agent)?U1(Z.parallel.task??"{previous}"):Z.parallel.task}};let X=Z;return{...X,task:y0(J,X.agent)?U1(X.task??(Q===0?"{task}":"{previous}")):X.task}})}function fA($,J,Z,Q){if(!J.usesFork)return;if($.agent){if(y0(J,$.agent))Z($.agent,0);return}if($.tasks){$.tasks.forEach((Y,z)=>{if(y0(J,Y.agent))Z(Y.agent,z)});return}if(!$.chain?.length)return;let X=0;for(let Y of $.chain){if(T$(Y)){for(let H of Y.parallel){if(y0(J,H.agent))Z(H.agent,X);X++}continue}if(k$(Y)){let H=Y.expand.maxItems??Q??0;if(y0(J,Y.parallel.agent))for(let V=0;V<H;V++)Z(Y.parallel.agent,X+V);X+=H;continue}let z=Y;if(y0(J,z.agent))Z(z.agent,X);X++}}function RA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,shareEnabled:z,sessionRoot:H,sessionFileForIndex:V,sessionFileForTask:U,thinkingOverrideForTask:G,artifactConfig:K,artifactsDir:B,effectiveAsync:W,controlConfig:O,intercomBridge:A,nestedRoute:L,contextPolicy:_}=$,M=(Z.chain?.length??0)>0,F=(Z.tasks?.length??0)>0,R=!M&&!F&&Boolean(Z.agent);if(!W)return null;if(M&&Z.chain){let D=SA(Z.chain,Q);if(D)return{content:[{type:"text",text:D}],isError:!0,details:{mode:"chain",results:[]}}}if(F&&Z.tasks){let D=I9(J.config.parallel?.maxTasks);if(Z.tasks.length>D)return r2(`Max ${D} tasks`);if(Z.worktree){let q=sz(Z.tasks,Q);if(q)return r2(q)}}if(!M2())return{content:[{type:"text",text:"Async 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 C=L2(),T={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},I=Y.modelRegistry.getAvailable().map(A0),S=B1(J.config.maxSubagentDepth),j=Y.model?.provider,E=A.active?A.orchestratorTarget:void 0,k=A.active?(D,q)=>$0(C,D,q):void 0;if(F&&Z.tasks){let D=Z.tasks.map((y)=>X.find((h)=>h.name===y.agent)),q=Z.tasks.map((y,h)=>T0(y.model??D[h]?.model,Y.model,I,j,{scope:$.modelScope,source:y.model?"explicit":"inherited"})),f=Z.tasks.map((y)=>O0(y.skill)),b=Z.tasks.map((y,h)=>({agent:y.agent,task:y0(_,y.agent)?U1(y.task):y.task,cwd:y.cwd,...q[h]?{model:q[h]}:{},...f[h]!==void 0?{skill:f[h]}:{},...y.output===!0?D[h]?.output?{output:D[h].output}:{}:y.output!==void 0?{output:y.output}:{},...y.outputMode!==void 0?{outputMode:y.outputMode}:{},...y.reads!==void 0&&y.reads!==!0?{reads:y.reads}:{},...y.progress!==void 0?{progress:y.progress}:{},...y.toolBudget!==void 0?{toolBudget:y.toolBudget}:{},...y.acceptance!==void 0?{acceptance:y.acceptance}:{}}));return I8(C,{chain:[{parallel:b,concurrency:P9(Z.concurrency,J.config.parallel?.concurrency),worktree:Z.worktree}],resultMode:"parallel",agents:X,ctx:T,availableModels:I,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:K.enabled?B:void 0,artifactConfig:K,shareEnabled:z,sessionRoot:H,chainSkills:[],sessionFilesByFlatIndex:Z.tasks.map((y,h)=>U(y.agent,h)),thinkingOverridesByFlatIndex:Z.tasks.map((y,h)=>G(y.agent,h)),maxSubagentDepth:S,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:O,controlIntercomTarget:E,childIntercomTarget:k,nestedRoute:L,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:$.toolBudget,configToolBudget:$.configToolBudget,globalConcurrencyLimit:J.config.globalConcurrencyLimit})}if(M&&Z.chain){let D=O0(Z.skill),q=D===!1?[]:D??[],f=F4(Z.chain,_);return I8(C,{chain:f,task:Z.task,agents:X,ctx:T,availableModels:I,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:K.enabled?B:void 0,artifactConfig:K,shareEnabled:z,sessionRoot:H,chainSkills:q,sessionFilesByFlatIndex:iz(f,U,J.config.chain?.dynamicFanout?.maxItems),thinkingOverridesByFlatIndex:rz(f,G,J.config.chain?.dynamicFanout?.maxItems),dynamicFanoutMaxItems:J.config.chain?.dynamicFanout?.maxItems,maxSubagentDepth:S,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:O,controlIntercomTarget:E,childIntercomTarget:k,nestedRoute:L,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:$.toolBudget,configToolBudget:$.configToolBudget,globalConcurrencyLimit:J.config.globalConcurrencyLimit})}if(R){let D=X.find((P)=>P.name===Z.agent);if(!D)return{content:[{type:"text",text:`Unknown agent: ${Z.agent}`}],isError:!0,details:{mode:"single",results:[]}};let q=Z.output!==void 0?Z.output:D.output,f=L8(q,D.output),b=Z.outputMode??"inline",y=O0(Z.skill),h=y===!1?[]:y,n=W1(S,D.maxSubagentDepth),g=T0(Z.model??D.model,Y.model,I,j,{scope:$.modelScope,source:Z.model?"explicit":"inherited"});return m6(C,{agent:Z.agent,task:y0(_,Z.agent)?U1(Z.task??""):Z.task??"",agentConfig:D,ctx:T,availableModels:I,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:K.enabled?B:void 0,artifactConfig:K,shareEnabled:z,sessionRoot:H,sessionFile:U(Z.agent,0),skills:h,output:f,outputMode:b,outputBaseDir:$9(J,B,C),modelOverride:g,thinkingOverride:G(Z.agent,0),maxSubagentDepth:n,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:O,controlIntercomTarget:E,childIntercomTarget:k?(P,w)=>k(P,w):void 0,nestedRoute:L,acceptance:Z.acceptance,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:$.toolBudget,configToolBudget:$.configToolBudget})}return null}async function yA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:z,runId:H,shareEnabled:V,sessionDirForIndex:U,sessionFileForIndex:G,sessionFileForTask:K,thinkingOverrideForTask:B,artifactsDir:W,artifactConfig:O,onUpdate:A,sessionRoot:L,controlConfig:_,contextPolicy:M}=$,F=oZ($,J),R=$.intercomBridge.active?$0:void 0,C=J.state.foregroundControls.get(H),T=O0(Z.skill),I=T===!1?[]:T??[],S=F4(Z.chain,M),j=B1(J.config.maxSubagentDepth),E=await NY({chain:S,task:Z.task,agents:X,ctx:Y,modelScope:$.modelScope,intercomEvents:J.pi.events,signal:z,runId:H,cwd:Q,shareEnabled:V,sessionDirForIndex:U,sessionFileForIndex:G,sessionFileForTask:K,thinkingOverrideForTask:B,artifactsDir:W,artifactConfig:O,includeProgress:Z.includeProgress,clarify:Z.clarify,onUpdate:A,onControlEvent:F,controlConfig:_,childIntercomTarget:R?(f,b)=>R(H,f,b):void 0,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,foregroundControl:C,nestedRoute:C?.nestedRoute,chainSkills:I,chainDir:Z.chainDir??YQ(Q),dynamicFanoutMaxItems:J.config.chain?.dynamicFanout?.maxItems,maxSubagentDepth:j,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,timeoutMs:$.timeoutMs,deadlineAt:$.deadlineAt,turnBudget:$.turnBudget,onDetachedExit:(f,b)=>dZ(J.state,{runId:H,mode:"chain",cwd:Q,index:f,result:b}),toolBudget:$.toolBudget,configToolBudget:$.configToolBudget,globalConcurrencyLimit:J.config.globalConcurrencyLimit});if(E.requestedAsync){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:"chain",results:[]}};let f=L2(),b={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},y=F4(E.requestedAsync.chain,M);return I8(f,{chain:y,task:Z.task,agents:X,ctx:b,availableModels:Y.modelRegistry.getAvailable().map(A0),cwd:Q,maxOutput:Z.maxOutput,artifactsDir:O.enabled?W:void 0,artifactConfig:O,shareEnabled:V,sessionRoot:L,chainSkills:E.requestedAsync.chainSkills,sessionFilesByFlatIndex:iz(y,K,J.config.chain?.dynamicFanout?.maxItems),thinkingOverridesByFlatIndex:rz(y,B,J.config.chain?.dynamicFanout?.maxItems),dynamicFanoutMaxItems:J.config.chain?.dynamicFanout?.maxItems,maxSubagentDepth:j,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:_,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(h,n)=>$0(f,h,n):void 0,nestedRoute:$.nestedRoute,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,toolBudget:$.toolBudget,configToolBudget:$.configToolBudget,globalConcurrencyLimit:J.config.globalConcurrencyLimit})}let k=E.details?{...E.details,runId:H}:void 0;if(C&&k)d2(C),d1(H,k.results,C.nestedChildren),k.totalCost=z8(k.results);let D=k?H8(k):void 0;if(D)nZ(J.state,{runId:H,mode:"chain",cwd:Q,results:D.results});let q=D&&!D.results.some((f)=>f.interrupted||f.detached)?await lZ({pi:J.pi,intercomBridge:$.intercomBridge,runId:H,mode:"chain",details:D,...C?.nestedChildren?.length?{nestedChildren:C.nestedChildren}:{}}):null;if(q)return{...E,content:[{type:"text",text:q.text}],details:q.details};return D?{...E,details:D}:E}function r2($){return{content:[{type:"text",text:$}],isError:!0,details:{mode:"parallel",results:[]}}}function DA($,J,Z,Q,X,Y,z){if(!$)return{};try{return{setup:f6(J,Z,Q.length,{agents:Q.map((H)=>H.agent),setupHook:X?{hookPath:X,timeoutMs:Y}:void 0,baseDir:z})}}catch(H){let V=H instanceof Error?H.message:String(H);return{errorResult:r2(V)}}}function sz($,J){let Z=pJ($,J);if(!Z)return;return iJ(Z,J)}function $9($,J,Z){return $.config.singleRunOutputBaseDir?y$.resolve($.expandTilde($.config.singleRunOutputBaseDir)):y$.join(J,"outputs",Z)}function SA($,J){for(let Z=0;Z<$.length;Z++){let Q=$[Z];if(!T$(Q)||!Q.worktree)continue;let X=J1(J,Q.cwd),Y=pJ(Q.parallel,X);if(!Y)continue;let z=iJ(Y,X);return`parallel chain step ${Z+1}: ${z}`}return}function rZ($,J,Z,Q){if(Z)return Z.worktrees[Q].agentCwd;return J1(J,$.cwd)}function wA($,J,Z){if(!$)return"";let Q=y$.join(J,"worktree-diffs"),X=R6($,Z.map((Y)=>Y.agent),Q);return y6(X)}function kA($){let J=new Map;for(let Z=0;Z<$.tasks.length;Z++){let Q=$.behaviors[Z];if(!Q?.output)continue;let X=$.tasks[Z],Y=rZ(X,$.paramsCwd,$.worktreeSetup,Z),z=W2(Q.output,$.ctxCwd,Y,$.outputBaseDir);if(!z)continue;let H=J.get(z);if(H)return`Parallel tasks ${H.index+1} (${H.agent}) and ${Z+1} (${X.agent}) resolve output to the same path: ${z}. Use distinct output paths.`;J.set(z,{index:Z,agent:X.agent})}return}async function IA($){for(let J=0;J<$.tasks.length;J++)$.sessionFileForIndex(J);return e8($.tasks,$.concurrencyLimit,async(J,Z)=>{let Q=$.behaviors[Z],X=Q?.skills,Y=rZ(J,$.paramsCwd,$.worktreeSetup,Z),z=Q?S1({...Q,output:!1,progress:!1},Y,!1):{prefix:"",suffix:""},H=Q?S1({...Q,output:!1,reads:!1},$.progressDir,Z===$.firstProgressIndex):{prefix:"",suffix:""},V=W2(Q?.output,$.ctx.cwd,Y,$.outputBaseDir),U=N8(`${z.prefix}${$.taskTexts[Z]}${H.suffix}`,V),G=new AbortController;if($.foregroundControl)$.foregroundControl.currentAgent=J.agent,$.foregroundControl.currentIndex=Z,$.foregroundControl.currentActivityState=void 0,$.foregroundControl.updatedAt=Date.now(),$.foregroundControl.interrupt=()=>{if(G.signal.aborted)return!1;return G.abort(),$.foregroundControl.currentActivityState=void 0,$.foregroundControl.updatedAt=Date.now(),!0};let K=$.agents.find((B)=>B.name===J.agent);return C8($.ctx.cwd,$.agents,J.agent,U,{parentSessionId:$.ctx.sessionManager.getSessionId()??void 0,cwd:Y,signal:$.signal,interruptSignal:G.signal,allowIntercomDetach:K?.systemPrompt?.includes(v1)===!0,intercomEvents:$.intercomEvents,runId:$.runId,index:Z,sessionDir:$.sessionDirForIndex(Z),sessionFile:$.sessionFileForTask(J.agent,Z),share:$.shareEnabled,artifactsDir:$.artifactConfig.enabled?$.artifactsDir:void 0,artifactConfig:$.artifactConfig,maxOutput:$.maxOutput,outputPath:V,outputMode:Q?.outputMode,maxSubagentDepth:$.maxSubagentDepths[Z],controlConfig:$.controlConfig,onControlEvent:$.onControlEvent,onDetachedExit:(B)=>dZ($.state,{runId:$.runId,mode:"parallel",cwd:Y,index:Z,result:B}),intercomSessionName:$.childIntercomTarget?.(J.agent,Z),orchestratorIntercomTarget:$.orchestratorIntercomTarget,nestedRoute:$.foregroundControl?.nestedRoute,modelOverride:$.modelOverrides[Z],thinkingOverride:$.thinkingOverrideForTask(J.agent,Z),availableModels:$.availableModels,preferredModelProvider:$.ctx.model?.provider,modelScope:$.modelScope,skills:X===!1?[]:X,acceptance:J.acceptance,acceptanceContext:{mode:"parallel"},timeoutMs:$.timeoutMs,deadlineAt:$.deadlineAt,turnBudget:$.turnBudget,toolBudget:$.toolBudgets[Z],onUpdate:$.onUpdate?(B)=>{let W=B.details?.results||[],O=B.details?.progress||[];if($.foregroundControl&&O.length>0){let _=O[0];$.foregroundControl.currentAgent=J.agent,$.foregroundControl.currentIndex=Z,$.foregroundControl.currentActivityState=_?.activityState,$.foregroundControl.lastActivityAt=_?.lastActivityAt,$.foregroundControl.currentTool=_?.currentTool,$.foregroundControl.currentToolStartedAt=_?.currentToolStartedAt,$.foregroundControl.currentPath=_?.currentPath,$.foregroundControl.turnCount=_?.turnCount,$.foregroundControl.tokens=_?.tokens,$.foregroundControl.toolCount=_?.toolCount,$.foregroundControl.updatedAt=Date.now()}if(W.length>0)$.liveResults[Z]=W[0];if(O.length>0)$.liveProgress[Z]=O[0];let A=$.liveResults.filter((_)=>_!==void 0),L=$.liveProgress.filter((_)=>_!==void 0);$.onUpdate?.({content:B.content,details:{mode:"parallel",results:A,progress:L,controlEvents:B.details?.controlEvents,totalSteps:$.tasks.length}})}:void 0}).finally(()=>{if($.foregroundControl?.currentIndex===Z)$.foregroundControl.interrupt=void 0,$.foregroundControl.updatedAt=Date.now()})},$.globalSemaphore)}async function PA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:z,runId:H,sessionDirForIndex:V,sessionFileForIndex:U,sessionFileForTask:G,thinkingOverrideForTask:K,shareEnabled:B,artifactConfig:W,artifactsDir:O,backgroundRequestedWhileClarifying:A,onUpdate:L,sessionRoot:_,controlConfig:M,contextPolicy:F}=$,R=oZ($,J),C=$.intercomBridge.active?$0:void 0,T=[],I=[],S=Z.tasks,j=I9(J.config.parallel?.maxTasks),E=P9(Z.concurrency,J.config.parallel?.concurrency);if(S.length>j)return{content:[{type:"text",text:`Max ${j} tasks`}],isError:!0,details:{mode:"parallel",results:[]}};let k=[];for(let d of S){let z$=X.find((F$)=>F$.name===d.agent);if(!z$)return{content:[{type:"text",text:`Unknown agent: ${d.agent}`}],isError:!0,details:{mode:"parallel",results:[]}};k.push(z$)}let D=B1(J.config.maxSubagentDepth),q=k.map((d)=>W1(D,d.maxSubagentDepth)),f=[];for(let d=0;d<S.length;d++){let z$=pz({stepBudget:S[d]?.toolBudget,runBudget:$.toolBudget,agentBudget:k[d]?.toolBudget,configBudget:$.configToolBudget});if(z$.error)return r2(z$.error);f.push(z$.toolBudget)}if(Z.worktree){let d=sz(S,Q);if(d)return r2(d)}let b=Y.model?.provider,y=Y.modelRegistry.getAvailable().map(A0),h=S.map((d)=>d.task),n=S.map((d)=>O0(d.skill)),g=S.map((d,z$)=>({...d.output!==void 0?{output:d.output===!0?k[z$]?.output??!1:d.output}:{},...d.outputMode!==void 0?{outputMode:d.outputMode}:{},...d.reads!==void 0&&d.reads!==!0?{reads:d.reads}:{},...d.progress!==void 0?{progress:d.progress}:{},...n[z$]!==void 0?{skills:n[z$]}:{},...d.model?{model:d.model}:{}})),P=S.map((d,z$)=>T0(g[z$]?.model??k[z$]?.model,Y.model,y,b,{scope:$.modelScope,source:g[z$]?.model?"explicit":"inherited"}));if(Z.clarify===!0&&Y.hasUI){let d=k.map((V$,J$)=>e0(V$,g[J$])),z$=t0(Q),F$=await Y.ui.custom((V$,J$,H$,O$)=>new M8(V$,J$,k,h,"",void 0,d,y,b,z$,O$,"parallel"),{overlay:!0,overlayOptions:{anchor:"center",width:84,maxHeight:"80%"}});if(!F$||!F$.confirmed)return{content:[{type:"text",text:"Cancelled"}],details:{mode:"parallel",results:[]}};h=F$.templates;for(let V$=0;V$<F$.behaviorOverrides.length;V$++){let J$=F$.behaviorOverrides[V$];if(J$?.model)P[V$]=T0(J$.model,Y.model,y,b,{scope:$.modelScope,source:"explicit"}),g[V$].model=J$.model;if(J$?.output!==void 0)g[V$].output=J$.output;if(J$?.reads!==void 0)g[V$].reads=J$.reads;if(J$?.progress!==void 0)g[V$].progress=J$.progress;if(J$?.skills!==void 0)n[V$]=J$.skills,g[V$].skills=J$.skills}if(F$.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:"parallel",results:[]}};let V$=L2(),J$={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},H$=S.map((O$,q$)=>{let m=y0(F,O$.agent)?U1(h[q$]):h[q$],a=v9(m)?!1:g[q$]?.progress;return{agent:O$.agent,task:m,cwd:O$.cwd,...P[q$]?{model:P[q$]}:{},...n[q$]!==void 0?{skill:n[q$]}:{},...g[q$]?.output!==void 0?{output:g[q$].output}:{},...g[q$]?.outputMode!==void 0?{outputMode:g[q$].outputMode}:{},...g[q$]?.reads!==void 0?{reads:g[q$].reads}:{},...a!==void 0?{progress:a}:{},...O$.toolBudget!==void 0?{toolBudget:O$.toolBudget}:{},...O$.acceptance!==void 0?{acceptance:O$.acceptance}:{}}});return I8(V$,{chain:[{parallel:H$,concurrency:E,worktree:Z.worktree}],resultMode:"parallel",agents:X,ctx:J$,availableModels:y,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:W.enabled?O:void 0,artifactConfig:W,shareEnabled:B,sessionRoot:_,chainSkills:[],sessionFilesByFlatIndex:S.map((O$,q$)=>G(O$.agent,q$)),thinkingOverridesByFlatIndex:S.map((O$,q$)=>K(O$.agent,q$)),maxSubagentDepth:D,worktreeSetupHook:J.config.worktreeSetupHook,worktreeSetupHookTimeoutMs:J.config.worktreeSetupHookTimeoutMs,worktreeBaseDir:J.config.worktreeBaseDir,controlConfig:M,controlIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,childIntercomTarget:$.intercomBridge.active?(O$,q$)=>$0(V$,O$,q$):void 0,timeoutMs:$.timeoutMs,turnBudget:$.turnBudget,globalConcurrencyLimit:J.config.globalConcurrencyLimit})}}let w=k.map((d,z$)=>$1(e0(d,g[z$]),h[z$])),v=w.findIndex((d)=>d.progress),x=Array(S.length).fill(void 0),$$=Array(S.length).fill(void 0),c=J.state.foregroundControls.get(H),{setup:o,errorResult:D$}=DA(Z.worktree,Q,H,S,J.config.worktreeSetupHook,J.config.worktreeSetupHookTimeoutMs,J.config.worktreeBaseDir);if(D$)return D$;try{let d=y$.join(O,"outputs",H),z$=kA({tasks:S,behaviors:w,paramsCwd:Q,ctxCwd:Y.cwd,outputBaseDir:d,worktreeSetup:o});if(z$)return r2(z$);for(let i=0;i<S.length;i++){let P$=rZ(S[i],Q,o,i),H0=W2(w[i]?.output,Y.cwd,P$,d),Z$=s0(w[i]?.outputMode,H0,`Parallel task ${i+1} (${S[i].agent})`);if(Z$)return r2(Z$)}let F$=v!==-1,V$=y$.join(O,"progress",H);if(F$)y2(V$);for(let i=0;i<h.length;i++)if(y0(F,S[i].agent))h[i]=U1(h[i]);let J$=$.deadlineAt??($.timeoutMs!==void 0?Date.now()+$.timeoutMs:void 0),H$=await IA({tasks:S,taskTexts:h,agents:X,ctx:Y,state:J.state,intercomEvents:J.pi.events,signal:z,runId:H,sessionDirForIndex:V,sessionFileForIndex:U,sessionFileForTask:G,thinkingOverrideForTask:K,shareEnabled:B,artifactConfig:W,artifactsDir:O,outputBaseDir:d,maxOutput:Z.maxOutput,paramsCwd:Q,progressDir:V$,availableModels:y,modelScope:$.modelScope,modelOverrides:P,behaviors:w,firstProgressIndex:F$?-1:v,controlConfig:M,onControlEvent:R,childIntercomTarget:C?(i,P$)=>C(H,i,P$):void 0,orchestratorIntercomTarget:$.intercomBridge.active?$.intercomBridge.orchestratorTarget:void 0,foregroundControl:c,concurrencyLimit:E,globalSemaphore:new t8(J.config.globalConcurrencyLimit??S4),maxSubagentDepths:q,liveResults:x,liveProgress:$$,onUpdate:L,worktreeSetup:o,timeoutMs:$.timeoutMs,deadlineAt:J$,turnBudget:$.turnBudget,toolBudgets:f});for(let i=0;i<H$.length;i++){let P$=H$[i];T8(P$.agent,h[i],P$.exitCode,P$.progressSummary?.durationMs??0)}for(let i of H$){if(i.progress)T.push(i.progress);if(i.artifactPaths)I.push(i.artifactPaths)}if(c)d2(c),d1(H,H$,c.nestedChildren);let O$=H$.find((i)=>i.interrupted),q$=H8({mode:"parallel",runId:H,results:H$,progress:Z.includeProgress?T:void 0,artifacts:I.length?{dir:O,files:I}:void 0,totalChildUsage:zJ(H$),totalCost:z8(H$)});if(nZ(J.state,{runId:H,mode:"parallel",cwd:Q,results:q$.results}),O$)return{content:[{type:"text",text:`Parallel run paused after interrupt (${O$.agent}). Waiting for explicit next action.`}],details:q$};let m=H$.findIndex((i)=>i.detached),a=m>=0?H$[m]:void 0;if(a)return{content:[{type:"text",text:`Parallel run detached for intercom coordination (${a.agent}). Reply to the supervisor request first. After the child exits, start a fresh follow-up if needed.`}],details:q$};if(c)d2(c);let s$=await lZ({pi:J.pi,intercomBridge:$.intercomBridge,runId:H,mode:"parallel",details:q$,...c?.nestedChildren?.length?{nestedChildren:c.nestedChildren}:{}});if(s$)return{content:[{type:"text",text:s$.text}],details:s$.details};let G$=wA(o,O,S),a$=H$.filter((i)=>i.exitCode===0).length,R$=A?" (background requested, but clarify kept this run foreground)":"",U$=X8(H$.map((i)=>({agent:i.agent,output:i.truncation?.text||G0(i),exitCode:i.exitCode,error:i.error,timedOut:i.timedOut})),(i,P$)=>`=== Task ${i+1}: ${P$} ===`),N$=`${a$}/${H$.length} succeeded${R$}`;return{content:[{type:"text",text:G$?`${N$}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
${U$}`}],details:q$}}finally{if(o)rJ(o)}}async function bA($,J){let{params:Z,effectiveCwd:Q,agents:X,ctx:Y,signal:z,runId:H,sessionDirForIndex:V,sessionFileForTask:U,thinkingOverrideForTask:G,shareEnabled:K,artifactConfig:B,artifactsDir:W,onUpdate:O,sessionRoot:A,controlConfig:L,contextPolicy:_}=$,M=oZ($,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=pz({runBudget:$.toolBudget,agentBudget:T.toolBudget,configBudget:$.configToolBudget});if(I.error)return U4(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 m6(O$,{agent:Z.agent,task:y0(_,Z.agent)?U1(E):E,agentConfig:T,ctx:q$,availableModels:j,cwd:Q,maxOutput:Z.maxOutput,artifactsDir:B.enabled?W:void 0,artifactConfig:B,shareEnabled:K,sessionRoot:A,sessionFile:U(Z.agent,0),skills:D===!1?[]:D,output:f,outputMode:b,outputBaseDir:$9(J,W,O$),modelOverride:k,thinkingOverride:G(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=U1(E);let n=E,g=W2(f,Y.cwd,Q,$9(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),o=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:U(Z.agent,0),share:K,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:G(Z.agent,0),availableModels:j,preferredModelProvider:S,modelScope:$.modelScope,skills:w,acceptance:Z.acceptance,acceptanceContext:{mode:"single"},onDetachedExit:(F$)=>dZ(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=o.progress?.activityState,x.lastActivityAt=o.progress?.lastActivityAt,x.currentTool=o.progress?.currentTool,x.currentToolStartedAt=o.progress?.currentToolStartedAt,x.currentPath=o.progress?.currentPath,x.turnCount=o.progress?.turnCount,x.tokens=o.progress?.tokens,x.toolCount=o.progress?.toolCount,x.updatedAt=Date.now();if(T8(Z.agent,n,o.exitCode,o.progressSummary?.durationMs??0),o.progress)R.push(o.progress);if(o.artifactPaths)C.push(o.artifactPaths);let D$=G0(o),d=JY({fullOutput:D$,truncatedOutput:o.truncation?.text,outputPath:g,outputMode:o.outputMode,exitCode:o.exitCode,savedPath:o.savedOutputPath,outputReference:o.outputReference,saveError:o.outputSaveError});if(x)d2(x),d1(H,[o],x.nestedChildren);let z$=H8({mode:"single",runId:H,results:[o],...$.turnBudget?{turnBudget:$.turnBudget}:{},...I.toolBudget?{toolBudget:I.toolBudget}:{},progress:Z.includeProgress?R:void 0,artifacts:C.length?{dir:W,files:C}:void 0,truncation:o.truncation,totalChildUsage:zJ([o]),totalCost:z8([o])});if(nZ(J.state,{runId:H,mode:"single",cwd:Q,results:z$.results}),!o.detached&&!o.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,...o.exitCode!==0?{isError:!0}:{}}}if(o.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(o.interrupted)return{content:[{type:"text",text:`Run paused after interrupt (${Z.agent}). Waiting for explicit next action.`}],details:z$};if(o.exitCode!==0)return{content:[{type:"text",text:OA(o,d.displayOutput)}],details:z$,isError:!0};return{content:[{type:"text",text:d.displayOutput||"(no output)"}],details:z$}}function xA($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function vA($){return{content:[{type:"text",text:"Rejected: a subagent call is already in progress. Issue exactly ONE subagent call per turn."}],isError:!0,details:{mode:xA($),results:[]}}}function nz($){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 $}function az($){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=nz(X),U=uO(H.cwd,V.cwd),G=V.cwd===void 0?V:{...V,cwd:U},K=G.action;if(K){if(K==="doctor"){let Z$=null,t=$.state.currentSessionId,f$;try{Z$=H.sessionManager.getSessionFile()??null,t=H.sessionManager.getSessionId()}catch(K$){f$=K$ instanceof Error?`${K$.name}: ${K$.message}`:String(K$)}let l;try{l=K6($.pi.getSessionName(),H.sessionManager.getSessionId())}catch(K$){if(!f$)f$=K$ instanceof Error?`${K$.name}: ${K$.message}`:String(K$)}return{content:[{type:"text",text:eY({cwd:U,config:$.config,state:$.state,context:G.context,requestedSessionDir:G.sessionDir,currentSessionFile:Z$,currentSessionId:t,orchestratorTarget:l,sessionError:f$,expandTilde:$.expandTilde})}],details:{mode:"management",results:[]}}}if(K==="status"){let Z$=G.id??G.runId,t=B4($),f$=dO(H,$);if(G.view==="fleet")return t6(G,{state:$.state,nested:t,sessionRoots:f$});if(Z$)try{let l=l1(Z$,{state:$.state,nested:t});if(l?.kind==="foreground"){let K$=cZ($.state,l.id);if(K$){if(G.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 mz(K$)}}}catch(l){return{content:[{type:"text",text:l instanceof Error?l.message:String(l)}],isError:!0,details:{mode:"management",results:[]}}}else{let l=cZ($.state,void 0);if(l&&G.view!=="transcript")return mz(l);if(l&&G.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 t6(G,{state:$.state,nested:t,sessionRoots:f$})}if(K==="resume")return WA({params:G,requestCwd:U,ctx:H,deps:$});if(K==="steer"){let Z$=(G.message??G.task??"").trim();if(!Z$)return{content:[{type:"text",text:"action='steer' requires message."}],isError:!0,details:{mode:"management",results:[]}};let t=G.runId??G.id;if(G.dir)try{let l=i2(G,d$,w$),K$=l.resolvedId??t??y$.basename(l.asyncDir??G.dir);return uz({state:$.state,runId:K$,message:Z$,index:G.index,kill:$.kill,location:l})}catch(l){return{content:[{type:"text",text:l instanceof Error?l.message:String(l)}],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$=l1(t,{state:$.state,nested:B4($)})}catch(l){return{content:[{type:"text",text:l instanceof Error?l.message:String(l)}],isError:!0,details:{mode:"management",results:[]}}}if(f$?.kind==="nested")return BA({target:f$,message:Z$,index:G.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 uz({state:$.state,runId:f$.id,message:Z$,index:G.index,kill:$.kill,location:f$.location})}if(K==="append-step")return JA({params:G,requestCwd:U,ctx:H,deps:$});if(K==="schedule"||K==="schedule-list"||K==="schedule-status"||K==="schedule-cancel"){if(!$.handleScheduledRunAction)return{content:[{type:"text",text:`Action '${K}' is not available in this subagent context.`}],isError:!0,details:{mode:"management",results:[]}};return $.handleScheduledRunAction(G,H)}if(K==="interrupt"){let Z$=G.runId??G.id,t;if(Z$)try{t=l1(Z$,{state:$.state,nested:B4($)})}catch(K$){return{content:[{type:"text",text:K$ instanceof Error?K$.message:String(K$)}],isError:!0,details:{mode:"management",results:[]}}}if(t?.kind==="nested")return KA(t);let f$=cZ($.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 l=eO($.state,t?.kind==="async"?t.id:Z$,$.kill,t?.kind==="async"?t.location:void 0);if(l)return l;return{content:[{type:"text",text:"No interrupt-capable run found in this session."}],isError:!0,details:{mode:"management",results:[]}}}if(!k9.includes(K))return{content:[{type:"text",text:`Unknown action: ${K}. Valid: ${k9.join(", ")}`}],isError:!0,details:{mode:"management",results:[]}};if($.allowMutatingManagementActions===!1&&cO.has(K))return{content:[{type:"text",text:`Action '${K}' is not available from child-safe subagent fanout mode.`}],isError:!0,details:{mode:"management",results:[]}};return vY(K,G,{...H,cwd:U,config:$.config})}let{blocked:B,depth:W,maxDepth:O}=b9($.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=jA(G);if(A.error)return A.error;let L=A.params,_=hz(L,W,$.config.forceTopLevelAsync===!0),M=NA(_);if(M.error)return g8(_,M.error);let F=EA(_,$.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=D6(_.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,D=qA(_,E);_=D.params;let q=K6($.pi.getSessionName(),H.sessionManager.getSessionId()),f=k5({config:$.config.intercomBridge,context:_.context,orchestratorTarget:q}),b=f.active?E.map((Z$)=>I5(Z$,f)):E,y=L2().slice(0,8),h=D8(),n=h?S8():void 0,g=h??uY(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=_A(_,b,w,v,x,$$);if(c)return c;let o=()=>{return},D$=()=>{return};try{let Z$=Vz(H.sessionManager,D.usesFork?"fork":void 0);o=Z$.sessionFileForIndex,D$=Z$.thinkingOverrideForIndex}catch(Z$){return U4(_,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{G1.mkdirSync(O$,{recursive:!0})}catch(Z$){let t=Z$ instanceof Error?Z$.message:String(Z$);return U4(_,Error(`Failed to create session directory '${O$}': ${t}`))}let q$=(Z$)=>y$.join(O$,`run-${Z$??0}`),m=(Z$,t)=>y0(D,Z$)?o(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"),G$=(Z$)=>y$.join(q$(Z$),"session.jsonl");try{fA(_,D,m,$.config.chain?.dynamicFanout?.maxItems)}catch(Z$){return U4(_,Z$)}let a$=MA(_,$.config.chain?.dynamicFanout?.maxItems);if(a$)return a$;let R$=z?(Z$)=>z(q2(Z$,_.context)):void 0,U$=w?"chain":v?"parallel":"single",N$=oO({state:$.state,config:$.config,sessionId:$.state.currentSessionId,requested:lO(_,$.config),mode:U$});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:G$,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:U$,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(),l=t?.details,K$=Z$==="subagent.nested.started"?"running":t?.isError||l?.results.some((u)=>u.exitCode!==0)?"failed":l?.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:K$==="running"?"live":"gone",mode:U$,state:K$,agent:c$[0],agents:c$,startedAt:i?.startedAt??f$,...K$!=="running"?{endedAt:f$}:{},lastUpdate:f$,...l?.totalCost?{totalCost:l.totalCost}:{},...X0?{error:X0}:{},...l?.results.length?{steps:l.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$=RA(W$,$);if(Z$)return q2(Z$,_.context);if(i)P$("subagent.nested.started"),H0=!0;if(w&&_.chain){let t=await yA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(v&&_.tasks){let t=await PA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}if(x){let t=await bA(W$,$);return P$("subagent.nested.completed",t),q2(t,_.context)}}catch(Z$){let t=U4(_,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=nz(X);if(V.action)return J(Q,V,Y,z,H);if($.state.subagentInProgress===!0)return vA(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 J9 from"node:path";var gA=65536,hA=1048576,sZ=2097152;function tz($,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(J9.join(M,"events.jsonl")).size}catch(F){if(F.code==="ENOENT")return 0;throw F}},U=(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}},G=(M)=>{let F=J.cleanupTimers.get(M);if(!F)return;clearTimeout(F),J.cleanupTimers.delete(M)},K=(M)=>{G(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=J9.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>sZ;if(S)I=C.size-sZ;if(C.size<=I)return;let j=Math.min(C.size,I+sZ),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??K2(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>hA){q=[],f=0,b=!0;return}q.push(h),f+=h.length};while(k<j){let h=Math.min(gA,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{FZ(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??c0(F.asyncDir);if(j){let E=F.status;if(F.status=j.state,F.status!=="complete"&&F.status!=="failed"&&F.status!=="paused")G(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)))K(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))K(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??J9.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{FZ(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))K(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,U(R));if(F.length===0)return;if(W(),J.lastUiContext?.hasUI)H(J.lastUiContext)}}}import*as uA from"node:fs";import*as QH from"node:path";function aZ($){if(typeof $!=="string")return;let J=$.trim();return J.length>0?J:void 0}function tZ($){if(typeof $!=="number")return;return Number.isFinite($)?$:void 0}function Z9($,J){let Z=aZ($.id);if(Z)return`id:${Z}`;let Q=aZ($.sessionId)??"no-session",X=aZ($.agent)??"unknown",Y=tZ($.timestamp),z=tZ($.taskIndex),H=tZ($.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 mA($,J,Z){for(let[Q,X]of $.entries())if(J-X>Z)$.delete(Q)}function Q9($,J,Z,Q){if(mA($,Z,Q),$.has(J))return!0;return $.set(J,Z),!1}function ez($){let J=globalThis,Z=J[$];if(Z instanceof Map)return Z;let Q=new Map;return J[$]=Q,Q}var cA={setTimeout:($,J)=>setTimeout($,J),clearTimeout:($)=>clearTimeout($)};function $H($,J,Z=cA){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 nA=3000,dA=3000;function JH($,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 $3($){return typeof $==="object"&&$!==null&&"code"in $?$.code:void 0}function ZH($){return $3($)==="ENOENT"}function eZ($){let J=$3($);return J==="EMFILE"||J==="ENOSPC"}function oA($,J){try{return $.realpathSync.native(J)}catch{return J}}function XH($,J,Z,Q,X={}){let Y=X.fs??uA,z=X.timers??{setTimeout,clearTimeout,setInterval,clearInterval},H=async(W)=>{let O=QH.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=l2(JH(A.nestedChildren,O,"nestedChildren"));if(!M?.length&&!_)try{M=l2(v6(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=Z9(A,`result:${W}`);if(Q9(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=d6(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
|
-
|
|
233
|
-
|
|
234
|
-
${k}`:""}`:q,b=j.sessionFile??(T.length===1?A.sessionFile:void 0),y=JH(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=o6({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(ZH(A))return;console.error(`Failed to process subagent result file '${O}':`,A)}};J.resultFileCoalescer=$H((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(ZH(W))return;console.error(`Failed to scan subagent result directory '${Z}':`,W)}},U=(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 (${$3(W)??"unknown error"}).`),V(),J.watcherRestartTimer=z.setInterval(V,dA),J.watcherRestartTimer.unref?.()},G=()=>{if(J.watcherRestartTimer)return;J.watcherRestartTimer=z.setTimeout(()=>{J.watcherRestartTimer=null;try{Y.mkdirSync(Z,{recursive:!0}),K()}catch(W){if(eZ(W)){U(W);return}console.error(`Failed to restart subagent result watcher for '${Z}':`,W),G()}},nA),J.watcherRestartTimer.unref?.()},K=()=>{if(J.watcher)return;if(J.watcherRestartTimer)z.clearTimeout(J.watcherRestartTimer),z.clearInterval(J.watcherRestartTimer),J.watcherRestartTimer=null;try{let W=oA(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(eZ(O)){U(O);return}console.error(`Subagent result watcher failed for '${Z}':`,O),J.watcher?.close(),J.watcher=null,G()}),J.watcher.unref?.()}catch(W){if(eZ(W)){U(W);return}console.error(`Failed to start subagent result watcher for '${Z}':`,W),J.watcher=null,G()}};return{startResultWatcher:K,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 lA,randomUUID as pA}from"node:crypto";import*as X9 from"node:fs";import*as O4 from"node:path";var KH=O4.join(Y0,"scheduled-subagent-runs");var iA=2147483647,rA=300000,sA=20;function YH($){return $.scheduledRuns?.enabled===!0}function aA($,J,Z=KH){let Q=lA("sha256").update(`${O4.resolve($)}\x00${J}`).digest("hex").slice(0,20);return O4.join(Z,`${Q}.json`)}function tA($,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]),U=Number(X[5]),G=X[6]===void 0?0:Number(X[6]),K=X[7],B=K==="Z"?0:Number(K.slice(1,3)),W=K==="Z"?0:Number(K.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||U>59||G>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 zH($,J,Z){if(!X9.existsSync($))return{version:1,cwd:J,sessionId:Z,jobs:[]};let Q;try{Q=JSON.parse(X9.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 U=V;if(typeof U.id!=="string"||typeof U.name!=="string"||typeof U.schedule!=="string"||typeof U.cwd!=="string"||typeof U.sessionId!=="string")throw Error(`Scheduled subagent store '${$}' job ${H} has invalid string fields.`);if([U.runAt,U.createdAt,U.updatedAt].some((K)=>typeof K!=="number"||!Number.isFinite(K)||Number.isNaN(new Date(K).getTime())))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid timestamps.`);if(!U.state||!z.has(U.state))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid state.`);if(!U.params||typeof U.params!=="object"||Array.isArray(U.params))throw Error(`Scheduled subagent store '${$}' job ${H} has invalid params.`);Y.push(U)}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 zH(this.filePath,this.cwd,this.sessionId).jobs}get($){return this.list().find((J)=>J.id===$)}mutate($){let J=zH(this.filePath,this.cwd,this.sessionId),Z=$(J);return L0(this.filePath,J),Z}}function HH($){let J=$.scheduledRuns?.maxLatenessMs;return Number.isInteger(J)&&J>=0?J:rA}function eA($){let J=$.scheduledRuns?.maxPending;return Number.isInteger(J)&&J>=1?J:sA}function $_($){return $==="fired"||$==="canceled"||$==="missed"||$==="failed"}function VH($){if(($.chain?.length??0)>0)return"chain";if(($.tasks?.length??0)>0)return"parallel";return"single"}function J_($){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 I0($,J=!1){return{content:[{type:"text",text:$}],...J?{isError:!0}:{},details:{mode:"management",results:[]}}}function GH($,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 Z_($){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:U,chainName:G,config:K,schedule:B,scheduleName:W,...O}=$;return{params:{...O,async:!0,clarify:!1,context:"fresh"}}}class BH{store;ctx;timers=new Map;storeRoot;now;randomId;timersApi;deps;constructor($){this.deps=$,this.storeRoot=$.storeRoot??KH,this.now=$.now??Date.now,this.randomId=$.randomId??(()=>pA().slice(0,8)),this.timersApi=$.timers??globalThis}bindSession($){if(this.stopTimers(),this.ctx=$,!YH(this.deps.config)){this.store=void 0;return}let J=I1($.sessionManager);this.store=new UH(aA($.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(!YH(this.deps.config))return I0('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 I0("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 I0(`Unknown scheduled-run action: ${$.action}`,!0)}}catch(Z){let Q=Z instanceof Error?Z.message:String(Z);return I0(Q,!0)}}createJob($,J){let Z=this.requireStore(),Q=Z_($);if(Q.error)return I0(Q.error,!0);let X=$.schedule.trim(),Y=tA(X,this.now()),z=Z.list().filter((O)=>O.state==="scheduled"||O.state==="running").length,H=eA(this.deps.config);if(z>=H)return I0(`Scheduled subagent limit reached (${z}/${H} pending or running). Cancel an existing scheduled run before adding another.`,!0);let V=this.randomId(),U=I1(J.sessionManager),G=$.scheduleName?.trim(),K=Q.params,B=this.now(),W={id:V,name:G||J_(K),schedule:X,runAt:Y,state:"scheduled",createdAt:B,updatedAt:B,cwd:J.cwd,sessionId:U,params:K};return Z.mutate((O)=>{O.jobs.push(W)}),this.arm(W),I0([`Scheduled subagent run ${W.id}.`,`Name: ${W.name}`,`When: ${new Date(W.runAt).toISOString()}`,`Mode: ${VH(K)}`,"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(`
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
`).trim();if(Q.code===0)return{status:"ok",message:X||"Probe succeeded."};return{status:A_(z,Q.killed===!0),message:z||`Probe exited with code ${Q.code??"unknown"}.`}}function Q3($,J){if($<=1)return 0;return Math.max(0,Math.min($-1,Math.round(($-1)*J)))}function __($){return $==="quota"?{cheap:0,medium:0.3333333333333333,strong:0.6666666666666666}:{cheap:0.3333333333333333,medium:0.6666666666666666,strong:1}}function FH($,J){if($.length===0)throw Error("No provider models are available for profile generation.");let Z=J==="quota"&&$.length>1?$.slice(0,-1):$,Q=__(J);return{cheap:Z[Q3(Z.length,Q.cheap)].fullId,medium:Z[Q3(Z.length,Q.medium)].fullId,strong:Z[Q3(Z.length,Q.strong)].fullId}}function OH($){return z3($.observed.cost)}function M_($,J){let Z=OH($),Q=OH(J);if(Z===void 0||Q===void 0)return!1;if(Z>Q)return!1;if($.derived.profileRank<J.derived.profileRank)return!1;if(($.observed.reasoning===!0?1:0)<(J.observed.reasoning===!0?1:0))return!1;if(($.observed.contextWindow??0)<(J.observed.contextWindow??0))return!1;if(($.observed.maxTokens??0)<(J.observed.maxTokens??0))return!1;return Z<Q||$.derived.profileRank>J.derived.profileRank||$.observed.reasoning===!0&&J.observed.reasoning!==!0||($.observed.contextWindow??0)>(J.observed.contextWindow??0)||($.observed.maxTokens??0)>(J.observed.maxTokens??0)}function q_($){return $.filter((J,Z)=>!$.some((Q,X)=>X!==Z&&M_(Q,J)))}function AH($,J){return{subagents:{agentOverrides:{scout:{model:J.cheap},delegate:{model:J.cheap},planner:{model:J.medium},"context-builder":{model:J.medium},researcher:{model:J.medium},worker:{model:J.strong},reviewer:{model:J.strong},oracle:{model:J.strong}}}}}function L_($){return $.observed.availableInRegistry&&$.observed.probe.status!=="unavailable"&&$.observed.probe.status!=="auth"&&$.observed.probe.status!=="timeout"&&$.observed.probe.status!=="error"}function EH($){return $.derived.classificationSources.includes("heuristic-name")&&!$.derived.classificationSources.includes("official-metadata")}function N_(){return"Classification fell back to name heuristics."}function _H($){return $.models.filter(EH).length}function E_($){let J=H3();return T1.join(J,`${X_($)}.json`)}function CH(){return T1.join(b$(),"profiles","dm-subagents")}function C_(){return CH()}function H3(){let $=C_();return h0.mkdirSync($,{recursive:!0}),$}function T_(){return T1.join(CH(),"providers")}function j_(){let $=T_();return h0.mkdirSync($,{recursive:!0}),$}function TH($){return T1.join(j_(),`${Y3($)}.models.json`)}function z9(){let $=H3();return h0.readdirSync($,{withFileTypes:!0}).filter((J)=>J.isFile()&&J.name.endsWith(".json")).map((J)=>J.name.slice(0,-5)).sort((J,Z)=>J.localeCompare(Z))}function H9($){let J=E_($);if(!h0.existsSync(J))throw Error(`Profile not found: ${$}`);let Z=X3(J);return{filePath:J,profile:Y_(J,Z)}}function jH($){let{filePath:J,profile:Z}=H9($),Q=z_(),X=H_(Q);return X.subagents=Z.subagents,Y9(Q,X),{filePath:J,settingsPath:Q}}function f_($){let J=TH($);if(!h0.existsSync(J))return null;return X3(J)}function R_($,J=A4){let Z=Date.parse($.refreshedAt);if(!Number.isFinite(Z))return!0;let Q=J*24*60*60*1000;return Date.now()-Z>Q}async function V3($,J,Z,Q={}){let X=Y3(Z),Y=Q.maxAgeDays??A4,z=TH(X);if(!Q.force){let B=f_(X);if(B&&!R_(B,Y))return{filePath:z,catalog:B,reused:!0,heuristicFallbackCount:_H(B)}}let H=J.modelRegistry.getAvailable().filter((B)=>B.provider===X);if(H.length===0)throw Error(`No models found in the current registry for provider '${X}'.`);let V=[];for(let B of H){let W=B,O=`${W.provider}/${W.id}`,A=Q.probe===!1?{status:"skipped",message:"Live probing disabled."}:await NH($,J,O);V.push({rawModel:B,modelRecord:W,fullId:O,probe:A})}let U=K_(V.map(({modelRecord:B})=>({id:B.id,...typeof B.name==="string"?{name:B.name}:{},...typeof B.reasoning==="boolean"?{reasoning:B.reasoning}:{},...typeof B.contextWindow==="number"?{contextWindow:B.contextWindow}:{},...typeof B.maxTokens==="number"?{maxTokens:B.maxTokens}:{},...B.cost&&typeof B.cost==="object"?{cost:B.cost}:{}}))),G=[];for(let{rawModel:B,modelRecord:W,fullId:O,probe:A}of V){let L=O_({id:W.id,...typeof W.name==="string"?{name:W.name}:{},...typeof W.reasoning==="boolean"?{reasoning:W.reasoning}:{},...typeof W.contextWindow==="number"?{contextWindow:W.contextWindow}:{},...typeof W.maxTokens==="number"?{maxTokens:W.maxTokens}:{},...W.cost&&typeof W.cost==="object"?{cost:W.cost}:{}},U),_=L.classificationSources.includes("heuristic-name")&&!L.classificationSources.includes("official-metadata")?[N_()]:[];G.push({id:W.id,fullId:O,observed:{availableInRegistry:!0,...typeof W.name==="string"?{name:W.name}:{},...typeof W.reasoning==="boolean"?{reasoning:W.reasoning}:{},thinkingLevels:JJ(A0(B)).map((M)=>M),...typeof W.contextWindow==="number"?{contextWindow:W.contextWindow}:{},...typeof W.maxTokens==="number"?{maxTokens:W.maxTokens}:{},...W.cost&&typeof W.cost==="object"?{cost:W.cost}:{},probe:{status:A.status,checkedAt:new Date().toISOString(),...A.message?{message:A.message}:{}}},derived:L,warnings:_,notes:[]})}G.sort((B,W)=>B.derived.profileRank-W.derived.profileRank||B.fullId.localeCompare(W.fullId));let K={provider:X,refreshedAt:new Date().toISOString(),maxAgeDays:Y,sources:["runtime-registry",...Q.probe===!1?[]:["live-probe"],"heuristic-classifier"],models:G};return Y9(z,K),{filePath:z,catalog:K,reused:!1,heuristicFallbackCount:_H(K)}}async function fH($,J,Z,Q={}){let X=Y3(Z),{filePath:Y,catalog:z,heuristicFallbackCount:H}=await V3($,J,X,{maxAgeDays:Q.maxAgeDays,force:Q.forceRefresh,probe:Q.probe}),V=z.models.filter(L_),U=q_(V);if(U.length===0)throw Error(`Provider '${X}' has no usable models after filtering.`);let G=FH(U,"quota"),K=FH(U,"quality"),B=H3(),W=T1.join(B,`${X}.quota.json`),O=T1.join(B,`${X}.quality.json`);Y9(W,AH("quota",G)),Y9(O,AH("quality",K));let A=new Set([...Object.values(G),...Object.values(K)]),L=U.filter((_)=>A.has(_.fullId)&&EH(_)).length;return{quotaPath:W,qualityPath:O,catalogPath:Y,quotaModels:G,qualityModels:K,heuristicFallbackCount:H,selectedHeuristicFallbackCount:L}}async function RH($,J,Z){let{filePath:Q,profile:X}=H9(Z),Y=J.modelRegistry.getAvailable().map(A0),z=Object.entries(X.subagents.agentOverrides).filter(([,U])=>typeof U?.model==="string"&&U.model.trim()).map(([U,G])=>({agent:U,model:G.model.trim()})),H=new Map,V=[];for(let U of z){let G=S2(U.model,Y),{thinkingSuffix:K}=J2(U.model),B=G?`${G.fullId}${K}`:U.model,W=H.get(B);if(!W)W=await NH($,J,B),H.set(B,W);V.push({agent:U.agent,model:U.model,inRegistry:G!==void 0,probe:W})}return{profileName:Z,filePath:Q,results:V}}import*as G9 from"node:fs";import*as j1 from"node:path";import{fileURLToPath as y_}from"node:url";var D_=new Set(["chain-prompts","prompt-workflow","run","chain","parallel","run-chain","subagents-doctor","subagents-models"]);function S_(){return j1.resolve(j1.dirname(y_(import.meta.url)),"..","..","prompts")}function w_($){return[S_(),j1.join(b$(),"prompts"),j1.join(l$($),"prompts")]}function k_($){let J=[];for(let Z of w_($)){let Q;try{Q=G9.readdirSync(Z,{withFileTypes:!0})}catch{continue}for(let X of Q)if(X.isFile()&&X.name.endsWith(".md"))J.push(j1.join(Z,X.name))}return J}function I_($){return $.split(/\r?\n/).map((J)=>J.trim()).find(Boolean)??"Prompt workflow"}function h8($,J){let Z=$[J]?.trim();return Z?Z:void 0}function V9($,J){let Z=$[J]?.trim().toLowerCase();if(Z==="true"||Z==="yes"||Z==="1")return!0;if(Z==="false"||Z==="no"||Z==="0")return!1;return}function P_($){if(!$)return;if($==="false")return!1;let J=$.split(",").map((Z)=>Z.trim()).filter(Boolean);return J.length>1?J:J[0]}function b_($){let J=h8($,"subagent");if(!J||J==="true")return"delegate";return J}function x_($){let J=G9.readFileSync($,"utf-8"),{frontmatter:Z,body:Q}=Q2(J),X=j1.basename($,".md");if(!X||D_.has(X))return;let Y=h8(Z,"model"),z=P_(h8(Z,"skill")),H=h8(Z,"cwd"),V=h8(Z,"chain");return{name:X,description:h8(Z,"description")??I_(Q),body:Q,filePath:$,agent:b_(Z),...V9(Z,"inheritContext")===!0||V9(Z,"fork")===!0?{context:"fork"}:{},...V9(Z,"fresh")===!0?{context:"fresh"}:{},...Y?{model:Y}:{},...z!==void 0?{skill:z}:{},...H?{cwd:H}:{},...V9(Z,"worktree")===!0?{worktree:!0}:{},...V?{chain:V}:{}}}function yH($){let J=new Map;for(let Z of k_($)){let Q=x_(Z);if(Q)J.set(Q.name,Q)}return[...J.values()].sort((Z,Q)=>Z.name.localeCompare(Q.name))}function DH($){let J=[],Z="",Q,X=!1;for(let Y of $){if(X){Z+=Y,X=!1;continue}if(Y==="\\"){X=!0;continue}if(Q){if(Y===Q)Q=void 0;else Z+=Y;continue}if(Y==="'"||Y==='"'){Q=Y;continue}if(/\s/.test(Y)){if(Z)J.push(Z),Z="";continue}Z+=Y}if(Z)J.push(Z);return J}function v_($,J){let Z=J.join(" ");return $.replace(/\$ARGUMENTS/g,Z).replace(/\$@/g,Z).replace(/\$\{(\d+):-([^}]*)\}/g,(Q,X,Y)=>J[Number(X)-1]||Y).replace(/\$(\d+)/g,(Q,X)=>J[Number(X)-1]??"")}function SH($){let J=[],Z,Q=!1,X=!1,Y=!1,z=!1;for(let H=0;H<$.length;H++){let V=$[H];if(V==="--fork"){Q=!0;continue}if(V==="--fresh"){X=!0;continue}if(V==="--worktree"){Y=!0;continue}if(V==="--bg"||V==="--async"){z=!0;continue}if(V==="--subagent"){Z=$[++H];continue}let U=V.match(/^--subagent(?:=|:)(.+)$/);if(U){Z=U[1];continue}J.push(V)}return{args:J,agentOverride:Z,fork:Q,fresh:X,worktree:Y,bg:z}}function g_($){let J=$.indexOf(" -- ");if(J===-1)return{declaration:$.trim(),argsText:""};return{declaration:$.slice(0,J).trim(),argsText:$.slice(J+4).trim()}}function wH($){return $.split(" -> ").map((J)=>J.trim()).filter(Boolean)}function PH($,J,Z){let Q=v_($.body,J).trim(),X=Z.fork?"fork":Z.fresh?"fresh":$.context;return{agent:Z.agentOverride??$.agent,task:Q,clarify:!1,agentScope:"both",...X?{context:X}:{},...$.model?{model:$.model}:{},...$.skill!==void 0?{skill:$.skill}:{},...$.cwd?{cwd:$.cwd}:{},...Z.worktree||$.worktree?{worktree:!0}:{},...Z.bg?{async:!0}:{}}}function kH($,J,Z){let Q=PH($,J,Z);return{agent:Q.agent??"delegate",task:Q.task,...Q.model?{model:Q.model}:{},...Q.skill!==void 0?{skill:Q.skill}:{},...Q.cwd?{cwd:Q.cwd}:{}}}function G3($,J){return $.find((Z)=>Z.name===J)}function IH($){if($.length===0)return"No prompt workflows found in package, user, or project prompts.";return["Prompt workflows:",...$.map((J)=>`- ${J.name}: ${J.description} (${J.filePath})`)].join(`
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
`)}function nM($){return{text:OV($),...$.details?{details:$.details}:{},...$.isError?{isError:!0}:{}}}function dM($){if(!$.isError)return;throw new p$("execution_failed",OV($)||"Subagent RPC execution failed.")}function q3($,J){let Z=WV($,J),Q={};if(Z.id!==void 0)Q.id=Z.id;if(Z.runId!==void 0)Q.runId=Z.runId;if(Z.dir!==void 0)Q.dir=Z.dir;if(Z.index!==void 0)Q.index=Z.index;return Q}function oM($){if(!$)return{};return{cwd:$.cwd,sessionId:$.sessionManager.getSessionId()??void 0,sessionFile:$.sessionManager.getSessionFile()??null}}function AV($){return{version:L4,methods:[...L3],capabilities:{status:!0,asyncSpawn:!0,interrupt:!0,stop:!0},events:{ready:UV,request:KV,replyPrefix:BV},session:oM($)}}async function M3($,J,Z,Q,X){FV(X,`RPC ${Q} params`);let Y=new AbortController,z=await $.execute(`rpc-${Q}-${Z}`,X,Y.signal,void 0,J);return dM(z),nM(z)}function lM($){let J=WV($,"spawn");if(J.action!==void 0)throw new p$("invalid_params","RPC spawn does not accept management/control actions. Use status or interrupt RPC methods instead.");if(J.async===!1)throw new p$("invalid_params","RPC spawn only supports detached async launches; omit async or set async: true.");if(J.clarify===!0)throw new p$("invalid_params","RPC spawn cannot open the clarify UI; omit clarify or set clarify: false.");return{...J,async:!0,clarify:!1}}function pM($,J,Z){let Q=q3($,"stop");FV({action:"status",...Q},"RPC stop target params");let X=J.asyncDirRoot??d$,Y=J.resultsDir??w$,z;try{z=i2(Q,X,Y)}catch(B){throw new p$("invalid_params",B instanceof Error?B.message:String(B))}if(!z.asyncDir)throw new p$("not_found","Async run not found or already completed; stop requires a live async run directory.");let H=Z.sessionManager.getSessionId(),V=c0(z.asyncDir),U=V?.runId??z.resolvedId??GV.basename(z.asyncDir);if(!V)throw new p$("not_found",`Status file not found for async run '${U}'.`);if(!H||V.sessionId!==H)throw new p$("not_found",`Async run '${U}' was not found in the active session.`);let G;try{G=E0(z.asyncDir,{resultsDir:Y,kill:J.kill,now:J.now}).status}catch(B){throw new p$("execution_failed",B instanceof Error?B.message:String(B))}let K=G?.runId??U;if(!G)throw new p$("not_found",`Status file not found for async run '${K}'.`);if(G.sessionId!==H)throw new p$("not_found",`Async run '${K}' was not found in the active session.`);if(G.state!=="running")throw new p$("invalid_state",`Async run ${K} is ${G.state}; stop only supports running async runs.`);try{Wz({asyncDir:z.asyncDir,pid:G.pid,kill:J.kill,now:J.now,source:"rpc-stop"})}catch(B){throw new p$("execution_failed",B instanceof Error?B.message:String(B))}return{runId:K,asyncDir:z.asyncDir,previousState:G.state,state:"stopping",message:`Stop requested for async run ${K}.`}}async function iM($,J){let Z=J.getContext();if($.method==="ping")return AV(Z);if(!Z)throw new p$("no_active_session","No active extension context for subagent RPC.");if($.method==="spawn")return M3(J,Z,$.requestId,$.method,lM($.params));if($.method==="status")return M3(J,Z,$.requestId,$.method,{action:"status",...q3($.params,"status")});if($.method==="interrupt")return M3(J,Z,$.requestId,$.method,{action:"interrupt",...q3($.params,"interrupt")});if($.method==="stop")return pM($.params,J,Z);throw new p$("unsupported_method",`Unsupported subagent RPC method: ${String($.method)}`)}function rM($){if(!N4($))throw new p$("invalid_request","Subagent RPC request must be an object.");let J=uM($.requestId);if($.version!==L4)throw new p$("unsupported_version",`Unsupported subagent RPC version: ${String($.version)}.`);if(typeof $.method!=="string"||!L3.includes($.method))throw new p$("unsupported_method",`Unsupported subagent RPC method: ${String($.method)}.`);return{version:L4,requestId:J,method:$.method,...$.params!==void 0?{params:$.params}:{},...N4($.source)?{source:$.source}:{}}}function sM($){if(!N4($))return"unknown";let J=$.requestId;return typeof J==="string"&&J.trim().length>0&&!/[\r\n]/.test(J)?J:"unknown"}function aM($,J){let Z=sM($),Q=N4($)&&typeof $.method==="string"&&L3.includes($.method)?$.method:void 0,X=J instanceof p$?J:new p$("execution_failed",J instanceof Error?J.message:String(J));return{version:L4,requestId:Z,...Q?{method:Q}:{},success:!1,error:{code:X.code,message:X.message}}}function _V($){let J=$.events.on(KV,async(Z)=>{let Q;try{Q=rM(Z);let X=await iM(Q,$);$.events.emit(VV(Q.requestId),{version:L4,requestId:Q.requestId,method:Q.method,success:!0,data:X})}catch(X){let Y=aM(Q??Z,X);$.events.emit(VV(Y.requestId),Y)}});return{emitReady:(Z)=>{$.events.emit(UV,AV(Z??$.getContext()))},dispose:()=>{if(typeof J==="function")J()}}}var MV=["queued","running"],tM=1800000,eM=250,$q=1000,Jq=[e1,$2,Q8,T4];function Zq($,J){return new Promise((Z)=>{if(J?.aborted){Z();return}let Q=setTimeout(()=>{J?.removeEventListener("abort",X),Z()},$),X=()=>{clearTimeout(Q),Z()};J?.addEventListener("abort",X,{once:!0})})}function Qq($,J,Z){let Q=Z.sleep??Zq,X=Z.events;if(!X)return Q($,J);return new Promise((Y)=>{let z=!1,H=[],V=new AbortController,U=()=>{if(z)return;z=!0,V.abort(),J?.removeEventListener("abort",U);for(let G of H)try{G()}catch{}Y()};if(J?.aborted){U();return}J?.addEventListener("abort",U,{once:!0});for(let G of Jq)try{H.push(X.on(G,U))}catch{}Q($,V.signal).then(U)})}function qV($,J){return $.id===J||$.id.startsWith(J)}function q9($){return $.activityState==="needs_attention"}function N3($,J){let Z=J.asyncDirRoot??d$,Q=J.resultsDir??w$,X=p1(Z,{states:[...MV],sessionId:J.state.currentSessionId??void 0,resultsDir:Q,kill:J.kill,now:J.now});return $.id?X.filter((Y)=>qV(Y,$.id)):X}function Xq($,J,Z){return N3($,J).filter((Q)=>q9(Q)&&Z.has(Q.id))}function Yq($,J){let Z=J.asyncDirRoot??d$,Q=J.resultsDir??w$,X=p1(Z,{sessionId:J.state.currentSessionId??void 0,resultsDir:Q,kill:J.kill,now:J.now});return $.id?X.filter((Y)=>qV(Y,$.id)):X}function zq($){if($.length===0)return"";let J={complete:0,failed:0,paused:0};for(let Q of $)if(Q.state in J)J[Q.state]+=1;let Z=[];if(J.complete)Z.push(`${J.complete} complete`);if(J.failed)Z.push(`${J.failed} failed`);if(J.paused)Z.push(`${J.paused} paused`);return Z.join(", ")}function E2($,J=!1){return{content:[{type:"text",text:$}],...J?{isError:!0}:{},details:{mode:"management",results:[]}}}async function LV($,J,Z){let Q=Z.now??Date.now,X=Math.max(eM,Z.pollIntervalMs??$q),Y=$.timeoutMs!==void 0&&$.timeoutMs>0?$.timeoutMs:tM,z=Q(),H=$.id?!0:$.all===!0,V;try{V=N3($,Z)}catch(S){return E2(S instanceof Error?S.message:String(S),!0)}if(V.length===0){let S=$.id?`No active run matched "${$.id}". Nothing to wait for.`:"No active async runs in this session. Nothing to wait for.";return E2(S)}if($.id){let S=V.filter((j)=>j.id===$.id);if(S.length===1)V=S;else if(V.length>1)return E2(`Ambiguous async run id prefix "${$.id}" matched ${V.length} active runs: ${V.map((j)=>j.id).join(", ")}. Pass a longer id.`,!0)}let U=$.id?{...$,id:V[0].id}:$,G=new Set(V.map((S)=>S.id)),K=G.size,B=V.filter((S)=>!q9(S)),W=(S,j)=>{if(j.length>0)return!0;if(H)return S.every((k)=>!G.has(k.id));return S.filter((k)=>G.has(k.id)).length<K},O=V.filter((S)=>q9(S));while(!W(B,O)){if(J?.aborted){let S=B.map((j)=>`${j.id} (${j.state})`).join(", ");return E2(`Wait aborted after ${x$(Q()-z)}. Still active: ${S}.`,!0)}if(Q()-z>=Y){let S=B.map((j)=>`${j.id} (${j.state})`).join(", ");return E2(`Wait timed out after ${x$(Y)} with ${B.length} run(s) still active: ${S}. The runs are detached and keep going; call wait again or inspect with subagent({ action: "status" }).`,!0)}await Qq(X,J,Z);try{V=N3(U,Z),B=V.filter((S)=>!q9(S)),O=Xq(U,Z,G)}catch(S){return E2(S instanceof Error?S.message:String(S),!0)}}let A="",L=0;try{let j=Yq(U,Z).filter((E)=>!MV.includes(E.state)&&G.has(E.id));L=j.length,A=zq(j)}catch{}let _=O.length>0?` ${O.length} run(s) need attention: ${O.map((S)=>S.id).join(", ")} — inspect with subagent({ action: "status" }) then nudge/resume/interrupt.`:"",M=B.filter((S)=>G.has(S.id)).length,F=x$(Q()-z),R=A?` Outcome: ${A}.`:"";if(H){let S=$.id?`run "${$.id}"`:`${K} async run(s)`,j=O.length>0?"attention required":"done",E=O.length>0?"Relevant completion/control events have been observed; inspect status if the notification is not visible yet.":"Completion events have been observed; inspect status if the notification is not visible yet.";return E2(`Waited ${F} for ${S}; ${j}.${R}${_} ${E}`)}let C=M>0?` ${M} run(s) still in flight — call wait again to catch the next one.`:O.length>0?" No other runs are waitable until attention is handled.":" No runs remain in flight.",T=O.length>0&&L===0?`${O.length} of ${K} run(s) need attention`:`${L} of ${K} run(s) finished`,I=L>0?" Completion events for the finished run(s) have been observed; inspect status if the notification is not visible yet.":" Relevant control events have been observed; inspect status if the notification is not visible yet.";return E2(`Waited ${F}; ${T}.${R}${_}${C}${I}`)}var c8={enabled:!0,debounceMs:150,maxWaitMs:1000,stragglerDebounceMs:75,stragglerMaxWaitMs:400,stragglerWindowMs:2000};function R1($){if(typeof $!=="number"||!Number.isFinite($)||!Number.isInteger($)||$<1)return;return $}function EV($,J){return{enabled:typeof J?.enabled==="boolean"?J.enabled:typeof $?.enabled==="boolean"?$.enabled:c8.enabled,debounceMs:R1(J?.debounceMs)??R1($?.debounceMs)??c8.debounceMs,maxWaitMs:R1(J?.maxWaitMs)??R1($?.maxWaitMs)??c8.maxWaitMs,stragglerDebounceMs:R1(J?.stragglerDebounceMs)??R1($?.stragglerDebounceMs)??c8.stragglerDebounceMs,stragglerMaxWaitMs:R1(J?.stragglerMaxWaitMs)??R1($?.stragglerMaxWaitMs)??c8.stragglerMaxWaitMs,stragglerWindowMs:R1(J?.stragglerWindowMs)??R1($?.stragglerWindowMs)??c8.stragglerWindowMs}}var Hq={setTimeout:($,J)=>setTimeout($,J),clearTimeout:($)=>clearTimeout($)};function NV($){if($&&typeof $==="object"&&"unref"in $&&typeof $.unref==="function")$.unref()}function CV($){let J=$.timers??Hq,Z=$.now??Date.now,Q=$.config;if(!Q.enabled)return{push(K){$.emit([K])},flush(){},dispose(){}};let X=[],Y=null,z=null,H=!1,V=null,U=()=>{if(Y)J.clearTimeout(Y),Y=null;if(z)J.clearTimeout(z),z=null},G=()=>{if(U(),X.length===0)return;let K=X;X=[],V=Z(),$.emit(K)};return{push(K){if(X.length===0)H=V!==null&&Z()-V<Q.stragglerWindowMs;if(X.push(K),Y)J.clearTimeout(Y);let B=H?Q.stragglerDebounceMs:Q.debounceMs;if(Y=J.setTimeout(G,B),NV(Y),!z){let W=H?Q.stragglerMaxWaitMs:Q.maxWaitMs;z=J.setTimeout(G,W),NV(z)}},flush:G,dispose(){U(),X=[]}}}function jV($){if(!$.sessionValue)return;return $.sessionLabel?`${$.sessionLabel}: ${$.sessionValue}`:$.sessionValue}function Vq($){let J=jV($);return[`Background task ${$.status}: **${$.agent}**${$.taskInfo??""}`,"",$.resultPreview.trim()?$.resultPreview:"(no output)",J?"":void 0,J].filter((Z)=>Z!==void 0).join(`
|
|
269
|
-
|
|
270
|
-
`)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { keyText } from "@duckmind/dm-coding-agent";
|
|
6
|
+
import { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@duckmind/dm-tui";
|
|
7
|
+
import { discoverAgents } from "../agents/agents.js";
|
|
8
|
+
import { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from "../shared/artifacts.js";
|
|
9
|
+
import { resolveCurrentSessionId } from "../shared/session-identity.js";
|
|
10
|
+
import { cleanupOldChainDirs } from "../shared/settings.js";
|
|
11
|
+
import { clearLegacyResultAnimationTimer, renderWidget, renderSubagentResult } from "../tui/render.js";
|
|
12
|
+
import { SubagentParams, WaitParams } from "./schemas.js";
|
|
13
|
+
import { createSubagentExecutor } from "../runs/foreground/subagent-executor.js";
|
|
14
|
+
import { createAsyncJobTracker } from "../runs/background/async-job-tracker.js";
|
|
15
|
+
import { createResultWatcher } from "../runs/background/result-watcher.js";
|
|
16
|
+
import { createScheduledRunManager } from "../runs/background/scheduled-runs.js";
|
|
17
|
+
import { registerSlashCommands } from "../slash/slash-commands.js";
|
|
18
|
+
import { registerPromptTemplateDelegationBridge } from "../slash/prompt-template-bridge.js";
|
|
19
|
+
import { registerSlashSubagentBridge } from "../slash/slash-bridge.js";
|
|
20
|
+
import { createNativeSupervisorChannel } from "../intercom/native-supervisor-channel.js";
|
|
21
|
+
import { registerSubagentRpcBridge } from "./rpc.js";
|
|
22
|
+
import { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots } from "../slash/slash-live-state.js";
|
|
23
|
+
import { waitForSubagents } from "../runs/background/wait.js";
|
|
24
|
+
import registerSubagentNotify from "../runs/background/notify.js";
|
|
25
|
+
import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../runs/shared/dm-args.js";
|
|
26
|
+
import { formatDuration, shortenPath } from "../shared/formatters.js";
|
|
27
|
+
import { loadConfig } from "./config.js";
|
|
28
|
+
import { buildSubagentToolDescription } from "./tool-description.js";
|
|
29
|
+
import {
|
|
30
|
+
ASYNC_DIR,
|
|
31
|
+
DEFAULT_ARTIFACT_CONFIG,
|
|
32
|
+
RESULTS_DIR,
|
|
33
|
+
SLASH_RESULT_TYPE,
|
|
34
|
+
SLASH_TEXT_RESULT_TYPE,
|
|
35
|
+
SUBAGENT_ASYNC_COMPLETE_EVENT,
|
|
36
|
+
SUBAGENT_ASYNC_STARTED_EVENT,
|
|
37
|
+
SUBAGENT_CONTROL_EVENT,
|
|
38
|
+
WIDGET_KEY
|
|
39
|
+
} from "../shared/types.js";
|
|
40
|
+
import {
|
|
41
|
+
clearPendingForegroundControlNotices,
|
|
42
|
+
formatSubagentControlNotice,
|
|
43
|
+
handleSubagentControlNotice,
|
|
44
|
+
SUBAGENT_CONTROL_MESSAGE_TYPE
|
|
45
|
+
} from "./control-notices.js";
|
|
46
|
+
export { loadConfig } from "./config.js";
|
|
47
|
+
function getSubagentSessionRoot(parentSessionFile) {
|
|
48
|
+
if (parentSessionFile) {
|
|
49
|
+
const baseName = path.basename(parentSessionFile, ".jsonl");
|
|
50
|
+
const sessionsDir = path.dirname(parentSessionFile);
|
|
51
|
+
return path.join(sessionsDir, baseName);
|
|
52
|
+
}
|
|
53
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), "dm-subagent-session-"));
|
|
54
|
+
}
|
|
55
|
+
function expandTilde(p) {
|
|
56
|
+
return p.startsWith("~/") ? path.join(os.homedir(), p.slice(2)) : p;
|
|
57
|
+
}
|
|
58
|
+
function ensureAccessibleDir(dirPath) {
|
|
59
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
60
|
+
try {
|
|
61
|
+
fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);
|
|
62
|
+
} catch {
|
|
63
|
+
try {
|
|
64
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
65
|
+
} catch {}
|
|
66
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
67
|
+
fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function isSlashResultRunning(result) {
|
|
71
|
+
return result.details?.progress?.some((entry) => entry.status === "running") || result.details?.results.some((entry) => entry.progress?.status === "running") || false;
|
|
72
|
+
}
|
|
73
|
+
function subagentResultIsRunning(result) {
|
|
74
|
+
return result.details?.progress?.some((entry) => entry.status === "running") || result.details?.results.some((entry) => entry.progress?.status === "running") || false;
|
|
75
|
+
}
|
|
76
|
+
function ensureSubagentResultAnimation(context) {
|
|
77
|
+
const state = context.state;
|
|
78
|
+
if (state.subagentResultAnimationTimer)
|
|
79
|
+
return;
|
|
80
|
+
if (typeof context.invalidate !== "function")
|
|
81
|
+
return;
|
|
82
|
+
if (state.frame === undefined)
|
|
83
|
+
state.frame = 0;
|
|
84
|
+
state.subagentResultAnimationTimer = setInterval(() => {
|
|
85
|
+
state.frame = ((state.frame ?? 0) + 1) % 10;
|
|
86
|
+
try {
|
|
87
|
+
context.invalidate();
|
|
88
|
+
} catch {}
|
|
89
|
+
}, 80);
|
|
90
|
+
}
|
|
91
|
+
function isSlashResultError(result) {
|
|
92
|
+
return result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== "running") || false;
|
|
93
|
+
}
|
|
94
|
+
function isStaleExtensionContextError(error) {
|
|
95
|
+
return error instanceof Error && error.message.includes("Extension context no longer active");
|
|
96
|
+
}
|
|
97
|
+
function rebuildSlashResultContainer(container, result, options, theme) {
|
|
98
|
+
container.clear();
|
|
99
|
+
container.addChild(new Spacer(1));
|
|
100
|
+
const boxTheme = isSlashResultRunning(result) ? "toolPendingBg" : isSlashResultError(result) ? "toolErrorBg" : "toolSuccessBg";
|
|
101
|
+
const box = new Box(1, 1, (text) => theme.bg(boxTheme, text));
|
|
102
|
+
box.addChild(renderSubagentResult(result, options, theme));
|
|
103
|
+
container.addChild(box);
|
|
104
|
+
}
|
|
105
|
+
function createSlashResultComponent(details, options, theme) {
|
|
106
|
+
const container = new Container;
|
|
107
|
+
let lastVersion = -1;
|
|
108
|
+
container.render = (width) => {
|
|
109
|
+
const snapshot = getSlashRenderableSnapshot(details);
|
|
110
|
+
if (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {
|
|
111
|
+
lastVersion = snapshot.version;
|
|
112
|
+
rebuildSlashResultContainer(container, snapshot.result, options, theme);
|
|
113
|
+
}
|
|
114
|
+
return Container.prototype.render.call(container, width);
|
|
115
|
+
};
|
|
116
|
+
return container;
|
|
117
|
+
}
|
|
118
|
+
function parseSubagentNotifyContent(content) {
|
|
119
|
+
const lines = content.split(`
|
|
120
|
+
`);
|
|
121
|
+
const header = lines[0] ?? "";
|
|
122
|
+
const match = header.match(/^Background task (completed|failed|paused): \*\*(.+?)\*\*(?:\s+(\([^)]*\)))?$/);
|
|
123
|
+
if (!match)
|
|
124
|
+
return;
|
|
125
|
+
const body = lines.slice(2);
|
|
126
|
+
let sessionIndex = -1;
|
|
127
|
+
for (let i = body.length - 1;i >= 1; i--) {
|
|
128
|
+
if (body[i - 1]?.trim() === "" && /^(Session|Session file|Session share error):\s+/.test(body[i])) {
|
|
129
|
+
sessionIndex = i;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const sessionLine = sessionIndex >= 0 ? body[sessionIndex] : undefined;
|
|
134
|
+
const resultLines = sessionIndex >= 0 ? body.slice(0, sessionIndex) : body;
|
|
135
|
+
const resultPreview = resultLines.join(`
|
|
136
|
+
`).trim() || "(no output)";
|
|
137
|
+
let sessionLabel;
|
|
138
|
+
let sessionValue;
|
|
139
|
+
if (sessionLine) {
|
|
140
|
+
const separator = sessionLine.indexOf(":");
|
|
141
|
+
sessionLabel = sessionLine.slice(0, separator).toLowerCase();
|
|
142
|
+
sessionValue = sessionLine.slice(separator + 1).trim();
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
agent: match[2],
|
|
146
|
+
status: match[1],
|
|
147
|
+
...match[3] ? { taskInfo: match[3] } : {},
|
|
148
|
+
resultPreview,
|
|
149
|
+
...sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
class SubagentControlNoticeComponent {
|
|
154
|
+
details;
|
|
155
|
+
theme;
|
|
156
|
+
constructor(details, theme) {
|
|
157
|
+
this.details = details;
|
|
158
|
+
this.theme = theme;
|
|
159
|
+
}
|
|
160
|
+
invalidate() {}
|
|
161
|
+
render(width) {
|
|
162
|
+
const eventLabel = this.details.event.type.replaceAll("_", " ");
|
|
163
|
+
if (width < 3)
|
|
164
|
+
return [truncateToWidth(`Subagent ${eventLabel}`, width)];
|
|
165
|
+
const bodyWidth = Math.max(1, width - 2);
|
|
166
|
+
const borderChar = "─";
|
|
167
|
+
const header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;
|
|
168
|
+
const headerText = truncateToWidth(header, bodyWidth, "");
|
|
169
|
+
const headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));
|
|
170
|
+
const lines = [this.theme.fg("accent", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];
|
|
171
|
+
for (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {
|
|
172
|
+
const text = truncateToWidth(line, bodyWidth, "");
|
|
173
|
+
const padding = Math.max(0, bodyWidth - visibleWidth(text));
|
|
174
|
+
lines.push(this.theme.fg("accent", `│${text}${" ".repeat(padding)}│`));
|
|
175
|
+
}
|
|
176
|
+
lines.push(this.theme.fg("accent", `╰${borderChar.repeat(bodyWidth)}╯`));
|
|
177
|
+
return lines;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export default function registerSubagentExtension(pi) {
|
|
181
|
+
if (process.env[SUBAGENT_CHILD_ENV] === "1") {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const globalStore = globalThis;
|
|
185
|
+
const runtimeCleanupStoreKey = "__piSubagentRuntimeCleanup";
|
|
186
|
+
const previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];
|
|
187
|
+
if (typeof previousRuntimeCleanup === "function") {
|
|
188
|
+
try {
|
|
189
|
+
previousRuntimeCleanup();
|
|
190
|
+
} catch {}
|
|
191
|
+
}
|
|
192
|
+
ensureAccessibleDir(RESULTS_DIR);
|
|
193
|
+
ensureAccessibleDir(ASYNC_DIR);
|
|
194
|
+
cleanupOldChainDirs();
|
|
195
|
+
const config = loadConfig();
|
|
196
|
+
const asyncByDefault = config.asyncByDefault === true;
|
|
197
|
+
const tempArtifactsDir = getArtifactsDir(null);
|
|
198
|
+
cleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);
|
|
199
|
+
const state = {
|
|
200
|
+
baseCwd: "",
|
|
201
|
+
currentSessionId: null,
|
|
202
|
+
subagentInProgress: false,
|
|
203
|
+
subagentSpawns: { sessionId: null, count: 0 },
|
|
204
|
+
asyncJobs: new Map,
|
|
205
|
+
foregroundRuns: new Map,
|
|
206
|
+
foregroundControls: new Map,
|
|
207
|
+
lastForegroundControlId: null,
|
|
208
|
+
pendingForegroundControlNotices: new Map,
|
|
209
|
+
cleanupTimers: new Map,
|
|
210
|
+
lastUiContext: null,
|
|
211
|
+
poller: null,
|
|
212
|
+
completionSeen: new Map,
|
|
213
|
+
watcher: null,
|
|
214
|
+
watcherRestartTimer: null,
|
|
215
|
+
resultFileCoalescer: {
|
|
216
|
+
schedule: () => false,
|
|
217
|
+
clear: () => {}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const supervisorChannel = createNativeSupervisorChannel(pi, state);
|
|
221
|
+
const { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(pi, state, RESULTS_DIR, 10 * 60 * 1000);
|
|
222
|
+
startResultWatcher();
|
|
223
|
+
primeExistingResults();
|
|
224
|
+
const runtimeCleanup = () => {
|
|
225
|
+
stopResultWatcher();
|
|
226
|
+
scheduledRunManager.stop();
|
|
227
|
+
supervisorChannel.dispose();
|
|
228
|
+
clearPendingForegroundControlNotices(state);
|
|
229
|
+
if (state.poller) {
|
|
230
|
+
clearInterval(state.poller);
|
|
231
|
+
state.poller = null;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
globalStore[runtimeCleanupStoreKey] = runtimeCleanup;
|
|
235
|
+
const { ensurePoller, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR);
|
|
236
|
+
let executorExecute;
|
|
237
|
+
const scheduledRunManager = createScheduledRunManager({
|
|
238
|
+
config,
|
|
239
|
+
launch: (params, ctx, signal) => {
|
|
240
|
+
if (!executorExecute) {
|
|
241
|
+
return Promise.resolve({
|
|
242
|
+
content: [{ type: "text", text: "Scheduled subagent launch is unavailable (executor not ready)." }],
|
|
243
|
+
isError: true,
|
|
244
|
+
details: { mode: "management", results: [] }
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return executorExecute(randomUUID(), params, signal, undefined, ctx);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
const executor = createSubagentExecutor({
|
|
251
|
+
pi,
|
|
252
|
+
state,
|
|
253
|
+
config,
|
|
254
|
+
asyncByDefault,
|
|
255
|
+
handleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),
|
|
256
|
+
tempArtifactsDir,
|
|
257
|
+
getSubagentSessionRoot,
|
|
258
|
+
expandTilde,
|
|
259
|
+
discoverAgents
|
|
260
|
+
});
|
|
261
|
+
executorExecute = executor.execute;
|
|
262
|
+
pi.registerMessageRenderer(SLASH_RESULT_TYPE, (message, options, theme) => {
|
|
263
|
+
const details = resolveSlashMessageDetails(message.details);
|
|
264
|
+
if (!details)
|
|
265
|
+
return;
|
|
266
|
+
return createSlashResultComponent(details, options, theme);
|
|
267
|
+
});
|
|
268
|
+
pi.registerMessageRenderer(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {
|
|
269
|
+
const content = typeof message.content === "string" ? message.content : message.content.filter((entry) => entry.type === "text").map((entry) => entry.text).join(`
|
|
270
|
+
`);
|
|
271
|
+
return new Text(content, 0, 0);
|
|
272
|
+
});
|
|
273
|
+
pi.registerMessageRenderer("subagent-notify", (message, options, theme) => {
|
|
274
|
+
const content = typeof message.content === "string" ? message.content : "";
|
|
275
|
+
const details = message.details ?? parseSubagentNotifyContent(content);
|
|
276
|
+
if (!details)
|
|
277
|
+
return new Text(content, 0, 0);
|
|
278
|
+
const icon = details.status === "completed" ? theme.fg("success", "✓") : details.status === "paused" ? theme.fg("warning", "■") : theme.fg("error", "✗");
|
|
279
|
+
const parts = [];
|
|
280
|
+
if (details.taskInfo)
|
|
281
|
+
parts.push(details.taskInfo);
|
|
282
|
+
if (details.durationMs !== undefined)
|
|
283
|
+
parts.push(formatDuration(details.durationMs));
|
|
284
|
+
let text = `${icon} ${theme.bold(details.agent)} ${theme.fg("dim", details.status)}`;
|
|
285
|
+
if (parts.length > 0)
|
|
286
|
+
text += ` ${theme.fg("dim", "·")} ${parts.map((part) => theme.fg("dim", part)).join(` ${theme.fg("dim", "·")} `)}`;
|
|
287
|
+
const trimmedPreview = details.resultPreview.trim();
|
|
288
|
+
const previewLines = options.expanded ? trimmedPreview.split(`
|
|
289
|
+
`).filter((line) => line.trim()) : [trimmedPreview.split(`
|
|
290
|
+
`, 1)[0] ?? ""].filter((line) => line.trim());
|
|
291
|
+
for (const line of previewLines.length > 0 ? previewLines : ["(no output)"]) {
|
|
292
|
+
text += `
|
|
293
|
+
${theme.fg("dim", `⎿ ${line}`)}`;
|
|
294
|
+
}
|
|
295
|
+
if (!options.expanded && trimmedPreview.includes(`
|
|
296
|
+
`)) {
|
|
297
|
+
const expandKey = keyText("app.tools.expand");
|
|
298
|
+
text += `
|
|
299
|
+
${theme.fg("dim", `${expandKey} full notification`)}`;
|
|
300
|
+
}
|
|
301
|
+
if (details.sessionLabel && details.sessionValue) {
|
|
302
|
+
text += `
|
|
303
|
+
${theme.fg("muted", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;
|
|
304
|
+
}
|
|
305
|
+
return new Text(text, 0, 0);
|
|
306
|
+
});
|
|
307
|
+
pi.registerMessageRenderer(SUBAGENT_CONTROL_MESSAGE_TYPE, (message, _options, theme) => {
|
|
308
|
+
const details = message.details;
|
|
309
|
+
if (!details?.event)
|
|
310
|
+
return;
|
|
311
|
+
const content = typeof message.content === "string" ? message.content : undefined;
|
|
312
|
+
return new SubagentControlNoticeComponent({ ...details, noticeText: formatSubagentControlNotice(details, content) }, theme);
|
|
313
|
+
});
|
|
314
|
+
const executeSubagentCollapsed = (id, params, signal, onUpdate, ctx) => {
|
|
315
|
+
if (ctx.hasUI)
|
|
316
|
+
ctx.ui.setToolsExpanded(false);
|
|
317
|
+
return executor.execute(id, params, signal, onUpdate, ctx);
|
|
318
|
+
};
|
|
319
|
+
const slashBridge = registerSlashSubagentBridge({
|
|
320
|
+
events: pi.events,
|
|
321
|
+
getContext: () => state.lastUiContext,
|
|
322
|
+
execute: (id, params, signal, onUpdate, ctx) => executeSubagentCollapsed(id, params, signal, onUpdate, ctx)
|
|
323
|
+
});
|
|
324
|
+
const promptTemplateBridge = registerPromptTemplateDelegationBridge({
|
|
325
|
+
events: pi.events,
|
|
326
|
+
getContext: () => state.lastUiContext,
|
|
327
|
+
execute: async (requestId, request, signal, ctx, onUpdate) => {
|
|
328
|
+
if (request.tasks && request.tasks.length > 0) {
|
|
329
|
+
return executeSubagentCollapsed(requestId, {
|
|
330
|
+
tasks: request.tasks,
|
|
331
|
+
context: request.context,
|
|
332
|
+
cwd: request.cwd,
|
|
333
|
+
worktree: request.worktree,
|
|
334
|
+
async: false,
|
|
335
|
+
clarify: false
|
|
336
|
+
}, signal, onUpdate, ctx);
|
|
337
|
+
}
|
|
338
|
+
return executeSubagentCollapsed(requestId, {
|
|
339
|
+
agent: request.agent,
|
|
340
|
+
task: request.task,
|
|
341
|
+
context: request.context,
|
|
342
|
+
cwd: request.cwd,
|
|
343
|
+
model: request.model,
|
|
344
|
+
async: false,
|
|
345
|
+
clarify: false
|
|
346
|
+
}, signal, onUpdate, ctx);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
const rpcBridge = registerSubagentRpcBridge({
|
|
350
|
+
events: pi.events,
|
|
351
|
+
getContext: () => state.lastUiContext,
|
|
352
|
+
execute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx)
|
|
353
|
+
});
|
|
354
|
+
function effectiveParallelTaskCount(tasks) {
|
|
355
|
+
if (!tasks || tasks.length === 0)
|
|
356
|
+
return 0;
|
|
357
|
+
return tasks.reduce((total, task) => {
|
|
358
|
+
const count = typeof task.count === "number" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;
|
|
359
|
+
return total + count;
|
|
360
|
+
}, 0);
|
|
361
|
+
}
|
|
362
|
+
const tool = {
|
|
363
|
+
name: "subagent",
|
|
364
|
+
label: "Subagent",
|
|
365
|
+
description: buildSubagentToolDescription(config),
|
|
366
|
+
parameters: SubagentParams,
|
|
367
|
+
execute(id, params, signal, onUpdate, ctx) {
|
|
368
|
+
return executeSubagentCollapsed(id, params, signal, onUpdate, ctx);
|
|
369
|
+
},
|
|
370
|
+
renderCall(args, theme) {
|
|
371
|
+
if (args.action) {
|
|
372
|
+
const target = args.agent || args.chainName || "";
|
|
373
|
+
return new Text(`${theme.fg("toolTitle", theme.bold("subagent "))}${args.action}${target ? ` ${theme.fg("accent", target)}` : ""}`, 0, 0);
|
|
374
|
+
}
|
|
375
|
+
const isParallel = (args.tasks?.length ?? 0) > 0;
|
|
376
|
+
const parallelCount = effectiveParallelTaskCount(args.tasks);
|
|
377
|
+
const asyncLabel = args.async === true && args.clarify !== true ? theme.fg("warning", " [async]") : "";
|
|
378
|
+
if (args.chain?.length)
|
|
379
|
+
return new Text(`${theme.fg("toolTitle", theme.bold("subagent "))}chain (${args.chain.length})${asyncLabel}`, 0, 0);
|
|
380
|
+
if (isParallel)
|
|
381
|
+
return new Text(`${theme.fg("toolTitle", theme.bold("subagent "))}parallel (${parallelCount})${asyncLabel}`, 0, 0);
|
|
382
|
+
return new Text(`${theme.fg("toolTitle", theme.bold("subagent "))}${theme.fg("accent", args.agent || "?")}${asyncLabel}`, 0, 0);
|
|
383
|
+
},
|
|
384
|
+
renderResult(result, options, theme, context) {
|
|
385
|
+
if (subagentResultIsRunning(result)) {
|
|
386
|
+
ensureSubagentResultAnimation(context);
|
|
387
|
+
} else {
|
|
388
|
+
clearLegacyResultAnimationTimer(context);
|
|
389
|
+
}
|
|
390
|
+
const frame = context.state?.frame ?? 0;
|
|
391
|
+
return renderSubagentResult(result, options, theme, frame);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
pi.registerTool(tool);
|
|
395
|
+
const waitTool = {
|
|
396
|
+
name: "wait",
|
|
397
|
+
label: "Wait",
|
|
398
|
+
description: `Block until background (async) subagent runs started in this session finish, then return.
|
|
359
399
|
|
|
360
400
|
Use this after launching async subagents when you have no independent work left and must not end your turn — for example inside a skill that has to run to completion, or any non-interactive run (\`dm --print ...\`) where the whole task is a single turn and ending it would abandon the still-running children.
|
|
361
401
|
|
|
@@ -364,4 +404,126 @@ Use this after launching async subagents when you have no independent work left
|
|
|
364
404
|
• { id: "..." } — wait for one specific run (id or prefix) to finish.
|
|
365
405
|
• { timeoutMs: 600000 } — stop waiting after N ms (the runs keep going regardless; default 30 min)
|
|
366
406
|
|
|
367
|
-
wait also returns when a run needs attention (a child that went idle or blocked for a decision), not only on completion — so a stuck child never stalls the loop; the summary names the run(s) to inspect/nudge/resume/interrupt. It wakes the instant a completion or control event arrives (subscribed to DM's event bus, with a poll fallback that reconciles crashed runners), keeps the turn alive for normal notification delivery, and resolves early if the turn is aborted.`,
|
|
407
|
+
wait also returns when a run needs attention (a child that went idle or blocked for a decision), not only on completion — so a stuck child never stalls the loop; the summary names the run(s) to inspect/nudge/resume/interrupt. It wakes the instant a completion or control event arrives (subscribed to DM's event bus, with a poll fallback that reconciles crashed runners), keeps the turn alive for normal notification delivery, and resolves early if the turn is aborted.`,
|
|
408
|
+
parameters: WaitParams,
|
|
409
|
+
execute(_id, params, signal, _onUpdate, _ctx) {
|
|
410
|
+
return waitForSubagents(params, signal, { state, events: pi.events });
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
pi.registerTool(waitTool);
|
|
414
|
+
registerSlashCommands(pi, state);
|
|
415
|
+
const eventUnsubscribeStoreKey = "__piSubagentEventUnsubscribes";
|
|
416
|
+
const controlNoticeSeenStoreKey = "__piSubagentVisibleControlNotices";
|
|
417
|
+
const previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];
|
|
418
|
+
if (Array.isArray(previousEventUnsubscribes)) {
|
|
419
|
+
for (const unsubscribe of previousEventUnsubscribes) {
|
|
420
|
+
if (typeof unsubscribe !== "function")
|
|
421
|
+
continue;
|
|
422
|
+
try {
|
|
423
|
+
unsubscribe();
|
|
424
|
+
} catch {}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
registerSubagentNotify(pi, state, { batchConfig: config.completionBatch });
|
|
428
|
+
const existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];
|
|
429
|
+
const visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices : new Set;
|
|
430
|
+
globalStore[controlNoticeSeenStoreKey] = visibleControlNotices;
|
|
431
|
+
const controlEventHandler = (payload) => {
|
|
432
|
+
handleSubagentControlNotice({
|
|
433
|
+
pi,
|
|
434
|
+
state,
|
|
435
|
+
visibleControlNotices,
|
|
436
|
+
details: payload
|
|
437
|
+
});
|
|
438
|
+
};
|
|
439
|
+
const eventUnsubscribes = [
|
|
440
|
+
pi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),
|
|
441
|
+
pi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),
|
|
442
|
+
pi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),
|
|
443
|
+
rpcBridge.dispose
|
|
444
|
+
];
|
|
445
|
+
globalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;
|
|
446
|
+
pi.on("tool_result", (event, ctx) => {
|
|
447
|
+
if (event.toolName !== "subagent")
|
|
448
|
+
return;
|
|
449
|
+
if (!ctx.hasUI)
|
|
450
|
+
return;
|
|
451
|
+
state.lastUiContext = ctx;
|
|
452
|
+
if (state.asyncJobs.size > 0) {
|
|
453
|
+
renderWidget(ctx, Array.from(state.asyncJobs.values()));
|
|
454
|
+
ctx.ui.requestRender?.();
|
|
455
|
+
ensurePoller();
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
const cleanupSessionArtifacts = (ctx) => {
|
|
459
|
+
try {
|
|
460
|
+
const sessionFile = ctx.sessionManager.getSessionFile();
|
|
461
|
+
if (sessionFile) {
|
|
462
|
+
cleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);
|
|
463
|
+
}
|
|
464
|
+
} catch {}
|
|
465
|
+
};
|
|
466
|
+
const resetSessionState = (ctx) => {
|
|
467
|
+
state.baseCwd = ctx.cwd;
|
|
468
|
+
state.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);
|
|
469
|
+
state.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };
|
|
470
|
+
if (!process.env[SUBAGENT_CHILD_ENV]) {
|
|
471
|
+
const sessionId = ctx.sessionManager.getSessionId();
|
|
472
|
+
if (sessionId) {
|
|
473
|
+
process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
state.lastUiContext = ctx;
|
|
477
|
+
cleanupSessionArtifacts(ctx);
|
|
478
|
+
clearPendingForegroundControlNotices(state);
|
|
479
|
+
resetJobs(ctx);
|
|
480
|
+
restoreActiveJobs(ctx);
|
|
481
|
+
scheduledRunManager.bindSession(ctx);
|
|
482
|
+
restoreSlashFinalSnapshots(ctx.sessionManager.getEntries());
|
|
483
|
+
primeExistingResults();
|
|
484
|
+
};
|
|
485
|
+
pi.on("session_start", (_event, ctx) => {
|
|
486
|
+
resetSessionState(ctx);
|
|
487
|
+
rpcBridge.emitReady(ctx);
|
|
488
|
+
supervisorChannel.start();
|
|
489
|
+
});
|
|
490
|
+
pi.on("session_shutdown", () => {
|
|
491
|
+
delete process.env[SUBAGENT_PARENT_SESSION_ENV];
|
|
492
|
+
for (const unsubscribe of eventUnsubscribes) {
|
|
493
|
+
try {
|
|
494
|
+
unsubscribe();
|
|
495
|
+
} catch {}
|
|
496
|
+
}
|
|
497
|
+
if (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {
|
|
498
|
+
delete globalStore[eventUnsubscribeStoreKey];
|
|
499
|
+
}
|
|
500
|
+
stopResultWatcher();
|
|
501
|
+
scheduledRunManager.stop();
|
|
502
|
+
if (state.poller)
|
|
503
|
+
clearInterval(state.poller);
|
|
504
|
+
state.poller = null;
|
|
505
|
+
clearPendingForegroundControlNotices(state);
|
|
506
|
+
for (const timer of state.cleanupTimers.values()) {
|
|
507
|
+
clearTimeout(timer);
|
|
508
|
+
}
|
|
509
|
+
state.cleanupTimers.clear();
|
|
510
|
+
state.asyncJobs.clear();
|
|
511
|
+
clearSlashSnapshots();
|
|
512
|
+
slashBridge.cancelAll();
|
|
513
|
+
slashBridge.dispose();
|
|
514
|
+
promptTemplateBridge.cancelAll();
|
|
515
|
+
promptTemplateBridge.dispose();
|
|
516
|
+
supervisorChannel.dispose();
|
|
517
|
+
if (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {
|
|
518
|
+
delete globalStore[runtimeCleanupStoreKey];
|
|
519
|
+
}
|
|
520
|
+
try {
|
|
521
|
+
if (state.lastUiContext?.hasUI) {
|
|
522
|
+
state.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);
|
|
523
|
+
}
|
|
524
|
+
} catch (error) {
|
|
525
|
+
if (!isStaleExtensionContextError(error))
|
|
526
|
+
throw error;
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|