@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
@@ -0,0 +1,373 @@
1
+ import * as fs from "node:fs";
2
+ import { sanitizeDisplayText, truncateDisplayText } from "../../shared/display-text.js";
3
+ import { decodeUtf8Tail } from "../../shared/utf8.js";
4
+ import { DIRS } from "../../shared/types.js";
5
+ import { readStatus } from "../../shared/utils.js";
6
+ import { readSessionMessagesTail } from "./fleet-view.js";
7
+ import { completionReplayPath, readCompletionArchive, readCompletionReplay } from "./completion-replay.js";
8
+ import { resultPayloadPathForSessionRun } from "./result-files.js";
9
+ import { resolveSubagentRunId } from "./run-id-resolver.js";
10
+ import { reconcileAsyncRun, reconcileNestedAsyncDescendants } from "./stale-run-reconciler.js";
11
+ export const INSPECT_REPLY_KIND = "dm-subagents.inspect-reply";
12
+ export const INSPECT_REPLY_VERSION = 1;
13
+ export const INSPECT_WIDGET_KEY = "subagent-inspect";
14
+ export const INSPECT_WIDGET_PREFIX = "DM_SUBAGENT_INSPECT_JSON:";
15
+ const REQUEST_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
16
+ const MAX_ID_LENGTH = 256;
17
+ const MAX_LABEL_LENGTH = 160;
18
+ const MAX_TASK_LENGTH = 2000;
19
+ const MAX_FINAL_OUTPUT_LENGTH = 8000;
20
+ const MAX_MESSAGE_TEXT_LENGTH = 1000;
21
+ const DEFAULT_MESSAGE_LINES = 100;
22
+ const MAX_MESSAGE_LINES = 200;
23
+ const FAILED_OUTPUT_ARTIFACT_PREFIX = `Subagent run failed before producing output.
24
+
25
+ Error:
26
+ `;
27
+ export const MAX_SERIALIZED_BYTES = 64 * 1024;
28
+ function isRecord(value) {
29
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30
+ }
31
+ function publicText(value, maxLength) {
32
+ if (typeof value !== "string")
33
+ return;
34
+ const normalized = sanitizeDisplayText(value.slice(0, maxLength * 4));
35
+ return normalized ? truncateDisplayText(normalized, maxLength) : undefined;
36
+ }
37
+ function boundContent(value, maxLength) {
38
+ const normalized = value.replace(/[\u2028\u2029]/g, `
39
+ `);
40
+ return truncateDisplayText(normalized, maxLength);
41
+ }
42
+ function errorReply(request, code, message) {
43
+ return {
44
+ kind: INSPECT_REPLY_KIND,
45
+ version: INSPECT_REPLY_VERSION,
46
+ requestId: typeof request.requestId === "string" && REQUEST_ID_PATTERN.test(request.requestId) ? request.requestId : "invalid",
47
+ ...typeof request.asyncId === "string" ? { asyncId: truncateDisplayText(request.asyncId, MAX_ID_LENGTH) } : {},
48
+ ...typeof request.childId === "string" ? { childId: truncateDisplayText(request.childId, MAX_ID_LENGTH) } : {},
49
+ error: { code, message }
50
+ };
51
+ }
52
+ export function parseInspectRequest(args) {
53
+ const tokens = args.trim().split(/\s+/).filter(Boolean);
54
+ const positional = [];
55
+ let lines;
56
+ for (let index = 0;index < tokens.length; index++) {
57
+ const token = tokens[index];
58
+ if (token === "--lines") {
59
+ const value = tokens[++index];
60
+ const parsed = value === undefined ? NaN : Number.parseInt(value, 10);
61
+ if (!Number.isFinite(parsed))
62
+ return { error: "--lines requires an integer value." };
63
+ lines = parsed;
64
+ continue;
65
+ }
66
+ if (token.startsWith("--"))
67
+ return { error: `Unknown flag: ${token}. Supported: --lines N.` };
68
+ positional.push(token);
69
+ }
70
+ const [requestId, asyncId, childId, ...extra] = positional;
71
+ if (!requestId || !REQUEST_ID_PATTERN.test(requestId)) {
72
+ return { error: "requestId must match [A-Za-z0-9_-]{1,64}." };
73
+ }
74
+ if (!asyncId)
75
+ return { error: "Usage: /subagents-inspect-rpc <requestId> <asyncId> [childId] [--lines N]." };
76
+ if (asyncId.length > MAX_ID_LENGTH || childId !== undefined && childId.length > MAX_ID_LENGTH) {
77
+ return { error: "asyncId/childId exceed the maximum length." };
78
+ }
79
+ if (extra.length > 0)
80
+ return { error: "Too many positional arguments. Usage: /subagents-inspect-rpc <requestId> <asyncId> [childId] [--lines N]." };
81
+ if (lines !== undefined && (lines < 1 || !Number.isSafeInteger(lines)))
82
+ return { error: "--lines must be a positive integer." };
83
+ return { request: { requestId, asyncId, childId, lines } };
84
+ }
85
+ function findChildNode(status, asyncDir, childId) {
86
+ const steps = status.steps ?? [];
87
+ for (let index = 0;index < steps.length; index++) {
88
+ const step = steps[index];
89
+ const ids = [step.workflowKey, step.runId, `step:${index}`];
90
+ if (ids.includes(childId)) {
91
+ return { asyncDir, status, stepIndex: index, label: step.label ?? step.agent };
92
+ }
93
+ }
94
+ const findNested = (children) => {
95
+ for (const child of children ?? []) {
96
+ if (child.id === childId)
97
+ return child;
98
+ const deeper = findNested(child.children);
99
+ if (deeper)
100
+ return deeper;
101
+ }
102
+ return;
103
+ };
104
+ for (const step of steps) {
105
+ const nested = findNested(step.children);
106
+ if (nested) {
107
+ if (!nested.asyncDir)
108
+ return { error: `Child '${childId}' has no async directory to inspect.` };
109
+ const childStatus = readStatus(nested.asyncDir);
110
+ if (!childStatus)
111
+ return { error: `Child '${childId}' status is unavailable.` };
112
+ return { asyncDir: nested.asyncDir, status: childStatus, label: nested.agent ?? nested.agents?.join(", ") };
113
+ }
114
+ }
115
+ return { error: `Child '${childId}' was not found under async run '${status.runId}'.` };
116
+ }
117
+ function resultOutput(data, stepIndex) {
118
+ if (!isRecord(data))
119
+ throw new Error("Async result payload must be an object.");
120
+ if (data.results !== undefined && !Array.isArray(data.results))
121
+ throw new Error("Async result payload results must be an array.");
122
+ if (data.summary !== undefined && typeof data.summary !== "string")
123
+ throw new Error("Async result payload summary must be a string.");
124
+ const results = data.results;
125
+ if (stepIndex !== undefined && results) {
126
+ const stepResult = results[stepIndex];
127
+ if (stepResult === undefined)
128
+ return {};
129
+ if (!isRecord(stepResult))
130
+ throw new Error("Async result payload step result must be an object.");
131
+ if (stepResult.output !== undefined && typeof stepResult.output !== "string")
132
+ throw new Error("Async result payload step output must be a string.");
133
+ if (stepResult.error !== undefined && typeof stepResult.error !== "string")
134
+ throw new Error("Async result payload step error must be a string.");
135
+ return {
136
+ ...typeof stepResult.output === "string" ? { output: stepResult.output } : {},
137
+ ...typeof stepResult.error === "string" ? { errorText: stepResult.error } : {}
138
+ };
139
+ }
140
+ if (typeof data.summary === "string")
141
+ return { output: data.summary };
142
+ if (results?.length === 1) {
143
+ const result = results[0];
144
+ if (!isRecord(result))
145
+ throw new Error("Async result payload result must be an object.");
146
+ if (result.output !== undefined && typeof result.output !== "string")
147
+ throw new Error("Async result payload output must be a string.");
148
+ if (typeof result.output === "string")
149
+ return { output: result.output };
150
+ }
151
+ return {};
152
+ }
153
+ function readOutputArtifact(outputPath) {
154
+ const file = fs.openSync(outputPath, "r");
155
+ try {
156
+ const prefix = Buffer.allocUnsafe(Buffer.byteLength(FAILED_OUTPUT_ARTIFACT_PREFIX, "utf-8"));
157
+ const prefixBytes = fs.readSync(file, prefix, 0, prefix.length, 0);
158
+ const failedOutput = prefix.subarray(0, prefixBytes).toString("utf-8") === FAILED_OUTPUT_ARTIFACT_PREFIX;
159
+ const size = fs.fstatSync(file).size;
160
+ const length = Math.min(size, MAX_FINAL_OUTPUT_LENGTH * 4);
161
+ const buffer = Buffer.allocUnsafe(length);
162
+ const bytesRead = fs.readSync(file, buffer, 0, length, size - length);
163
+ let text = decodeUtf8Tail(buffer.subarray(0, bytesRead));
164
+ if (!failedOutput)
165
+ return { output: text };
166
+ const metadata = text.lastIndexOf(`
167
+ Metadata: `);
168
+ if (metadata >= 0 && !text.slice(metadata + 1).includes(`
169
+ `))
170
+ text = text.slice(0, metadata);
171
+ const transcript = text.lastIndexOf(`
172
+
173
+ Transcript: `);
174
+ if (transcript >= 0 && !text.slice(transcript + 2).includes(`
175
+ `))
176
+ text = text.slice(0, transcript);
177
+ return { errorText: text.startsWith(FAILED_OUTPUT_ARTIFACT_PREFIX) ? text.slice(FAILED_OUTPUT_ARTIFACT_PREFIX.length) : text };
178
+ } finally {
179
+ fs.closeSync(file);
180
+ }
181
+ }
182
+ function readSessionBackedOutput(sessionPath, trustedRoots, trustedSessionFileRoot) {
183
+ if (trustedRoots.length === 0 && !trustedSessionFileRoot)
184
+ return {};
185
+ const tail = readSessionMessagesTail(sessionPath, MAX_MESSAGE_LINES, trustedRoots, [sessionPath], trustedSessionFileRoot);
186
+ const last = tail.messages.findLast((message) => message.role === "assistant" && message.kind === "text");
187
+ if (!last)
188
+ return {};
189
+ const parts = tail.messages.filter((message) => message.recordIndex === last.recordIndex && message.kind === "text");
190
+ return { output: parts.map((part) => part.text).join(`
191
+ `) };
192
+ }
193
+ function readResultOutput(resultsDir, sessionId, runId, stepIndex, trustedRoots, stepAgent, now, trustedSessionFileRoot) {
194
+ const resultPath = resultPayloadPathForSessionRun(resultsDir, sessionId, runId);
195
+ if (resultPath)
196
+ return resultOutput(JSON.parse(fs.readFileSync(resultPath, "utf-8")), stepIndex);
197
+ const replayPath = completionReplayPath(resultsDir, runId);
198
+ let rawReplay;
199
+ try {
200
+ rawReplay = JSON.parse(fs.readFileSync(replayPath, "utf-8"));
201
+ } catch (error) {
202
+ if (error.code !== "ENOENT")
203
+ throw error;
204
+ }
205
+ const nowMs = now();
206
+ const replay = readCompletionReplay(resultsDir, runId, { sessionId, now: nowMs });
207
+ if (!replay) {
208
+ if (isRecord(rawReplay) && rawReplay.version === 1 && rawReplay.runId === runId && rawReplay.sessionId === sessionId && typeof rawReplay.expiresAt === "number" && rawReplay.expiresAt > nowMs) {
209
+ throw new Error("Completion replay record failed validation.");
210
+ }
211
+ return {};
212
+ }
213
+ const archive = readCompletionArchive(replay.archivePath);
214
+ const childEntries = archive?.entries.filter((entry) => entry.resultIndex !== undefined || entry.agent !== undefined) ?? [];
215
+ const singleChild = childEntries.length === 1;
216
+ const uniqueLegacyAgent = (agent) => agent !== undefined && archive?.entries.filter((entry) => entry.resultIndex === undefined && entry.agent === agent).length === 1;
217
+ const matches = (entry) => {
218
+ if (stepIndex !== undefined) {
219
+ if (entry.resultIndex !== undefined)
220
+ return entry.resultIndex === stepIndex;
221
+ return uniqueLegacyAgent(stepAgent) && entry.agent === stepAgent;
222
+ }
223
+ if (singleChild)
224
+ return entry.resultIndex !== undefined || entry.agent !== undefined;
225
+ return entry.resultIndex === undefined && entry.agent === undefined;
226
+ };
227
+ const artifact = archive?.entries.find((entry) => entry.source === "output-artifact" && matches(entry));
228
+ const artifactPath = artifact?.source === "output-artifact" ? artifact.path : undefined;
229
+ if (artifactPath)
230
+ return readOutputArtifact(artifactPath);
231
+ const sessionEntry = archive?.entries.find((entry) => entry.source === "session" && matches(entry));
232
+ const sessionPath = sessionEntry?.source === "session" ? sessionEntry.path : undefined;
233
+ if (sessionPath)
234
+ return readSessionBackedOutput(sessionPath, trustedRoots, trustedSessionFileRoot);
235
+ const output = archive?.entries.find((entry) => entry.source === "result-tail" && matches(entry))?.text;
236
+ return output ? { output } : {};
237
+ }
238
+ function toReplyMessage(message) {
239
+ return {
240
+ role: truncateDisplayText(sanitizeDisplayText(message.role), 32),
241
+ kind: message.kind,
242
+ text: boundContent(message.text, MAX_MESSAGE_TEXT_LENGTH),
243
+ ...message.name ? { name: truncateDisplayText(sanitizeDisplayText(message.name), 96) } : {},
244
+ ...message.isError === true ? { isError: true } : {}
245
+ };
246
+ }
247
+ function enforceByteBudget(reply) {
248
+ const truncated = reply.truncated ?? { task: false, messages: 0, finalOutput: false };
249
+ const sized = () => Buffer.byteLength(JSON.stringify(reply), "utf-8");
250
+ while (reply.messages && reply.messages.length > 0 && sized() > MAX_SERIALIZED_BYTES) {
251
+ reply.messages.shift();
252
+ truncated.messages += 1;
253
+ }
254
+ if (sized() > MAX_SERIALIZED_BYTES && reply.finalOutput) {
255
+ reply.finalOutput = truncateDisplayText(reply.finalOutput, Math.max(0, reply.finalOutput.length - (sized() - MAX_SERIALIZED_BYTES) - 256));
256
+ truncated.finalOutput = true;
257
+ }
258
+ if (sized() > MAX_SERIALIZED_BYTES && reply.task) {
259
+ reply.task = truncateDisplayText(reply.task, Math.max(0, reply.task.length - (sized() - MAX_SERIALIZED_BYTES) - 256));
260
+ truncated.task = true;
261
+ }
262
+ if (truncated.task || truncated.messages > 0 || truncated.finalOutput)
263
+ reply.truncated = truncated;
264
+ return reply;
265
+ }
266
+ export function buildInspectReply(request, deps = {}) {
267
+ const asyncDirRoot = deps.asyncDirRoot ?? DIRS.async;
268
+ const resultsDir = deps.resultsDir ?? DIRS.results;
269
+ const currentSessionId = deps.state?.currentSessionId ?? undefined;
270
+ if (!currentSessionId) {
271
+ return errorReply(request, "no_active_session", "Inspection requires an active session; the request could not be attributed to a session.");
272
+ }
273
+ let resolved;
274
+ try {
275
+ resolved = resolveSubagentRunId(request.asyncId, { asyncDirRoot, resultsDir, state: deps.state });
276
+ } catch {
277
+ return errorReply(request, "invalid_request", "The requested async run could not be resolved.");
278
+ }
279
+ if (!resolved || resolved.kind === "foreground") {
280
+ return errorReply(request, "not_found", `Async run '${request.asyncId}' was not found.`);
281
+ }
282
+ try {
283
+ let asyncDir;
284
+ let status;
285
+ if (resolved.kind === "nested") {
286
+ reconcileNestedAsyncDescendants(resolved.match.route, { resultsDir, kill: deps.kill, now: deps.now });
287
+ asyncDir = resolved.match.run.asyncDir ?? "";
288
+ status = asyncDir ? readStatus(asyncDir) : null;
289
+ } else {
290
+ if (!resolved.location.asyncDir)
291
+ return errorReply(request, "stale", `Async run '${request.asyncId}' has no remaining artifacts.`);
292
+ asyncDir = resolved.location.asyncDir;
293
+ status = reconcileAsyncRun(asyncDir, { resultsDir, kill: deps.kill, now: deps.now }).status ?? readStatus(asyncDir);
294
+ }
295
+ if (!status)
296
+ return errorReply(request, "stale", `Async run '${request.asyncId}' artifacts are no longer available.`);
297
+ if (status.sessionId !== currentSessionId) {
298
+ return errorReply(request, "foreign_session", "Inspection is only available for async runs owned by the current session.");
299
+ }
300
+ const node = request.childId === undefined ? { asyncDir, status } : findChildNode(status, asyncDir, request.childId);
301
+ if ("error" in node)
302
+ return errorReply(request, "not_found", node.error);
303
+ if (node.asyncDir !== asyncDir) {
304
+ if (node.status.sessionId !== currentSessionId) {
305
+ return errorReply(request, "foreign_session", "Inspection is only available for async runs owned by the current session.");
306
+ }
307
+ reconcileAsyncRun(node.asyncDir, { resultsDir, kill: deps.kill, now: deps.now });
308
+ node.status = readStatus(node.asyncDir) ?? node.status;
309
+ }
310
+ const step = node.stepIndex !== undefined ? node.status.steps?.[node.stepIndex] : undefined;
311
+ const lineLimit = Math.max(1, Math.min(MAX_MESSAGE_LINES, Math.trunc(request.lines ?? DEFAULT_MESSAGE_LINES)));
312
+ const sessionFile = step?.sessionFile ?? node.status.sessionFile;
313
+ const trustedRoots = [...new Set([
314
+ ...deps.state?.trustedSessionRoots ?? [],
315
+ ...node.status.sessionRoot ? [node.status.sessionRoot] : []
316
+ ])];
317
+ let messages;
318
+ let task;
319
+ if (sessionFile && (trustedRoots.length > 0 || deps.state?.trustedSessionFileRoot)) {
320
+ const tail = readSessionMessagesTail(sessionFile, lineLimit, trustedRoots, [sessionFile], deps.state?.trustedSessionFileRoot);
321
+ if (tail.messages.length > 0) {
322
+ messages = tail.messages.map(toReplyMessage);
323
+ if (!tail.truncated && node.status.context !== "fork" && step?.context !== "fork") {
324
+ const firstUser = tail.messages.find((message) => message.role === "user" && message.kind === "text");
325
+ if (firstUser)
326
+ task = firstUser.text;
327
+ }
328
+ }
329
+ }
330
+ const result = readResultOutput(resultsDir, currentSessionId, node.status.runId, node.stepIndex, trustedRoots, step?.agent, deps.now ?? Date.now, deps.state?.trustedSessionFileRoot);
331
+ const failedText = step?.error ?? node.status.error;
332
+ if (result.output === undefined && result.errorText === undefined && failedText !== undefined) {
333
+ return errorReply(request, "internal", "Inspection could not read the async run artifacts.");
334
+ }
335
+ const finalOutputRaw = result.output ?? result.errorText;
336
+ const truncated = { task: false, messages: 0, finalOutput: false };
337
+ const boundedTask = task !== undefined ? boundContent(task, MAX_TASK_LENGTH) : undefined;
338
+ if (task !== undefined && boundedTask !== task)
339
+ truncated.task = true;
340
+ const boundedFinal = finalOutputRaw !== undefined ? boundContent(finalOutputRaw, MAX_FINAL_OUTPUT_LENGTH) : undefined;
341
+ if (finalOutputRaw !== undefined && boundedFinal !== finalOutputRaw)
342
+ truncated.finalOutput = true;
343
+ const label = publicText(node.label ?? step?.label ?? step?.agent ?? node.status.runId, MAX_LABEL_LENGTH);
344
+ const reply = {
345
+ kind: INSPECT_REPLY_KIND,
346
+ version: INSPECT_REPLY_VERSION,
347
+ requestId: request.requestId,
348
+ asyncId: node.status.runId,
349
+ ...request.childId !== undefined ? { childId: request.childId } : {},
350
+ status: node.status.state,
351
+ ...label ? { label } : {},
352
+ ...boundedTask !== undefined ? { task: boundedTask } : {},
353
+ ...messages && messages.length > 0 ? { messages } : {},
354
+ ...boundedFinal !== undefined ? { finalOutput: boundedFinal } : {},
355
+ ...truncated.task || truncated.finalOutput || truncated.messages > 0 ? { truncated } : {}
356
+ };
357
+ return enforceByteBudget(reply);
358
+ } catch {
359
+ return errorReply(request, "internal", "Inspection could not read the async run artifacts.");
360
+ }
361
+ }
362
+ export function encodeInspectReply(reply) {
363
+ return [`${INSPECT_WIDGET_PREFIX}${JSON.stringify(reply)}`];
364
+ }
365
+ export function handleInspectRpcArgs(args, deps = {}) {
366
+ const parsed = parseInspectRequest(args);
367
+ if (parsed.error || !parsed.request) {
368
+ const firstToken = args.trim().split(/\s+/)[0];
369
+ const echo = firstToken !== undefined && REQUEST_ID_PATTERN.test(firstToken) ? { requestId: firstToken } : {};
370
+ return errorReply(echo, "invalid_request", parsed.error ?? "Invalid inspect request.");
371
+ }
372
+ return buildInspectReply(parsed.request, deps);
373
+ }