@duckmind/dm-windows-x64 0.61.4 → 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.exe +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
@@ -1,15 +1,120 @@
1
1
  import * as fs from "node:fs";
2
+ import { createRequire } from "node:module";
2
3
  import * as os from "node:os";
3
4
  import * as path from "node:path";
4
- import { Compile } from "typebox/compile";
5
+ import { pathToFileURL } from "node:url";
6
+ import { DM_CODING_AGENT_PACKAGE_ROOT_ENV } from "../../shared/utils.js";
5
7
  export const STRUCTURED_OUTPUT_SCHEMA_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA";
6
8
  export const STRUCTURED_OUTPUT_CAPTURE_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";
9
+ export const STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE_ENV = "DM_SUBAGENT_STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE";
10
+ export const MISSING_STRUCTURED_OUTPUT_CALL_ERROR = "Missing structured_output call; this step has outputSchema and must finish by calling structured_output.";
11
+ const SCHEMA_MAP_KEYWORDS = ["properties", "patternProperties", "$defs", "definitions", "dependentSchemas"];
12
+ const SCHEMA_SINGLE_KEYWORDS = ["additionalItems", "additionalProperties", "contains", "not", "propertyNames", "if", "then", "else", "unevaluatedItems", "unevaluatedProperties", "contentSchema"];
13
+ const SCHEMA_ARRAY_KEYWORDS = ["allOf", "anyOf", "oneOf", "prefixItems"];
14
+ function rewriteLocalJsonPointerRefs(schema, pointerPrefix, inheritsWrapperResource = true) {
15
+ if (typeof schema === "boolean" || !schema || typeof schema !== "object" || Array.isArray(schema))
16
+ return schema;
17
+ const source = schema;
18
+ const rewritten = { ...source };
19
+ const sharesWrapperResource = inheritsWrapperResource && typeof source.$id !== "string";
20
+ if (sharesWrapperResource) {
21
+ for (const keyword of ["$ref", "$dynamicRef", "$recursiveRef"]) {
22
+ const ref = source[keyword];
23
+ if (ref === "#")
24
+ rewritten[keyword] = pointerPrefix;
25
+ else if (typeof ref === "string" && ref.startsWith("#/"))
26
+ rewritten[keyword] = `${pointerPrefix}${ref.slice(1)}`;
27
+ }
28
+ }
29
+ for (const keyword of SCHEMA_MAP_KEYWORDS) {
30
+ const entries = source[keyword];
31
+ if (!entries || typeof entries !== "object" || Array.isArray(entries))
32
+ continue;
33
+ rewritten[keyword] = Object.fromEntries(Object.entries(entries).map(([name, nested]) => [
34
+ name,
35
+ rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource)
36
+ ]));
37
+ }
38
+ const items = source.items;
39
+ if (Array.isArray(items))
40
+ rewritten.items = items.map((nested) => rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource));
41
+ else if (items !== undefined)
42
+ rewritten.items = rewriteLocalJsonPointerRefs(items, pointerPrefix, sharesWrapperResource);
43
+ for (const keyword of SCHEMA_SINGLE_KEYWORDS) {
44
+ if (source[keyword] !== undefined)
45
+ rewritten[keyword] = rewriteLocalJsonPointerRefs(source[keyword], pointerPrefix, sharesWrapperResource);
46
+ }
47
+ for (const keyword of SCHEMA_ARRAY_KEYWORDS) {
48
+ if (Array.isArray(source[keyword]))
49
+ rewritten[keyword] = source[keyword].map((nested) => rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource));
50
+ }
51
+ const dependencies = source.dependencies;
52
+ if (dependencies && typeof dependencies === "object" && !Array.isArray(dependencies)) {
53
+ rewritten.dependencies = Object.fromEntries(Object.entries(dependencies).map(([name, nested]) => [
54
+ name,
55
+ Array.isArray(nested) ? nested : rewriteLocalJsonPointerRefs(nested, pointerPrefix, sharesWrapperResource)
56
+ ]));
57
+ }
58
+ return rewritten;
59
+ }
60
+ export function createStructuredOutputToolParameters(schema, options = {}) {
61
+ return {
62
+ type: "object",
63
+ properties: {
64
+ value: rewriteLocalJsonPointerRefs(schema, "#/properties/value"),
65
+ ...options.acceptanceReport ? { acceptanceReport: { type: "object" } } : {}
66
+ },
67
+ required: ["value"],
68
+ additionalProperties: false
69
+ };
70
+ }
71
+ let cachedCompile;
72
+ export async function resolveCompileFromPackageRoot(packageRoot) {
73
+ const requireFromRoot = createRequire(path.join(packageRoot, "package.json"));
74
+ const resolved = requireFromRoot.resolve("typebox/compile");
75
+ const mod = await import(pathToFileURL(resolved).href);
76
+ return typeof mod.Compile === "function" ? mod.Compile : undefined;
77
+ }
78
+ async function importCompile() {
79
+ const failures = [];
80
+ try {
81
+ const mod = await import("typebox/compile");
82
+ if (typeof mod.Compile === "function")
83
+ return mod.Compile;
84
+ failures.push("typebox/compile did not export a Compile function");
85
+ } catch (error) {
86
+ failures.push(`direct import failed: ${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ const packageRoot = process.env[DM_CODING_AGENT_PACKAGE_ROOT_ENV];
89
+ if (packageRoot) {
90
+ try {
91
+ const compile = await resolveCompileFromPackageRoot(packageRoot);
92
+ if (compile)
93
+ return compile;
94
+ failures.push("DM package root typebox/compile did not export a Compile function");
95
+ } catch (error) {
96
+ failures.push(`DM package root import failed: ${error instanceof Error ? error.message : String(error)}`);
97
+ }
98
+ } else {
99
+ failures.push(`${DM_CODING_AGENT_PACKAGE_ROOT_ENV} is not set`);
100
+ }
101
+ throw new Error(`Cannot load typebox/compile for structured output validation (${failures.join("; ")})`);
102
+ }
103
+ function loadCompile() {
104
+ if (!cachedCompile) {
105
+ cachedCompile = importCompile().catch((error) => {
106
+ cachedCompile = undefined;
107
+ throw error;
108
+ });
109
+ }
110
+ return cachedCompile;
111
+ }
7
112
  export function assertJsonSchemaObject(schema, label = "outputSchema") {
8
113
  if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
9
114
  throw new Error(`${label} must be a JSON Schema object.`);
10
115
  }
11
116
  }
12
- export function createStructuredOutputRuntime(schema, baseDir) {
117
+ export function createStructuredOutputRuntime(schema, baseDir, options = {}) {
13
118
  assertJsonSchemaObject(schema);
14
119
  const rootDir = baseDir ?? os.tmpdir();
15
120
  fs.mkdirSync(rootDir, { recursive: true });
@@ -17,12 +122,13 @@ export function createStructuredOutputRuntime(schema, baseDir) {
17
122
  const schemaPath = path.join(dir, "schema.json");
18
123
  const outputPath = path.join(dir, "output.json");
19
124
  fs.writeFileSync(schemaPath, JSON.stringify(schema), { mode: 384 });
20
- return { schema, schemaPath, outputPath };
125
+ return { schema, schemaPath, outputPath, ...options.captureAcceptanceReport ? { acceptanceReportPath: path.join(dir, "acceptance-report.json") } : {} };
21
126
  }
22
- export function validateStructuredOutputValue(schema, value) {
127
+ export async function validateStructuredOutputValue(schema, value) {
128
+ const compile = await loadCompile();
23
129
  let validator;
24
130
  try {
25
- validator = Compile(schema);
131
+ validator = compile(schema);
26
132
  } catch (error) {
27
133
  return { status: "invalid", message: `invalid outputSchema: ${error instanceof Error ? error.message : String(error)}` };
28
134
  }
@@ -34,9 +140,9 @@ export function validateStructuredOutputValue(schema, value) {
34
140
  });
35
141
  return { status: "invalid", message: errors.join("; ") || "schema validation failed" };
36
142
  }
37
- export function readStructuredOutput(runtime) {
143
+ export async function readStructuredOutput(runtime) {
38
144
  if (!fs.existsSync(runtime.outputPath)) {
39
- return { error: "Missing structured_output call; this step has outputSchema and must finish by calling structured_output." };
145
+ return { error: MISSING_STRUCTURED_OUTPUT_CALL_ERROR };
40
146
  }
41
147
  let value;
42
148
  try {
@@ -44,11 +150,24 @@ export function readStructuredOutput(runtime) {
44
150
  } catch (error) {
45
151
  return { error: `Failed to read structured output: ${error instanceof Error ? error.message : String(error)}` };
46
152
  }
47
- const validation = validateStructuredOutputValue(runtime.schema, value);
48
- if (validation.status === "invalid")
49
- return { error: `Structured output validation failed: ${validation.message}` };
153
+ try {
154
+ const validation = await validateStructuredOutputValue(runtime.schema, value);
155
+ if (validation.status === "invalid")
156
+ return { error: `Structured output validation failed: ${validation.message}` };
157
+ } catch (error) {
158
+ return { error: `Failed to validate structured output: ${error instanceof Error ? error.message : String(error)}` };
159
+ }
50
160
  return { value };
51
161
  }
162
+ export function readStructuredOutputAcceptanceReport(runtime) {
163
+ if (!runtime.acceptanceReportPath || !fs.existsSync(runtime.acceptanceReportPath))
164
+ return {};
165
+ try {
166
+ return { value: JSON.parse(fs.readFileSync(runtime.acceptanceReportPath, "utf-8")) };
167
+ } catch (error) {
168
+ return { error: `Failed to read structured output acceptance report: ${error instanceof Error ? error.message : String(error)}` };
169
+ }
170
+ }
52
171
  export function cleanupStructuredOutputRuntime(runtime) {
53
172
  if (!runtime)
54
173
  return;
@@ -1,9 +1,13 @@
1
+ import { isToolTimeoutExempt } from "./tool-timeout.js";
2
+ import { createHash } from "node:crypto";
3
+ import { previewDisplayText } from "../../shared/display-text.js";
1
4
  const CONTROL_EVENT_TYPES = ["active_long_running", "needs_attention"];
2
5
  const CONTROL_NOTIFICATION_CHANNELS = ["event", "async", "intercom"];
3
6
  const DEFAULT_NOTIFY_ON = ["active_long_running", "needs_attention"];
4
7
  export const DEFAULT_CONTROL_CONFIG = {
5
8
  enabled: true,
6
9
  needsAttentionAfterMs: 60000,
10
+ needsAttentionAfterMsIsExplicit: false,
7
11
  activeNoticeAfterMs: 240000,
8
12
  failedToolAttemptsBeforeAttention: 3,
9
13
  notifyOn: DEFAULT_NOTIFY_ON,
@@ -27,7 +31,10 @@ function parseControlList(value, allowed) {
27
31
  }
28
32
  export function resolveControlConfig(globalConfig, override) {
29
33
  const enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;
30
- const needsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs) ?? parsePositiveInt(globalConfig?.needsAttentionAfterMs) ?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;
34
+ const overrideNeedsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs);
35
+ const globalNeedsAttentionAfterMs = parsePositiveInt(globalConfig?.needsAttentionAfterMs);
36
+ const needsAttentionAfterMs = overrideNeedsAttentionAfterMs ?? globalNeedsAttentionAfterMs ?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;
37
+ const needsAttentionAfterMsIsExplicit = overrideNeedsAttentionAfterMs !== undefined || globalNeedsAttentionAfterMs !== undefined;
31
38
  const activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs) ?? parsePositiveInt(globalConfig?.activeNoticeAfterMs) ?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;
32
39
  const activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns) ?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);
33
40
  const activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens) ?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);
@@ -37,6 +44,7 @@ export function resolveControlConfig(globalConfig, override) {
37
44
  return {
38
45
  enabled,
39
46
  needsAttentionAfterMs,
47
+ needsAttentionAfterMsIsExplicit,
40
48
  activeNoticeAfterMs,
41
49
  activeNoticeAfterTurns,
42
50
  activeNoticeAfterTokens,
@@ -45,13 +53,36 @@ export function resolveControlConfig(globalConfig, override) {
45
53
  notifyChannels: [...notifyChannels]
46
54
  };
47
55
  }
56
+ function scaledNeedsAttentionAfterMs(config, thinking) {
57
+ if (config.needsAttentionAfterMsIsExplicit !== false)
58
+ return config.needsAttentionAfterMs;
59
+ switch (thinking) {
60
+ case "medium":
61
+ return config.needsAttentionAfterMs * 2;
62
+ case "high":
63
+ return config.needsAttentionAfterMs * 5;
64
+ case "xhigh":
65
+ case "max":
66
+ return config.needsAttentionAfterMs * 10;
67
+ default:
68
+ return config.needsAttentionAfterMs;
69
+ }
70
+ }
48
71
  export function deriveActivityState(input) {
49
- if (!input.config.enabled)
72
+ if (!input.config.enabled || input.currentTool)
50
73
  return;
51
74
  const now = input.now ?? Date.now();
52
75
  const lastActivity = input.lastActivityAt ?? input.startedAt;
53
76
  const ageMs = Math.max(0, now - lastActivity);
54
- return ageMs > input.config.needsAttentionAfterMs ? "needs_attention" : undefined;
77
+ return ageMs > scaledNeedsAttentionAfterMs(input.config, input.thinking) ? "needs_attention" : undefined;
78
+ }
79
+ export function shouldEmitOpenToolAttention(input) {
80
+ if (!input.config.enabled || !input.currentTool || input.currentToolStartedAt === undefined)
81
+ return false;
82
+ if (isToolTimeoutExempt(input.currentTool))
83
+ return false;
84
+ const now = input.now ?? Date.now();
85
+ return Math.max(0, now - input.currentToolStartedAt) >= input.config.activeNoticeAfterMs;
55
86
  }
56
87
  export function buildControlEvent(input) {
57
88
  const ts = input.ts ?? Date.now();
@@ -76,7 +107,11 @@ export function buildControlEvent(input) {
76
107
  ...input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {},
77
108
  ...input.currentPath ? { currentPath: input.currentPath } : {},
78
109
  ...elapsedMs !== undefined ? { elapsedMs } : {},
79
- ...input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}
110
+ ...input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {},
111
+ ...input.workflowKey ? { workflowKey: input.workflowKey } : {},
112
+ ...input.phase ? { phase: input.phase } : {},
113
+ ...input.label ? { label: input.label } : {},
114
+ ...input.taskPreview ? { taskPreview: previewDisplayText(input.taskPreview, 160) } : {}
80
115
  };
81
116
  }
82
117
  export function shouldNotifyControlEvent(config, event) {
@@ -84,7 +119,8 @@ export function shouldNotifyControlEvent(config, event) {
84
119
  }
85
120
  export function controlNotificationKey(event, childIntercomTarget) {
86
121
  const childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);
87
- return `${childKey}:${event.type}:${event.reason ?? "idle"}`;
122
+ const contextHash = createHash("sha256").update(formatControlNudge(event)).digest("hex").slice(0, 8);
123
+ return `${childKey}:${event.type}:${event.reason ?? "idle"}:${contextHash}`;
88
124
  }
89
125
  export function claimControlNotification(config, event, seenKeys, childIntercomTarget) {
90
126
  if (!shouldNotifyControlEvent(config, event))
@@ -111,6 +147,18 @@ function formatLongRunningFacts(event) {
111
147
  facts.push(`path ${event.currentPath}`);
112
148
  return facts.length > 0 ? facts.join(" | ") : undefined;
113
149
  }
150
+ export function formatControlNudge(event) {
151
+ const scope = event.label ?? event.phase ?? event.workflowKey ?? event.taskPreview;
152
+ if (event.recentFailureSummary)
153
+ return previewDisplayText(`Resolve the recent failure${scope ? ` for ${scope}` : ""}: ${event.recentFailureSummary}. Report the smallest next step or ask for a decision.`, 160);
154
+ if (event.currentTool || event.currentPath) {
155
+ const current = [event.currentTool ? `tool ${event.currentTool}` : undefined, event.currentPath ? `path ${event.currentPath}` : undefined].filter(Boolean).join(" at ");
156
+ return previewDisplayText(`Check ${current}${scope ? ` for ${scope}` : ""}. Report the smallest next step or ask for a decision.`, 160);
157
+ }
158
+ if (scope)
159
+ return previewDisplayText(`Continue ${scope}. Report the smallest next step or ask for a decision.`, 160);
160
+ return "What are you blocked on? Reply with the smallest next step or ask for a decision.";
161
+ }
114
162
  export function formatControlNoticeMessage(event, childIntercomTarget) {
115
163
  const runTarget = event.runId;
116
164
  if (event.reason === "completion_guard") {
@@ -123,8 +171,9 @@ export function formatControlNoticeMessage(event, childIntercomTarget) {
123
171
  ].filter((line) => Boolean(line)).join(`
124
172
  `);
125
173
  }
126
- const nudgeMessage = "What are you blocked on? Reply with the smallest next step or ask for a decision.";
127
- const nudgeCommand = `subagent({ action: "resume", id: "${runTarget}", ${event.index !== undefined ? `index: ${event.index}, ` : ""}message: "${nudgeMessage}" })`;
174
+ const nudgeMessage = formatControlNudge(event);
175
+ const steerCommand = `subagent({ action: "steer", id: "${runTarget}", ${event.index !== undefined ? `index: ${event.index}, ` : ""}message: ${JSON.stringify(nudgeMessage)} })`;
176
+ const nestedResumeCommand = `subagent({ action: "resume", id: "${runTarget}", message: ${JSON.stringify(nudgeMessage)} })`;
128
177
  if (event.type === "active_long_running") {
129
178
  const facts = formatLongRunningFacts(event);
130
179
  return [
@@ -132,21 +181,27 @@ export function formatControlNoticeMessage(event, childIntercomTarget) {
132
181
  `Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : ""}`,
133
182
  `Signal: ${event.message}`,
134
183
  facts ? `Facts: ${facts}` : undefined,
135
- "Hint: Inspect status, then nudge if the work seems stuck. Live async nudges interrupt the child before sending the follow-up.",
136
- `Nudge: ${nudgeCommand}`,
184
+ "Hint: Inspect status first. Use steer for a top-level live async child, routed resume for a live nested child, or resume to revive a paused/completed/failed child.",
185
+ `Top-level live async nudge: ${steerCommand}`,
186
+ `Routed live nested nudge: ${nestedResumeCommand}`,
137
187
  childIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,
138
188
  `Status: subagent({ action: "status", id: "${runTarget}" })`,
139
189
  `Interrupt: subagent({ action: "interrupt", id: "${runTarget}" })`
140
190
  ].filter((line) => Boolean(line)).join(`
141
191
  `);
142
192
  }
193
+ const supervisorHint = event.reason === "supervisor_request" ? "Supervisor request: reply to the pending request. If subagent_supervisor pending is empty, check intercom pending because an external intercom tool may own the request." : undefined;
194
+ const facts = formatLongRunningFacts(event);
143
195
  return [
144
196
  `Subagent needs attention: ${event.agent}`,
145
197
  `Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : ""}`,
146
198
  `Signal: ${event.message}`,
199
+ facts ? `Facts: ${facts}` : undefined,
147
200
  event.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,
148
- "Hint: Inspect status first unless the run is clearly blocked. Live async nudges interrupt the child before sending the follow-up.",
149
- `Nudge: ${nudgeCommand}`,
201
+ supervisorHint,
202
+ "Hint: Inspect status first unless the run is clearly blocked. Use steer for a top-level live async child, routed resume for a live nested child, or resume to revive a paused/completed/failed child.",
203
+ `Top-level live async nudge: ${steerCommand}`,
204
+ `Routed live nested nudge: ${nestedResumeCommand}`,
150
205
  childIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,
151
206
  `Status: subagent({ action: "status", id: "${runTarget}" })`,
152
207
  `Interrupt: subagent({ action: "interrupt", id: "${runTarget}" })`