@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,9 +1,9 @@
1
1
  import { parseRunControlStaleDetection } from "./contracts.js";
2
2
  import { createSerializedWriteQueue } from "../serialized-write-queue.js";
3
3
  import { createRunStoreRuntimeReporter } from "./runtime-reporter.js";
4
- import { Effect } from "effect";
4
+ import { Effect, Option } from "effect";
5
5
  //#region src/run-control/supervisor.ts
6
- const RUNNING_NODE_EVENT_TYPES = /* @__PURE__ */ new Set([
6
+ const isRunningNodeEvent = (event) => [
7
7
  "agent.start",
8
8
  "artifact.check.start",
9
9
  "gate.start",
@@ -14,20 +14,39 @@ const RUNNING_NODE_EVENT_TYPES = /* @__PURE__ */ new Set([
14
14
  "node.start",
15
15
  "output.repair",
16
16
  "runtime.observability"
17
- ]);
18
- function createRunControlSupervisor(input) {
19
- return Effect.runSync(createRunControlSupervisorEffect(input));
20
- }
21
- function createRunControlSupervisorEffect(input) {
22
- return Effect.sync(() => createRunControlSupervisorRuntime(input));
23
- }
24
- function createRunControlSupervisorRuntime(input) {
17
+ ].includes(event.type);
18
+ const CLEAR_NODE_ACTIVITY = [
19
+ (event) => event.type === "node.finish",
20
+ (event) => event.type === "agent.finish" && event.exitCode !== 0,
21
+ (event) => (event.type === "artifact.check.finish" || event.type === "hook.finish") && event.required && !event.passed,
22
+ (event) => event.type === "gate.finish" && !event.passed
23
+ ];
24
+ const MARK_NODE_RUNNING = [
25
+ isRunningNodeEvent,
26
+ (event) => event.type === "agent.finish" && event.exitCode === 0,
27
+ (event) => (event.type === "artifact.check.finish" || event.type === "hook.finish") && (event.passed || !event.required),
28
+ (event) => event.type === "gate.finish" && event.passed
29
+ ];
30
+ const timestamp = (now) => now().toISOString();
31
+ const nodeIdFromEvent = (event) => {
32
+ if (!("nodeId" in event)) return Option.none();
33
+ return Option.fromUndefinedOr(event.nodeId);
34
+ };
35
+ const shouldClearNodeActivity = (event) => CLEAR_NODE_ACTIVITY.some((predicate) => predicate(event));
36
+ const shouldMarkNodeRunning = (event) => MARK_NODE_RUNNING.some((predicate) => predicate(event));
37
+ const scheduleStaleTimerEffect = (input) => Effect.sync(() => {
38
+ if (input.activity.staleTimer) clearTimeout(input.activity.staleTimer);
39
+ input.activity.staleTimer = setTimeout(() => {
40
+ input.onTimer(input.nodeId);
41
+ }, input.delayMs);
42
+ });
43
+ const createRunControlSupervisorRuntime = (input) => {
25
44
  const now = input.now ?? (() => /* @__PURE__ */ new Date());
26
45
  const staleDetection = parseRunControlStaleDetection({
27
46
  heartbeatIntervalMs: input.heartbeatIntervalMs ?? 3e4,
28
47
  nodeStaleAfterMs: input.nodeStaleAfterMs ?? 12e4
29
48
  });
30
- const store = input.store;
49
+ const { store } = input;
31
50
  const bridge = createRunStoreRuntimeReporter({
32
51
  now,
33
52
  reporter: input.reporter,
@@ -37,17 +56,21 @@ function createRunControlSupervisorRuntime(input) {
37
56
  });
38
57
  const nodeActivity = /* @__PURE__ */ new Map();
39
58
  const controlWrites = createSerializedWriteQueue();
40
- let heartbeatTimer;
59
+ let heartbeatTimer = Option.none();
41
60
  let runActive = false;
42
61
  let stopped = false;
43
62
  const flushControlWritesEffect = () => Effect.tryPromise({
44
63
  catch: (error) => error,
45
- try: () => controlWrites.flush()
64
+ try: async () => {
65
+ await controlWrites.flush();
66
+ }
46
67
  });
47
68
  const enqueueControlWriteEffect = (write) => Effect.sync(() => {
48
- controlWrites.enqueue(() => Effect.runPromise(bridge.flushEffect().pipe(Effect.andThen(write))));
69
+ controlWrites.enqueue(async () => {
70
+ await Effect.runPromise(bridge.flushEffect().pipe(Effect.andThen(write)));
71
+ });
49
72
  });
50
- const enqueueHeartbeatEffect = () => Effect.gen(function* () {
73
+ const enqueueHeartbeatEffect = () => Effect.gen(function* enqueueHeartbeatProgram() {
51
74
  if (!(runActive && !stopped)) return;
52
75
  const at = timestamp(now);
53
76
  yield* enqueueControlWriteEffect(store.recordEvent({
@@ -62,16 +85,20 @@ function createRunControlSupervisorRuntime(input) {
62
85
  const enqueueHeartbeat = () => {
63
86
  Effect.runSync(enqueueHeartbeatEffect());
64
87
  };
65
- const scheduleStaleTimerEffect = (nodeId, activity, delayMs = staleDetection.nodeStaleAfterMs) => Effect.sync(() => {
66
- if (activity.staleTimer) clearTimeout(activity.staleTimer);
67
- activity.staleTimer = setTimeout(() => markNodeStalled(nodeId), delayMs);
68
- });
69
- const markNodeStalledEffect = (nodeId) => Effect.gen(function* () {
88
+ const markNodeStalledEffect = (nodeId) => Effect.gen(function* effectBody() {
70
89
  const activity = nodeActivity.get(nodeId);
71
90
  if (!(activity && runActive && !stopped && activity.status === "running")) return;
72
91
  const elapsedMs = now().getTime() - activity.lastActivityMs;
73
92
  if (elapsedMs < staleDetection.nodeStaleAfterMs) {
74
- yield* scheduleStaleTimerEffect(nodeId, activity, staleDetection.nodeStaleAfterMs - elapsedMs);
93
+ const delayMs = staleDetection.nodeStaleAfterMs - elapsedMs;
94
+ yield* scheduleStaleTimerEffect({
95
+ activity,
96
+ delayMs,
97
+ nodeId,
98
+ onTimer: (stalledNodeId) => {
99
+ Effect.runSync(markNodeStalledEffect(stalledNodeId));
100
+ }
101
+ });
75
102
  return;
76
103
  }
77
104
  activity.status = "stalled";
@@ -84,10 +111,7 @@ function createRunControlSupervisorRuntime(input) {
84
111
  status: "stalled"
85
112
  }));
86
113
  });
87
- const markNodeStalled = (nodeId) => {
88
- Effect.runSync(markNodeStalledEffect(nodeId));
89
- };
90
- const markNodeRunningEffect = (nodeId) => Effect.gen(function* () {
114
+ const markNodeRunningEffect = (nodeId) => Effect.gen(function* markNodeRunningProgram() {
91
115
  if (!(runActive && !stopped)) return;
92
116
  const previous = nodeActivity.get(nodeId);
93
117
  const wasStalled = previous?.status === "stalled";
@@ -97,7 +121,14 @@ function createRunControlSupervisorRuntime(input) {
97
121
  status: "running"
98
122
  };
99
123
  nodeActivity.set(nodeId, activity);
100
- yield* scheduleStaleTimerEffect(nodeId, activity);
124
+ yield* scheduleStaleTimerEffect({
125
+ activity,
126
+ delayMs: staleDetection.nodeStaleAfterMs,
127
+ nodeId,
128
+ onTimer: (stalledNodeId) => {
129
+ Effect.runSync(markNodeStalledEffect(stalledNodeId));
130
+ }
131
+ });
101
132
  if (wasStalled) {
102
133
  const at = timestamp(now);
103
134
  yield* enqueueControlWriteEffect(store.updateNodeStatus({
@@ -113,8 +144,8 @@ function createRunControlSupervisorRuntime(input) {
113
144
  if (activity?.staleTimer) clearTimeout(activity.staleTimer);
114
145
  nodeActivity.delete(nodeId);
115
146
  });
116
- const clearAllNodesEffect = () => Effect.forEach([...nodeActivity.keys()], clearNodeEffect).pipe(Effect.asVoid);
117
- const observeRuntimeEventEffect = (event) => Effect.gen(function* () {
147
+ const clearAllNodesEffect = () => Effect.forEach([...nodeActivity.keys()], clearNodeEffect, { concurrency: 1 }).pipe(Effect.asVoid);
148
+ const observeRuntimeEventEffect = (event) => Effect.gen(function* observeRuntimeEventProgram() {
118
149
  if (event.type === "workflow.start") {
119
150
  runActive = true;
120
151
  return;
@@ -125,33 +156,35 @@ function createRunControlSupervisorRuntime(input) {
125
156
  return;
126
157
  }
127
158
  const nodeId = nodeIdFromEvent(event);
128
- if (!nodeId) return;
159
+ if (Option.isNone(nodeId) || nodeId.value.length === 0) return;
129
160
  if (shouldClearNodeActivity(event)) {
130
- yield* clearNodeEffect(nodeId);
161
+ yield* clearNodeEffect(nodeId.value);
131
162
  return;
132
163
  }
133
- if (shouldMarkNodeRunning(event)) yield* markNodeRunningEffect(nodeId);
164
+ if (shouldMarkNodeRunning(event)) yield* markNodeRunningEffect(nodeId.value);
134
165
  });
135
166
  const startEffect = () => Effect.sync(() => {
136
- if (heartbeatTimer || stopped) return;
137
- heartbeatTimer = setInterval(enqueueHeartbeat, staleDetection.heartbeatIntervalMs);
167
+ if (Option.isSome(heartbeatTimer) || stopped) return;
168
+ heartbeatTimer = Option.some(setInterval(enqueueHeartbeat, staleDetection.heartbeatIntervalMs));
138
169
  });
139
- const stopEffect = () => Effect.gen(function* () {
170
+ const stopEffect = () => Effect.gen(function* stopProgram() {
140
171
  stopped = true;
141
- if (heartbeatTimer) {
142
- clearInterval(heartbeatTimer);
143
- heartbeatTimer = void 0;
172
+ if (Option.isSome(heartbeatTimer)) {
173
+ clearInterval(heartbeatTimer.value);
174
+ heartbeatTimer = Option.none();
144
175
  }
145
176
  yield* clearAllNodesEffect();
146
177
  yield* bridge.flushEffect();
147
178
  yield* flushControlWritesEffect();
148
179
  });
149
- const flushEffect = () => Effect.gen(function* () {
180
+ const flushEffect = () => Effect.gen(function* flushProgram() {
150
181
  yield* bridge.flushEffect();
151
182
  yield* flushControlWritesEffect();
152
183
  });
153
184
  return {
154
- flush: () => Effect.runPromise(flushEffect()),
185
+ flush: async () => {
186
+ await Effect.runPromise(flushEffect());
187
+ },
155
188
  flushEffect,
156
189
  reporter(event) {
157
190
  bridge.reporter(event);
@@ -161,36 +194,13 @@ function createRunControlSupervisorRuntime(input) {
161
194
  Effect.runSync(startEffect());
162
195
  },
163
196
  startEffect,
164
- stop: () => Effect.runPromise(stopEffect()),
197
+ stop: async () => {
198
+ await Effect.runPromise(stopEffect());
199
+ },
165
200
  stopEffect
166
201
  };
167
- }
168
- function timestamp(now) {
169
- return now().toISOString();
170
- }
171
- function nodeIdFromEvent(event) {
172
- if (!("nodeId" in event)) return;
173
- return event.nodeId;
174
- }
175
- function shouldClearNodeActivity(event) {
176
- switch (event.type) {
177
- case "node.finish": return true;
178
- case "agent.finish": return event.exitCode !== 0;
179
- case "artifact.check.finish":
180
- case "hook.finish": return event.required && !event.passed;
181
- case "gate.finish": return !event.passed;
182
- default: return false;
183
- }
184
- }
185
- function shouldMarkNodeRunning(event) {
186
- if (RUNNING_NODE_EVENT_TYPES.has(event.type)) return true;
187
- switch (event.type) {
188
- case "agent.finish": return event.exitCode === 0;
189
- case "artifact.check.finish":
190
- case "hook.finish": return event.passed || !event.required;
191
- case "gate.finish": return event.passed;
192
- default: return false;
193
- }
194
- }
202
+ };
203
+ const createRunControlSupervisorEffect = (input) => Effect.sync(() => createRunControlSupervisorRuntime(input));
204
+ const createRunControlSupervisor = (input) => Effect.runSync(createRunControlSupervisorEffect(input));
195
205
  //#endregion
196
206
  export { createRunControlSupervisor, createRunControlSupervisorEffect };
@@ -12,12 +12,12 @@ const GITIGNORE_CONTENT = "*\n";
12
12
  * Idempotent: creates the file only if it does not already exist; never
13
13
  * overwrites an existing `.pipeline/.gitignore`.
14
14
  */
15
- function ensurePipelineWorkspaceIgnore(worktreePath) {
15
+ const ensurePipelineWorkspaceIgnore = (worktreePath) => {
16
16
  const pipelineDir = join(worktreePath, PIPELINE_DIR);
17
17
  const gitignorePath = join(worktreePath, GITIGNORE_PATH);
18
18
  if (existsSync(gitignorePath)) return;
19
19
  mkdirSync(pipelineDir, { recursive: true });
20
20
  writeFileSync(gitignorePath, GITIGNORE_CONTENT);
21
- }
21
+ };
22
22
  //#endregion
23
23
  export { ensurePipelineWorkspaceIgnore };