@oisincoveney/pipeline 3.24.2 → 4.0.0

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 (382) hide show
  1. package/README.md +14 -2
  2. package/defaults/pipeline.yaml +23 -5
  3. package/defaults/profiles.yaml +104 -21
  4. package/dist/argo-graph.js +90 -88
  5. package/dist/argo-submit.d.ts +110 -138
  6. package/dist/argo-submit.js +363 -378
  7. package/dist/argo-workflow.d.ts +156 -177
  8. package/dist/argo-workflow.js +96 -138
  9. package/dist/backlog.js +5 -4
  10. package/dist/bench/eval-report.js +21 -12
  11. package/dist/claude-settings-config.js +23 -31
  12. package/dist/claude-user-config.js +6 -16
  13. package/dist/cli/bootstrap-commands.js +3 -3
  14. package/dist/cli/doctor.d.ts +1 -1
  15. package/dist/cli/doctor.js +176 -171
  16. package/dist/cli/factory-commands.js +13 -13
  17. package/dist/cli/format.js +92 -86
  18. package/dist/cli/loop-commands.js +21 -21
  19. package/dist/cli/mcp-gateway-commands.js +12 -12
  20. package/dist/cli/plan-commands.js +85 -116
  21. package/dist/cli/program.d.ts +3 -3
  22. package/dist/cli/program.js +41 -43
  23. package/dist/cli/run-command.d.ts +1 -1
  24. package/dist/cli/run-command.js +25 -25
  25. package/dist/cli/run-commands.js +31 -29
  26. package/dist/cli/run-resolver.d.ts +1 -1
  27. package/dist/cli/run-resolver.js +30 -32
  28. package/dist/cli/run-service.d.ts +2 -3
  29. package/dist/cli/run-service.js +229 -239
  30. package/dist/cli/submit-options.js +85 -83
  31. package/dist/cluster-doctor.js +147 -175
  32. package/dist/codex-config.js +24 -30
  33. package/dist/commands/bench-command.js +9 -7
  34. package/dist/commands/coordinator-command.js +35 -0
  35. package/dist/commands/pipeline-command.js +13 -7
  36. package/dist/commands/runner-command-command.js +39 -24
  37. package/dist/commands/runner-node-command.js +31 -0
  38. package/dist/commands/ticket/complete.js +29 -33
  39. package/dist/commands/ticket/create.js +84 -82
  40. package/dist/commands/ticket/graph-check.js +11 -11
  41. package/dist/commands/ticket/next.js +36 -36
  42. package/dist/commands/ticket/sequence.js +11 -12
  43. package/dist/commands/ticket/shared.d.ts +5 -2
  44. package/dist/commands/ticket/shared.js +63 -66
  45. package/dist/commands/ticket/start.js +58 -67
  46. package/dist/commands/ticket-command.js +2 -2
  47. package/dist/config/defaults.d.ts +139 -140
  48. package/dist/config/defaults.js +81 -80
  49. package/dist/config/lint.js +52 -64
  50. package/dist/config/load.d.ts +4 -5
  51. package/dist/config/load.js +64 -74
  52. package/dist/config/schema/catalog.d.ts +2 -1
  53. package/dist/config/schema/catalog.js +3 -2
  54. package/dist/config/schema/mcp.js +46 -52
  55. package/dist/config/schemas.d.ts +382 -528
  56. package/dist/config/schemas.js +400 -398
  57. package/dist/config/validate.d.ts +1 -2
  58. package/dist/config/validate.js +236 -201
  59. package/dist/config.d.ts +2 -2
  60. package/dist/context/repo-map.js +105 -119
  61. package/dist/coordinator/composition.js +169 -0
  62. package/dist/coordinator/config.js +71 -0
  63. package/dist/coordinator/run-owner.js +64 -0
  64. package/dist/coordinator/wave-advance.js +148 -0
  65. package/dist/coordinator/wave-scheduler.js +50 -0
  66. package/dist/credentials/broker.d.ts +6 -8
  67. package/dist/credentials/broker.js +17 -16
  68. package/dist/credentials/codex-config.js +15 -19
  69. package/dist/credentials/file-targets.js +9 -15
  70. package/dist/credentials/local-codex-auth-sync.js +55 -58
  71. package/dist/credentials/opencode-config.js +28 -32
  72. package/dist/credentials/runner.js +13 -13
  73. package/dist/effect-sync-errors.js +28 -0
  74. package/dist/factory/create-experiment.js +285 -121
  75. package/dist/factory/exec.js +10 -12
  76. package/dist/factory/git-credentials.js +4 -4
  77. package/dist/factory/stamp-answers.js +10 -11
  78. package/dist/factory/template-update.js +65 -44
  79. package/dist/factory-lane.d.ts +26 -40
  80. package/dist/factory-lane.js +26 -25
  81. package/dist/gates.js +3 -3
  82. package/dist/git-remote-url.js +17 -19
  83. package/dist/hooks.d.ts +26 -26
  84. package/dist/hooks.js +20 -22
  85. package/dist/index.d.ts +4 -3
  86. package/dist/index.js +27 -36
  87. package/dist/install-commands/claude-code.js +100 -92
  88. package/dist/install-commands/host-selection.js +3 -6
  89. package/dist/install-commands/opencode.js +264 -259
  90. package/dist/install-commands/planner.js +163 -181
  91. package/dist/install-commands/result-format.js +1 -3
  92. package/dist/install-commands/shared.js +25 -42
  93. package/dist/install-commands/writer.js +22 -25
  94. package/dist/install-commands.js +8 -8
  95. package/dist/jscpd-output.js +29 -0
  96. package/dist/json-config-merge.js +14 -20
  97. package/dist/json-line-values.js +17 -6
  98. package/dist/loop/argo-poll.d.ts +0 -1
  99. package/dist/loop/argo-poll.js +15 -95
  100. package/dist/loop/backlog-records.js +1 -3
  101. package/dist/loop/controller-deps.js +150 -161
  102. package/dist/loop/controller.js +164 -186
  103. package/dist/loop/gh-checks.js +62 -61
  104. package/dist/loop/gh-runner.js +22 -25
  105. package/dist/loop/loop-command.js +66 -58
  106. package/dist/loop/loop-controller-entrypoint.js +29 -30
  107. package/dist/loop/merge.js +36 -40
  108. package/dist/loop/run-terminal-poll.js +69 -0
  109. package/dist/mcp/gateway-config.js +25 -29
  110. package/dist/mcp/gateway-doctor.js +77 -119
  111. package/dist/mcp/gateway-reconcile.js +17 -22
  112. package/dist/mcp/gateway-runtime.js +1 -3
  113. package/dist/mcp/host-config.js +37 -40
  114. package/dist/mcp/host-renderers.js +10 -18
  115. package/dist/mcp/repo-local-backends.js +51 -54
  116. package/dist/mcp/toolhive-vmcp.js +39 -39
  117. package/dist/model-resolver.js +29 -33
  118. package/dist/moka-global-config.d.ts +78 -55
  119. package/dist/moka-global-config.js +93 -92
  120. package/dist/moka-submit.d.ts +2179 -866
  121. package/dist/moka-submit.js +97 -99
  122. package/dist/opencode-project-config.js +34 -40
  123. package/dist/package-assets.js +1 -3
  124. package/dist/path-refs.js +2 -2
  125. package/dist/pipeline-init.js +25 -25
  126. package/dist/pipeline-runtime.d.ts +15 -14
  127. package/dist/pipeline-runtime.js +51 -50
  128. package/dist/planned-node.js +6 -3
  129. package/dist/planning/compile.d.ts +5 -5
  130. package/dist/planning/compile.js +140 -139
  131. package/dist/planning/dependency-refs.js +5 -5
  132. package/dist/planning/generate.d.ts +1296 -1296
  133. package/dist/planning/generate.js +307 -314
  134. package/dist/planning/graph.d.ts +0 -1
  135. package/dist/planning/graph.js +131 -149
  136. package/dist/remote/argo/model.d.ts +104 -122
  137. package/dist/remote/argo/model.js +205 -197
  138. package/dist/remote/argo/policy.js +39 -47
  139. package/dist/remote/argo/storage.js +81 -85
  140. package/dist/remote/jobs/execution-identity.js +70 -0
  141. package/dist/remote/jobs/job-outcome.js +108 -0
  142. package/dist/remote/jobs/manifest.js +96 -0
  143. package/dist/remote/jobs/model.d.ts +158 -0
  144. package/dist/remote/jobs/model.js +162 -0
  145. package/dist/remote/jobs/node-bootstrap.js +213 -0
  146. package/dist/remote/jobs/policy.js +123 -0
  147. package/dist/remote/jobs/reconcile.js +100 -0
  148. package/dist/remote/jobs/run-spec-client.js +64 -0
  149. package/dist/remote/jobs/run-spec-path.js +31 -0
  150. package/dist/remote/jobs/run-spec-server.d.ts +34 -0
  151. package/dist/remote/jobs/run-spec-server.js +116 -0
  152. package/dist/remote/jobs/submit.d.ts +23 -0
  153. package/dist/remote/jobs/submit.js +116 -0
  154. package/dist/remote/jobs/watch.js +59 -0
  155. package/dist/remote/submit/argo-submission.d.ts +3 -1
  156. package/dist/remote/submit/argo-submission.js +53 -58
  157. package/dist/remote/submit/compilation.d.ts +2 -0
  158. package/dist/remote/submit/compilation.js +46 -49
  159. package/dist/remote/submit/event-boundary.js +62 -76
  160. package/dist/remote/submit/hook-events.d.ts +6 -0
  161. package/dist/remote/submit/io.d.ts +7 -1
  162. package/dist/remote/submit/io.js +40 -43
  163. package/dist/remote/submit/jobs-submission.d.ts +59 -0
  164. package/dist/remote/submit/jobs-submission.js +97 -0
  165. package/dist/remote/submit/jobs-submit-result.d.ts +25 -0
  166. package/dist/remote/submit/jobs-submit-result.js +34 -0
  167. package/dist/remote/submit/options.d.ts +49 -0
  168. package/dist/remote/submit/options.js +27 -0
  169. package/dist/remote/submit/service.d.ts +40 -1
  170. package/dist/remote/submit/service.js +67 -49
  171. package/dist/run-control/command-context.js +6 -8
  172. package/dist/run-control/commands.js +10 -10
  173. package/dist/run-control/contracts.d.ts +52 -101
  174. package/dist/run-control/contracts.js +83 -69
  175. package/dist/run-control/detach.js +66 -72
  176. package/dist/run-control/execution-store.js +0 -0
  177. package/dist/run-control/file-errors.js +1 -3
  178. package/dist/run-control/logical-segment.js +3 -3
  179. package/dist/run-control/next-node.js +67 -78
  180. package/dist/run-control/postgres/postgres-run-control-store.js +196 -225
  181. package/dist/run-control/resume-command.js +34 -41
  182. package/dist/run-control/run-artifacts-command.js +84 -105
  183. package/dist/run-control/run-command-domain.js +7 -11
  184. package/dist/run-control/run-control-store.js +9 -9
  185. package/dist/run-control/run-query-command.js +73 -100
  186. package/dist/run-control/run-record.js +5 -3
  187. package/dist/run-control/run-state-lock.js +5 -5
  188. package/dist/run-control/runtime-event-projection.js +38 -50
  189. package/dist/run-control/runtime-reporter.js +86 -102
  190. package/dist/run-control/stop-command.js +42 -53
  191. package/dist/run-control/store-fs-effects.js +3 -1
  192. package/dist/run-control/store-manifest.js +38 -13
  193. package/dist/run-control/store-paths.js +3 -3
  194. package/dist/run-control/store.js +1 -1
  195. package/dist/run-control/submit-result.js +21 -21
  196. package/dist/run-control/supervisor.js +78 -68
  197. package/dist/run-control/workspace.js +2 -2
  198. package/dist/run-state/git-refs.js +258 -307
  199. package/dist/runner/opencode-excludes.js +4 -4
  200. package/dist/runner/subprocess-result.js +28 -37
  201. package/dist/runner/subprocess.js +41 -41
  202. package/dist/runner/timeouts.js +14 -13
  203. package/dist/runner-command/dynamic-command.js +46 -39
  204. package/dist/runner-command/environment-commands.js +91 -0
  205. package/dist/runner-command/finalize.js +174 -153
  206. package/dist/runner-command/lifecycle-context.js +115 -130
  207. package/dist/runner-command/lifecycle.js +78 -72
  208. package/dist/runner-command/pre-schedule.js +203 -223
  209. package/dist/runner-command/run.js +450 -448
  210. package/dist/runner-command/schedule-source-options.js +8 -10
  211. package/dist/runner-command/select-ready-wave.js +39 -30
  212. package/dist/runner-command/task-descriptor.js +11 -17
  213. package/dist/runner-command-contract.d.ts +147 -157
  214. package/dist/runner-command-contract.js +403 -411
  215. package/dist/runner-event-schema.d.ts +364 -505
  216. package/dist/runner-event-schema.js +187 -175
  217. package/dist/runner-event-sink.js +37 -43
  218. package/dist/runner-output.js +6 -6
  219. package/dist/runner.d.ts +57 -37
  220. package/dist/runner.js +176 -127
  221. package/dist/runtime/actor-ids.d.ts +1 -0
  222. package/dist/runtime/actor-ids.js +2 -2
  223. package/dist/runtime/agent-node/agent-node.js +99 -110
  224. package/dist/runtime/agent-node/handoff-finalization.js +23 -24
  225. package/dist/runtime/agent-node/model-selection.js +19 -22
  226. package/dist/runtime/agent-node/output-finalization.js +174 -204
  227. package/dist/runtime/agent-node/prompt-rendering.js +208 -251
  228. package/dist/runtime/agent-node/session-execution.js +43 -39
  229. package/dist/runtime/builtins/builtins.js +218 -284
  230. package/dist/runtime/changed-files/changed-files.js +29 -34
  231. package/dist/runtime/command-executor/command-executor.js +31 -23
  232. package/dist/runtime/config-error.js +1 -3
  233. package/dist/runtime/context/context.js +35 -37
  234. package/dist/runtime/contracts/contracts.d.ts +3 -0
  235. package/dist/runtime/contracts/index.d.ts +1 -1
  236. package/dist/runtime/detached-race.js +11 -14
  237. package/dist/runtime/drain-merge/drain-merge.js +139 -164
  238. package/dist/runtime/durable-store/acquisition.js +5 -3
  239. package/dist/runtime/durable-store/durable-store.d.ts +3 -1
  240. package/dist/runtime/durable-store/postgres/client.js +29 -0
  241. package/dist/runtime/durable-store/postgres/migrate-substrate.js +34 -29
  242. package/dist/runtime/durable-store/postgres/postgres-store.js +18 -20
  243. package/dist/runtime/events/events.js +273 -331
  244. package/dist/runtime/events/index.js +2 -2
  245. package/dist/runtime/execution-envelope.js +44 -0
  246. package/dist/runtime/gates/adjudication/llm-judge.js +21 -24
  247. package/dist/runtime/gates/adjudication/structured-claim.js +15 -16
  248. package/dist/runtime/gates/adjudicator/adjudicator.js +27 -27
  249. package/dist/runtime/gates/adjudicator/index.js +2 -2
  250. package/dist/runtime/gates/contract.js +5 -9
  251. package/dist/runtime/gates/gates.js +9 -8
  252. package/dist/runtime/gates/kinds/acceptance/acceptance.js +68 -71
  253. package/dist/runtime/gates/kinds/acceptance/index.js +2 -2
  254. package/dist/runtime/gates/kinds/artifact/artifact.js +4 -4
  255. package/dist/runtime/gates/kinds/artifact/index.js +2 -2
  256. package/dist/runtime/gates/kinds/builtin/builtin.js +4 -4
  257. package/dist/runtime/gates/kinds/builtin/index.js +2 -2
  258. package/dist/runtime/gates/kinds/changed-files/changed-files.js +31 -35
  259. package/dist/runtime/gates/kinds/changed-files/index.js +2 -2
  260. package/dist/runtime/gates/kinds/command/command.js +3 -3
  261. package/dist/runtime/gates/kinds/command/index.js +2 -2
  262. package/dist/runtime/gates/kinds/json-schema/index.js +2 -2
  263. package/dist/runtime/gates/kinds/json-schema/json-schema.js +7 -6
  264. package/dist/runtime/gates/kinds/verdict/index.js +2 -2
  265. package/dist/runtime/gates/kinds/verdict/verdict.js +3 -3
  266. package/dist/runtime/gates/orchestrator.js +72 -86
  267. package/dist/runtime/gates/registry.js +1 -3
  268. package/dist/runtime/handoff.d.ts +2 -1
  269. package/dist/runtime/handoff.js +43 -46
  270. package/dist/runtime/hooks/command-hook.js +57 -71
  271. package/dist/runtime/hooks/context.js +21 -25
  272. package/dist/runtime/hooks/events.js +84 -100
  273. package/dist/runtime/hooks/execution.js +6 -12
  274. package/dist/runtime/hooks/hooks.js +34 -23
  275. package/dist/runtime/hooks/invocation.js +23 -29
  276. package/dist/runtime/hooks/module-hook.js +36 -35
  277. package/dist/runtime/hooks/policy.js +32 -29
  278. package/dist/runtime/hooks/results.js +56 -66
  279. package/dist/runtime/journal-acquisition.d.ts +3 -2
  280. package/dist/runtime/journal-acquisition.js +14 -14
  281. package/dist/runtime/json-validation/json-validation.js +51 -72
  282. package/dist/runtime/launch-plan-args.js +39 -0
  283. package/dist/runtime/local-scheduler.js +46 -48
  284. package/dist/runtime/node-execution.js +376 -445
  285. package/dist/runtime/node-protocol/node-protocol.js +36 -79
  286. package/dist/runtime/node-state-store.d.ts +4 -1
  287. package/dist/runtime/node-state-store.js +13 -57
  288. package/dist/runtime/node-state-tracker.js +46 -54
  289. package/dist/runtime/open-pull-request/open-pull-request.js +201 -187
  290. package/dist/runtime/opencode-adapter.js +23 -24
  291. package/dist/runtime/opencode-agent-name.js +6 -6
  292. package/dist/runtime/opencode-runtime.js +115 -93
  293. package/dist/runtime/opencode-server.js +39 -53
  294. package/dist/runtime/opencode-session-executor.js +312 -344
  295. package/dist/runtime/parallel-node/parallel-node.js +123 -134
  296. package/dist/runtime/parallel-worktrees/parallel-worktrees.js +90 -73
  297. package/dist/runtime/protected-paths/protected-paths.js +70 -71
  298. package/dist/runtime/remediation/remediation.js +202 -231
  299. package/dist/runtime/retry.js +8 -10
  300. package/dist/runtime/run-journal.d.ts +2 -0
  301. package/dist/runtime/run-journal.js +7 -7
  302. package/dist/runtime/runtime-results.js +54 -69
  303. package/dist/runtime/scheduled-dependencies.d.ts +2 -1
  304. package/dist/runtime/scheduled-dependencies.js +61 -75
  305. package/dist/runtime/scheduler.js +179 -202
  306. package/dist/runtime/services/agent-node-runtime-service.js +3 -3
  307. package/dist/runtime/services/backlog-service.d.ts +1 -2
  308. package/dist/runtime/services/backlog-service.js +8 -14
  309. package/dist/runtime/services/command-executor-service.js +1 -1
  310. package/dist/runtime/services/config-io-service.js +24 -21
  311. package/dist/runtime/services/drain-merge-git-service.js +1 -1
  312. package/dist/runtime/services/file-system-service.js +9 -7
  313. package/dist/runtime/services/git-porcelain-service.js +6 -6
  314. package/dist/runtime/services/kubernetes-argo-service.d.ts +10 -3
  315. package/dist/runtime/services/kubernetes-argo-service.js +90 -84
  316. package/dist/runtime/services/kubernetes-jobs-read-service.js +115 -0
  317. package/dist/runtime/services/kubernetes-jobs-service.d.ts +37 -0
  318. package/dist/runtime/services/kubernetes-jobs-service.js +45 -0
  319. package/dist/runtime/services/kubernetes-jobs-watch-service.js +61 -0
  320. package/dist/runtime/services/kubernetes-lease-service.js +21 -0
  321. package/dist/runtime/services/mcp-gateway-service.js +143 -94
  322. package/dist/runtime/services/open-pull-request-git-service.js +1 -3
  323. package/dist/runtime/services/opencode-runtime-server-service.js +10 -12
  324. package/dist/runtime/services/opencode-sdk-service.js +7 -7
  325. package/dist/runtime/services/repo-io-service.js +10 -12
  326. package/dist/runtime/services/run-journal-file-service.js +2 -2
  327. package/dist/runtime/services/runner-command-io-service.js +48 -52
  328. package/dist/runtime/services/runner-event-sink-http-service.js +32 -39
  329. package/dist/runtime/step/step-node.js +15 -15
  330. package/dist/runtime/workflow-execution.js +56 -57
  331. package/dist/runtime/workflow-lifecycle.js +82 -101
  332. package/dist/runtime/yeet-event-record.js +104 -0
  333. package/dist/runtime/yeet-executor.js +184 -0
  334. package/dist/safe-json.js +16 -16
  335. package/dist/schedule/backlog-context.js +122 -116
  336. package/dist/schedule/baseline.js +249 -255
  337. package/dist/schedule/passes/coverage.js +63 -68
  338. package/dist/schedule/passes/drain-merge.js +34 -40
  339. package/dist/schedule/passes/ids.js +15 -17
  340. package/dist/schedule/passes/models.js +40 -37
  341. package/dist/schedule/passes/open-pull-request.js +16 -20
  342. package/dist/schedule/passes/references.js +18 -22
  343. package/dist/schedule/prompts.js +135 -141
  344. package/dist/schedule/scheduling-roles.js +8 -14
  345. package/dist/schema-boundary.d.ts +4 -0
  346. package/dist/schema-boundary.js +145 -0
  347. package/dist/serialized-write-queue.js +2 -2
  348. package/dist/standard-output-schemas.js +61 -59
  349. package/dist/strings.js +12 -12
  350. package/dist/task-ref.js +5 -5
  351. package/dist/tickets/apply-ticket-plan.js +52 -61
  352. package/dist/tickets/backlog-task-store.d.ts +15 -23
  353. package/dist/tickets/backlog-task-store.js +82 -94
  354. package/dist/tickets/completion/complete-ticket.js +53 -59
  355. package/dist/tickets/ticket-graph-dto.d.ts +24 -48
  356. package/dist/tickets/ticket-graph-dto.js +40 -40
  357. package/dist/tickets/ticket-graph.d.ts +7 -2
  358. package/dist/tickets/ticket-graph.js +36 -50
  359. package/dist/tickets/ticket-plan-command-args.js +6 -10
  360. package/dist/tickets/ticket-plan-render.js +10 -16
  361. package/dist/tickets/ticket-plan.d.ts +32 -41
  362. package/dist/tickets/ticket-plan.js +97 -77
  363. package/dist/tickets/ticket-selection.d.ts +3 -1
  364. package/dist/tickets/ticket-selection.js +37 -52
  365. package/dist/tickets/ticket-task-index.js +13 -17
  366. package/dist/tickets/validation-error-format.js +3 -10
  367. package/dist/token-estimator.js +12 -7
  368. package/dist/unknown-fields.js +21 -0
  369. package/dist/workflow-submit-contract.d.ts +9 -10
  370. package/dist/workflow-submit-contract.js +10 -9
  371. package/docs/adr-moka-postgres-schema-isolation.md +48 -0
  372. package/docs/adr-opencode-first-goal-loop-runtime.md +11 -11
  373. package/docs/config-architecture.md +13 -13
  374. package/docs/mcp-host-isolation.md +1 -0
  375. package/docs/moka-orchestrator-design.md +3 -3
  376. package/docs/operator-guide.md +1 -1
  377. package/docs/pipeline-console-runner-contract.md +10 -6
  378. package/docs/runtime-actor-model.md +18 -18
  379. package/docs/runtime-test-subsystems.md +200 -0
  380. package/docs/slash-command-adapter-contract.md +3 -3
  381. package/package.json +49 -85
  382. package/dist/config/schema/reference-validation.js +0 -83
