@duckmind/dm-linux-x64 0.61.5 → 0.61.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 (279) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +211 -67
  3. package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
  4. package/extensions/dm-subagents/agents/claude-code.md +15 -0
  5. package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
  6. package/extensions/dm-subagents/agents/codex-exec.md +15 -0
  7. package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
  8. package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
  9. package/extensions/dm-subagents/agents/delegate.md +3 -2
  10. package/extensions/dm-subagents/agents/oracle.md +10 -5
  11. package/extensions/dm-subagents/agents/researcher.md +2 -2
  12. package/extensions/dm-subagents/agents/reviewer.md +17 -7
  13. package/extensions/dm-subagents/agents/scout.md +5 -5
  14. package/extensions/dm-subagents/agents/worker.md +6 -2
  15. package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
  16. package/extensions/dm-subagents/index.js +4 -0
  17. package/extensions/dm-subagents/inspector-runner.mjs +10 -0
  18. package/extensions/dm-subagents/install.mjs +3 -2
  19. package/extensions/dm-subagents/package.json +2 -2
  20. package/extensions/dm-subagents/prompts/council.md +60 -0
  21. package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
  22. package/extensions/dm-subagents/prompts/review-loop.md +13 -7
  23. package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
  24. package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  25. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
  26. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
  27. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
  28. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
  29. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
  30. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
  31. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
  32. package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
  33. package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
  34. package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
  35. package/extensions/dm-subagents/src/agents/agents.js +1447 -299
  36. package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
  37. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
  38. package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
  39. package/extensions/dm-subagents/src/agents/identity.js +1 -1
  40. package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
  41. package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
  42. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
  43. package/extensions/dm-subagents/src/agents/skills.js +52 -35
  44. package/extensions/dm-subagents/src/api/agents.js +6 -0
  45. package/extensions/dm-subagents/src/api/background-work.js +151 -0
  46. package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
  47. package/extensions/dm-subagents/src/api/control-channel.js +3 -0
  48. package/extensions/dm-subagents/src/api/delegation.js +5 -0
  49. package/extensions/dm-subagents/src/api/dm-args.js +3 -0
  50. package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
  51. package/extensions/dm-subagents/src/api/external-runs.js +233 -0
  52. package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
  53. package/extensions/dm-subagents/src/api/preflight.js +322 -0
  54. package/extensions/dm-subagents/src/api/project-panes.js +11 -0
  55. package/extensions/dm-subagents/src/api/shared-types.js +4 -0
  56. package/extensions/dm-subagents/src/extension/config.js +175 -0
  57. package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
  58. package/extensions/dm-subagents/src/extension/doctor.js +71 -17
  59. package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
  60. package/extensions/dm-subagents/src/extension/index.js +711 -265
  61. package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
  62. package/extensions/dm-subagents/src/extension/rpc.js +427 -22
  63. package/extensions/dm-subagents/src/extension/schemas.js +158 -65
  64. package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
  65. package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
  66. package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
  67. package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
  68. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
  69. package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
  70. package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
  71. package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
  72. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
  73. package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
  74. package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
  75. package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
  76. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
  77. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
  78. package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
  79. package/extensions/dm-subagents/src/missions/actions.js +394 -0
  80. package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
  81. package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
  82. package/extensions/dm-subagents/src/missions/store.js +548 -0
  83. package/extensions/dm-subagents/src/missions/types.js +9 -0
  84. package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
  85. package/extensions/dm-subagents/src/policy/authority.js +37 -0
  86. package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
  87. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
  88. package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
  89. package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
  90. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
  91. package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
  92. package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
  93. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
  94. package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
  95. package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
  96. package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
  97. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
  98. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
  99. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
  100. package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
  101. package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
  102. package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
  103. package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
  104. package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
  105. package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
  106. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
  107. package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
  108. package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
  109. package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
  110. package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
  111. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
  112. package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
  113. package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
  114. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
  115. package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
  116. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
  117. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
  118. package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
  119. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
  120. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
  121. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
  122. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
  123. package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
  124. package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
  125. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
  126. package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
  127. package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
  128. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
  129. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
  130. package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
  131. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
  132. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
  133. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
  134. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
  135. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
  136. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
  137. package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
  138. package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
  139. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
  140. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
  141. package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
  142. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
  143. package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
  144. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
  145. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
  146. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
  147. package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
  148. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
  149. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
  150. package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
  151. package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
  152. package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
  153. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
  154. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
  155. package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
  156. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
  157. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
  158. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
  159. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
  160. package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
  161. package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
  162. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
  163. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
  164. package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
  165. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
  166. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
  167. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
  168. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
  169. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
  170. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
  171. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
  172. package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
  173. package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
  174. package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
  175. package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
  176. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
  177. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
  178. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
  179. package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
  180. package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
  181. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
  182. package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
  183. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
  184. package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
  185. package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
  186. package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
  187. package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
  188. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
  189. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
  190. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
  191. package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
  192. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
  193. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
  194. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
  195. package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
  196. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
  197. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
  198. package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
  199. package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
  200. package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
  201. package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
  202. package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
  203. package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
  204. package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
  205. package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
  206. package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
  207. package/extensions/dm-subagents/src/shared/display-text.js +142 -0
  208. package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
  209. package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
  210. package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
  211. package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
  212. package/extensions/dm-subagents/src/shared/formatters.js +21 -7
  213. package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
  214. package/extensions/dm-subagents/src/shared/model-info.js +10 -5
  215. package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
  216. package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
  217. package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
  218. package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
  219. package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
  220. package/extensions/dm-subagents/src/shared/settings.js +39 -47
  221. package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
  222. package/extensions/dm-subagents/src/shared/status-format.js +9 -2
  223. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
  224. package/extensions/dm-subagents/src/shared/types.js +47 -7
  225. package/extensions/dm-subagents/src/shared/utf8.js +12 -0
  226. package/extensions/dm-subagents/src/shared/utils.js +151 -131
  227. package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
  228. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
  229. package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
  230. package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
  231. package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
  232. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
  233. package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
  234. package/extensions/dm-subagents/src/slash/selector.js +101 -0
  235. package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
  236. package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
  237. package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
  238. package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
  239. package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
  240. package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
  241. package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
  242. package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
  243. package/extensions/dm-subagents/src/tui/render.js +1511 -261
  244. package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
  245. package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
  246. package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
  247. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
  248. package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
  249. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
  250. package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
  251. package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
  252. package/extensions/dm-subagents/src/watchdog/render.js +54 -0
  253. package/extensions/dm-subagents/src/watchdog/review.js +251 -0
  254. package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
  255. package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
  256. package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
  257. package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
  258. package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
  259. package/extensions/dm-subagents/src/watchdog/types.js +29 -0
  260. package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
  261. package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
  262. package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
  263. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
  264. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
  265. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
  266. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
  267. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
  268. package/package.json +4 -3
  269. package/extensions/dm-fff/package.json +0 -21
  270. package/extensions/dm-fff/src/index.js +0 -691
  271. package/extensions/dm-fff/src/query.js +0 -60
  272. package/extensions/dm-subagents/agents/context-builder.md +0 -46
  273. package/extensions/dm-subagents/agents/planner.md +0 -55
  274. package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
  275. package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
  276. package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
  277. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
  278. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
  279. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +0 -50
