@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.
Files changed (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1,8 +1,851 @@
1
- import{randomUUID as M$}from"node:crypto";import*as Y from"node:fs";import*as O from"node:path";import*as S from"node:os";import*as y from"node:path";function N($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function z$($){let J=$?.env??process.env,j=$&&Object.hasOwn($,"getuid")?$.getuid:process.getuid?.bind(process);if(typeof j==="function")return`uid-${j()}`;for(let X of["USERNAME","USER","LOGNAME"]){let K=J[X];if(K)return`user-${N(K)}`}let Z=$&&Object.hasOwn($,"userInfo")?$.userInfo:S.userInfo;try{let X=Z?.().username;if(X)return`user-${N(X)}`}catch{}let Q=J.USERPROFILE??J.HOME;if(Q)return`home-${N(Q)}`;let f=$&&Object.hasOwn($,"homedir")?$.homedir:S.homedir;try{let X=f?.();if(X)return`home-${N(X)}`}catch{}return"shared"}var L=y.join(S.tmpdir(),`dm-subagents-${z$()}`),t=y.join(L,"async-subagent-results"),e=y.join(L,"async-subagent-runs"),C$=y.join(L,"chain-runs"),t$=y.join(L,"artifacts");import*as J$ from"node:path";var _$=128,E$=4;function g($){return typeof $==="string"&&$.length>0&&$.length<=_$&&!J$.isAbsolute($)&&!$.includes("/")&&!$.includes("\\")&&!$.includes("..")}function $$($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function j$($,J){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function h($){if(!Array.isArray($))return[];return $.map((J)=>{if(!J||typeof J!=="object")return;let j=J;if(!g(j.runId))return;return{runId:j.runId,...$$(j.stepIndex)!==void 0?{stepIndex:$$(j.stepIndex)}:{},...j$(j.agent,128)?{agent:j$(j.agent,128)}:{}}}).filter((J)=>Boolean(J)).slice(0,E$)}function m($){if(!$)return[];try{return h(JSON.parse($))}catch{return[]}}import*as M from"node:path";import{fileURLToPath as Z$}from"node:url";import*as V from"node:os";import*as U from"node:path";var _j=U.join(V.homedir(),".config","mcp","mcp.json"),Ej={cursor:[U.join(V.homedir(),".cursor","mcp.json")],"claude-code":[U.join(V.homedir(),".claude","mcp.json"),U.join(V.homedir(),".claude.json"),U.join(V.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[U.join(V.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[U.join(V.homedir(),".codex","config.json")],windsurf:[U.join(V.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};import{Compile as Rj}from"typebox/compile";function Q$($,J){let j=Z$($),Z=M.extname(j),Q=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(Z)?Z:".ts";return M.join(M.dirname(j),`${J}${Q}`)}function f$($){return M.basename(Z$($)).startsWith("dm-args.")}function R$($=import.meta.url){let J=f$($)?"subagent-prompt-runtime":M.join("..","runs","shared","subagent-prompt-runtime");return Q$($,J)}function b$($=import.meta.url){let J=f$($)?M.join("..","..","extension","fanout-child"):"fanout-child";return Q$($,J)}var dj=R$(),oj=b$();var n="DM_SUBAGENT_PARENT_EVENT_SINK",d="DM_SUBAGENT_PARENT_CONTROL_INBOX",o="DM_SUBAGENT_PARENT_ROOT_RUN_ID",W$="DM_SUBAGENT_PARENT_RUN_ID",O$="DM_SUBAGENT_PARENT_CHILD_INDEX",X$="DM_SUBAGENT_PARENT_DEPTH",B$="DM_SUBAGENT_PARENT_PATH",p="DM_SUBAGENT_PARENT_CAPABILITY_TOKEN";import*as D$ from"node:fs";import*as C from"node:path";var I$=[10,25,50,100,200,500,1000,2000,4000],N$=new Set(["EACCES","EBUSY","EPERM"]),K$=typeof SharedArrayBuffer<"u"?new SharedArrayBuffer(4):void 0,Y$=K$?new Int32Array(K$):void 0;function x$($){if($<=0)return;if(Y$)try{Atomics.wait(Y$,0,0,$);return}catch{}let J=Date.now()+$;while(Date.now()<J);}function P$($){let J=$?.code;return typeof J==="string"&&N$.has(J)}function w$($,J,j,Z,Q){for(let f=0;;f++)try{$.renameSync(J,j);return}catch(X){let K=Z[f];if(K===void 0||!P$(X))throw X;Q(K)}}function v$($={}){let J=$.fs??D$,j=$.now??Date.now,Z=$.pid??process.pid,Q=$.random??Math.random,X=$.retryRenameErrors??process.platform==="win32"?$.retryDelaysMs??I$:[],K=$.wait??x$;return(q,z)=>{J.mkdirSync(C.dirname(q),{recursive:!0});let T=C.join(C.dirname(q),`.${C.basename(q)}.${Z}.${j()}.${Q().toString(36).slice(2)}.tmp`);try{J.writeFileSync(T,JSON.stringify(z,null,2),"utf-8"),w$(J,T,q,X,K)}finally{J.rmSync(T,{force:!0})}}}var q$=v$();var F=O.join(L,"nested-subagent-events"),D="route.json",k$="registry.json",E=65536,u=12,b=16,x=3;function A($){return g($)}function c$($,J){if(!A(J))throw Error(`${$} must be a non-empty safe id token.`)}function G($,J){c$($,J)}function _($,J){let j=O.resolve($),Z=O.resolve(J);return Z===j||Z.startsWith(`${j}${O.sep}`)}function i($){return O.dirname(O.resolve($.eventSink))}function H($){if(G("rootRunId",$.rootRunId),G("capabilityToken",$.capabilityToken),!_(F,$.eventSink))throw Error("Nested event sink is outside the subagent nested event root.");if(!_(F,$.controlInbox))throw Error("Nested control inbox is outside the subagent nested event root.");if(i($)!==O.dirname(O.resolve($.controlInbox)))throw Error("Nested event sink and control inbox must share one route root.")}function tj($){G("rootRunId",$);let J=M$(),j=O.join(F,`${$}-${J}`),Z=O.join(j,"events"),Q=O.join(j,"controls");return Y.mkdirSync(Z,{recursive:!0,mode:448}),Y.mkdirSync(Q,{recursive:!0,mode:448}),Y.writeFileSync(O.join(j,D),`${JSON.stringify({rootRunId:$,capabilityToken:J,createdAt:Date.now()})}
2
- `,{mode:384}),{rootRunId:$,eventSink:Z,controlInbox:Q,capabilityToken:J}}function g$($=process.env){let J=$[o],j=$[n],Z=$[d],Q=$[p];if(!J||!j||!Z||!Q)return;let f={rootRunId:J,eventSink:j,controlInbox:Z,capabilityToken:Q};H(f);let X=O.join(i(f),D),K=JSON.parse(Y.readFileSync(X,"utf-8"));if(K.rootRunId!==J||K.capabilityToken!==Q)throw Error("Nested event route metadata does not match the provided root id and capability token.");return f}function ej($=process.env){try{return g$($)}catch(J){console.error("Ignoring invalid nested subagent event route:",J);return}}function $J($=process.env){let J=$[W$];if(!A(J))return;let j=$[O$],Z=j&&/^\d+$/.test(j)?Number(j):void 0,Q=Math.min(Math.max(1,W(Number($[X$]))??1),x),f=m($[B$]),X=f.length?f:[{runId:J,...Z!==void 0?{stepIndex:Z}:{}}];return{parentRunId:J,...Z!==void 0?{parentStepIndex:Z}:{},depth:Q,path:X}}function jJ($,J){if(!J.asyncDir)return;let j=O.resolve(J.asyncDir),Z=O.resolve(L,"nested-subagent-runs",$,J.id),Q=O.relative(Z,j);return j===Z||!Q.startsWith("..")&&!O.isAbsolute(Q)?j:void 0}function W($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function B($,J=512){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function h$($){if(!$||typeof $!=="object")return;let J=$,j=W(J.input),Z=W(J.output),Q=W(J.total);return j!==void 0&&Z!==void 0&&Q!==void 0?{input:j,output:Z,total:Q}:void 0}function m$($){if(!$||typeof $!=="object")return;let J=$,j=W(J.inputTokens),Z=W(J.outputTokens),Q=W(J.costUsd);return j!==void 0&&Z!==void 0&&Q!==void 0?{inputTokens:j,outputTokens:Z,costUsd:Q}:void 0}function P($){if(!$||typeof $!=="object")return;let J=$,j=W(J.maxTurns),Z=W(J.graceTurns),Q=W(J.turnCount),f=J.outcome==="within-budget"||J.outcome==="wrap-up-requested"||J.outcome==="exceeded"?J.outcome:void 0;if(j===void 0||Z===void 0||Q===void 0||!f)return;return{maxTurns:j,graceTurns:Z,turnCount:Q,outcome:f,...W(J.wrapUpRequestedAtTurn)!==void 0?{wrapUpRequestedAtTurn:W(J.wrapUpRequestedAtTurn)}:{},...W(J.exceededAtTurn)!==void 0?{exceededAtTurn:W(J.exceededAtTurn)}:{}}}function n$($,J){return $==="queued"||$==="running"||$==="complete"||$==="failed"||$==="paused"?$:J}function d$($,J){if(!$||typeof $!=="object")return;let j=$,Z=B(j.agent,128);if(!Z)return;let Q=j.status==="pending"||j.status==="running"||j.status==="complete"||j.status==="completed"||j.status==="failed"||j.status==="paused"?j.status:"pending";return{agent:Z,status:Q,...B(j.sessionFile,2048)?{sessionFile:B(j.sessionFile,2048)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...W(j.lastActivityAt)!==void 0?{lastActivityAt:W(j.lastActivityAt)}:{},...B(j.currentTool,128)?{currentTool:B(j.currentTool,128)}:{},...W(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:W(j.currentToolStartedAt)}:{},...B(j.currentPath,2048)?{currentPath:B(j.currentPath,2048)}:{},...W(j.turnCount)!==void 0?{turnCount:W(j.turnCount)}:{},...W(j.toolCount)!==void 0?{toolCount:W(j.toolCount)}:{},...W(j.startedAt)!==void 0?{startedAt:W(j.startedAt)}:{},...W(j.endedAt)!==void 0?{endedAt:W(j.endedAt)}:{},...B(j.error,1024)?{error:B(j.error,1024)}:{},...j.timedOut===!0?{timedOut:!0}:{},...P(j.turnBudget)?{turnBudget:P(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...J<x&&Array.isArray(j.children)?{children:j.children.map((f)=>v(f,J+1)).filter((f)=>Boolean(f)).slice(0,b)}:{}}}function v($,J=0){if(!$||typeof $!=="object")return;let j=$;if(!A(j.id)||!A(j.parentRunId))return;let Z=h(j.path),Q=Array.isArray(j.steps)?j.steps.map((K)=>d$(K,J+1)).filter((K)=>Boolean(K)).slice(0,u):void 0,f=h$(j.totalTokens),X=m$(j.totalCost);return{id:j.id,parentRunId:j.parentRunId,...W(j.parentStepIndex)!==void 0?{parentStepIndex:W(j.parentStepIndex)}:{},...B(j.parentAgent,128)?{parentAgent:B(j.parentAgent,128)}:{},depth:Math.min(Math.max(0,W(j.depth)??0),x),path:Z,state:n$(j.state,"running"),...B(j.asyncDir,2048)?{asyncDir:B(j.asyncDir,2048)}:{},...W(j.pid)!==void 0&&W(j.pid)>0&&Number.isInteger(W(j.pid))?{pid:W(j.pid)}:{},...B(j.sessionId,256)?{sessionId:B(j.sessionId,256)}:{},...B(j.sessionFile,2048)?{sessionFile:B(j.sessionFile,2048)}:{},...B(j.intercomTarget,256)?{intercomTarget:B(j.intercomTarget,256)}:{},...B(j.ownerIntercomTarget,256)?{ownerIntercomTarget:B(j.ownerIntercomTarget,256)}:{},...B(j.leafIntercomTarget,256)?{leafIntercomTarget:B(j.leafIntercomTarget,256)}:{},...j.ownerState==="live"||j.ownerState==="gone"||j.ownerState==="unknown"?{ownerState:j.ownerState}:{},...B(j.controlInbox,2048)?{controlInbox:B(j.controlInbox,2048)}:{},...B(j.capabilityToken,128)?{capabilityToken:B(j.capabilityToken,128)}:{},...j.mode==="single"||j.mode==="parallel"||j.mode==="chain"?{mode:j.mode}:{},...B(j.agent,128)?{agent:B(j.agent,128)}:{},...Array.isArray(j.agents)?{agents:j.agents.map((K)=>B(K,128)).filter((K)=>Boolean(K)).slice(0,u)}:{},...W(j.currentStep)!==void 0?{currentStep:W(j.currentStep)}:{},...W(j.chainStepCount)!==void 0?{chainStepCount:W(j.chainStepCount)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...W(j.lastActivityAt)!==void 0?{lastActivityAt:W(j.lastActivityAt)}:{},...B(j.currentTool,128)?{currentTool:B(j.currentTool,128)}:{},...W(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:W(j.currentToolStartedAt)}:{},...B(j.currentPath,2048)?{currentPath:B(j.currentPath,2048)}:{},...W(j.turnCount)!==void 0?{turnCount:W(j.turnCount)}:{},...W(j.toolCount)!==void 0?{toolCount:W(j.toolCount)}:{},...f?{totalTokens:f}:{},...X?{totalCost:X}:{},...W(j.startedAt)!==void 0?{startedAt:W(j.startedAt)}:{},...W(j.endedAt)!==void 0?{endedAt:W(j.endedAt)}:{},...W(j.lastUpdate)!==void 0?{lastUpdate:W(j.lastUpdate)}:{},...W(j.timeoutMs)!==void 0?{timeoutMs:W(j.timeoutMs)}:{},...W(j.deadlineAt)!==void 0?{deadlineAt:W(j.deadlineAt)}:{},...j.timedOut===!0?{timedOut:!0}:{},...P(j.turnBudget)?{turnBudget:P(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...B(j.error,1024)?{error:B(j.error,1024)}:{},...Q&&Q.length>0?{steps:Q}:{},...J<x&&Array.isArray(j.children)?{children:j.children.map((K)=>v(K,J+1)).filter((K)=>Boolean(K)).slice(0,b)}:{}}}function r($,J){if(Buffer.byteLength($,"utf-8")>E)return;let j;try{j=JSON.parse($)}catch{return}if(!j||typeof j!=="object")return;let Z=j;if(Z.type!=="subagent.nested.started"&&Z.type!=="subagent.nested.updated"&&Z.type!=="subagent.nested.completed")return;if(Z.rootRunId!==J.rootRunId||Z.capabilityToken!==J.capabilityToken)return;if(!A(Z.parentRunId))return;let Q=W(Z.ts);if(Q===void 0)return;let f=v(Z.child);if(!f||f.id===J.rootRunId)return;let X={...f,controlInbox:J.controlInbox,capabilityToken:J.capabilityToken,ownerState:f.ownerState??"unknown"};return{type:Z.type,ts:Q,rootRunId:J.rootRunId,parentRunId:Z.parentRunId,...W(Z.parentStepIndex)!==void 0?{parentStepIndex:W(Z.parentStepIndex)}:{},capabilityToken:J.capabilityToken,child:X}}function o$($,J){if(!$.includes(`
3
- `)){let j=r($.trim(),J);return j?[j]:[]}return $.split(`
4
- `).slice(0,$.endsWith(`
5
- `)?void 0:-1).map((j)=>j.trim()?r(j,J):void 0).filter((j)=>Boolean(j))}function R($){return $==="complete"||$==="failed"||$==="paused"}function G$($,J){let j=J.type==="subagent.nested.completed"&&J.child.state==="running"?"complete":J.child.state,Z={...J.child,state:j,lastUpdate:J.child.lastUpdate??J.ts};if(!$)return Z;let Q=$.lastUpdate??0,f=Z.lastUpdate??J.ts;if(f<Q)return $;if(R($.state)&&!R(Z.state))return $;if(R($.state)&&R(Z.state)&&f===Q)return $;return{...$,...Z,state:Z.state,lastUpdate:Math.max(Q,f)}}function p$($,J){let j=!1,Z=(K)=>K.map((q)=>{if(q.id===J.parentRunId){let T=q.children??[],I=T.findIndex((c)=>c.id===J.child.id),a=G$(I>=0?T[I]:void 0,J),A$=I>=0?T.map((c,T$)=>T$===I?a:c):[...T,a];return j=!0,{...q,children:A$.slice(0,b),lastUpdate:Math.max(q.lastUpdate??0,J.ts)}}if(!q.children?.length)return q;let z=Z(q.children);return z===q.children?q:{...q,children:z}}),Q=Z($);if(j)return Q;let f=Q.findIndex((K)=>K.id===J.child.id),X=G$(f>=0?Q[f]:void 0,J);return f>=0?Q.map((K,q)=>q===f?X:K):[...Q,X].slice(0,b)}function u$($,J){return{...$,updatedAt:Math.max($.updatedAt,J.ts),children:p$($.children,J)}}function L$($){return O.join(i($),k$)}function r$($){G("rootRunId",$);let J;try{J=Y.readdirSync(F)}catch(j){if(j.code==="ENOENT")return;throw j}for(let j of J){if(!j.startsWith(`${$}-`))continue;let Z=O.join(F,j);try{let Q=JSON.parse(Y.readFileSync(O.join(Z,D),"utf-8"));if(Q.rootRunId!==$||typeof Q.capabilityToken!=="string")continue;let f={rootRunId:$,eventSink:O.join(Z,"events"),controlInbox:O.join(Z,"controls"),capabilityToken:Q.capabilityToken};return H(f),f}catch{continue}}return}function JJ(){let $;try{$=Y.readdirSync(F)}catch(j){if(j.code==="ENOENT")return new Map;throw j}let J=new Map;for(let j of $){let Z=O.join(F,j);try{let Q=JSON.parse(Y.readFileSync(O.join(Z,D),"utf-8"));if(typeof Q.rootRunId!=="string"||typeof Q.capabilityToken!=="string")continue;if(J.has(Q.rootRunId))continue;let f={rootRunId:Q.rootRunId,eventSink:O.join(Z,"events"),controlInbox:O.join(Z,"controls"),capabilityToken:Q.capabilityToken};H(f),J.set(Q.rootRunId,f)}catch{continue}}return J}function ZJ($){let J=r$($);return J?k(J):void 0}function H$($,J){if(!$?.length)return;for(let j of $){if(j.id===J)return j;let Z=H$(j.children,J)??H$(j.steps?.flatMap((Q)=>Q.children??[]),J);if(Z)return Z}return}function w($,J=[]){for(let j of $??[])J.push(j),w(j.children,J),w(j.steps?.flatMap((Z)=>Z.children??[]),J);return J}function l($,J,j=[]){if(!J)return w($,j);for(let Z of $??[]){if(Z.parentRunId===J.parentRunId&&(J.parentStepIndex===void 0||Z.parentStepIndex===J.parentStepIndex)){w([Z],j);continue}l(Z.children,J,j),l(Z.steps?.flatMap((Q)=>Q.children??[]),J,j)}return j}function l$(){let $;try{$=Y.readdirSync(F)}catch(j){if(j.code==="ENOENT")return[];throw j}let J=[];for(let j of $){let Z=O.join(F,j);try{let Q=JSON.parse(Y.readFileSync(O.join(Z,D),"utf-8"));if(typeof Q.rootRunId!=="string"||typeof Q.capabilityToken!=="string")continue;let f={rootRunId:Q.rootRunId,eventSink:O.join(Z,"events"),controlInbox:O.join(Z,"controls"),capabilityToken:Q.capabilityToken};H(f),J.push(f)}catch{continue}}return J}function i$($,J={}){G("id",$);let j=[];for(let Z of J.scope?.routes??l$())try{let Q=k(Z);for(let f of l(Q.children,J.scope?.descendantOf))if(J.prefix?f.id.startsWith($):f.id===$)j.push({rootRunId:Z.rootRunId,route:Z,run:f})}catch{continue}return j}function QJ($){let J=i$($)[0];return J?{rootRunId:J.rootRunId,run:J.run}:void 0}function s$($){H($);try{let J=JSON.parse(Y.readFileSync(L$($),"utf-8"));return{rootRunId:$.rootRunId,updatedAt:typeof J.updatedAt==="number"?J.updatedAt:0,children:Array.isArray(J.children)?J.children.map((j)=>v(j)).filter((j)=>Boolean(j)):[],processedEvents:Array.isArray(J.processedEvents)?J.processedEvents.filter((j)=>typeof j==="string"):[]}}catch(J){if(J.code!=="ENOENT")throw J;return{rootRunId:$.rootRunId,updatedAt:0,children:[],processedEvents:[]}}}function k($){H($);let J=s$($),j=new Set(J.processedEvents),Z=!1,Q=[];try{Q=Y.readdirSync($.eventSink).filter((f)=>f.endsWith(".json")||f.endsWith(".jsonl")).sort()}catch(f){if(f.code!=="ENOENT")throw f}for(let f of Q){if(j.has(f))continue;let X=O.join($.eventSink,f);if(!_($.eventSink,X))continue;let K;try{let q=Y.statSync(X);if(!q.isFile()||q.size>E)continue;K=Y.readFileSync(X,"utf-8")}catch{continue}for(let q of o$(K,$))J=u$(J,q),Z=!0;j.add(f),Z=!0}if(Z)J={...J,processedEvents:[...j].slice(-1000)},q$(L$($),J);return J}function s($,J,j){let Z=`${JSON.stringify(j)}
6
- `;if(Buffer.byteLength(Z,"utf-8")>E)throw Error("Nested route record exceeds the maximum size.");Y.mkdirSync($,{recursive:!0,mode:448});let Q=`${String(J).padStart(13,"0")}-${M$()}.json`,f=O.join($,`.${Q}.tmp`),X=O.join($,Q);return Y.writeFileSync(f,Z,{mode:384}),Y.renameSync(f,X),X}function fJ($,J){H($);let j={...J,rootRunId:$.rootRunId,capabilityToken:$.capabilityToken},Z=r(JSON.stringify(j),$);if(!Z)throw Error("Nested event record failed validation.");s($.eventSink,Z.ts,Z)}function V$($,J){if(Buffer.byteLength($,"utf-8")>E)return;let j;try{j=JSON.parse($)}catch{return}if(!j||typeof j!=="object")return;let Z=j;if(Z.type!=="subagent.nested.control-request")return;if(Z.rootRunId!==J.rootRunId||Z.capabilityToken!==J.capabilityToken)return;if(!A(Z.requestId)||!A(Z.targetRunId))return;if(Z.action!=="interrupt"&&Z.action!=="resume")return;let Q=W(Z.ts);if(Q===void 0)return;return{type:"subagent.nested.control-request",ts:Q,rootRunId:J.rootRunId,capabilityToken:J.capabilityToken,requestId:Z.requestId,targetRunId:Z.targetRunId,action:Z.action,...B(Z.message,16000)?{message:B(Z.message,16000)}:{}}}function F$($,J){if(Buffer.byteLength($,"utf-8")>E)return;let j;try{j=JSON.parse($)}catch{return}if(!j||typeof j!=="object")return;let Z=j;if(Z.type!=="subagent.nested.control-result")return;if(Z.rootRunId!==J.rootRunId||Z.capabilityToken!==J.capabilityToken)return;if(!A(Z.requestId)||!A(Z.targetRunId))return;let Q=W(Z.ts);if(Q===void 0||typeof Z.ok!=="boolean")return;return{type:"subagent.nested.control-result",ts:Q,rootRunId:J.rootRunId,capabilityToken:J.capabilityToken,requestId:Z.requestId,targetRunId:Z.targetRunId,ok:Z.ok,message:B(Z.message,16000)??(Z.ok?"Control request completed.":"Control request failed.")}}function WJ($,J){H($),G("requestId",J.requestId),G("targetRunId",J.targetRunId);let j={type:"subagent.nested.control-request",...J,rootRunId:$.rootRunId,capabilityToken:$.capabilityToken},Z=V$(JSON.stringify(j),$);if(!Z)throw Error("Nested control request failed validation.");return s($.controlInbox,Z.ts,Z)}function OJ($){H($);let J=[];try{J=Y.readdirSync($.controlInbox).filter((Z)=>Z.endsWith(".json")).sort()}catch(Z){if(Z.code!=="ENOENT")throw Z}let j=[];for(let Z of J){let Q=O.join($.controlInbox,Z);if(!_($.controlInbox,Q))continue;try{let f=Y.statSync(Q);if(!f.isFile()||f.size>E)continue;let X=V$(Y.readFileSync(Q,"utf-8"),$);if(X)j.push({...X,filePath:Q})}catch{continue}}return j}function XJ($,J){H($),G("requestId",J.requestId),G("targetRunId",J.targetRunId);let j={type:"subagent.nested.control-result",...J,rootRunId:$.rootRunId,capabilityToken:$.capabilityToken},Z=F$(JSON.stringify(j),$);if(!Z)throw Error("Nested control result failed validation.");s($.eventSink,Z.ts,Z)}function BJ($){H($);let J=[];try{J=Y.readdirSync($.eventSink).filter((Z)=>Z.endsWith(".json")||Z.endsWith(".jsonl")).sort()}catch(Z){if(Z.code!=="ENOENT")throw Z}let j=[];for(let Z of J){let Q=O.join($.eventSink,Z);if(!_($.eventSink,Q))continue;try{let f=Y.statSync(Q);if(!f.isFile()||f.size>E)continue;let X=Y.readFileSync(Q,"utf-8"),K=X.includes(`
7
- `)?X.split(`
8
- `).filter((q)=>q.trim()):[X];for(let q of K){let z=F$(q,$);if(z)j.push(z)}}catch{continue}}return j}function KJ($){return{[n]:$.eventSink,[d]:$.controlInbox,[o]:$.rootRunId,[p]:$.capabilityToken}}function a$($,J,j){if(!J?.length)return;for(let Z of J)Z.children=void 0;if(!j?.length)return;for(let Z of j){if(Z.parentRunId!==$||Z.parentStepIndex===void 0)continue;let Q=J.find((f,X)=>(f.index??X)===Z.parentStepIndex);if(!Q)continue;Q.children??=[],Q.children=[...Q.children.filter((f)=>f.id!==Z.id),Z].slice(0,b)}}function YJ($){if(!$.nestedRoute)return;let J=k($.nestedRoute);$.nestedChildren=J.children,a$($.asyncId,$.steps,J.children)}function qJ($){if(!$.nestedRoute)return;let J=k($.nestedRoute);$.nestedChildren=J.children}function U$($){if(!$?.length)return!1;for(let J of $){if(!R(J.state))return!0;if(U$(J.children))return!0;if(U$(J.steps?.flatMap((j)=>j.children??[])))return!0}return!1}function GJ($,J,j){return{id:$.runId||j.id,parentRunId:j.parentRunId,...j.parentStepIndex!==void 0?{parentStepIndex:j.parentStepIndex}:{},depth:j.depth,path:j.path??[{runId:j.parentRunId,...j.parentStepIndex!==void 0?{stepIndex:j.parentStepIndex}:{}}],asyncDir:J,...$.pid?{pid:$.pid}:{},...$.sessionId?{sessionId:$.sessionId}:{},mode:$.mode??j.mode,state:$.state,...$.currentStep!==void 0?{currentStep:$.currentStep}:{},...$.chainStepCount!==void 0?{chainStepCount:$.chainStepCount}:{},...$.activityState?{activityState:$.activityState}:{},...$.lastActivityAt!==void 0?{lastActivityAt:$.lastActivityAt}:{},...$.currentTool?{currentTool:$.currentTool}:{},...$.currentToolStartedAt!==void 0?{currentToolStartedAt:$.currentToolStartedAt}:{},...$.currentPath?{currentPath:$.currentPath}:{},...$.turnCount!==void 0?{turnCount:$.turnCount}:{},...$.toolCount!==void 0?{toolCount:$.toolCount}:{},...$.totalTokens?{totalTokens:$.totalTokens}:{},...$.timeoutMs!==void 0?{timeoutMs:$.timeoutMs}:{},...$.deadlineAt!==void 0?{deadlineAt:$.deadlineAt}:{},...$.timedOut!==void 0?{timedOut:$.timedOut}:{},...$.turnBudget?{turnBudget:$.turnBudget}:{},...$.turnBudgetExceeded!==void 0?{turnBudgetExceeded:$.turnBudgetExceeded}:{},...$.wrapUpRequested!==void 0?{wrapUpRequested:$.wrapUpRequested}:{},...$.error?{error:$.error}:{},...$.startedAt!==void 0?{startedAt:$.startedAt}:{startedAt:j.ts},...$.endedAt!==void 0?{endedAt:$.endedAt}:{},lastUpdate:$.lastUpdate??j.ts,...$.sessionFile?{sessionFile:$.sessionFile}:{},...$.steps?.length?{steps:$.steps.map((Z)=>({agent:Z.agent,status:Z.status,...Z.sessionFile?{sessionFile:Z.sessionFile}:{},...Z.activityState?{activityState:Z.activityState}:{},...Z.lastActivityAt!==void 0?{lastActivityAt:Z.lastActivityAt}:{},...Z.currentTool?{currentTool:Z.currentTool}:{},...Z.currentToolStartedAt!==void 0?{currentToolStartedAt:Z.currentToolStartedAt}:{},...Z.currentPath?{currentPath:Z.currentPath}:{},...Z.turnCount!==void 0?{turnCount:Z.turnCount}:{},...Z.toolCount!==void 0?{toolCount:Z.toolCount}:{},...Z.startedAt!==void 0?{startedAt:Z.startedAt}:{},...Z.endedAt!==void 0?{endedAt:Z.endedAt}:{},...Z.error?{error:Z.error}:{},...Z.timedOut!==void 0?{timedOut:Z.timedOut}:{},...Z.turnBudget?{turnBudget:Z.turnBudget}:{},...Z.turnBudgetExceeded!==void 0?{turnBudgetExceeded:Z.turnBudgetExceeded}:{},...Z.wrapUpRequested!==void 0?{wrapUpRequested:Z.wrapUpRequested}:{}})).slice(0,u)}:{}}}function HJ($,J){return{DM_SUBAGENT_NESTED_ROOT_RUN_ID:$,DM_SUBAGENT_NESTED_PARENT_RUN_ID:J}}function UJ($){let J=O.resolve($);return _(e,J)&&!_(O.join(L,"nested-subagent-runs"),J)}function MJ($,J){return G("rootRunId",$),G("id",J),O.join(t,"nested",$,`${J}.json`)}export{fJ as writeNestedEvent,XJ as writeNestedControlResult,WJ as writeNestedControlRequest,qJ as updateForegroundNestedProjection,YJ as updateAsyncJobNestedProjection,v as sanitizeSummary,g$ as resolveNestedRouteFromEnv,$J as resolveNestedParentAddressFromEnv,jJ as resolveNestedAsyncDir,ej as resolveInheritedNestedRouteFromEnv,s$ as readNestedRegistry,BJ as readNestedControlResults,OJ as readNestedControlRequests,ZJ as projectNestedRegistryForRoot,k as projectNestedEvents,o$ as parseNestedEventRecords,GJ as nestedSummaryFromAsyncStatus,KJ as nestedRouteEnv,MJ as nestedResultsPath,HJ as nestedArtifactEnv,UJ as isTopLevelAsyncDir,A as isSafeNestedId,U$ as hasLiveNestedDescendants,i$ as findNestedRunMatchesById,QJ as findNestedRunById,H$ as findNestedRun,r$ as findNestedRouteForRootId,tj as createNestedRoute,JJ as buildNestedRouteIndex,a$ as attachRootChildrenToSteps,c$ as assertSafeNestedId,u$ as applyNestedEvent,F as NESTED_EVENTS_DIR};
1
+ import { randomUUID } from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import {
5
+ ASYNC_DIR,
6
+ RESULTS_DIR,
7
+ TEMP_ROOT_DIR
8
+ } from "../../shared/types.js";
9
+ import { isSafeNestedPathId, parseNestedPathEnv, sanitizeNestedPath } from "./nested-path.js";
10
+ import {
11
+ SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV,
12
+ SUBAGENT_PARENT_CHILD_INDEX_ENV,
13
+ SUBAGENT_PARENT_CONTROL_INBOX_ENV,
14
+ SUBAGENT_PARENT_DEPTH_ENV,
15
+ SUBAGENT_PARENT_EVENT_SINK_ENV,
16
+ SUBAGENT_PARENT_PATH_ENV,
17
+ SUBAGENT_PARENT_ROOT_RUN_ID_ENV,
18
+ SUBAGENT_PARENT_RUN_ID_ENV
19
+ } from "./dm-args.js";
20
+ import { writeAtomicJson } from "../../shared/atomic-json.js";
21
+ export const NESTED_EVENTS_DIR = path.join(TEMP_ROOT_DIR, "nested-subagent-events");
22
+ const ROUTE_FILE = "route.json";
23
+ const REGISTRY_FILE = "registry.json";
24
+ const MAX_EVENT_BYTES = 64 * 1024;
25
+ const MAX_STEPS = 12;
26
+ const MAX_CHILDREN = 16;
27
+ const MAX_DEPTH = 3;
28
+ export function isSafeNestedId(value) {
29
+ return isSafeNestedPathId(value);
30
+ }
31
+ export function assertSafeNestedId(label, value) {
32
+ if (!isSafeNestedId(value))
33
+ throw new Error(`${label} must be a non-empty safe id token.`);
34
+ }
35
+ function assertSafeId(label, value) {
36
+ assertSafeNestedId(label, value);
37
+ }
38
+ function containedPath(base, candidate) {
39
+ const resolvedBase = path.resolve(base);
40
+ const resolvedCandidate = path.resolve(candidate);
41
+ return resolvedCandidate === resolvedBase || resolvedCandidate.startsWith(`${resolvedBase}${path.sep}`);
42
+ }
43
+ function commonRouteRoot(route) {
44
+ return path.dirname(path.resolve(route.eventSink));
45
+ }
46
+ function validateRouteShape(route) {
47
+ assertSafeId("rootRunId", route.rootRunId);
48
+ assertSafeId("capabilityToken", route.capabilityToken);
49
+ if (!containedPath(NESTED_EVENTS_DIR, route.eventSink))
50
+ throw new Error("Nested event sink is outside the subagent nested event root.");
51
+ if (!containedPath(NESTED_EVENTS_DIR, route.controlInbox))
52
+ throw new Error("Nested control inbox is outside the subagent nested event root.");
53
+ if (commonRouteRoot(route) !== path.dirname(path.resolve(route.controlInbox)))
54
+ throw new Error("Nested event sink and control inbox must share one route root.");
55
+ }
56
+ export function createNestedRoute(rootRunId) {
57
+ assertSafeId("rootRunId", rootRunId);
58
+ const capabilityToken = randomUUID();
59
+ const routeRoot = path.join(NESTED_EVENTS_DIR, `${rootRunId}-${capabilityToken}`);
60
+ const eventSink = path.join(routeRoot, "events");
61
+ const controlInbox = path.join(routeRoot, "controls");
62
+ fs.mkdirSync(eventSink, { recursive: true, mode: 448 });
63
+ fs.mkdirSync(controlInbox, { recursive: true, mode: 448 });
64
+ fs.writeFileSync(path.join(routeRoot, ROUTE_FILE), `${JSON.stringify({ rootRunId, capabilityToken, createdAt: Date.now() })}
65
+ `, { mode: 384 });
66
+ return { rootRunId, eventSink, controlInbox, capabilityToken };
67
+ }
68
+ export function resolveNestedRouteFromEnv(env = process.env) {
69
+ const rootRunId = env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV];
70
+ const eventSink = env[SUBAGENT_PARENT_EVENT_SINK_ENV];
71
+ const controlInbox = env[SUBAGENT_PARENT_CONTROL_INBOX_ENV];
72
+ const capabilityToken = env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV];
73
+ if (!rootRunId || !eventSink || !controlInbox || !capabilityToken)
74
+ return;
75
+ const route = { rootRunId, eventSink, controlInbox, capabilityToken };
76
+ validateRouteShape(route);
77
+ const routeFile = path.join(commonRouteRoot(route), ROUTE_FILE);
78
+ const metadata = JSON.parse(fs.readFileSync(routeFile, "utf-8"));
79
+ if (metadata.rootRunId !== rootRunId || metadata.capabilityToken !== capabilityToken) {
80
+ throw new Error("Nested event route metadata does not match the provided root id and capability token.");
81
+ }
82
+ return route;
83
+ }
84
+ export function resolveInheritedNestedRouteFromEnv(env = process.env) {
85
+ try {
86
+ return resolveNestedRouteFromEnv(env);
87
+ } catch (error) {
88
+ console.error("Ignoring invalid nested subagent event route:", error);
89
+ return;
90
+ }
91
+ }
92
+ export function resolveNestedParentAddressFromEnv(env = process.env) {
93
+ const parentRunId = env[SUBAGENT_PARENT_RUN_ID_ENV];
94
+ if (!isSafeNestedId(parentRunId))
95
+ return;
96
+ const rawIndex = env[SUBAGENT_PARENT_CHILD_INDEX_ENV];
97
+ const parentStepIndex = rawIndex && /^\d+$/.test(rawIndex) ? Number(rawIndex) : undefined;
98
+ const depth = Math.min(Math.max(1, clampNumber(Number(env[SUBAGENT_PARENT_DEPTH_ENV])) ?? 1), MAX_DEPTH);
99
+ const parsedPath = parseNestedPathEnv(env[SUBAGENT_PARENT_PATH_ENV]);
100
+ const nestedPath = parsedPath.length ? parsedPath : [{ runId: parentRunId, ...parentStepIndex !== undefined ? { stepIndex: parentStepIndex } : {} }];
101
+ return { parentRunId, ...parentStepIndex !== undefined ? { parentStepIndex } : {}, depth, path: nestedPath };
102
+ }
103
+ export function resolveNestedAsyncDir(rootRunId, run) {
104
+ if (!run.asyncDir)
105
+ return;
106
+ const resolved = path.resolve(run.asyncDir);
107
+ const nestedRoot = path.resolve(TEMP_ROOT_DIR, "nested-subagent-runs", rootRunId, run.id);
108
+ const relative = path.relative(nestedRoot, resolved);
109
+ return resolved === nestedRoot || !relative.startsWith("..") && !path.isAbsolute(relative) ? resolved : undefined;
110
+ }
111
+ function clampNumber(value) {
112
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
113
+ }
114
+ function stringValue(value, max = 512) {
115
+ return typeof value === "string" && value.length > 0 ? value.slice(0, max) : undefined;
116
+ }
117
+ function sanitizeTokenUsage(value) {
118
+ if (!value || typeof value !== "object")
119
+ return;
120
+ const raw = value;
121
+ const input = clampNumber(raw.input);
122
+ const output = clampNumber(raw.output);
123
+ const total = clampNumber(raw.total);
124
+ return input !== undefined && output !== undefined && total !== undefined ? { input, output, total } : undefined;
125
+ }
126
+ function sanitizeCost(value) {
127
+ if (!value || typeof value !== "object")
128
+ return;
129
+ const raw = value;
130
+ const inputTokens = clampNumber(raw.inputTokens);
131
+ const outputTokens = clampNumber(raw.outputTokens);
132
+ const costUsd = clampNumber(raw.costUsd);
133
+ return inputTokens !== undefined && outputTokens !== undefined && costUsd !== undefined ? { inputTokens, outputTokens, costUsd } : undefined;
134
+ }
135
+ function sanitizeTurnBudget(value) {
136
+ if (!value || typeof value !== "object")
137
+ return;
138
+ const raw = value;
139
+ const maxTurns = clampNumber(raw.maxTurns);
140
+ const graceTurns = clampNumber(raw.graceTurns);
141
+ const turnCount = clampNumber(raw.turnCount);
142
+ const outcome = raw.outcome === "within-budget" || raw.outcome === "wrap-up-requested" || raw.outcome === "exceeded" ? raw.outcome : undefined;
143
+ if (maxTurns === undefined || graceTurns === undefined || turnCount === undefined || !outcome)
144
+ return;
145
+ return {
146
+ maxTurns,
147
+ graceTurns,
148
+ turnCount,
149
+ outcome,
150
+ ...clampNumber(raw.wrapUpRequestedAtTurn) !== undefined ? { wrapUpRequestedAtTurn: clampNumber(raw.wrapUpRequestedAtTurn) } : {},
151
+ ...clampNumber(raw.exceededAtTurn) !== undefined ? { exceededAtTurn: clampNumber(raw.exceededAtTurn) } : {}
152
+ };
153
+ }
154
+ function sanitizeState(value, fallback) {
155
+ return value === "queued" || value === "running" || value === "complete" || value === "failed" || value === "paused" ? value : fallback;
156
+ }
157
+ function sanitizeStep(input, depth) {
158
+ if (!input || typeof input !== "object")
159
+ return;
160
+ const raw = input;
161
+ const agent = stringValue(raw.agent, 128);
162
+ if (!agent)
163
+ return;
164
+ const status = raw.status === "pending" || raw.status === "running" || raw.status === "complete" || raw.status === "completed" || raw.status === "failed" || raw.status === "paused" ? raw.status : "pending";
165
+ return {
166
+ agent,
167
+ status,
168
+ ...stringValue(raw.sessionFile, 2048) ? { sessionFile: stringValue(raw.sessionFile, 2048) } : {},
169
+ ...raw.activityState === "active_long_running" || raw.activityState === "needs_attention" ? { activityState: raw.activityState } : {},
170
+ ...clampNumber(raw.lastActivityAt) !== undefined ? { lastActivityAt: clampNumber(raw.lastActivityAt) } : {},
171
+ ...stringValue(raw.currentTool, 128) ? { currentTool: stringValue(raw.currentTool, 128) } : {},
172
+ ...clampNumber(raw.currentToolStartedAt) !== undefined ? { currentToolStartedAt: clampNumber(raw.currentToolStartedAt) } : {},
173
+ ...stringValue(raw.currentPath, 2048) ? { currentPath: stringValue(raw.currentPath, 2048) } : {},
174
+ ...clampNumber(raw.turnCount) !== undefined ? { turnCount: clampNumber(raw.turnCount) } : {},
175
+ ...clampNumber(raw.toolCount) !== undefined ? { toolCount: clampNumber(raw.toolCount) } : {},
176
+ ...clampNumber(raw.startedAt) !== undefined ? { startedAt: clampNumber(raw.startedAt) } : {},
177
+ ...clampNumber(raw.endedAt) !== undefined ? { endedAt: clampNumber(raw.endedAt) } : {},
178
+ ...stringValue(raw.error, 1024) ? { error: stringValue(raw.error, 1024) } : {},
179
+ ...raw.timedOut === true ? { timedOut: true } : {},
180
+ ...sanitizeTurnBudget(raw.turnBudget) ? { turnBudget: sanitizeTurnBudget(raw.turnBudget) } : {},
181
+ ...raw.turnBudgetExceeded === true ? { turnBudgetExceeded: true } : {},
182
+ ...raw.wrapUpRequested === true ? { wrapUpRequested: true } : {},
183
+ ...depth < MAX_DEPTH && Array.isArray(raw.children) ? { children: raw.children.map((child) => sanitizeSummary(child, depth + 1)).filter((child) => Boolean(child)).slice(0, MAX_CHILDREN) } : {}
184
+ };
185
+ }
186
+ export function sanitizeSummary(input, depth = 0) {
187
+ if (!input || typeof input !== "object")
188
+ return;
189
+ const raw = input;
190
+ if (!isSafeNestedId(raw.id) || !isSafeNestedId(raw.parentRunId))
191
+ return;
192
+ const pathParts = sanitizeNestedPath(raw.path);
193
+ const steps = Array.isArray(raw.steps) ? raw.steps.map((step) => sanitizeStep(step, depth + 1)).filter((step) => Boolean(step)).slice(0, MAX_STEPS) : undefined;
194
+ const totalTokens = sanitizeTokenUsage(raw.totalTokens);
195
+ const totalCost = sanitizeCost(raw.totalCost);
196
+ return {
197
+ id: raw.id,
198
+ parentRunId: raw.parentRunId,
199
+ ...clampNumber(raw.parentStepIndex) !== undefined ? { parentStepIndex: clampNumber(raw.parentStepIndex) } : {},
200
+ ...stringValue(raw.parentAgent, 128) ? { parentAgent: stringValue(raw.parentAgent, 128) } : {},
201
+ depth: Math.min(Math.max(0, clampNumber(raw.depth) ?? 0), MAX_DEPTH),
202
+ path: pathParts,
203
+ state: sanitizeState(raw.state, "running"),
204
+ ...stringValue(raw.asyncDir, 2048) ? { asyncDir: stringValue(raw.asyncDir, 2048) } : {},
205
+ ...clampNumber(raw.pid) !== undefined && clampNumber(raw.pid) > 0 && Number.isInteger(clampNumber(raw.pid)) ? { pid: clampNumber(raw.pid) } : {},
206
+ ...stringValue(raw.sessionId, 256) ? { sessionId: stringValue(raw.sessionId, 256) } : {},
207
+ ...stringValue(raw.sessionFile, 2048) ? { sessionFile: stringValue(raw.sessionFile, 2048) } : {},
208
+ ...stringValue(raw.intercomTarget, 256) ? { intercomTarget: stringValue(raw.intercomTarget, 256) } : {},
209
+ ...stringValue(raw.ownerIntercomTarget, 256) ? { ownerIntercomTarget: stringValue(raw.ownerIntercomTarget, 256) } : {},
210
+ ...stringValue(raw.leafIntercomTarget, 256) ? { leafIntercomTarget: stringValue(raw.leafIntercomTarget, 256) } : {},
211
+ ...raw.ownerState === "live" || raw.ownerState === "gone" || raw.ownerState === "unknown" ? { ownerState: raw.ownerState } : {},
212
+ ...stringValue(raw.controlInbox, 2048) ? { controlInbox: stringValue(raw.controlInbox, 2048) } : {},
213
+ ...stringValue(raw.capabilityToken, 128) ? { capabilityToken: stringValue(raw.capabilityToken, 128) } : {},
214
+ ...raw.mode === "single" || raw.mode === "parallel" || raw.mode === "chain" ? { mode: raw.mode } : {},
215
+ ...stringValue(raw.agent, 128) ? { agent: stringValue(raw.agent, 128) } : {},
216
+ ...Array.isArray(raw.agents) ? { agents: raw.agents.map((agent) => stringValue(agent, 128)).filter((agent) => Boolean(agent)).slice(0, MAX_STEPS) } : {},
217
+ ...clampNumber(raw.currentStep) !== undefined ? { currentStep: clampNumber(raw.currentStep) } : {},
218
+ ...clampNumber(raw.chainStepCount) !== undefined ? { chainStepCount: clampNumber(raw.chainStepCount) } : {},
219
+ ...raw.activityState === "active_long_running" || raw.activityState === "needs_attention" ? { activityState: raw.activityState } : {},
220
+ ...clampNumber(raw.lastActivityAt) !== undefined ? { lastActivityAt: clampNumber(raw.lastActivityAt) } : {},
221
+ ...stringValue(raw.currentTool, 128) ? { currentTool: stringValue(raw.currentTool, 128) } : {},
222
+ ...clampNumber(raw.currentToolStartedAt) !== undefined ? { currentToolStartedAt: clampNumber(raw.currentToolStartedAt) } : {},
223
+ ...stringValue(raw.currentPath, 2048) ? { currentPath: stringValue(raw.currentPath, 2048) } : {},
224
+ ...clampNumber(raw.turnCount) !== undefined ? { turnCount: clampNumber(raw.turnCount) } : {},
225
+ ...clampNumber(raw.toolCount) !== undefined ? { toolCount: clampNumber(raw.toolCount) } : {},
226
+ ...totalTokens ? { totalTokens } : {},
227
+ ...totalCost ? { totalCost } : {},
228
+ ...clampNumber(raw.startedAt) !== undefined ? { startedAt: clampNumber(raw.startedAt) } : {},
229
+ ...clampNumber(raw.endedAt) !== undefined ? { endedAt: clampNumber(raw.endedAt) } : {},
230
+ ...clampNumber(raw.lastUpdate) !== undefined ? { lastUpdate: clampNumber(raw.lastUpdate) } : {},
231
+ ...clampNumber(raw.timeoutMs) !== undefined ? { timeoutMs: clampNumber(raw.timeoutMs) } : {},
232
+ ...clampNumber(raw.deadlineAt) !== undefined ? { deadlineAt: clampNumber(raw.deadlineAt) } : {},
233
+ ...raw.timedOut === true ? { timedOut: true } : {},
234
+ ...sanitizeTurnBudget(raw.turnBudget) ? { turnBudget: sanitizeTurnBudget(raw.turnBudget) } : {},
235
+ ...raw.turnBudgetExceeded === true ? { turnBudgetExceeded: true } : {},
236
+ ...raw.wrapUpRequested === true ? { wrapUpRequested: true } : {},
237
+ ...stringValue(raw.error, 1024) ? { error: stringValue(raw.error, 1024) } : {},
238
+ ...steps && steps.length > 0 ? { steps } : {},
239
+ ...depth < MAX_DEPTH && Array.isArray(raw.children) ? { children: raw.children.map((child) => sanitizeSummary(child, depth + 1)).filter((child) => Boolean(child)).slice(0, MAX_CHILDREN) } : {}
240
+ };
241
+ }
242
+ function parseRecord(content, route) {
243
+ if (Buffer.byteLength(content, "utf-8") > MAX_EVENT_BYTES)
244
+ return;
245
+ let parsed;
246
+ try {
247
+ parsed = JSON.parse(content);
248
+ } catch {
249
+ return;
250
+ }
251
+ if (!parsed || typeof parsed !== "object")
252
+ return;
253
+ const raw = parsed;
254
+ if (raw.type !== "subagent.nested.started" && raw.type !== "subagent.nested.updated" && raw.type !== "subagent.nested.completed")
255
+ return;
256
+ if (raw.rootRunId !== route.rootRunId || raw.capabilityToken !== route.capabilityToken)
257
+ return;
258
+ if (!isSafeNestedId(raw.parentRunId))
259
+ return;
260
+ const ts = clampNumber(raw.ts);
261
+ if (ts === undefined)
262
+ return;
263
+ const child = sanitizeSummary(raw.child);
264
+ if (!child || child.id === route.rootRunId)
265
+ return;
266
+ const routedChild = {
267
+ ...child,
268
+ controlInbox: route.controlInbox,
269
+ capabilityToken: route.capabilityToken,
270
+ ownerState: child.ownerState ?? "unknown"
271
+ };
272
+ return {
273
+ type: raw.type,
274
+ ts,
275
+ rootRunId: route.rootRunId,
276
+ parentRunId: raw.parentRunId,
277
+ ...clampNumber(raw.parentStepIndex) !== undefined ? { parentStepIndex: clampNumber(raw.parentStepIndex) } : {},
278
+ capabilityToken: route.capabilityToken,
279
+ child: routedChild
280
+ };
281
+ }
282
+ export function parseNestedEventRecords(content, route) {
283
+ if (!content.includes(`
284
+ `)) {
285
+ const record = parseRecord(content.trim(), route);
286
+ return record ? [record] : [];
287
+ }
288
+ return content.split(`
289
+ `).slice(0, content.endsWith(`
290
+ `) ? undefined : -1).map((line) => line.trim() ? parseRecord(line, route) : undefined).filter((event) => Boolean(event));
291
+ }
292
+ function terminal(state) {
293
+ return state === "complete" || state === "failed" || state === "paused";
294
+ }
295
+ function mergeSummary(existing, event) {
296
+ const incomingState = event.type === "subagent.nested.completed" && event.child.state === "running" ? "complete" : event.child.state;
297
+ const incoming = { ...event.child, state: incomingState, lastUpdate: event.child.lastUpdate ?? event.ts };
298
+ if (!existing)
299
+ return incoming;
300
+ const existingUpdate = existing.lastUpdate ?? 0;
301
+ const incomingUpdate = incoming.lastUpdate ?? event.ts;
302
+ if (incomingUpdate < existingUpdate)
303
+ return existing;
304
+ if (terminal(existing.state) && !terminal(incoming.state))
305
+ return existing;
306
+ if (terminal(existing.state) && terminal(incoming.state) && incomingUpdate === existingUpdate)
307
+ return existing;
308
+ return { ...existing, ...incoming, state: incoming.state, lastUpdate: Math.max(existingUpdate, incomingUpdate) };
309
+ }
310
+ function attachChild(children, event) {
311
+ let updated = false;
312
+ const walk = (items) => items.map((item) => {
313
+ if (item.id === event.parentRunId) {
314
+ const existingChildren = item.children ?? [];
315
+ const childIndex = existingChildren.findIndex((child) => child.id === event.child.id);
316
+ const nextChild = mergeSummary(childIndex >= 0 ? existingChildren[childIndex] : undefined, event);
317
+ const nextChildren = childIndex >= 0 ? existingChildren.map((child, index) => index === childIndex ? nextChild : child) : [...existingChildren, nextChild];
318
+ updated = true;
319
+ return { ...item, children: nextChildren.slice(0, MAX_CHILDREN), lastUpdate: Math.max(item.lastUpdate ?? 0, event.ts) };
320
+ }
321
+ if (!item.children?.length)
322
+ return item;
323
+ const nextChildren = walk(item.children);
324
+ return nextChildren === item.children ? item : { ...item, children: nextChildren };
325
+ });
326
+ const next = walk(children);
327
+ if (updated)
328
+ return next;
329
+ const childIndex = next.findIndex((child) => child.id === event.child.id);
330
+ const nextChild = mergeSummary(childIndex >= 0 ? next[childIndex] : undefined, event);
331
+ return childIndex >= 0 ? next.map((child, index) => index === childIndex ? nextChild : child) : [...next, nextChild].slice(0, MAX_CHILDREN);
332
+ }
333
+ export function applyNestedEvent(registry, event) {
334
+ return {
335
+ ...registry,
336
+ updatedAt: Math.max(registry.updatedAt, event.ts),
337
+ children: attachChild(registry.children, event)
338
+ };
339
+ }
340
+ function registryPath(route) {
341
+ return path.join(commonRouteRoot(route), REGISTRY_FILE);
342
+ }
343
+ export function findNestedRouteForRootId(rootRunId) {
344
+ assertSafeId("rootRunId", rootRunId);
345
+ let entries;
346
+ try {
347
+ entries = fs.readdirSync(NESTED_EVENTS_DIR);
348
+ } catch (error) {
349
+ if (error.code === "ENOENT")
350
+ return;
351
+ throw error;
352
+ }
353
+ for (const entry of entries) {
354
+ if (!entry.startsWith(`${rootRunId}-`))
355
+ continue;
356
+ const routeRoot = path.join(NESTED_EVENTS_DIR, entry);
357
+ try {
358
+ const metadata = JSON.parse(fs.readFileSync(path.join(routeRoot, ROUTE_FILE), "utf-8"));
359
+ if (metadata.rootRunId !== rootRunId || typeof metadata.capabilityToken !== "string")
360
+ continue;
361
+ const route = {
362
+ rootRunId,
363
+ eventSink: path.join(routeRoot, "events"),
364
+ controlInbox: path.join(routeRoot, "controls"),
365
+ capabilityToken: metadata.capabilityToken
366
+ };
367
+ validateRouteShape(route);
368
+ return route;
369
+ } catch {
370
+ continue;
371
+ }
372
+ }
373
+ return;
374
+ }
375
+ export function buildNestedRouteIndex() {
376
+ let entries;
377
+ try {
378
+ entries = fs.readdirSync(NESTED_EVENTS_DIR);
379
+ } catch (error) {
380
+ if (error.code === "ENOENT")
381
+ return new Map;
382
+ throw error;
383
+ }
384
+ const index = new Map;
385
+ for (const entry of entries) {
386
+ const routeRoot = path.join(NESTED_EVENTS_DIR, entry);
387
+ try {
388
+ const metadata = JSON.parse(fs.readFileSync(path.join(routeRoot, ROUTE_FILE), "utf-8"));
389
+ if (typeof metadata.rootRunId !== "string" || typeof metadata.capabilityToken !== "string")
390
+ continue;
391
+ if (index.has(metadata.rootRunId))
392
+ continue;
393
+ const route = {
394
+ rootRunId: metadata.rootRunId,
395
+ eventSink: path.join(routeRoot, "events"),
396
+ controlInbox: path.join(routeRoot, "controls"),
397
+ capabilityToken: metadata.capabilityToken
398
+ };
399
+ validateRouteShape(route);
400
+ index.set(metadata.rootRunId, route);
401
+ } catch {
402
+ continue;
403
+ }
404
+ }
405
+ return index;
406
+ }
407
+ export function projectNestedRegistryForRoot(rootRunId) {
408
+ const route = findNestedRouteForRootId(rootRunId);
409
+ return route ? projectNestedEvents(route) : undefined;
410
+ }
411
+ export function findNestedRun(children, id) {
412
+ if (!children?.length)
413
+ return;
414
+ for (const child of children) {
415
+ if (child.id === id)
416
+ return child;
417
+ const nested = findNestedRun(child.children, id) ?? findNestedRun(child.steps?.flatMap((step) => step.children ?? []), id);
418
+ if (nested)
419
+ return nested;
420
+ }
421
+ return;
422
+ }
423
+ function collectNestedRuns(children, output = []) {
424
+ for (const child of children ?? []) {
425
+ output.push(child);
426
+ collectNestedRuns(child.children, output);
427
+ collectNestedRuns(child.steps?.flatMap((step) => step.children ?? []), output);
428
+ }
429
+ return output;
430
+ }
431
+ function collectScopedNestedRuns(children, scope, output = []) {
432
+ if (!scope)
433
+ return collectNestedRuns(children, output);
434
+ for (const child of children ?? []) {
435
+ if (child.parentRunId === scope.parentRunId && (scope.parentStepIndex === undefined || child.parentStepIndex === scope.parentStepIndex)) {
436
+ collectNestedRuns([child], output);
437
+ continue;
438
+ }
439
+ collectScopedNestedRuns(child.children, scope, output);
440
+ collectScopedNestedRuns(child.steps?.flatMap((step) => step.children ?? []), scope, output);
441
+ }
442
+ return output;
443
+ }
444
+ function listNestedRoutes() {
445
+ let entries;
446
+ try {
447
+ entries = fs.readdirSync(NESTED_EVENTS_DIR);
448
+ } catch (error) {
449
+ if (error.code === "ENOENT")
450
+ return [];
451
+ throw error;
452
+ }
453
+ const routes = [];
454
+ for (const entry of entries) {
455
+ const routeRoot = path.join(NESTED_EVENTS_DIR, entry);
456
+ try {
457
+ const metadata = JSON.parse(fs.readFileSync(path.join(routeRoot, ROUTE_FILE), "utf-8"));
458
+ if (typeof metadata.rootRunId !== "string" || typeof metadata.capabilityToken !== "string")
459
+ continue;
460
+ const route = {
461
+ rootRunId: metadata.rootRunId,
462
+ eventSink: path.join(routeRoot, "events"),
463
+ controlInbox: path.join(routeRoot, "controls"),
464
+ capabilityToken: metadata.capabilityToken
465
+ };
466
+ validateRouteShape(route);
467
+ routes.push(route);
468
+ } catch {
469
+ continue;
470
+ }
471
+ }
472
+ return routes;
473
+ }
474
+ export function findNestedRunMatchesById(id, options = {}) {
475
+ assertSafeId("id", id);
476
+ const matches = [];
477
+ for (const route of options.scope?.routes ?? listNestedRoutes()) {
478
+ try {
479
+ const registry = projectNestedEvents(route);
480
+ for (const run of collectScopedNestedRuns(registry.children, options.scope?.descendantOf)) {
481
+ if (options.prefix ? run.id.startsWith(id) : run.id === id)
482
+ matches.push({ rootRunId: route.rootRunId, route, run });
483
+ }
484
+ } catch {
485
+ continue;
486
+ }
487
+ }
488
+ return matches;
489
+ }
490
+ export function findNestedRunById(id) {
491
+ const match = findNestedRunMatchesById(id)[0];
492
+ return match ? { rootRunId: match.rootRunId, run: match.run } : undefined;
493
+ }
494
+ export function readNestedRegistry(route) {
495
+ validateRouteShape(route);
496
+ try {
497
+ const parsed = JSON.parse(fs.readFileSync(registryPath(route), "utf-8"));
498
+ return {
499
+ rootRunId: route.rootRunId,
500
+ updatedAt: typeof parsed.updatedAt === "number" ? parsed.updatedAt : 0,
501
+ children: Array.isArray(parsed.children) ? parsed.children.map((child) => sanitizeSummary(child)).filter((child) => Boolean(child)) : [],
502
+ processedEvents: Array.isArray(parsed.processedEvents) ? parsed.processedEvents.filter((item) => typeof item === "string") : []
503
+ };
504
+ } catch (error) {
505
+ if (error.code !== "ENOENT")
506
+ throw error;
507
+ return { rootRunId: route.rootRunId, updatedAt: 0, children: [], processedEvents: [] };
508
+ }
509
+ }
510
+ export function projectNestedEvents(route) {
511
+ validateRouteShape(route);
512
+ let registry = readNestedRegistry(route);
513
+ const seen = new Set(registry.processedEvents);
514
+ let changed = false;
515
+ let entries = [];
516
+ try {
517
+ entries = fs.readdirSync(route.eventSink).filter((entry) => entry.endsWith(".json") || entry.endsWith(".jsonl")).sort();
518
+ } catch (error) {
519
+ if (error.code !== "ENOENT")
520
+ throw error;
521
+ }
522
+ for (const entry of entries) {
523
+ if (seen.has(entry))
524
+ continue;
525
+ const eventPath = path.join(route.eventSink, entry);
526
+ if (!containedPath(route.eventSink, eventPath))
527
+ continue;
528
+ let content;
529
+ try {
530
+ const stat = fs.statSync(eventPath);
531
+ if (!stat.isFile() || stat.size > MAX_EVENT_BYTES)
532
+ continue;
533
+ content = fs.readFileSync(eventPath, "utf-8");
534
+ } catch {
535
+ continue;
536
+ }
537
+ for (const event of parseNestedEventRecords(content, route)) {
538
+ registry = applyNestedEvent(registry, event);
539
+ changed = true;
540
+ }
541
+ seen.add(entry);
542
+ changed = true;
543
+ }
544
+ if (changed) {
545
+ registry = { ...registry, processedEvents: [...seen].slice(-1000) };
546
+ writeAtomicJson(registryPath(route), registry);
547
+ }
548
+ return registry;
549
+ }
550
+ function writeRouteRecord(dir, ts, payload) {
551
+ const content = `${JSON.stringify(payload)}
552
+ `;
553
+ if (Buffer.byteLength(content, "utf-8") > MAX_EVENT_BYTES)
554
+ throw new Error("Nested route record exceeds the maximum size.");
555
+ fs.mkdirSync(dir, { recursive: true, mode: 448 });
556
+ const name = `${String(ts).padStart(13, "0")}-${randomUUID()}.json`;
557
+ const tmp = path.join(dir, `.${name}.tmp`);
558
+ const finalPath = path.join(dir, name);
559
+ fs.writeFileSync(tmp, content, { mode: 384 });
560
+ fs.renameSync(tmp, finalPath);
561
+ return finalPath;
562
+ }
563
+ export function writeNestedEvent(route, event) {
564
+ validateRouteShape(route);
565
+ const record = {
566
+ ...event,
567
+ rootRunId: route.rootRunId,
568
+ capabilityToken: route.capabilityToken
569
+ };
570
+ const sanitized = parseRecord(JSON.stringify(record), route);
571
+ if (!sanitized)
572
+ throw new Error("Nested event record failed validation.");
573
+ writeRouteRecord(route.eventSink, sanitized.ts, sanitized);
574
+ }
575
+ function parseControlRequest(content, route) {
576
+ if (Buffer.byteLength(content, "utf-8") > MAX_EVENT_BYTES)
577
+ return;
578
+ let parsed;
579
+ try {
580
+ parsed = JSON.parse(content);
581
+ } catch {
582
+ return;
583
+ }
584
+ if (!parsed || typeof parsed !== "object")
585
+ return;
586
+ const raw = parsed;
587
+ if (raw.type !== "subagent.nested.control-request")
588
+ return;
589
+ if (raw.rootRunId !== route.rootRunId || raw.capabilityToken !== route.capabilityToken)
590
+ return;
591
+ if (!isSafeNestedId(raw.requestId) || !isSafeNestedId(raw.targetRunId))
592
+ return;
593
+ if (raw.action !== "interrupt" && raw.action !== "resume")
594
+ return;
595
+ const ts = clampNumber(raw.ts);
596
+ if (ts === undefined)
597
+ return;
598
+ return {
599
+ type: "subagent.nested.control-request",
600
+ ts,
601
+ rootRunId: route.rootRunId,
602
+ capabilityToken: route.capabilityToken,
603
+ requestId: raw.requestId,
604
+ targetRunId: raw.targetRunId,
605
+ action: raw.action,
606
+ ...stringValue(raw.message, 16000) ? { message: stringValue(raw.message, 16000) } : {}
607
+ };
608
+ }
609
+ function parseControlResult(content, route) {
610
+ if (Buffer.byteLength(content, "utf-8") > MAX_EVENT_BYTES)
611
+ return;
612
+ let parsed;
613
+ try {
614
+ parsed = JSON.parse(content);
615
+ } catch {
616
+ return;
617
+ }
618
+ if (!parsed || typeof parsed !== "object")
619
+ return;
620
+ const raw = parsed;
621
+ if (raw.type !== "subagent.nested.control-result")
622
+ return;
623
+ if (raw.rootRunId !== route.rootRunId || raw.capabilityToken !== route.capabilityToken)
624
+ return;
625
+ if (!isSafeNestedId(raw.requestId) || !isSafeNestedId(raw.targetRunId))
626
+ return;
627
+ const ts = clampNumber(raw.ts);
628
+ if (ts === undefined || typeof raw.ok !== "boolean")
629
+ return;
630
+ return {
631
+ type: "subagent.nested.control-result",
632
+ ts,
633
+ rootRunId: route.rootRunId,
634
+ capabilityToken: route.capabilityToken,
635
+ requestId: raw.requestId,
636
+ targetRunId: raw.targetRunId,
637
+ ok: raw.ok,
638
+ message: stringValue(raw.message, 16000) ?? (raw.ok ? "Control request completed." : "Control request failed.")
639
+ };
640
+ }
641
+ export function writeNestedControlRequest(route, request) {
642
+ validateRouteShape(route);
643
+ assertSafeId("requestId", request.requestId);
644
+ assertSafeId("targetRunId", request.targetRunId);
645
+ const record = {
646
+ type: "subagent.nested.control-request",
647
+ ...request,
648
+ rootRunId: route.rootRunId,
649
+ capabilityToken: route.capabilityToken
650
+ };
651
+ const sanitized = parseControlRequest(JSON.stringify(record), route);
652
+ if (!sanitized)
653
+ throw new Error("Nested control request failed validation.");
654
+ return writeRouteRecord(route.controlInbox, sanitized.ts, sanitized);
655
+ }
656
+ export function readNestedControlRequests(route) {
657
+ validateRouteShape(route);
658
+ let entries = [];
659
+ try {
660
+ entries = fs.readdirSync(route.controlInbox).filter((entry) => entry.endsWith(".json")).sort();
661
+ } catch (error) {
662
+ if (error.code !== "ENOENT")
663
+ throw error;
664
+ }
665
+ const requests = [];
666
+ for (const entry of entries) {
667
+ const filePath = path.join(route.controlInbox, entry);
668
+ if (!containedPath(route.controlInbox, filePath))
669
+ continue;
670
+ try {
671
+ const stat = fs.statSync(filePath);
672
+ if (!stat.isFile() || stat.size > MAX_EVENT_BYTES)
673
+ continue;
674
+ const request = parseControlRequest(fs.readFileSync(filePath, "utf-8"), route);
675
+ if (request)
676
+ requests.push({ ...request, filePath });
677
+ } catch {
678
+ continue;
679
+ }
680
+ }
681
+ return requests;
682
+ }
683
+ export function writeNestedControlResult(route, result) {
684
+ validateRouteShape(route);
685
+ assertSafeId("requestId", result.requestId);
686
+ assertSafeId("targetRunId", result.targetRunId);
687
+ const record = {
688
+ type: "subagent.nested.control-result",
689
+ ...result,
690
+ rootRunId: route.rootRunId,
691
+ capabilityToken: route.capabilityToken
692
+ };
693
+ const sanitized = parseControlResult(JSON.stringify(record), route);
694
+ if (!sanitized)
695
+ throw new Error("Nested control result failed validation.");
696
+ writeRouteRecord(route.eventSink, sanitized.ts, sanitized);
697
+ }
698
+ export function readNestedControlResults(route) {
699
+ validateRouteShape(route);
700
+ let entries = [];
701
+ try {
702
+ entries = fs.readdirSync(route.eventSink).filter((entry) => entry.endsWith(".json") || entry.endsWith(".jsonl")).sort();
703
+ } catch (error) {
704
+ if (error.code !== "ENOENT")
705
+ throw error;
706
+ }
707
+ const results = [];
708
+ for (const entry of entries) {
709
+ const eventPath = path.join(route.eventSink, entry);
710
+ if (!containedPath(route.eventSink, eventPath))
711
+ continue;
712
+ try {
713
+ const stat = fs.statSync(eventPath);
714
+ if (!stat.isFile() || stat.size > MAX_EVENT_BYTES)
715
+ continue;
716
+ const content = fs.readFileSync(eventPath, "utf-8");
717
+ const lines = content.includes(`
718
+ `) ? content.split(`
719
+ `).filter((line) => line.trim()) : [content];
720
+ for (const line of lines) {
721
+ const result = parseControlResult(line, route);
722
+ if (result)
723
+ results.push(result);
724
+ }
725
+ } catch {
726
+ continue;
727
+ }
728
+ }
729
+ return results;
730
+ }
731
+ export function nestedRouteEnv(route) {
732
+ return {
733
+ [SUBAGENT_PARENT_EVENT_SINK_ENV]: route.eventSink,
734
+ [SUBAGENT_PARENT_CONTROL_INBOX_ENV]: route.controlInbox,
735
+ [SUBAGENT_PARENT_ROOT_RUN_ID_ENV]: route.rootRunId,
736
+ [SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]: route.capabilityToken
737
+ };
738
+ }
739
+ export function attachRootChildrenToSteps(rootRunId, steps, children) {
740
+ if (!steps?.length)
741
+ return;
742
+ for (const step of steps) {
743
+ step.children = undefined;
744
+ }
745
+ if (!children?.length)
746
+ return;
747
+ for (const child of children) {
748
+ if (child.parentRunId !== rootRunId || child.parentStepIndex === undefined)
749
+ continue;
750
+ const step = steps.find((candidate, index) => (candidate.index ?? index) === child.parentStepIndex);
751
+ if (!step)
752
+ continue;
753
+ step.children ??= [];
754
+ step.children = [...step.children.filter((existing) => existing.id !== child.id), child].slice(0, MAX_CHILDREN);
755
+ }
756
+ }
757
+ export function updateAsyncJobNestedProjection(job) {
758
+ if (!job.nestedRoute)
759
+ return;
760
+ const registry = projectNestedEvents(job.nestedRoute);
761
+ job.nestedChildren = registry.children;
762
+ attachRootChildrenToSteps(job.asyncId, job.steps, registry.children);
763
+ }
764
+ export function updateForegroundNestedProjection(control) {
765
+ if (!control.nestedRoute)
766
+ return;
767
+ const registry = projectNestedEvents(control.nestedRoute);
768
+ control.nestedChildren = registry.children;
769
+ }
770
+ export function hasLiveNestedDescendants(children) {
771
+ if (!children?.length)
772
+ return false;
773
+ for (const child of children) {
774
+ if (!terminal(child.state))
775
+ return true;
776
+ if (hasLiveNestedDescendants(child.children))
777
+ return true;
778
+ if (hasLiveNestedDescendants(child.steps?.flatMap((step) => step.children ?? [])))
779
+ return true;
780
+ }
781
+ return false;
782
+ }
783
+ export function nestedSummaryFromAsyncStatus(status, asyncDir, fallback) {
784
+ return {
785
+ id: status.runId || fallback.id,
786
+ parentRunId: fallback.parentRunId,
787
+ ...fallback.parentStepIndex !== undefined ? { parentStepIndex: fallback.parentStepIndex } : {},
788
+ depth: fallback.depth,
789
+ path: fallback.path ?? [{ runId: fallback.parentRunId, ...fallback.parentStepIndex !== undefined ? { stepIndex: fallback.parentStepIndex } : {} }],
790
+ asyncDir,
791
+ ...status.pid ? { pid: status.pid } : {},
792
+ ...status.sessionId ? { sessionId: status.sessionId } : {},
793
+ mode: status.mode ?? fallback.mode,
794
+ state: status.state,
795
+ ...status.currentStep !== undefined ? { currentStep: status.currentStep } : {},
796
+ ...status.chainStepCount !== undefined ? { chainStepCount: status.chainStepCount } : {},
797
+ ...status.activityState ? { activityState: status.activityState } : {},
798
+ ...status.lastActivityAt !== undefined ? { lastActivityAt: status.lastActivityAt } : {},
799
+ ...status.currentTool ? { currentTool: status.currentTool } : {},
800
+ ...status.currentToolStartedAt !== undefined ? { currentToolStartedAt: status.currentToolStartedAt } : {},
801
+ ...status.currentPath ? { currentPath: status.currentPath } : {},
802
+ ...status.turnCount !== undefined ? { turnCount: status.turnCount } : {},
803
+ ...status.toolCount !== undefined ? { toolCount: status.toolCount } : {},
804
+ ...status.totalTokens ? { totalTokens: status.totalTokens } : {},
805
+ ...status.timeoutMs !== undefined ? { timeoutMs: status.timeoutMs } : {},
806
+ ...status.deadlineAt !== undefined ? { deadlineAt: status.deadlineAt } : {},
807
+ ...status.timedOut !== undefined ? { timedOut: status.timedOut } : {},
808
+ ...status.turnBudget ? { turnBudget: status.turnBudget } : {},
809
+ ...status.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: status.turnBudgetExceeded } : {},
810
+ ...status.wrapUpRequested !== undefined ? { wrapUpRequested: status.wrapUpRequested } : {},
811
+ ...status.error ? { error: status.error } : {},
812
+ ...status.startedAt !== undefined ? { startedAt: status.startedAt } : { startedAt: fallback.ts },
813
+ ...status.endedAt !== undefined ? { endedAt: status.endedAt } : {},
814
+ lastUpdate: status.lastUpdate ?? fallback.ts,
815
+ ...status.sessionFile ? { sessionFile: status.sessionFile } : {},
816
+ ...status.steps?.length ? { steps: status.steps.map((step) => ({
817
+ agent: step.agent,
818
+ status: step.status,
819
+ ...step.sessionFile ? { sessionFile: step.sessionFile } : {},
820
+ ...step.activityState ? { activityState: step.activityState } : {},
821
+ ...step.lastActivityAt !== undefined ? { lastActivityAt: step.lastActivityAt } : {},
822
+ ...step.currentTool ? { currentTool: step.currentTool } : {},
823
+ ...step.currentToolStartedAt !== undefined ? { currentToolStartedAt: step.currentToolStartedAt } : {},
824
+ ...step.currentPath ? { currentPath: step.currentPath } : {},
825
+ ...step.turnCount !== undefined ? { turnCount: step.turnCount } : {},
826
+ ...step.toolCount !== undefined ? { toolCount: step.toolCount } : {},
827
+ ...step.startedAt !== undefined ? { startedAt: step.startedAt } : {},
828
+ ...step.endedAt !== undefined ? { endedAt: step.endedAt } : {},
829
+ ...step.error ? { error: step.error } : {},
830
+ ...step.timedOut !== undefined ? { timedOut: step.timedOut } : {},
831
+ ...step.turnBudget ? { turnBudget: step.turnBudget } : {},
832
+ ...step.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: step.turnBudgetExceeded } : {},
833
+ ...step.wrapUpRequested !== undefined ? { wrapUpRequested: step.wrapUpRequested } : {}
834
+ })).slice(0, MAX_STEPS) } : {}
835
+ };
836
+ }
837
+ export function nestedArtifactEnv(rootRunId, parentRunId) {
838
+ return {
839
+ DM_SUBAGENT_NESTED_ROOT_RUN_ID: rootRunId,
840
+ DM_SUBAGENT_NESTED_PARENT_RUN_ID: parentRunId
841
+ };
842
+ }
843
+ export function isTopLevelAsyncDir(asyncDir) {
844
+ const resolved = path.resolve(asyncDir);
845
+ return containedPath(ASYNC_DIR, resolved) && !containedPath(path.join(TEMP_ROOT_DIR, "nested-subagent-runs"), resolved);
846
+ }
847
+ export function nestedResultsPath(rootRunId, id) {
848
+ assertSafeId("rootRunId", rootRunId);
849
+ assertSafeId("id", id);
850
+ return path.join(RESULTS_DIR, "nested", rootRunId, `${id}.json`);
851
+ }