@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,447 @@
1
+ import { Buffer } from "node:buffer";
2
+ export const MAX_CHILD_PENDING_LINE_BYTES = 16 * 1024 * 1024;
3
+ export const MAX_CHILD_STDERR_BYTES = 128 * 1024;
4
+ const MAX_PROTOCOL_DIAGNOSTIC_BYTES = 4096;
5
+ const MAX_PROJECTED_JSON_DEPTH = 256;
6
+ function createPiAggregateProjection() {
7
+ const decoder = new TextDecoder("utf-8", { fatal: true });
8
+ const stack = [];
9
+ let rootState = "value";
10
+ let token;
11
+ let valid = true;
12
+ let eventType;
13
+ let willRetry;
14
+ const parent = () => stack.at(-1);
15
+ const isTopLevelField = (key) => stack.length === 1 && parent()?.type === "object" && (key === "type" || key === "willRetry");
16
+ const completeValue = (value) => {
17
+ const container = parent();
18
+ if (!container) {
19
+ rootState = "end";
20
+ return;
21
+ }
22
+ if (container.type === "object") {
23
+ if (stack.length === 1 && container.key === "type" && typeof value === "string")
24
+ eventType = value;
25
+ if (stack.length === 1 && container.key === "willRetry" && typeof value === "boolean")
26
+ willRetry = value;
27
+ container.key = undefined;
28
+ container.state = "comma-or-end";
29
+ } else
30
+ container.state = "comma-or-end";
31
+ };
32
+ const startValue = (char) => {
33
+ const container = parent();
34
+ const key = container?.type === "object" ? container.key : undefined;
35
+ if (isTopLevelField(key)) {
36
+ if (key === "type")
37
+ eventType = undefined;
38
+ else
39
+ willRetry = undefined;
40
+ }
41
+ if (char === "{" || char === "[") {
42
+ if (stack.length >= MAX_PROJECTED_JSON_DEPTH)
43
+ return false;
44
+ stack.push(char === "{" ? { type: "object", state: "key-or-end" } : { type: "array", state: "value-or-end" });
45
+ return true;
46
+ }
47
+ if (char === '"') {
48
+ token = { type: "string", role: "value", value: "", capture: key === "type" && stack.length === 1, escape: false, unicodeDigits: 0, unicodeValue: "" };
49
+ return true;
50
+ }
51
+ if (char === "t")
52
+ token = { type: "literal", expected: "true", index: 1, value: true };
53
+ else if (char === "f")
54
+ token = { type: "literal", expected: "false", index: 1, value: false };
55
+ else if (char === "n")
56
+ token = { type: "literal", expected: "null", index: 1, value: null };
57
+ else if (char === "-")
58
+ token = { type: "number", phase: "minus" };
59
+ else if (char === "0")
60
+ token = { type: "number", phase: "zero" };
61
+ else if (char >= "1" && char <= "9")
62
+ token = { type: "number", phase: "int" };
63
+ else
64
+ return false;
65
+ return true;
66
+ };
67
+ const closeContainer = () => {
68
+ stack.pop();
69
+ completeValue();
70
+ return true;
71
+ };
72
+ const processChar = (char) => {
73
+ if (token?.type === "string") {
74
+ if (token.unicodeDigits > 0) {
75
+ if (!/[0-9a-fA-F]/.test(char))
76
+ return false;
77
+ token.unicodeValue += char;
78
+ token.unicodeDigits--;
79
+ if (token.unicodeDigits === 0 && token.capture) {
80
+ if (token.value.length >= 64)
81
+ return false;
82
+ token.value += String.fromCharCode(Number.parseInt(token.unicodeValue, 16));
83
+ }
84
+ return true;
85
+ }
86
+ if (token.escape) {
87
+ token.escape = false;
88
+ if (char === "u") {
89
+ token.unicodeDigits = 4;
90
+ token.unicodeValue = "";
91
+ return true;
92
+ }
93
+ if (!'"\\/bfnrt'.includes(char))
94
+ return false;
95
+ if (token.capture) {
96
+ if (token.value.length >= 64)
97
+ return false;
98
+ token.value += { b: "\b", f: "\f", n: `
99
+ `, r: "\r", t: "\t" }[char] ?? char;
100
+ }
101
+ return true;
102
+ }
103
+ if (char === "\\") {
104
+ token.escape = true;
105
+ return true;
106
+ }
107
+ if (char === '"') {
108
+ const finished = token;
109
+ token = undefined;
110
+ if (finished.role === "key") {
111
+ const container = parent();
112
+ if (!container || container.type !== "object")
113
+ return false;
114
+ container.key = finished.value;
115
+ container.state = "colon";
116
+ } else
117
+ completeValue(finished.capture ? finished.value : undefined);
118
+ return true;
119
+ }
120
+ if (char.charCodeAt(0) < 32)
121
+ return false;
122
+ if (token.capture) {
123
+ if (token.value.length >= 64)
124
+ return false;
125
+ token.value += char;
126
+ }
127
+ return true;
128
+ }
129
+ if (token?.type === "literal") {
130
+ if (char !== token.expected[token.index])
131
+ return false;
132
+ token.index++;
133
+ if (token.index === token.expected.length) {
134
+ const value = token.value;
135
+ token = undefined;
136
+ completeValue(value);
137
+ }
138
+ return true;
139
+ }
140
+ if (token?.type === "number") {
141
+ const phase = token.phase;
142
+ if (phase === "minus") {
143
+ if (char === "0")
144
+ token.phase = "zero";
145
+ else if (char >= "1" && char <= "9")
146
+ token.phase = "int";
147
+ else
148
+ return false;
149
+ return true;
150
+ }
151
+ if (phase === "zero" || phase === "int") {
152
+ if (char >= "0" && char <= "9") {
153
+ if (phase === "zero")
154
+ return false;
155
+ return true;
156
+ }
157
+ if (char === ".") {
158
+ token.phase = "dot";
159
+ return true;
160
+ }
161
+ if (char === "e" || char === "E") {
162
+ token.phase = "exp";
163
+ return true;
164
+ }
165
+ } else if (phase === "dot") {
166
+ if (char >= "0" && char <= "9") {
167
+ token.phase = "frac";
168
+ return true;
169
+ }
170
+ return false;
171
+ } else if (phase === "frac") {
172
+ if (char >= "0" && char <= "9")
173
+ return true;
174
+ if (char === "e" || char === "E") {
175
+ token.phase = "exp";
176
+ return true;
177
+ }
178
+ } else if (phase === "exp") {
179
+ if (char === "+" || char === "-") {
180
+ token.phase = "exp-sign";
181
+ return true;
182
+ }
183
+ if (char >= "0" && char <= "9") {
184
+ token.phase = "exp-digits";
185
+ return true;
186
+ }
187
+ return false;
188
+ } else if (phase === "exp-sign") {
189
+ if (char >= "0" && char <= "9") {
190
+ token.phase = "exp-digits";
191
+ return true;
192
+ }
193
+ return false;
194
+ } else if (phase === "exp-digits" && char >= "0" && char <= "9")
195
+ return true;
196
+ if (!["zero", "int", "frac", "exp-digits"].includes(phase))
197
+ return false;
198
+ token = undefined;
199
+ completeValue();
200
+ return processChar(char);
201
+ }
202
+ if (char === " " || char === "\t" || char === "\r" || char === `
203
+ `)
204
+ return true;
205
+ const container = parent();
206
+ if (!container)
207
+ return rootState === "value" ? startValue(char) : false;
208
+ if (container.type === "object") {
209
+ if (container.state === "key-or-end" || container.state === "key") {
210
+ if (char === "}" && container.state === "key-or-end")
211
+ return closeContainer();
212
+ if (char !== '"')
213
+ return false;
214
+ token = { type: "string", role: "key", value: "", capture: stack.length === 1, escape: false, unicodeDigits: 0, unicodeValue: "" };
215
+ return true;
216
+ }
217
+ if (container.state === "colon") {
218
+ if (char !== ":")
219
+ return false;
220
+ container.state = "value";
221
+ return true;
222
+ }
223
+ if (container.state === "value")
224
+ return startValue(char);
225
+ if (char === ",") {
226
+ container.state = "key";
227
+ return true;
228
+ }
229
+ if (char === "}")
230
+ return closeContainer();
231
+ return false;
232
+ }
233
+ if (container.state === "value-or-end" || container.state === "value") {
234
+ if (char === "]" && container.state === "value-or-end")
235
+ return closeContainer();
236
+ return startValue(char);
237
+ }
238
+ if (char === ",") {
239
+ container.state = "value";
240
+ return true;
241
+ }
242
+ if (char === "]")
243
+ return closeContainer();
244
+ return false;
245
+ };
246
+ const processText = (text) => {
247
+ for (const char of text)
248
+ if (!processChar(char))
249
+ return false;
250
+ return true;
251
+ };
252
+ return {
253
+ push(chunk) {
254
+ if (!valid)
255
+ return false;
256
+ try {
257
+ valid = processText(decoder.decode(chunk, { stream: true }));
258
+ } catch {
259
+ valid = false;
260
+ }
261
+ return valid;
262
+ },
263
+ finish() {
264
+ try {
265
+ valid = valid && processText(decoder.decode());
266
+ } catch {
267
+ valid = false;
268
+ }
269
+ if (token?.type === "number" && ["zero", "int", "frac", "exp-digits"].includes(token.phase)) {
270
+ token = undefined;
271
+ completeValue();
272
+ }
273
+ if (!valid || token || stack.length !== 0 || rootState !== "end")
274
+ return;
275
+ if (eventType === "turn_end")
276
+ return '{"type":"turn_end"}';
277
+ if (eventType === "agent_end" && typeof willRetry === "boolean")
278
+ return JSON.stringify({ type: "agent_end", willRetry });
279
+ if (eventType === "compaction_end" && typeof willRetry === "boolean")
280
+ return JSON.stringify({ type: "compaction_end", willRetry });
281
+ return;
282
+ }
283
+ };
284
+ }
285
+ export const PI_AGGREGATE_EVENT_PROJECTOR = {
286
+ accepts(prefix) {
287
+ return prefix.startsWith('{"type":"turn_end"') || prefix.startsWith('{"type":"agent_end"') || prefix.startsWith('{"type":"compaction_end"');
288
+ },
289
+ create: createPiAggregateProjection
290
+ };
291
+ export function formatProtocolOutputLimit(limit) {
292
+ return `${limit.code}: child ${limit.stream} line exceeded ${limit.limitBytes} bytes (observed at least ${limit.observedBytes} bytes without a newline).`;
293
+ }
294
+ export function createBoundedLineReader(options) {
295
+ const maxPendingLineBytes = options.maxPendingLineBytes ?? MAX_CHILD_PENDING_LINE_BYTES;
296
+ if (!Number.isInteger(maxPendingLineBytes) || maxPendingLineBytes < 1) {
297
+ throw new Error("maxPendingLineBytes must be a positive integer.");
298
+ }
299
+ let pending = [];
300
+ let pendingBytes = 0;
301
+ let projectedPrefix = Buffer.alloc(0);
302
+ let projectedTail = Buffer.alloc(0);
303
+ let projectedBytes = 0;
304
+ let projection;
305
+ let projectingOversizedLine = false;
306
+ let limitExceeded = false;
307
+ const diagnosticTail = (prior, segment) => {
308
+ const tailFromSegment = segment.subarray(Math.max(0, segment.length - MAX_PROTOCOL_DIAGNOSTIC_BYTES));
309
+ return tailFromSegment.length === MAX_PROTOCOL_DIAGNOSTIC_BYTES ? tailFromSegment : Buffer.concat([prior.subarray(Math.max(0, prior.length - (MAX_PROTOCOL_DIAGNOSTIC_BYTES - tailFromSegment.length))), tailFromSegment]);
310
+ };
311
+ const failLimit = (observedBytes, prefix, tail) => {
312
+ limitExceeded = true;
313
+ pending = [];
314
+ pendingBytes = 0;
315
+ projectingOversizedLine = false;
316
+ projection = undefined;
317
+ projectedPrefix = Buffer.alloc(0);
318
+ projectedTail = Buffer.alloc(0);
319
+ projectedBytes = 0;
320
+ options.onLimit({
321
+ code: "protocol_output_limit",
322
+ stream: options.stream ?? "stdout",
323
+ limitBytes: maxPendingLineBytes,
324
+ observedBytes,
325
+ diagnosticPrefix: prefix.toString("utf8"),
326
+ diagnosticTail: tail.toString("utf8")
327
+ });
328
+ return false;
329
+ };
330
+ const finishLine = () => {
331
+ if (projectingOversizedLine) {
332
+ const projected = projection?.finish();
333
+ if (projected === undefined) {
334
+ failLimit(projectedBytes, projectedPrefix, projectedTail);
335
+ } else {
336
+ options.onLine(projected);
337
+ }
338
+ } else if (pendingBytes > 0) {
339
+ options.onLine(Buffer.concat(pending, pendingBytes).toString("utf8"));
340
+ }
341
+ pending = [];
342
+ pendingBytes = 0;
343
+ projectingOversizedLine = false;
344
+ projection = undefined;
345
+ projectedPrefix = Buffer.alloc(0);
346
+ projectedTail = Buffer.alloc(0);
347
+ projectedBytes = 0;
348
+ };
349
+ const append = (segment) => {
350
+ if (segment.length === 0)
351
+ return true;
352
+ if (projectingOversizedLine) {
353
+ projectedBytes += segment.length;
354
+ projectedTail = diagnosticTail(projectedTail, segment);
355
+ return projection?.push(segment) === true || failLimit(projectedBytes, projectedPrefix, projectedTail);
356
+ }
357
+ const observedBytes = pendingBytes + segment.length;
358
+ if (observedBytes > maxPendingLineBytes) {
359
+ const prior = pendingBytes > 0 ? Buffer.concat(pending, pendingBytes) : Buffer.alloc(0);
360
+ const prefixFromPrior = prior.subarray(0, MAX_PROTOCOL_DIAGNOSTIC_BYTES);
361
+ const prefix = prefixFromPrior.length === MAX_PROTOCOL_DIAGNOSTIC_BYTES ? prefixFromPrior : Buffer.concat([prefixFromPrior, segment.subarray(0, MAX_PROTOCOL_DIAGNOSTIC_BYTES - prefixFromPrior.length)]);
362
+ const tail = diagnosticTail(prior, segment);
363
+ if (options.oversizedLineProjector?.accepts(prefix.toString("utf8"))) {
364
+ const candidate = options.oversizedLineProjector.create();
365
+ if (!candidate.push(prior) || !candidate.push(segment))
366
+ return failLimit(observedBytes, prefix, tail);
367
+ pending = [];
368
+ pendingBytes = 0;
369
+ projectingOversizedLine = true;
370
+ projection = candidate;
371
+ projectedPrefix = prefix;
372
+ projectedTail = tail;
373
+ projectedBytes = observedBytes;
374
+ return true;
375
+ }
376
+ return failLimit(observedBytes, prefix, tail);
377
+ }
378
+ pending.push(segment);
379
+ pendingBytes = observedBytes;
380
+ return true;
381
+ };
382
+ return {
383
+ push(chunk) {
384
+ if (limitExceeded)
385
+ return;
386
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
387
+ let start = 0;
388
+ for (let index = 0;index < bytes.length; index++) {
389
+ if (bytes[index] !== 10)
390
+ continue;
391
+ if (!append(bytes.subarray(start, index)))
392
+ return;
393
+ finishLine();
394
+ if (limitExceeded)
395
+ return;
396
+ start = index + 1;
397
+ }
398
+ append(bytes.subarray(start));
399
+ },
400
+ end() {
401
+ if (!limitExceeded)
402
+ finishLine();
403
+ },
404
+ exceeded: () => limitExceeded
405
+ };
406
+ }
407
+ function trimToUtf8Boundary(buffer, maxBytes) {
408
+ if (buffer.length <= maxBytes)
409
+ return buffer;
410
+ let start = buffer.length - maxBytes;
411
+ while (start < buffer.length && (buffer[start] & 192) === 128)
412
+ start++;
413
+ return buffer.subarray(start);
414
+ }
415
+ export function createBoundedByteTail(maxBytes = MAX_CHILD_STDERR_BYTES) {
416
+ if (!Number.isInteger(maxBytes) || maxBytes < 1)
417
+ throw new Error("maxBytes must be a positive integer.");
418
+ let tail = Buffer.alloc(0);
419
+ return {
420
+ push(chunk) {
421
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
422
+ tail = trimToUtf8Boundary(Buffer.concat([tail, bytes]), maxBytes);
423
+ },
424
+ text: () => tail.toString("utf8"),
425
+ byteLength: () => tail.length
426
+ };
427
+ }
428
+ export function projectChildLifecycle(event, terminalAssistantStop = false, state) {
429
+ if (event.type === "compaction_end") {
430
+ if (state)
431
+ state.compactionRetryActive = event.willRetry === true;
432
+ return event.willRetry === true ? "cancel-drain" : "none";
433
+ }
434
+ if (event.type === "agent_start" || event.type === "auto_retry_start") {
435
+ if (state)
436
+ state.compactionRetryActive = false;
437
+ }
438
+ if (event.type === "agent_end" && event.willRetry === true)
439
+ return "cancel-drain";
440
+ if (event.type === "agent_end" && state)
441
+ state.compactionRetryActive = false;
442
+ if (event.type === "agent_settled")
443
+ return state?.compactionRetryActive ? "none" : "start-drain";
444
+ if (terminalAssistantStop)
445
+ return "start-drain";
446
+ return "none";
447
+ }
@@ -0,0 +1,120 @@
1
+ import { parseExternalCliJsonlEvent } from "./external-cli-runner.js";
2
+ const MAX_EVENT_TYPE_LENGTH = 128;
3
+ const MAX_ERROR_LENGTH = 4096;
4
+ export const CLAUDE_CODE_ADAPTER_ID = "claude-code";
5
+ export const CLAUDE_CODE_WRITER_ADAPTER_ID = "claude-code-writer";
6
+ export const CLAUDE_CODE_WRITER_TOOLS = "Read,Write,Edit,Glob,Grep";
7
+ export const CLAUDE_CODE_ENV_ALLOWLIST = [
8
+ "PATH",
9
+ "HOME",
10
+ "USERPROFILE",
11
+ "USER",
12
+ "LOGNAME",
13
+ "TMPDIR",
14
+ "CLAUDE_CONFIG_DIR",
15
+ "ANTHROPIC_API_KEY",
16
+ "ANTHROPIC_AUTH_TOKEN",
17
+ "ANTHROPIC_BASE_URL",
18
+ "CLAUDE_CODE_OAUTH_TOKEN",
19
+ "CLAUDE_CODE_USE_BEDROCK",
20
+ "CLAUDE_CODE_USE_VERTEX",
21
+ "CLAUDE_CODE_USE_FOUNDRY",
22
+ "AWS_PROFILE",
23
+ "AWS_REGION",
24
+ "AWS_DEFAULT_REGION",
25
+ "AWS_ACCESS_KEY_ID",
26
+ "AWS_SECRET_ACCESS_KEY",
27
+ "AWS_SESSION_TOKEN",
28
+ "AWS_BEARER_TOKEN_BEDROCK",
29
+ "GOOGLE_APPLICATION_CREDENTIALS",
30
+ "CLOUD_ML_REGION",
31
+ "ANTHROPIC_VERTEX_PROJECT_ID",
32
+ "HTTP_PROXY",
33
+ "HTTPS_PROXY",
34
+ "NO_PROXY",
35
+ "http_proxy",
36
+ "https_proxy",
37
+ "no_proxy",
38
+ "SSL_CERT_FILE",
39
+ "SSL_CERT_DIR"
40
+ ];
41
+ function terminalError(event) {
42
+ for (const value of [event.error, event.result]) {
43
+ if (typeof value === "string" && value.trim())
44
+ return value.trim().slice(0, MAX_ERROR_LENGTH);
45
+ }
46
+ if (Array.isArray(event.errors)) {
47
+ const messages = event.errors.filter((value) => typeof value === "string" && Boolean(value.trim()));
48
+ if (messages.length > 0)
49
+ return messages.join("; ").slice(0, MAX_ERROR_LENGTH);
50
+ }
51
+ const subtype = typeof event.subtype === "string" && event.subtype ? event.subtype : "unknown";
52
+ return `Claude Code reported terminal result ${subtype}.`;
53
+ }
54
+ export function createClaudeCodeJsonlParser() {
55
+ let eventCount = 0;
56
+ let terminal;
57
+ return {
58
+ parseLine(line) {
59
+ const event = parseExternalCliJsonlEvent(line, "Claude Code", MAX_EVENT_TYPE_LENGTH);
60
+ if (terminal && event.type === "result")
61
+ throw new Error("Claude Code emitted a duplicate terminal result.");
62
+ eventCount += 1;
63
+ if (!terminal && event.type === "result") {
64
+ if (event.subtype === "success" && event.is_error === false && typeof event.result === "string" && event.result.trim()) {
65
+ terminal = { state: "completed", output: event.result.trim() };
66
+ } else {
67
+ terminal = { state: "failed", error: terminalError(event) };
68
+ }
69
+ }
70
+ return { phase: terminal ? terminal.state : "streaming", eventCount };
71
+ },
72
+ finish() {
73
+ return terminal;
74
+ }
75
+ };
76
+ }
77
+ export function resolveClaudeCodeLaunch(input) {
78
+ const writer = input.adapter === CLAUDE_CODE_WRITER_ADAPTER_ID;
79
+ const prefix = [...input.commandPrefixArgs ?? []];
80
+ const args = [
81
+ ...prefix,
82
+ "-p",
83
+ "--input-format",
84
+ "text",
85
+ "--output-format",
86
+ "stream-json",
87
+ "--verbose",
88
+ "--permission-mode",
89
+ writer ? "acceptEdits" : "plan",
90
+ "--tools",
91
+ writer ? CLAUDE_CODE_WRITER_TOOLS : "",
92
+ "--strict-mcp-config",
93
+ "--mcp-config",
94
+ '{"mcpServers":{}}',
95
+ "--setting-sources",
96
+ "user",
97
+ "--no-session-persistence",
98
+ "--disable-slash-commands",
99
+ "--no-chrome"
100
+ ];
101
+ return {
102
+ command: input.command,
103
+ args,
104
+ environment: { allowlist: CLAUDE_CODE_ENV_ALLOWLIST },
105
+ preflight: {
106
+ id: input.adapter,
107
+ versionArgs: [...prefix, "--version"],
108
+ helpArgs: [...prefix, "--help"],
109
+ validate(result) {
110
+ if (!/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)? \(Claude Code\)$/.test(result.version))
111
+ throw new Error(`Unsupported Claude Code version response: ${JSON.stringify(result.version)}.`);
112
+ for (const required of ["Claude Code - starts an interactive session", "--print", "--input-format", "stream-json", "--verbose", "--permission-mode", writer ? "acceptEdits" : "plan", "--tools", "--strict-mcp-config", "--mcp-config", "--setting-sources", "--no-session-persistence", "--disable-slash-commands", "--no-chrome"]) {
113
+ if (!result.help.includes(required))
114
+ throw new Error(`Claude Code help does not document required option ${JSON.stringify(required)}.`);
115
+ }
116
+ }
117
+ },
118
+ parser: createClaudeCodeJsonlParser()
119
+ };
120
+ }
@@ -0,0 +1,129 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { parseExternalCliJsonlEvent } from "./external-cli-runner.js";
4
+ const MAX_FINAL_MESSAGE_BYTES = 1024 * 1024;
5
+ const MAX_EVENT_TYPE_LENGTH = 128;
6
+ export const CODEX_EXEC_ADAPTER_ID = "codex-exec";
7
+ export const CODEX_EXEC_WRITER_ADAPTER_ID = "codex-exec-writer";
8
+ export const CODEX_EXEC_ENV_ALLOWLIST = [
9
+ "PATH",
10
+ "HOME",
11
+ "USERPROFILE",
12
+ "CODEX_HOME",
13
+ "CODEX_API_KEY",
14
+ "OPENAI_API_KEY",
15
+ "HTTP_PROXY",
16
+ "HTTPS_PROXY",
17
+ "NO_PROXY",
18
+ "http_proxy",
19
+ "https_proxy",
20
+ "no_proxy",
21
+ "SSL_CERT_FILE",
22
+ "SSL_CERT_DIR"
23
+ ];
24
+ function eventError(event, fallback) {
25
+ const error = event.error;
26
+ if (typeof error === "string" && error.trim())
27
+ return error.trim().slice(0, 4096);
28
+ if (error && typeof error === "object" && !Array.isArray(error)) {
29
+ const message = error.message;
30
+ if (typeof message === "string" && message.trim())
31
+ return message.trim().slice(0, 4096);
32
+ }
33
+ const message = event.message;
34
+ return typeof message === "string" && message.trim() ? message.trim().slice(0, 4096) : fallback;
35
+ }
36
+ export function createCodexExecJsonlParser(finalMessagePath) {
37
+ let eventCount = 0;
38
+ let terminal;
39
+ return {
40
+ parseLine(line) {
41
+ const event = parseExternalCliJsonlEvent(line, "Codex exec", MAX_EVENT_TYPE_LENGTH);
42
+ if (terminal)
43
+ throw new Error("Codex exec emitted an event after its terminal state.");
44
+ eventCount += 1;
45
+ if (event.type === "turn.completed")
46
+ terminal = { state: "completed" };
47
+ else if (event.type === "turn.failed")
48
+ terminal = { state: "failed", error: eventError(event, "Codex exec reported turn.failed.") };
49
+ else if (event.type === "error")
50
+ terminal = { state: "failed", error: eventError(event, "Codex exec reported an error event.") };
51
+ return { phase: terminal ? terminal.state : "streaming", eventCount };
52
+ },
53
+ finish() {
54
+ if (!terminal || terminal.state === "failed")
55
+ return terminal;
56
+ let descriptor;
57
+ try {
58
+ descriptor = fs.openSync(finalMessagePath, "r");
59
+ } catch (error) {
60
+ throw new Error(`Codex exec did not write its final-message artifact: ${error instanceof Error ? error.message : String(error)}`);
61
+ }
62
+ try {
63
+ const stat = fs.fstatSync(descriptor);
64
+ if (!stat.isFile())
65
+ throw new Error("Codex exec final-message artifact is not a file.");
66
+ if (stat.size > MAX_FINAL_MESSAGE_BYTES)
67
+ throw new Error("Codex exec final-message artifact exceeded its byte limit.");
68
+ const content = Buffer.alloc(stat.size);
69
+ let bytesRead = 0;
70
+ while (bytesRead < content.length) {
71
+ const count = fs.readSync(descriptor, content, bytesRead, content.length - bytesRead, bytesRead);
72
+ if (count === 0)
73
+ break;
74
+ bytesRead += count;
75
+ }
76
+ const output = content.subarray(0, bytesRead).toString("utf-8").trim();
77
+ if (!output)
78
+ throw new Error("Codex exec final-message artifact is empty.");
79
+ return { state: "completed", output };
80
+ } finally {
81
+ fs.closeSync(descriptor);
82
+ }
83
+ }
84
+ };
85
+ }
86
+ export function resolveCodexExecLaunch(input) {
87
+ const writer = input.adapter === CODEX_EXEC_WRITER_ADAPTER_ID;
88
+ const finalMessagePath = path.join(input.asyncDir, `external-${input.stepIndex}.final-message.txt`);
89
+ fs.rmSync(finalMessagePath, { force: true });
90
+ const prefix = [...input.commandPrefixArgs ?? []];
91
+ const args = [
92
+ ...prefix,
93
+ "exec",
94
+ "--json",
95
+ "--color",
96
+ "never",
97
+ "--ephemeral",
98
+ "--ignore-user-config",
99
+ "--ignore-rules",
100
+ "--skip-git-repo-check",
101
+ "-s",
102
+ writer ? "workspace-write" : "read-only",
103
+ "-c",
104
+ 'approval_policy="never"',
105
+ "--output-last-message",
106
+ finalMessagePath,
107
+ "-"
108
+ ];
109
+ return {
110
+ command: input.command,
111
+ args,
112
+ finalOutputPath: finalMessagePath,
113
+ environment: { allowlist: CODEX_EXEC_ENV_ALLOWLIST },
114
+ preflight: {
115
+ id: input.adapter,
116
+ versionArgs: [...prefix, "--version"],
117
+ helpArgs: [...prefix, "exec", "--help"],
118
+ validate(result) {
119
+ if (!/^codex-cli \d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(result.version))
120
+ throw new Error(`Unsupported Codex version response: ${JSON.stringify(result.version)}.`);
121
+ for (const required of ["Run Codex non-interactively", "--json", "--output-last-message", "--ephemeral", "--ignore-user-config", "--ignore-rules", "--skip-git-repo-check", "--sandbox", writer ? "workspace-write" : "read-only", "--config"]) {
122
+ if (!result.help.includes(required))
123
+ throw new Error(`Codex exec help does not document required option ${JSON.stringify(required)}.`);
124
+ }
125
+ }
126
+ },
127
+ parser: createCodexExecJsonlParser(finalMessagePath)
128
+ };
129
+ }