@@ -2,20 +2,26 @@ import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import { discoverAgentsAll } from "../agents/agents.js";
4
4
  import { isAsyncAvailable } from "../runs/background/async-execution.js";
5
+ import { formatSpawnBudgetSummary, getSpawnBudgetSnapshot } from "../runs/shared/spawn-budget.js";
6
+ import { getActiveAsyncCapacitySnapshot, resolveAbandonedSlotReleaseAfterMs, resolveMaxActiveAsyncRunsPerSession } from "../runs/background/active-async-capacity.js";
7
+ import { decodeRunFanoutBudgetDescriptor, formatRunFanoutBudget, getRunFanoutBudgetSnapshot, RUN_FANOUT_BUDGET_ENV } from "../runs/shared/run-fanout-budget.js";
5
8
  import { diagnoseIntercomBridge } from "../intercom/intercom-bridge.js";
6
9
  import { discoverAvailableSkills } from "../agents/skills.js";
7
10
  import {
8
- ASYNC_DIR,
11
+ DIRS,
9
12
  CHAIN_RUNS_DIR,
10
- RESULTS_DIR,
11
- TEMP_ROOT_DIR
13
+ TEMP_ROOT_DIR,
14
+ normalizeMaxSubagentSpawnsPerRun,
15
+ resolveMaxSubagentSpawnsPerRun
12
16
  } from "../shared/types.js";