@@ -1,79 +1,73 @@
1
- import { Effect } from "effect";
2
1
  import { existsSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- import { fileURLToPath } from "node:url";
2
+ import { join } from "node:path";
3
+ import { Effect, Option } from "effect";
5
4
  import { spawn } from "node:child_process";
6
5
  //#region src/run-control/detach.ts
7
- function startDetachedRunController(input) {
8
- return Effect.runPromise(startDetachedRunControllerEffect(input));
9
- }
10
- function startDetachedRunControllerEffect(input) {
11
- return Effect.gen(function* () {
12
- const command = process.execPath;
13
- const args = yield* controllerArgsEffect(input);
14
- const child = yield* Effect.sync(() => spawn(command, args, {
15
- cwd: input.workspaceRoot,
16
- detached: true,
17
- env: {
18
- ...process.env,
19
- PIPELINE_TARGET_PATH: input.workspaceRoot
20
- },
21
- stdio: "ignore"
22
- }));
23
- if (!child.pid) return yield* Effect.fail(/* @__PURE__ */ new Error("Detached run controller did not expose a process id."));
24
- yield* waitForControllerSpawnEffect(child);
25
- yield* Effect.sync(() => child.unref());
26
- return {
27
- argv: [command, ...args],
28
- pid: child.pid,
29
- startedAt: (/* @__PURE__ */ new Date()).toISOString()
30
- };
6
+ const optionalOption = (name, value) => Option.match(value, {
7
+ onNone: () => [],
8
+ onSome: (definedValue) => [name, definedValue]
9
+ });
10
+ const pathExistsEffect = (path) => Effect.sync(() => existsSync(path));
11
+ const cliEntrypointPathEffect = () => Effect.gen(function* effectBody() {
12
+ const envEntrypoint = process.env.MOKA_CLI_ENTRYPOINT;
13
+ if (envEntrypoint !== void 0 && envEntrypoint.length > 0) return envEntrypoint;
14
+ const moduleDir = import.meta.dirname;
15
+ const compiledEntrypoint = join(moduleDir, "..", "index.js");
16
+ if (yield* pathExistsEffect(compiledEntrypoint)) return compiledEntrypoint;
17
+ const sourceEntrypoint = join(moduleDir, "..", "index.ts");
18
+ if (yield* pathExistsEffect(sourceEntrypoint)) return sourceEntrypoint;
19
+ return process.argv[1] ?? compiledEntrypoint;
20
+ });
21
+ const controllerArgsEffect = (input) => Effect.gen(function* effectBody() {
22
+ return [
23
+ yield* cliEntrypointPathEffect(),
24
+ "run-controller",
25
+ "--run-id",
26
+ input.runId,
27
+ ...optionalOption("--schedule", Option.fromNullishOr(input.schedule)),
28
+ ...optionalOption("--entrypoint", Option.fromNullishOr(input.entrypoint)),
29
+ ...optionalOption("--workflow", Option.fromNullishOr(input.workflow)),
30
+ "--",
31
+ input.task
32
+ ];
33
+ });
34
+ const waitForControllerSpawnEffect = (child) => Effect.callback((resume) => {
35
+ const onSpawn = () => {
36
+ resume(Effect.void);
37
+ };
38
+ const onError = (error) => {
39
+ resume(Effect.fail(error));
40
+ };
41
+ child.once("spawn", onSpawn);
42
+ child.once("error", onError);
43
+ return Effect.sync(() => {
44
+ child.off("spawn", onSpawn);
45
+ child.off("error", onError);
31
46
  });
32
- }
33
- function controllerArgsEffect(input) {
34
- return Effect.gen(function* () {
35
- return [
36
- yield* cliEntrypointPathEffect(),
37
- "run-controller",
38
- "--run-id",
39
- input.runId,
40
- ...optionalOption("--schedule", input.schedule),
41
- ...optionalOption("--entrypoint", input.entrypoint),
42
- ...optionalOption("--workflow", input.workflow),
43
- "--",
44
- input.task
45
- ];
47
+ });
48
+ const startDetachedRunControllerEffect = (input) => Effect.gen(function* effectBody() {
49
+ const command = process.execPath;
50
+ const args = yield* controllerArgsEffect(input);
51
+ const child = yield* Effect.sync(() => spawn(command, args, {
52
+ cwd: input.workspaceRoot,
53
+ detached: true,
54
+ env: {
55
+ ...process.env,
56
+ PIPELINE_TARGET_PATH: input.workspaceRoot
57
+ },
58
+ stdio: "ignore"
59
+ }));
60
+ if (child.pid === void 0 || child.pid === 0) return yield* Effect.fail(/* @__PURE__ */ new Error("Detached run controller did not expose a process id."));
61
+ yield* waitForControllerSpawnEffect(child);
62
+ yield* Effect.sync(() => {
63
+ child.unref();
46
64
  });
47
- }
48
- function optionalOption(name, value) {
49
- return value ? [name, value] : [];
50
- }
51
- function cliEntrypointPathEffect() {
52
- return Effect.gen(function* () {
53
- const envEntrypoint = process.env.MOKA_CLI_ENTRYPOINT;
54
- if (envEntrypoint) return envEntrypoint;
55
- const moduleDir = dirname(fileURLToPath(import.meta.url));
56
- const compiledEntrypoint = join(moduleDir, "..", "index.js");
57
- if (yield* pathExistsEffect(compiledEntrypoint)) return compiledEntrypoint;
58
- const sourceEntrypoint = join(moduleDir, "..", "index.ts");
59
- if (yield* pathExistsEffect(sourceEntrypoint)) return sourceEntrypoint;
60
- return process.argv[1] ?? compiledEntrypoint;
61
- });
62
- }
63
- function pathExistsEffect(path) {
64
- return Effect.sync(() => existsSync(path));
65
- }
66
- function waitForControllerSpawnEffect(child) {
67
- return Effect.callback((resume) => {
68
- const onSpawn = () => resume(Effect.void);
69
- const onError = (error) => resume(Effect.fail(error));
70
- child.once("spawn", onSpawn);
71
- child.once("error", onError);
72
- return Effect.sync(() => {
73
- child.off("spawn", onSpawn);
74
- child.off("error", onError);
75
- });
76
- });
77
- }
65
+ return {
66
+ argv: [command, ...args],
67
+ pid: child.pid,
68
+ startedAt: (/* @__PURE__ */ new Date()).toISOString()
69
+ };
70
+ });
71
+ const startDetachedRunController = async (input) => await Effect.runPromise(startDetachedRunControllerEffect(input));
78
72
  //#endregion
79
73
  export { startDetachedRunController, startDetachedRunControllerEffect };
@@ -1,6 +1,4 @@
1
1
  //#region src/run-control/file-errors.ts
2
- function isNotFound(error) {
3
- return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
4
- }
2
+ const isNotFound = (error) => typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
5
3
  //#endregion
6
4
  export { isNotFound };
@@ -1,9 +1,9 @@
1
1
  import "effect";
2
2
  //#region src/run-control/logical-segment.ts
3
- const LOGICAL_SEGMENT_PATTERN = /^(?!\.{1,2}$)(?!.*[\\/]).+$/;
4
- function parseLogicalSegment(label, value) {
3
+ const LOGICAL_SEGMENT_PATTERN = /^(?!\.{1,2}$)(?!.*[\\/]).+$/u;
4
+ const parseLogicalSegment = (label, value) => {
5
5
  if (!LOGICAL_SEGMENT_PATTERN.test(value)) throw new Error(`${label} must be a non-empty logical identifier.`);
6
6
  return value;
7
- }
7
+ };
8
8
  //#endregion
9
9
  export { parseLogicalSegment };
@@ -5,7 +5,7 @@ import { compileScheduleArtifact, parseScheduleArtifact } from "../planning/gene
5
5
  import { computeReadyNodeIds } from "../runtime/scheduler.js";
6
6
  import { buildEnvelopeForNode, collectStoredResults } from "../runtime/step/step-node.js";
7
7
  import { resolveDurableStore } from "../runtime/durable-store/acquisition.js";
8
- import { Effect } from "effect";
8
+ import { Effect, Option } from "effect";
9
9
  //#region src/run-control/next-node.ts
10
10
  /**
11
11
  * PIPE-91.6: compute and return the {@link NextNodeEnvelope} for the first
@@ -20,99 +20,88 @@ import { Effect } from "effect";
20
20
  * meaningful output to hand the next executor. Pure function: store reads are
21
21
  * injected via `input.store`.
22
22
  */
23
- function buildNextNodeEnvelope(input) {
23
+ const buildNextNodeEnvelopeOption = (input) => {
24
24
  const nodeId = computeReadyNodeIds({
25
25
  completed: collectStoredResults(input),
26
26
  nodes: input.nodes
27
27
  })[0];
28
- if (nodeId === void 0) return;
29
- return buildEnvelopeForNode(input, nodeId);
30
- }
31
- function buildNextNodeEnvelopeFromRunStore(input) {
32
- return Effect.gen(function* () {
33
- const { nodeMetadata, nodes } = yield* scheduleNodesFromRunStore(input);
34
- return buildNextNodeEnvelope({
35
- nodeMetadata,
28
+ return Option.flatMap(Option.fromUndefinedOr(nodeId), (value) => Option.fromUndefinedOr(buildEnvelopeForNode(input, value)));
29
+ };
30
+ const buildNextNodeEnvelope = (input) => Option.getOrUndefined(buildNextNodeEnvelopeOption(input));
31
+ const readPersistedScheduleEffect = (store, runId) => Effect.gen(function* effectBody() {
32
+ const manifest = yield* store.readRun({ runId });
33
+ if (manifest === void 0) return yield* Effect.fail(/* @__PURE__ */ new Error(`Run ${runId} does not exist in the Moka DB.`));
34
+ if (manifest.schedule === void 0 || manifest.schedule.length === 0) return yield* Effect.fail(/* @__PURE__ */ new Error(`Run ${runId} has no persisted schedule. moka next node reads schedules from the Moka DB; start the run with moka run so manifest.schedule is persisted.`));
35
+ return manifest.schedule;
36
+ });
37
+ const scheduleNodesFromRunStore = (input) => Effect.gen(function* effectBody() {
38
+ const scheduleRaw = yield* readPersistedScheduleEffect(input.runControlStore, input.runId);
39
+ const { plan } = yield* Effect.try({
40
+ catch: (error) => error,
41
+ try: () => compileScheduleArtifact(input.config, parseScheduleArtifact(scheduleRaw, `persisted schedule for ${input.runId}`), input.worktreePath)
42
+ });
43
+ const nodes = plan.topologicalOrder;
44
+ return {
45
+ nodeMetadata: new Map(plan.topologicalOrder.map((node) => [node.id, {
46
+ criteria: node.taskContext?.acceptanceCriteria ?? [],
47
+ prompt: node.taskContext?.description ?? node.id
48
+ }])),
49
+ nodes
50
+ };
51
+ });
52
+ const buildNextNodeEnvelopeFromRunStore = (input) => Effect.gen(function* effectBody() {
53
+ const { nodeMetadata, nodes } = yield* scheduleNodesFromRunStore(input);
54
+ return buildNextNodeEnvelope({
55
+ nodeMetadata,
56
+ nodes,
57
+ runId: input.runId,
58
+ store: input.durableStore
59
+ });
60
+ });
61
+ const readyNodeIdsFromRunStore = (input) => Effect.gen(function* effectBody() {
62
+ const { nodes } = yield* scheduleNodesFromRunStore(input);
63
+ return computeReadyNodeIds({
64
+ completed: collectStoredResults({
65
+ nodeMetadata: /* @__PURE__ */ new Map(),
36
66
  nodes,
37
67
  runId: input.runId,
38
68
  store: input.durableStore
39
- });
69
+ }),
70
+ nodes
40
71
  });
41
- }
42
- function readyNodeIdsFromRunStore(input) {
43
- return Effect.gen(function* () {
44
- const { nodes } = yield* scheduleNodesFromRunStore(input);
45
- return computeReadyNodeIds({
46
- completed: collectStoredResults({
47
- nodeMetadata: /* @__PURE__ */ new Map(),
48
- nodes,
49
- runId: input.runId,
50
- store: input.durableStore
51
- }),
52
- nodes
53
- });
72
+ });
73
+ const printNextNodeEnvelopeScoped = (runId) => Effect.gen(function* effectBody() {
74
+ const cwd = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
75
+ const config = yield* Effect.try({
76
+ catch: (error) => error,
77
+ try: () => loadPipelineConfig(cwd)
54
78
  });
55
- }
56
- function scheduleNodesFromRunStore(input) {
57
- return Effect.gen(function* () {
58
- const scheduleRaw = yield* readPersistedScheduleEffect(input.runControlStore, input.runId);
59
- const plan = (yield* Effect.try({
60
- catch: (error) => error,
61
- try: () => compileScheduleArtifact(input.config, parseScheduleArtifact(scheduleRaw, `persisted schedule for ${input.runId}`), input.worktreePath)
62
- })).plan;
63
- const nodes = plan.topologicalOrder;
64
- return {
65
- nodeMetadata: new Map(plan.topologicalOrder.map((node) => [node.id, {
66
- criteria: node.taskContext?.acceptanceCriteria ?? [],
67
- prompt: node.taskContext?.description ?? node.id
68
- }])),
69
- nodes
70
- };
79
+ const dbUrl = loadMokaDbUrl();
80
+ const runControlStore = yield* resolveRunControlStore(dbUrl, cwd);
81
+ const durableStore = yield* resolveDurableStore(dbUrl, runId);
82
+ const envelope = yield* buildNextNodeEnvelopeFromRunStore({
83
+ config,
84
+ durableStore,
85
+ runControlStore,
86
+ runId,
87
+ worktreePath: cwd
71
88
  });
72
- }
73
- function readPersistedScheduleEffect(store, runId) {
74
- return Effect.gen(function* () {
75
- const manifest = yield* store.readRun({ runId });
76
- if (manifest === void 0) return yield* Effect.fail(/* @__PURE__ */ new Error(`Run ${runId} does not exist in the Moka DB.`));
77
- if (!manifest.schedule) return yield* Effect.fail(/* @__PURE__ */ new Error(`Run ${runId} has no persisted schedule. moka next node reads schedules from the Moka DB; start the run with moka run so manifest.schedule is persisted.`));
78
- return manifest.schedule;
79
- });
80
- }
89
+ if (envelope === void 0) {
90
+ process.stdout.write("No ready nodes — run is complete or all remaining nodes are blocked.\n");
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
95
+ });
96
+ const printNextNodeEnvelopeEffect = (runId) => Effect.scoped(printNextNodeEnvelopeScoped(runId));
81
97
  /**
82
98
  * Register `moka next node <run-id>` under the `next` command group. The
83
99
  * schedule is read from the run-control manifest in the Moka DB by run id.
84
100
  */
85
- function registerNextNodeSubcommand(nextCommand) {
101
+ const registerNextNodeSubcommand = (nextCommand) => {
86
102
  nextCommand.command("node").description("Emit the next ready node envelope from a persisted run without executing it").argument("<run-id>", "the run id to query").showHelpAfterError("Remove --schedule-file; moka next node reads schedules from the Moka DB by run id.").action(async (runId) => {
87
103
  await Effect.runPromise(printNextNodeEnvelopeEffect(runId));
88
104
  });
89
- }
90
- function printNextNodeEnvelopeEffect(runId) {
91
- return Effect.scoped(printNextNodeEnvelopeScoped(runId));
92
- }
93
- function printNextNodeEnvelopeScoped(runId) {
94
- return Effect.gen(function* () {
95
- const cwd = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
96
- const config = yield* Effect.try({
97
- catch: (error) => error,
98
- try: () => loadPipelineConfig(cwd)
99
- });
100
- const dbUrl = loadMokaDbUrl();
101
- const runControlStore = yield* resolveRunControlStore(dbUrl, cwd);
102
- const envelope = yield* buildNextNodeEnvelopeFromRunStore({
103
- config,
104
- durableStore: yield* resolveDurableStore(dbUrl, runId),
105
- runControlStore,
106
- runId,
107
- worktreePath: cwd
108
- });
109
- if (envelope === void 0) {
110
- process.stdout.write("No ready nodes — run is complete or all remaining nodes are blocked.\n");
111
- process.exitCode = 1;
112
- return;
113
- }
114
- process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
115
- });
116
- }
105
+ };
117
106
  //#endregion
118
107
  export { buildNextNodeEnvelope, buildNextNodeEnvelopeFromRunStore, readPersistedScheduleEffect, readyNodeIdsFromRunStore, registerNextNodeSubcommand };