@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,469 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { writeAtomicJson } from "../../shared/atomic-json.js";
4
+ import { MISSION_BINDING_FILE } from "../../missions/lifecycle.js";
5
+ import { encodeIndexSegment, indexSegmentAliases, MAX_INDEX_SEGMENT_BYTES } from "./index-segment.js";
6
+ const RESULT_INDEX_VERSION = 1;
7
+ const RESULT_INDEX_DIR = "result-index";
8
+ const SESSION_INDEX_DIR = "sessions";
9
+ const RUN_INDEX_DIR = "runs";
10
+ const OBSERVER_INDEX_DIR = "observers";
11
+ const TOOL_CALL_INDEX_DIR = "tool-calls";
12
+ const RESULT_PENDING_DIR = "result-pending";
13
+ const MISSION_OBSERVER = "mission";
14
+ const JSON_EXTENSION = ".json";
15
+ const MAX_JSON_FILE_STEM_BYTES = MAX_INDEX_SEGMENT_BYTES - Buffer.byteLength(JSON_EXTENSION, "utf-8");
16
+ function encodeSegment(value) {
17
+ return encodeIndexSegment(value);
18
+ }
19
+ function encodedJsonFileName(value) {
20
+ return `${encodeIndexSegment(value, MAX_JSON_FILE_STEM_BYTES)}${JSON_EXTENSION}`;
21
+ }
22
+ function encodedJsonFileNames(value) {
23
+ return indexSegmentAliases(value, MAX_JSON_FILE_STEM_BYTES).map((segment) => `${segment}${JSON_EXTENSION}`);
24
+ }
25
+ function nonEmptyString(value) {
26
+ return typeof value === "string" && value.length > 0 ? value : undefined;
27
+ }
28
+ function isUnaddressableResultCandidate(error) {
29
+ return error?.code === "ENAMETOOLONG";
30
+ }
31
+ export function resultFileName(runId) {
32
+ return `${runId}${JSON_EXTENSION}`;
33
+ }
34
+ export function resultFilePath(resultsDir, runId) {
35
+ return path.join(resultsDir, resultFileName(runId));
36
+ }
37
+ function sessionIndexDir(resultsDir, sessionId) {
38
+ return path.join(resultsDir, RESULT_INDEX_DIR, SESSION_INDEX_DIR, encodeSegment(sessionId));
39
+ }
40
+ function sessionIndexDirs(resultsDir, sessionId) {
41
+ return indexSegmentAliases(sessionId).map((segment) => path.join(resultsDir, RESULT_INDEX_DIR, SESSION_INDEX_DIR, segment));
42
+ }
43
+ function resultIndexPath(resultsDir, sessionId, runId) {
44
+ return path.join(sessionIndexDir(resultsDir, sessionId), encodedJsonFileName(runId));
45
+ }
46
+ function resultIndexPaths(resultsDir, sessionId, runId) {
47
+ return sessionIndexDirs(resultsDir, sessionId).flatMap((dir) => encodedJsonFileNames(runId).map((fileName) => path.join(dir, fileName)));
48
+ }
49
+ function runIndexPath(resultsDir, runId) {
50
+ return path.join(resultsDir, RESULT_INDEX_DIR, RUN_INDEX_DIR, encodedJsonFileName(runId));
51
+ }
52
+ function resultPendingPath(resultsDir, sessionId, runId) {
53
+ return path.join(resultsDir, RESULT_PENDING_DIR, encodeSegment(sessionId), encodedJsonFileName(runId));
54
+ }
55
+ function resultPendingPaths(resultsDir, sessionId, runId) {
56
+ return indexSegmentAliases(sessionId).flatMap((segment) => encodedJsonFileNames(runId).map((fileName) => path.join(resultsDir, RESULT_PENDING_DIR, segment, fileName)));
57
+ }
58
+ function pendingSessionDirs(resultsDir, sessionId) {
59
+ return indexSegmentAliases(sessionId).map((segment) => path.join(resultsDir, RESULT_PENDING_DIR, segment));
60
+ }
61
+ function firstExistingResultFile(paths) {
62
+ for (const filePath of paths) {
63
+ if (existingResultFile(filePath))
64
+ return filePath;
65
+ }
66
+ return;
67
+ }
68
+ function observerIndexDir(resultsDir, observer) {
69
+ return path.join(resultsDir, RESULT_INDEX_DIR, OBSERVER_INDEX_DIR, observer);
70
+ }
71
+ function observerIndexPath(resultsDir, observer, runId) {
72
+ return path.join(observerIndexDir(resultsDir, observer), encodedJsonFileName(runId));
73
+ }
74
+ function toolCallIndexDir(resultsDir, toolCallId) {
75
+ return path.join(resultsDir, RESULT_INDEX_DIR, TOOL_CALL_INDEX_DIR, encodeIndexSegment(toolCallId));
76
+ }
77
+ function toolCallIndexPath(resultsDir, toolCallId, runId) {
78
+ return path.join(toolCallIndexDir(resultsDir, toolCallId), encodedJsonFileName(runId));
79
+ }
80
+ function parseResultIndexEntry(value) {
81
+ if (!value || typeof value !== "object" || Array.isArray(value))
82
+ return;
83
+ const record = value;
84
+ if (record.version !== RESULT_INDEX_VERSION || typeof record.runId !== "string" || typeof record.sessionId !== "string" || typeof record.file !== "string" || typeof record.writtenAt !== "number")
85
+ return;
86
+ return {
87
+ version: RESULT_INDEX_VERSION,
88
+ runId: record.runId,
89
+ sessionId: record.sessionId,
90
+ file: record.file,
91
+ writtenAt: record.writtenAt,
92
+ ...typeof record.asyncDir === "string" ? { asyncDir: record.asyncDir } : {}
93
+ };
94
+ }
95
+ export function writeResultIndexForData(resultPath, data) {
96
+ const runId = nonEmptyString(data.runId) ?? nonEmptyString(data.id) ?? path.basename(resultPath, ".json");
97
+ const sessionId = nonEmptyString(data.sessionId);
98
+ if (!runId || !sessionId)
99
+ return;
100
+ const file = path.basename(resultPath);
101
+ const entry = {
102
+ version: RESULT_INDEX_VERSION,
103
+ runId,
104
+ sessionId,
105
+ file,
106
+ writtenAt: Date.now(),
107
+ ...nonEmptyString(data.asyncDir) ? { asyncDir: nonEmptyString(data.asyncDir) } : {}
108
+ };
109
+ const resultsDir = path.dirname(resultPath);
110
+ writeAtomicJson(resultIndexPath(resultsDir, sessionId, runId), entry);
111
+ try {
112
+ writeAtomicJson(runIndexPath(resultsDir, runId), entry);
113
+ } catch (error) {
114
+ console.error(`Failed to write async result run index for '${resultPath}':`, error);
115
+ }
116
+ const toolCallId = nonEmptyString(data.toolCallId);
117
+ try {
118
+ if (toolCallId)
119
+ writeAtomicJson(toolCallIndexPath(resultsDir, toolCallId, runId), entry);
120
+ } catch (error) {
121
+ console.error(`Failed to write async result tool-call index for '${resultPath}':`, error);
122
+ }
123
+ try {
124
+ if (entry.asyncDir && fs.existsSync(path.join(entry.asyncDir, MISSION_BINDING_FILE))) {
125
+ writeAtomicJson(observerIndexPath(resultsDir, MISSION_OBSERVER, runId), entry);
126
+ }
127
+ } catch (error) {
128
+ console.error(`Failed to write async result observer index for '${resultPath}':`, error);
129
+ }
130
+ }
131
+ function writeIndexedPendingResultFile(resultPath, data) {
132
+ const runId = nonEmptyString(data.runId) ?? nonEmptyString(data.id) ?? path.basename(resultPath, ".json");
133
+ const sessionId = nonEmptyString(data.sessionId);
134
+ if (!sessionId)
135
+ throw new Error(`Cannot write async result '${resultPath}' without a sessionId.`);
136
+ const resultsDir = path.dirname(resultPath);
137
+ writeAtomicJson(resultPendingPath(resultsDir, sessionId, runId), data);
138
+ writeResultIndexForData(resultPath, data);
139
+ return { runId, sessionId, resultsDir };
140
+ }
141
+ export function writePendingAsyncResultFile(resultPath, data) {
142
+ writeIndexedPendingResultFile(resultPath, data);
143
+ }
144
+ export function writeAsyncResultFile(resultPath, data) {
145
+ const { runId, sessionId, resultsDir } = writeIndexedPendingResultFile(resultPath, data);
146
+ return promotePendingResultFile(resultsDir, sessionId, runId, path.basename(resultPath), { logFailure: false }) === "promoted" ? { state: "public" } : { state: "pending" };
147
+ }
148
+ export function removeResultIndex(resultsDir, sessionId, runId, toolCallId) {
149
+ if (!runId)
150
+ return;
151
+ if (sessionId) {
152
+ for (const indexPath of resultIndexPaths(resultsDir, sessionId, runId)) {
153
+ try {
154
+ fs.rmSync(indexPath, { force: true });
155
+ } catch {}
156
+ }
157
+ for (const pendingPath of resultPendingPaths(resultsDir, sessionId, runId)) {
158
+ try {
159
+ fs.rmSync(pendingPath, { force: true });
160
+ } catch {}
161
+ }
162
+ }
163
+ try {
164
+ fs.rmSync(runIndexPath(resultsDir, runId), { force: true });
165
+ } catch {}
166
+ if (toolCallId) {
167
+ try {
168
+ fs.rmSync(toolCallIndexPath(resultsDir, toolCallId, runId), { force: true });
169
+ } catch {}
170
+ }
171
+ try {
172
+ fs.rmSync(observerIndexPath(resultsDir, MISSION_OBSERVER, runId), { force: true });
173
+ } catch {}
174
+ }
175
+ export function removeMissionObserverIndex(resultsDir, runId) {
176
+ if (!runId)
177
+ return;
178
+ try {
179
+ fs.rmSync(observerIndexPath(resultsDir, MISSION_OBSERVER, runId), { force: true });
180
+ } catch {}
181
+ }
182
+ function existingResultFile(resultPath) {
183
+ try {
184
+ return fs.statSync(resultPath).isFile();
185
+ } catch (error) {
186
+ if (error.code !== "ENOENT" && !isUnaddressableResultCandidate(error))
187
+ console.error(`Failed to inspect async result payload '${resultPath}':`, error);
188
+ return false;
189
+ }
190
+ }
191
+ function pendingResultExists(resultsDir, sessionId, runId) {
192
+ return firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId)) !== undefined;
193
+ }
194
+ function pendingResultPayloadMatches(filePath, sessionId, runId) {
195
+ try {
196
+ const data = JSON.parse(fs.readFileSync(filePath, "utf-8"));
197
+ return (nonEmptyString(data.runId) ?? nonEmptyString(data.id)) === runId && nonEmptyString(data.sessionId) === sessionId;
198
+ } catch (error) {
199
+ if (error.code !== "ENOENT" && !isUnaddressableResultCandidate(error))
200
+ console.error(`Ignoring invalid pending async result '${filePath}':`, error);
201
+ return false;
202
+ }
203
+ }
204
+ function assertPendingResultPayloadMatches(filePath, sessionId, runId) {
205
+ const data = JSON.parse(fs.readFileSync(filePath, "utf-8"));
206
+ return (nonEmptyString(data.runId) ?? nonEmptyString(data.id)) === runId && nonEmptyString(data.sessionId) === sessionId;
207
+ }
208
+ export function promotePendingResultFile(resultsDir, sessionId, runId, file = resultFileName(runId), options = {}) {
209
+ if (file !== path.basename(file) || !file.endsWith(".json"))
210
+ return "none";
211
+ const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
212
+ if (!pendingPath)
213
+ return "none";
214
+ const resultPath = path.join(resultsDir, file);
215
+ try {
216
+ fs.renameSync(pendingPath, resultPath);
217
+ return existingResultFile(resultPath) ? "promoted" : "pending";
218
+ } catch (error) {
219
+ const code = error.code;
220
+ if (code === "ENOENT" || code === "EEXIST" || code === "EPERM" || code === "EACCES" || isUnaddressableResultCandidate(error)) {
221
+ const pendingExists = existingResultFile(pendingPath);
222
+ const resultExists = existingResultFile(resultPath);
223
+ if (pendingExists) {
224
+ if (!resultExists && options.logFailure !== false && !isUnaddressableResultCandidate(error))
225
+ console.error(`Failed to promote pending async result '${pendingPath}' to '${resultPath}':`, error);
226
+ return "pending";
227
+ }
228
+ if (resultExists)
229
+ return "promoted";
230
+ if (options.logFailure !== false)
231
+ console.error(`Pending async result '${pendingPath}' disappeared without a promoted result at '${resultPath}'.`);
232
+ return "none";
233
+ }
234
+ if (options.logFailure !== false)
235
+ console.error(`Failed to promote pending async result '${pendingPath}' to '${resultPath}':`, error);
236
+ return "pending";
237
+ }
238
+ }
239
+ function pendingResultLocationForSessionRun(resultsDir, sessionId, runId, file = resultFileName(runId)) {
240
+ if (file !== path.basename(file) || !file.endsWith(".json"))
241
+ return;
242
+ const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
243
+ if (!pendingPath || !pendingResultPayloadMatches(pendingPath, sessionId, runId))
244
+ return;
245
+ return { file, path: pendingPath, state: "pending" };
246
+ }
247
+ export function fallbackResultPayloadPathForSessionRun(resultsDir, sessionId, runId) {
248
+ const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
249
+ if (!pendingPath || !assertPendingResultPayloadMatches(pendingPath, sessionId, runId))
250
+ return;
251
+ return pendingPath;
252
+ }
253
+ function resultPayloadLocationFromIndex(resultsDir, entry) {
254
+ if (entry.file !== path.basename(entry.file) || !entry.file.endsWith(".json"))
255
+ return;
256
+ const pendingState = promotePendingResultFile(resultsDir, entry.sessionId, entry.runId, entry.file);
257
+ if (pendingState === "pending") {
258
+ return pendingResultLocationForSessionRun(resultsDir, entry.sessionId, entry.runId, entry.file);
259
+ }
260
+ const resultPath = path.join(resultsDir, entry.file);
261
+ if (pendingState === "promoted" || existingResultFile(resultPath))
262
+ return { file: entry.file, path: resultPath, state: "public" };
263
+ return;
264
+ }
265
+ function readResultIndexForSessionRun(resultsDir, sessionId, runId) {
266
+ for (const indexPath of resultIndexPaths(resultsDir, sessionId, runId)) {
267
+ try {
268
+ const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(indexPath, "utf-8")));
269
+ if (!entry || entry.sessionId !== sessionId || entry.runId !== runId)
270
+ continue;
271
+ return entry;
272
+ } catch (error) {
273
+ const code = error.code;
274
+ if (code === "EPERM" || code === "EACCES")
275
+ throw error;
276
+ if (code !== "ENOENT" && code !== "ENOTDIR" && !isUnaddressableResultCandidate(error)) {
277
+ console.error(`Ignoring invalid async result index for '${runId}':`, error);
278
+ }
279
+ }
280
+ }
281
+ return;
282
+ }
283
+ export function resultPayloadPathForSessionRun(resultsDir, sessionId, runId) {
284
+ const entry = readResultIndexForSessionRun(resultsDir, sessionId, runId);
285
+ return (entry ? resultPayloadLocationFromIndex(resultsDir, entry) : undefined)?.path ?? pendingResultLocationForSessionRun(resultsDir, sessionId, runId)?.path;
286
+ }
287
+ export function resultPayloadPathForMissionObserverRun(resultsDir, runId) {
288
+ try {
289
+ const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(observerIndexPath(resultsDir, MISSION_OBSERVER, runId), "utf-8")));
290
+ if (!entry || entry.runId !== runId)
291
+ return;
292
+ return resultPayloadLocationFromIndex(resultsDir, entry)?.path;
293
+ } catch (error) {
294
+ const code = error.code;
295
+ if (code !== "ENOENT" && code !== "ENOTDIR" && !isUnaddressableResultCandidate(error))
296
+ console.error(`Ignoring invalid async result observer index for '${runId}':`, error);
297
+ return;
298
+ }
299
+ }
300
+ export function resultPayloadPathForIndexedRun(resultsDir, runId) {
301
+ const entryPath = runIndexPath(resultsDir, runId);
302
+ try {
303
+ const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(entryPath, "utf-8")));
304
+ if (!entry || entry.runId !== runId) {
305
+ fs.rmSync(entryPath, { force: true });
306
+ return;
307
+ }
308
+ const location = resultPayloadLocationFromIndex(resultsDir, entry);
309
+ if (location)
310
+ return location.path;
311
+ fs.rmSync(entryPath, { force: true });
312
+ } catch (error) {
313
+ const code = error.code;
314
+ if (isUnaddressableResultCandidate(error))
315
+ return;
316
+ if (code !== "ENOENT" && code !== "ENOTDIR") {
317
+ console.error(`Ignoring invalid async result run index '${entryPath}':`, error);
318
+ try {
319
+ fs.rmSync(entryPath, { force: true });
320
+ } catch {}
321
+ }
322
+ }
323
+ return;
324
+ }
325
+ function indexedResultFile(resultsDir, entry, includePending = false) {
326
+ const location = resultPayloadLocationFromIndex(resultsDir, entry);
327
+ if (!location)
328
+ return;
329
+ return includePending || location.state === "public" ? location.file : undefined;
330
+ }
331
+ function listIndexFiles(dir) {
332
+ let files;
333
+ try {
334
+ files = fs.readdirSync(dir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => path.join(dir, entry.name));
335
+ } catch (error) {
336
+ const code = error.code;
337
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES" || isUnaddressableResultCandidate(error))
338
+ return [];
339
+ throw error;
340
+ }
341
+ return files;
342
+ }
343
+ function resultFilesFromIndexDir(resultsDir, dir, includePending = false) {
344
+ const candidates = new Set;
345
+ for (const entryPath of listIndexFiles(dir)) {
346
+ try {
347
+ const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(entryPath, "utf-8")));
348
+ if (!entry) {
349
+ fs.rmSync(entryPath, { force: true });
350
+ continue;
351
+ }
352
+ const resultFile = indexedResultFile(resultsDir, entry, includePending);
353
+ if (resultFile)
354
+ candidates.add(resultFile);
355
+ } catch (error) {
356
+ if (error.code !== "ENOENT" && !isUnaddressableResultCandidate(error))
357
+ console.error(`Ignoring invalid async result index '${entryPath}':`, error);
358
+ }
359
+ }
360
+ return [...candidates];
361
+ }
362
+ export function resultFilesForSession(resultsDir, sessionId) {
363
+ const files = new Set;
364
+ for (const dir of sessionIndexDirs(resultsDir, sessionId)) {
365
+ for (const file of resultFilesFromIndexDir(resultsDir, dir))
366
+ files.add(file);
367
+ }
368
+ return [...files];
369
+ }
370
+ function pendingResultFilesForSession(resultsDir, sessionId) {
371
+ const files = new Set;
372
+ for (const dir of pendingSessionDirs(resultsDir, sessionId)) {
373
+ let entries;
374
+ try {
375
+ entries = fs.readdirSync(dir, { withFileTypes: true });
376
+ } catch (error) {
377
+ const code = error.code;
378
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES" || isUnaddressableResultCandidate(error))
379
+ continue;
380
+ throw error;
381
+ }
382
+ for (const entry of entries) {
383
+ if (!entry.isFile() || !entry.name.endsWith(".json"))
384
+ continue;
385
+ const pendingPath = path.join(dir, entry.name);
386
+ try {
387
+ const data = JSON.parse(fs.readFileSync(pendingPath, "utf-8"));
388
+ const runId = nonEmptyString(data.runId) ?? nonEmptyString(data.id);
389
+ if (runId && nonEmptyString(data.sessionId) === sessionId)
390
+ files.add(resultFileName(runId));
391
+ } catch (error) {
392
+ if (error.code !== "ENOENT" && !isUnaddressableResultCandidate(error))
393
+ console.error(`Ignoring invalid pending async result '${pendingPath}':`, error);
394
+ }
395
+ }
396
+ }
397
+ return [...files];
398
+ }
399
+ export function resultCandidateFilesForSession(resultsDir, sessionId) {
400
+ const files = new Set;
401
+ for (const dir of sessionIndexDirs(resultsDir, sessionId)) {
402
+ for (const file of resultFilesFromIndexDir(resultsDir, dir, true))
403
+ files.add(file);
404
+ }
405
+ for (const file of pendingResultFilesForSession(resultsDir, sessionId))
406
+ files.add(file);
407
+ return [...files];
408
+ }
409
+ export function resultFilesForToolCall(resultsDir, toolCallId) {
410
+ return resultFilesFromIndexDir(resultsDir, toolCallIndexDir(resultsDir, toolCallId));
411
+ }
412
+ export function resultCandidateFilesForToolCall(resultsDir, toolCallId) {
413
+ return resultFilesFromIndexDir(resultsDir, toolCallIndexDir(resultsDir, toolCallId), true);
414
+ }
415
+ export function missionObserverResultFiles(resultsDir) {
416
+ return resultFilesFromIndexDir(resultsDir, observerIndexDir(resultsDir, MISSION_OBSERVER));
417
+ }
418
+ export function missionObserverResultCandidateFiles(resultsDir) {
419
+ return resultFilesFromIndexDir(resultsDir, observerIndexDir(resultsDir, MISSION_OBSERVER), true);
420
+ }
421
+ export function cleanupResultIndexes(resultsDir, now = Date.now(), maxAgeMs = 24 * 60 * 60 * 1000) {
422
+ const root = path.join(resultsDir, RESULT_INDEX_DIR);
423
+ const cutoff = now - maxAgeMs;
424
+ let removed = 0;
425
+ const visit = (dir) => {
426
+ let entries;
427
+ try {
428
+ entries = fs.readdirSync(dir, { withFileTypes: true });
429
+ } catch (error) {
430
+ const code = error.code;
431
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES" || isUnaddressableResultCandidate(error))
432
+ return;
433
+ throw error;
434
+ }
435
+ for (const entry of entries) {
436
+ const fullPath = path.join(dir, entry.name);
437
+ if (entry.isDirectory()) {
438
+ visit(fullPath);
439
+ try {
440
+ fs.rmdirSync(fullPath);
441
+ } catch {}
442
+ continue;
443
+ }
444
+ if (!entry.isFile() || !entry.name.endsWith(".json"))
445
+ continue;
446
+ try {
447
+ const stat = fs.statSync(fullPath);
448
+ const index = parseResultIndexEntry(JSON.parse(fs.readFileSync(fullPath, "utf-8")));
449
+ const resultFile = index ? indexedResultFile(resultsDir, index) : undefined;
450
+ const pendingFile = index ? pendingResultExists(resultsDir, index.sessionId, index.runId) : false;
451
+ if (!index || !resultFile && !pendingFile && stat.mtimeMs <= cutoff) {
452
+ fs.rmSync(fullPath, { force: true });
453
+ removed += 1;
454
+ }
455
+ } catch (error) {
456
+ if (isUnaddressableResultCandidate(error))
457
+ continue;
458
+ if (error.code !== "ENOENT")
459
+ console.error(`Ignoring invalid async result index '${fullPath}':`, error);
460
+ try {
461
+ fs.rmSync(fullPath, { force: true });
462
+ removed += 1;
463
+ } catch {}
464
+ }
465
+ }
466
+ };
467
+ visit(root);
468
+ return removed;
469
+ }