13
- const DEFAULT_PATHS = {
14
- tempRootDir: TEMP_ROOT_DIR,
15
- asyncDir: ASYNC_DIR,
16
- resultsDir: RESULTS_DIR,
17
- chainRunsDir: CHAIN_RUNS_DIR
18
- };
17
+ function defaultPaths() {
18
+ return {
19
+ tempRootDir: TEMP_ROOT_DIR,
20
+ asyncDir: DIRS.async,
21
+ resultsDir: DIRS.results,
22
+ chainRunsDir: CHAIN_RUNS_DIR
23
+ };
24
+ }
19
25
  const DEFAULT_DEPS = {
20
26
  isAsyncAvailable,
21
27
  discoverAgentsAll,
@@ -89,21 +95,19 @@ function formatSessionLines(input) {
89
95
  }
90
96
  function formatDiscovery(input, deps) {
91
97
  return [
92
- lineFromCheck("agents/chains", () => {
98
+ lineFromCheck("agents", () => {
93
99
  const discovered = deps.discoverAgentsAll(input.cwd);
94
100
  const agentCounts = {
95
101
  builtin: discovered.builtin.length,
96
102
  package: discovered.package?.length ?? 0,
97
103
  user: discovered.user.length,
98
- project: discovered.project.length
104
+ project: discovered.project.length,
105
+ runtime: 0
99
106
  };
100
- const chainCounts = discovered.chains.reduce((counts, chain) => {
101
- counts[chain.source] += 1;
102
- return counts;
103
- }, { builtin: 0, package: 0, user: 0, project: 0 });
107
+ const diagnostics = discovered.agentDiagnostics ?? [];
104
108
  return [
105
109
  `- agents: total ${agentCounts.builtin + agentCounts.package + agentCounts.user + agentCounts.project} (${formatSourceCounts(agentCounts)})`,
106
- `- chains: total ${discovered.chains.length} (${formatSourceCounts(chainCounts)})`
110
+ ...diagnostics.map((diagnostic) => `- invalid agent ${diagnostic.name ?? diagnostic.filePath} (${diagnostic.source}): ${diagnostic.error}`)
107
111
  ].join(`
108
112
  `);
109
113
  }),
@@ -122,6 +126,38 @@ function formatIntercomDiagnostic(diagnostic, context) {
122
126
  ];
123
127
  return lines;
124
128
  }
129
+ function formatSpawnBudgetSection(input) {
130
+ const snapshot = getSpawnBudgetSnapshot(input.state, input.config, input.currentSessionId ?? input.state.currentSessionId);
131
+ return [
132
+ `- usage: ${formatSpawnBudgetSummary(snapshot)}`,
133
+ `- recent grants: ${snapshot.grantHistory.length === 0 ? "none" : snapshot.grantHistory.map((grant) => `+${grant.amount} at ${new Date(grant.grantedAt).toISOString()} (${grant.previousLimit} → ${grant.limit})`).join("; ")}`,
134
+ "- reset boundary: a new parent session resets usage and grants; compaction does not"
135
+ ];
136
+ }
137
+ function formatRunFanoutSection(input) {
138
+ try {
139
+ const inherited = decodeRunFanoutBudgetDescriptor(process.env[RUN_FANOUT_BUDGET_ENV]);
140
+ if (inherited) {
141
+ return [`- usage: ${formatRunFanoutBudget(getRunFanoutBudgetSnapshot(inherited)).replace(/^Run fan-out: /, "")}`, `- root run: ${inherited.rootRunId}`, "- reset boundary: cumulative claims are never released; a new top-level run creates a new budget"];
142
+ }
143
+ } catch (error) {
144
+ return [`- inherited budget: invalid — ${errorText(error)}`];
145
+ }
146
+ const configured = resolveMaxSubagentSpawnsPerRun(input.config.maxSubagentSpawnsPerRun);
147
+ const source = normalizeMaxSubagentSpawnsPerRun(process.env.DM_SUBAGENT_MAX_SPAWNS_PER_RUN) !== undefined ? "environment" : normalizeMaxSubagentSpawnsPerRun(input.config.maxSubagentSpawnsPerRun) !== undefined ? "config" : "default";
148
+ return [`- configured limit: ${configured} (${source})`, "- usage: available after a run starts", "- reset boundary: cumulative claims are never released; a new top-level run creates a new budget"];
149
+ }
150
+ function formatActiveAsyncCapacitySection(input) {
151
+ const limit = resolveMaxActiveAsyncRunsPerSession(input.config.maxActiveAsyncRunsPerSession);
152
+ const sessionId = input.currentSessionId ?? input.state.currentSessionId;
153
+ const snapshot = sessionId ? getActiveAsyncCapacitySnapshot(sessionId, limit, { liveWorkflowRunIds: new Set(input.state.workflowControllers?.keys() ?? []), abandonedSlotReleaseAfterMs: resolveAbandonedSlotReleaseAfterMs(input.config.capacity?.abandonedSlotReleaseAfterMs) }) : { used: 0, limit: limit ?? 0 };
154
+ input.state.activeAsyncCapacity = snapshot;
155
+ return [
156
+ `- usage: ${snapshot.used}/${snapshot.limit || "unlimited"} used`,
157
+ "- scope: top-level async runs in the current parent session; foreground and nested workflow children are not charged again",
158
+ "- release: terminal state plus matching observed process-terminal proof, or abandoned-timeout for failed runs with a dead runner PID and stale activity when enabled; false keeps unknown-proof slots"
159
+ ];
160
+ }
125
161
  function formatPermissionSystemSection() {
126
162
  const lines = [];
127
163
  const parentSession = process.env["DM_SUBAGENT_PARENT_SESSION"] ?? "";
@@ -135,8 +171,14 @@ function formatPermissionSystemSection() {
135
171
  lines.push(`- subagent process: ${isChild ? "yes (DM_SUBAGENT_CHILD=1)" : "no"}`);
136
172
  return lines;
137
173
  }
174
+ function formatWorkflowScriptSection() {
175
+ return [
176
+ "- helpers: runs.run, runs.all, runs.steer, runs.status, runs.ref/refs, emit, console",
177
+ "- recovery: if runs.all is missing, reload or update dm-subagents; await Promise.all([runs.run(...)]) is also supported"
178
+ ];
179
+ }
138
180
  export function buildDoctorReport(input) {
139
- const paths = input.paths ?? DEFAULT_PATHS;
181
+ const paths = input.paths ?? defaultPaths();
140
182
  const deps = { ...DEFAULT_DEPS, ...input.deps };
141
183
  const lines = [
142
184
  "Subagents doctor report",
@@ -155,6 +197,18 @@ export function buildDoctorReport(input) {
155
197
  "Discovery",
156
198
  ...formatDiscovery(input, deps),
157
199
  "",
200
+ "Spawn budget",
201
+ ...formatSpawnBudgetSection(input),
202
+ "",
203
+ "Run fan-out budget",
204
+ ...formatRunFanoutSection(input),
205
+ "",
206
+ "Active async capacity",
207
+ ...formatActiveAsyncCapacitySection(input),
208
+ "",
209
+ "Workflow script",
210
+ ...formatWorkflowScriptSection(),
211
+ "",
158
212
  "Permission system",
159
213
  ...formatPermissionSystemSection(),
160
214
  "",
@@ -4,12 +4,14 @@ import * as path from "node:path";
4
4
  import { discoverAgents } from "../agents/agents.js";
5
5
  import { getArtifactsDir } from "../shared/artifacts.js";
6
6
  import { createSubagentExecutor } from "../runs/foreground/subagent-executor.js";
7
+ import { resolveWaitToolConfig } from "../runs/background/wait-config.js";
7
8
  import { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from "../runs/shared/dm-args.js";
8
9
  import { readNestedControlRequests, resolveNestedRouteFromEnv, writeNestedControlResult } from "../runs/shared/nested-events.js";
9
10
  import { deliverSubagentIntercomMessageEvent } from "../intercom/result-intercom.js";
10
11
  import { resolveSubagentIntercomTarget } from "../intercom/intercom-bridge.js";
11
- import { SubagentParams } from "./schemas.js";
12
- import { loadConfig } from "./config.js";
12
+ import { createSubagentParamsSchema } from "./schemas.js";
13
+ import { finalizeToolResult } from "./tool-result.js";
14
+ import { loadConfig, resolveAsyncByDefault } from "./config.js";
13
15
  function getSubagentSessionRoot(parentSessionFile) {
14
16
  if (parentSessionFile) {
15
17
  const baseName = path.basename(parentSessionFile, ".jsonl");
@@ -31,7 +33,6 @@ function createChildSafeState() {
31
33
  foregroundRuns: new Map,
32
34
  foregroundControls: new Map,
33
35
  lastForegroundControlId: null,
34
- pendingForegroundControlNotices: new Map,
35
36
  cleanupTimers: new Map,
36
37
  lastUiContext: null,
37
38
  poller: null,
@@ -44,27 +45,29 @@ function createChildSafeState() {
44
45
  }
45
46
  };
46
47
  }
47
- function startNestedControlInboxListener(pi, state) {
48
- let route;
48
+ function resolveNestedControlRoute() {
49
49
  try {
50
- route = resolveNestedRouteFromEnv();
50
+ return resolveNestedRouteFromEnv();
51
51
  } catch {
52
52
  return;
53
53
  }
54
- if (!route)
55
- return;
56
- const seen = new Set;
57
- const inFlight = new Set;
58
- const pendingResults = new Map;
54
+ }
55
+ function nestedControlRouteKey(route) {
56
+ return route.controlInbox;
57
+ }
58
+ function createNestedControlInboxState() {
59
+ return { seen: new Set, inFlight: new Set, pendingResults: new Map };
60
+ }
61
+ function startNestedControlInboxListener(dm, state, route, inboxState) {
59
62
  const timer = setInterval(() => {
60
63
  try {
61
64
  for (const request of readNestedControlRequests(route)) {
62
- if (seen.has(request.requestId) || inFlight.has(request.requestId))
65
+ if (inboxState.seen.has(request.requestId) || inboxState.inFlight.has(request.requestId))
63
66
  continue;
64
- inFlight.add(request.requestId);
67
+ inboxState.inFlight.add(request.requestId);
65
68
  (async () => {
66
69
  try {
67
- let result = pendingResults.get(request.requestId);
70
+ let result = inboxState.pendingResults.get(request.requestId);
68
71
  if (!result) {
69
72
  let ok = false;
70
73
  let message = "Control request failed.";
@@ -82,7 +85,7 @@ function startNestedControlInboxListener(pi, state) {
82
85
  } else {
83
86
  const index = control.currentIndex ?? 0;
84
87
  const target = resolveSubagentIntercomTarget(request.targetRunId, control.currentAgent, index);
85
- ok = await deliverSubagentIntercomMessageEvent(pi.events, target, `Follow-up for nested run ${request.targetRunId} (${control.currentAgent}):
88
+ ok = await deliverSubagentIntercomMessageEvent(dm.events, target, `Follow-up for nested run ${request.targetRunId} (${control.currentAgent}):
86
89
 
87
90
  ${request.message.trim()}`, 500, { source: "nested-resume", runId: request.targetRunId, agent: control.currentAgent, index });
88
91
  message = ok ? `Delivered follow-up to live nested run ${request.targetRunId}.` : `Nested child intercom target is not registered: ${target}`;
@@ -95,17 +98,17 @@ ${request.message.trim()}`, 500, { source: "nested-resume", runId: request.targe
95
98
  try {
96
99
  writeNestedControlResult(route, result);
97
100
  } catch (error) {
98
- pendingResults.set(request.requestId, result);
101
+ inboxState.pendingResults.set(request.requestId, result);
99
102
  console.error(`Failed to write nested control result for request '${request.requestId}' targeting '${request.targetRunId}' via inbox '${route.controlInbox}'; keeping request for retry:`, error);
100
103
  return;
101
104
  }
102
- pendingResults.delete(request.requestId);
103
- seen.add(request.requestId);
105
+ inboxState.pendingResults.delete(request.requestId);
106
+ inboxState.seen.add(request.requestId);
104
107
  try {
105
108
  fs.unlinkSync(request.filePath);
106
109
  } catch {}
107
110
  } finally {
108
- inFlight.delete(request.requestId);
111
+ inboxState.inFlight.delete(request.requestId);
109
112
  }
110
113
  })();
111
114
  }
@@ -114,45 +117,59 @@ ${request.message.trim()}`, 500, { source: "nested-resume", runId: request.targe
114
117
  }
115
118
  }, 200);
116
119
  timer.unref?.();
117
- return timer;
120
+ return () => clearInterval(timer);
118
121
  }
119
- export default function registerFanoutChildSubagentExtension(pi) {
122
+ export default function registerFanoutChildSubagentExtension(dm) {
120
123
  if (process.env[SUBAGENT_CHILD_ENV] !== "1" || process.env[SUBAGENT_FANOUT_CHILD_ENV] !== "1")
121
124
  return;
122
125
  const globalStore = globalThis;
123
126
  const registeredKey = "__piSubagentFanoutChildRegisteredApis";
124
127
  const registeredApis = globalStore[registeredKey] instanceof WeakSet ? globalStore[registeredKey] : new WeakSet;
125
128
  globalStore[registeredKey] = registeredApis;
126
- if (registeredApis.has(pi))
129
+ if (registeredApis.has(dm))
127
130
  return;
128
- registeredApis.add(pi);
131
+ registeredApis.add(dm);
129
132
  const config = loadConfig();
133
+ const waitToolConfig = resolveWaitToolConfig(config.waitTool);
130
134
  const state = createChildSafeState();
131
135
  const executor = createSubagentExecutor({
132
- pi,
136
+ dm,
133
137
  state,
134
138
  config,
135
- asyncByDefault: config.asyncByDefault === true,
139
+ asyncByDefault: resolveAsyncByDefault(config),
140
+ waitToolEnabled: waitToolConfig.enabled,
141
+ waitToolDefaultTimeoutMs: waitToolConfig.defaultTimeoutMs,
136
142
  tempArtifactsDir: getArtifactsDir(null),
137
143
  getSubagentSessionRoot,
138
144
  expandTilde,
139
145
  discoverAgents,
140
146
  allowMutatingManagementActions: false
141
147
  });
148
+ const params = createSubagentParamsSchema();
142
149
  const tool = {
143
150
  name: "subagent",
144
151
  label: "Subagent",
145
152
  description: [
146
153
  "Delegate to subagents from child-safe fanout mode.",
147
- "Allowed management/control actions: list, get, status, interrupt, resume, steer, append-step, doctor.",
148
- "Agent config mutation actions (create, update, delete, eject, disable, enable, reset) are blocked in this mode."
154
+ "Allowed management/control actions: list, get, status, lane.status, interrupt, resume, steer, doctor.",
155
+ "Mutating management actions (create, update, delete, eject, disable, enable, reset, grant-spawn-budget, lane.recordMerge, lane.recordSupersession) are blocked in this mode."
149
156
  ].join(`
150
157
  `),
151
- parameters: SubagentParams,
152
- execute(id, params, signal, onUpdate, ctx) {
153
- return executor.execute(id, params, signal, onUpdate, ctx);
158
+ parameters: params,
159
+ async execute(id, params, signal, onUpdate, ctx) {
160
+ return finalizeToolResult(await executor.executePublic(id, params, signal ?? new AbortController().signal, onUpdate, ctx));
154
161
  }
155
162
  };
156
- pi.registerTool(tool);
157
- startNestedControlInboxListener(pi, state);
163
+ dm.registerTool(tool);
164
+ const route = resolveNestedControlRoute();
165
+ if (!route)
166
+ return;
167
+ const listenerCleanupKey = "__piSubagentFanoutChildNestedControlInboxCleanups";
168
+ const listenerCleanups = globalStore[listenerCleanupKey] instanceof Map ? globalStore[listenerCleanupKey] : new Map;
169
+ globalStore[listenerCleanupKey] = listenerCleanups;
170
+ const routeKey = nestedControlRouteKey(route);
171
+ const previous = listenerCleanups.get(routeKey);
172
+ previous?.cleanup();
173
+ const inboxState = previous?.state ?? createNestedControlInboxState();
174
+ listenerCleanups.set(routeKey, { state: inboxState, cleanup: startNestedControlInboxListener(dm, state, route, inboxState) });
158
175
  }