@oisincoveney/pipeline 3.24.2 → 3.24.3

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 (326) hide show
  1. package/README.md +2 -2
  2. package/defaults/pipeline.yaml +23 -5
  3. package/defaults/profiles.yaml +104 -21
  4. package/dist/argo-graph.js +88 -88
  5. package/dist/argo-submit.d.ts +109 -137
  6. package/dist/argo-submit.js +337 -360
  7. package/dist/argo-workflow.d.ts +156 -176
  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 +172 -169
  16. package/dist/cli/factory-commands.js +12 -11
  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 +2 -2
  22. package/dist/cli/program.js +35 -43
  23. package/dist/cli/run-command.js +25 -25
  24. package/dist/cli/run-commands.js +25 -25
  25. package/dist/cli/run-resolver.d.ts +1 -1
  26. package/dist/cli/run-resolver.js +30 -32
  27. package/dist/cli/run-service.d.ts +2 -2
  28. package/dist/cli/run-service.js +226 -239
  29. package/dist/cli/submit-options.js +78 -82
  30. package/dist/cluster-doctor.js +147 -175
  31. package/dist/codex-config.js +24 -30
  32. package/dist/commands/bench-command.js +9 -7
  33. package/dist/commands/pipeline-command.js +9 -5
  34. package/dist/commands/runner-command-command.js +28 -18
  35. package/dist/commands/ticket/complete.js +29 -33
  36. package/dist/commands/ticket/create.js +82 -82
  37. package/dist/commands/ticket/graph-check.js +11 -11
  38. package/dist/commands/ticket/next.js +36 -36
  39. package/dist/commands/ticket/sequence.js +10 -12
  40. package/dist/commands/ticket/shared.d.ts +1 -1
  41. package/dist/commands/ticket/shared.js +63 -66
  42. package/dist/commands/ticket/start.js +58 -67
  43. package/dist/commands/ticket-command.js +2 -2
  44. package/dist/config/defaults.d.ts +139 -139
  45. package/dist/config/defaults.js +81 -80
  46. package/dist/config/lint.js +52 -64
  47. package/dist/config/load.d.ts +4 -4
  48. package/dist/config/load.js +62 -74
  49. package/dist/config/schema/catalog.js +1 -1
  50. package/dist/config/schema/mcp.js +46 -52
  51. package/dist/config/schemas.d.ts +375 -525
  52. package/dist/config/schemas.js +397 -397
  53. package/dist/config/validate.d.ts +1 -1
  54. package/dist/config/validate.js +236 -201
  55. package/dist/context/repo-map.js +102 -119
  56. package/dist/credentials/broker.d.ts +6 -8
  57. package/dist/credentials/broker.js +17 -16
  58. package/dist/credentials/codex-config.js +15 -19
  59. package/dist/credentials/file-targets.js +9 -15
  60. package/dist/credentials/local-codex-auth-sync.js +55 -58
  61. package/dist/credentials/opencode-config.js +28 -32
  62. package/dist/credentials/runner.js +13 -13
  63. package/dist/effect-sync-errors.js +28 -0
  64. package/dist/factory/create-experiment.js +38 -42
  65. package/dist/factory/exec.js +10 -12
  66. package/dist/factory/git-credentials.js +4 -4
  67. package/dist/factory/stamp-answers.js +10 -11
  68. package/dist/factory/template-update.js +65 -44
  69. package/dist/factory-lane.d.ts +26 -40
  70. package/dist/factory-lane.js +26 -25
  71. package/dist/gates.js +3 -3
  72. package/dist/git-remote-url.js +17 -19
  73. package/dist/hooks.d.ts +26 -25
  74. package/dist/hooks.js +20 -22
  75. package/dist/index.d.ts +1 -1
  76. package/dist/index.js +21 -35
  77. package/dist/install-commands/claude-code.js +96 -92
  78. package/dist/install-commands/host-selection.js +3 -6
  79. package/dist/install-commands/opencode.js +263 -259
  80. package/dist/install-commands/planner.js +159 -180
  81. package/dist/install-commands/result-format.js +1 -3
  82. package/dist/install-commands/shared.js +25 -42
  83. package/dist/install-commands/writer.js +22 -25
  84. package/dist/install-commands.js +8 -8
  85. package/dist/jscpd-output.js +29 -0
  86. package/dist/json-config-merge.js +14 -20
  87. package/dist/json-line-values.js +17 -6
  88. package/dist/loop/argo-poll.js +52 -71
  89. package/dist/loop/backlog-records.js +1 -3
  90. package/dist/loop/controller-deps.js +146 -159
  91. package/dist/loop/controller.js +162 -186
  92. package/dist/loop/gh-checks.js +62 -61
  93. package/dist/loop/gh-runner.js +22 -25
  94. package/dist/loop/loop-command.js +66 -58
  95. package/dist/loop/loop-controller-entrypoint.js +28 -30
  96. package/dist/loop/merge.js +36 -40
  97. package/dist/mcp/gateway-config.js +25 -29
  98. package/dist/mcp/gateway-doctor.js +104 -116
  99. package/dist/mcp/gateway-reconcile.js +17 -22
  100. package/dist/mcp/gateway-runtime.js +1 -3
  101. package/dist/mcp/host-config.js +37 -40
  102. package/dist/mcp/host-renderers.js +10 -18
  103. package/dist/mcp/repo-local-backends.js +50 -54
  104. package/dist/mcp/toolhive-vmcp.js +39 -39
  105. package/dist/model-resolver.js +29 -33
  106. package/dist/moka-global-config.d.ts +78 -54
  107. package/dist/moka-global-config.js +90 -92
  108. package/dist/moka-submit.d.ts +2163 -864
  109. package/dist/moka-submit.js +97 -99
  110. package/dist/opencode-project-config.js +34 -40
  111. package/dist/package-assets.js +1 -3
  112. package/dist/path-refs.js +2 -2
  113. package/dist/pipeline-init.js +25 -25
  114. package/dist/pipeline-runtime.d.ts +11 -11
  115. package/dist/pipeline-runtime.js +49 -50
  116. package/dist/planned-node.js +6 -3
  117. package/dist/planning/compile.d.ts +3 -3
  118. package/dist/planning/compile.js +140 -139
  119. package/dist/planning/dependency-refs.js +5 -5
  120. package/dist/planning/generate.d.ts +1293 -1293
  121. package/dist/planning/generate.js +305 -314
  122. package/dist/planning/graph.js +131 -149
  123. package/dist/remote/argo/model.d.ts +103 -121
  124. package/dist/remote/argo/model.js +205 -197
  125. package/dist/remote/argo/policy.js +39 -47
  126. package/dist/remote/argo/storage.js +81 -85
  127. package/dist/remote/submit/argo-submission.js +53 -58
  128. package/dist/remote/submit/compilation.js +46 -49
  129. package/dist/remote/submit/event-boundary.js +62 -76
  130. package/dist/remote/submit/hook-events.d.ts +5 -0
  131. package/dist/remote/submit/io.js +40 -43
  132. package/dist/remote/submit/options.d.ts +50 -0
  133. package/dist/remote/submit/options.js +27 -0
  134. package/dist/remote/submit/service.js +45 -49
  135. package/dist/run-control/command-context.js +6 -8
  136. package/dist/run-control/commands.js +10 -10
  137. package/dist/run-control/contracts.d.ts +40 -100
  138. package/dist/run-control/contracts.js +56 -69
  139. package/dist/run-control/detach.js +66 -72
  140. package/dist/run-control/file-errors.js +1 -3
  141. package/dist/run-control/logical-segment.js +3 -3
  142. package/dist/run-control/next-node.js +66 -78
  143. package/dist/run-control/postgres/postgres-run-control-store.js +195 -224
  144. package/dist/run-control/resume-command.js +33 -41
  145. package/dist/run-control/run-artifacts-command.js +83 -105
  146. package/dist/run-control/run-command-domain.js +7 -11
  147. package/dist/run-control/run-control-store.js +9 -9
  148. package/dist/run-control/run-query-command.js +73 -100
  149. package/dist/run-control/run-record.js +2 -2
  150. package/dist/run-control/run-state-lock.js +5 -5
  151. package/dist/run-control/runtime-event-projection.js +38 -50
  152. package/dist/run-control/runtime-reporter.js +84 -102
  153. package/dist/run-control/stop-command.js +42 -53
  154. package/dist/run-control/store-fs-effects.js +3 -1
  155. package/dist/run-control/store-manifest.js +38 -13
  156. package/dist/run-control/store-paths.js +3 -3
  157. package/dist/run-control/store.js +1 -1
  158. package/dist/run-control/submit-result.js +21 -21
  159. package/dist/run-control/supervisor.js +77 -68
  160. package/dist/run-control/workspace.js +2 -2
  161. package/dist/run-state/git-refs.js +257 -307
  162. package/dist/runner/opencode-excludes.js +4 -4
  163. package/dist/runner/subprocess-result.js +28 -37
  164. package/dist/runner/subprocess.js +41 -41
  165. package/dist/runner/timeouts.js +14 -13
  166. package/dist/runner-command/dynamic-command.js +46 -39
  167. package/dist/runner-command/finalize.js +174 -153
  168. package/dist/runner-command/lifecycle-context.js +112 -130
  169. package/dist/runner-command/lifecycle.js +77 -71
  170. package/dist/runner-command/pre-schedule.js +201 -222
  171. package/dist/runner-command/run.js +432 -447
  172. package/dist/runner-command/schedule-source-options.js +8 -10
  173. package/dist/runner-command/select-ready-wave.js +38 -29
  174. package/dist/runner-command/task-descriptor.js +11 -17
  175. package/dist/runner-command-contract.d.ts +147 -156
  176. package/dist/runner-command-contract.js +401 -410
  177. package/dist/runner-event-schema.d.ts +364 -504
  178. package/dist/runner-event-schema.js +187 -175
  179. package/dist/runner-event-sink.js +37 -43
  180. package/dist/runner-output.js +6 -6
  181. package/dist/runner.d.ts +56 -36
  182. package/dist/runner.js +175 -127
  183. package/dist/runtime/actor-ids.js +2 -2
  184. package/dist/runtime/agent-node/agent-node.js +99 -111
  185. package/dist/runtime/agent-node/handoff-finalization.js +23 -24
  186. package/dist/runtime/agent-node/model-selection.js +19 -22
  187. package/dist/runtime/agent-node/output-finalization.js +174 -205
  188. package/dist/runtime/agent-node/prompt-rendering.js +207 -251
  189. package/dist/runtime/agent-node/session-execution.js +34 -38
  190. package/dist/runtime/builtins/builtins.js +212 -284
  191. package/dist/runtime/changed-files/changed-files.js +26 -34
  192. package/dist/runtime/command-executor/command-executor.js +31 -23
  193. package/dist/runtime/config-error.js +1 -3
  194. package/dist/runtime/context/context.js +35 -37
  195. package/dist/runtime/contracts/index.d.ts +1 -1
  196. package/dist/runtime/detached-race.js +11 -14
  197. package/dist/runtime/drain-merge/drain-merge.js +137 -163
  198. package/dist/runtime/durable-store/acquisition.js +5 -3
  199. package/dist/runtime/durable-store/durable-store.d.ts +1 -1
  200. package/dist/runtime/durable-store/postgres/migrate-substrate.js +36 -33
  201. package/dist/runtime/durable-store/postgres/postgres-store.js +17 -18
  202. package/dist/runtime/events/events.js +255 -323
  203. package/dist/runtime/gates/adjudication/llm-judge.js +21 -24
  204. package/dist/runtime/gates/adjudication/structured-claim.js +15 -16
  205. package/dist/runtime/gates/adjudicator/adjudicator.js +27 -27
  206. package/dist/runtime/gates/adjudicator/index.js +2 -2
  207. package/dist/runtime/gates/contract.js +5 -9
  208. package/dist/runtime/gates/gates.js +9 -8
  209. package/dist/runtime/gates/kinds/acceptance/acceptance.js +66 -70
  210. package/dist/runtime/gates/kinds/acceptance/index.js +2 -2
  211. package/dist/runtime/gates/kinds/artifact/artifact.js +4 -4
  212. package/dist/runtime/gates/kinds/artifact/index.js +2 -2
  213. package/dist/runtime/gates/kinds/builtin/builtin.js +4 -4
  214. package/dist/runtime/gates/kinds/builtin/index.js +2 -2
  215. package/dist/runtime/gates/kinds/changed-files/changed-files.js +31 -35
  216. package/dist/runtime/gates/kinds/changed-files/index.js +2 -2
  217. package/dist/runtime/gates/kinds/command/command.js +3 -3
  218. package/dist/runtime/gates/kinds/command/index.js +2 -2
  219. package/dist/runtime/gates/kinds/json-schema/index.js +2 -2
  220. package/dist/runtime/gates/kinds/json-schema/json-schema.js +7 -6
  221. package/dist/runtime/gates/kinds/verdict/index.js +2 -2
  222. package/dist/runtime/gates/kinds/verdict/verdict.js +3 -3
  223. package/dist/runtime/gates/orchestrator.js +72 -86
  224. package/dist/runtime/gates/registry.js +1 -3
  225. package/dist/runtime/handoff.d.ts +1 -1
  226. package/dist/runtime/handoff.js +43 -46
  227. package/dist/runtime/hooks/command-hook.js +57 -71
  228. package/dist/runtime/hooks/context.js +21 -25
  229. package/dist/runtime/hooks/events.js +84 -100
  230. package/dist/runtime/hooks/execution.js +6 -12
  231. package/dist/runtime/hooks/hooks.js +34 -23
  232. package/dist/runtime/hooks/invocation.js +23 -29
  233. package/dist/runtime/hooks/module-hook.js +35 -35
  234. package/dist/runtime/hooks/policy.js +32 -29
  235. package/dist/runtime/hooks/results.js +56 -66
  236. package/dist/runtime/journal-acquisition.d.ts +1 -1
  237. package/dist/runtime/journal-acquisition.js +14 -14
  238. package/dist/runtime/json-validation/json-validation.js +50 -72
  239. package/dist/runtime/local-scheduler.js +46 -48
  240. package/dist/runtime/node-execution.js +375 -446
  241. package/dist/runtime/node-protocol/node-protocol.js +36 -79
  242. package/dist/runtime/node-state-store.d.ts +1 -1
  243. package/dist/runtime/node-state-store.js +13 -57
  244. package/dist/runtime/node-state-tracker.js +46 -54
  245. package/dist/runtime/open-pull-request/open-pull-request.js +143 -187
  246. package/dist/runtime/opencode-adapter.js +23 -24
  247. package/dist/runtime/opencode-agent-name.js +6 -6
  248. package/dist/runtime/opencode-runtime.js +92 -92
  249. package/dist/runtime/opencode-server.js +39 -53
  250. package/dist/runtime/opencode-session-executor.js +315 -334
  251. package/dist/runtime/parallel-node/parallel-node.js +122 -134
  252. package/dist/runtime/parallel-worktrees/parallel-worktrees.js +90 -73
  253. package/dist/runtime/protected-paths/protected-paths.js +70 -71
  254. package/dist/runtime/remediation/remediation.js +202 -231
  255. package/dist/runtime/retry.js +8 -10
  256. package/dist/runtime/run-journal.js +7 -7
  257. package/dist/runtime/runtime-results.js +54 -69
  258. package/dist/runtime/scheduled-dependencies.d.ts +1 -1
  259. package/dist/runtime/scheduled-dependencies.js +59 -74
  260. package/dist/runtime/scheduler.js +177 -202
  261. package/dist/runtime/services/agent-node-runtime-service.js +3 -3
  262. package/dist/runtime/services/backlog-service.js +8 -14
  263. package/dist/runtime/services/command-executor-service.js +1 -1
  264. package/dist/runtime/services/config-io-service.js +24 -21
  265. package/dist/runtime/services/drain-merge-git-service.js +1 -1
  266. package/dist/runtime/services/file-system-service.js +9 -7
  267. package/dist/runtime/services/git-porcelain-service.js +6 -6
  268. package/dist/runtime/services/kubernetes-argo-service.d.ts +10 -2
  269. package/dist/runtime/services/kubernetes-argo-service.js +90 -84
  270. package/dist/runtime/services/mcp-gateway-service.js +82 -81
  271. package/dist/runtime/services/open-pull-request-git-service.js +1 -3
  272. package/dist/runtime/services/opencode-runtime-server-service.js +10 -12
  273. package/dist/runtime/services/opencode-sdk-service.js +7 -7
  274. package/dist/runtime/services/repo-io-service.js +10 -12
  275. package/dist/runtime/services/run-journal-file-service.js +2 -2
  276. package/dist/runtime/services/runner-command-io-service.js +48 -52
  277. package/dist/runtime/services/runner-event-sink-http-service.js +31 -39
  278. package/dist/runtime/step/step-node.js +15 -15
  279. package/dist/runtime/workflow-execution.js +55 -57
  280. package/dist/runtime/workflow-lifecycle.js +81 -101
  281. package/dist/safe-json.js +16 -16
  282. package/dist/schedule/backlog-context.js +120 -116
  283. package/dist/schedule/baseline.js +249 -255
  284. package/dist/schedule/passes/coverage.js +63 -68
  285. package/dist/schedule/passes/drain-merge.js +34 -40
  286. package/dist/schedule/passes/ids.js +15 -17
  287. package/dist/schedule/passes/models.js +40 -37
  288. package/dist/schedule/passes/open-pull-request.js +12 -18
  289. package/dist/schedule/passes/references.js +18 -22
  290. package/dist/schedule/prompts.js +134 -141
  291. package/dist/schedule/scheduling-roles.js +8 -14
  292. package/dist/schema-boundary.d.ts +1 -0
  293. package/dist/schema-boundary.js +145 -0
  294. package/dist/serialized-write-queue.js +2 -2
  295. package/dist/standard-output-schemas.js +61 -59
  296. package/dist/strings.js +12 -12
  297. package/dist/task-ref.js +5 -5
  298. package/dist/tickets/apply-ticket-plan.js +51 -61
  299. package/dist/tickets/backlog-task-store.d.ts +13 -22
  300. package/dist/tickets/backlog-task-store.js +80 -94
  301. package/dist/tickets/completion/complete-ticket.js +53 -59
  302. package/dist/tickets/ticket-graph-dto.d.ts +24 -47
  303. package/dist/tickets/ticket-graph-dto.js +40 -40
  304. package/dist/tickets/ticket-graph.d.ts +7 -1
  305. package/dist/tickets/ticket-graph.js +36 -50
  306. package/dist/tickets/ticket-plan-command-args.js +6 -10
  307. package/dist/tickets/ticket-plan-render.js +10 -16
  308. package/dist/tickets/ticket-plan.d.ts +31 -40
  309. package/dist/tickets/ticket-plan.js +97 -77
  310. package/dist/tickets/ticket-selection.d.ts +1 -1
  311. package/dist/tickets/ticket-selection.js +37 -52
  312. package/dist/tickets/ticket-task-index.js +13 -17
  313. package/dist/tickets/validation-error-format.js +3 -10
  314. package/dist/token-estimator.js +12 -7
  315. package/dist/unknown-fields.js +21 -0
  316. package/dist/workflow-submit-contract.d.ts +9 -9
  317. package/dist/workflow-submit-contract.js +10 -9
  318. package/docs/adr-opencode-first-goal-loop-runtime.md +11 -11
  319. package/docs/config-architecture.md +13 -13
  320. package/docs/mcp-host-isolation.md +1 -0
  321. package/docs/moka-orchestrator-design.md +3 -3
  322. package/docs/operator-guide.md +1 -1
  323. package/docs/runtime-actor-model.md +18 -18
  324. package/docs/slash-command-adapter-contract.md +3 -3
  325. package/package.json +73 -76
  326. package/dist/config/schema/reference-validation.js +0 -83
@@ -11,78 +11,68 @@ import { createRunStoreRuntimeReporter } from "../run-control/runtime-reporter.j
11
11
  import { createTerminalRuntimeReporter, formatRuntimeFailure, formatRuntimeResult } from "./format.js";
12
12
  import { startDetachedRunController } from "../run-control/detach.js";
13
13
  import { createRunControlSupervisor } from "../run-control/supervisor.js";
14
- import { Effect } from "effect";
15
14
  import { readFileSync } from "node:fs";
16
15
  import { resolve } from "node:path";
16
+ import { Effect } from "effect";
17
17
  //#region src/cli/run-service.ts
18
- /**
19
- * Config-driven `execute` entrypoint. Package-owned defaults are the source of
20
- * truth; repo-local pipeline files are ignored by runtime loading.
21
- */
22
- function execute(description, options = {}) {
18
+ const detachedRunControllerInput = (input) => ({
19
+ entrypoint: input.prepared.entrypoint,
20
+ runId: input.runId,
21
+ ...input.prepared.schedule !== void 0 && input.prepared.schedule !== "" ? { schedule: input.prepared.schedule } : {},
22
+ task: input.task,
23
+ workflow: input.prepared.workflow,
24
+ workspaceRoot: input.worktreePath
25
+ });
26
+ const withRunId = (inputs) => ({
27
+ ...inputs,
28
+ runId: inputs.runId ?? generateRuntimeRunId()
29
+ });
30
+ const runWithFlushedReporter = async (flush, run) => {
23
31
  try {
24
- if (!description.trim()) throw new Error("Task description is required");
25
- const worktreePath = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
26
- return runConfiguredPipeline({
27
- entrypoint: options.entrypoint,
28
- pipelineRunner: options.pipelineRunner,
29
- runControl: options.runControl,
30
- runId: options.runId,
31
- runStoreMode: options.runStoreMode,
32
- schedule: options.schedule,
33
- supervised: options.supervised,
34
- supervisor: options.supervisor,
35
- task: description,
36
- workflow: options.workflow,
37
- worktreePath
38
- });
39
- } catch (err) {
40
- return Promise.reject(err);
32
+ return await run();
33
+ } finally {
34
+ await flush();
41
35
  }
42
- }
43
- function quick(description, options = {}) {
44
- return execute(description, {
45
- ...options,
46
- entrypoint: "quick",
47
- runControl: {
48
- ...options.runControl,
49
- effort: "quick"
50
- }
51
- });
52
- }
53
- function runLocalResolvedTask(task, execution, runControl) {
54
- return execute(task, {
55
- entrypoint: execution.entrypoint,
56
- runControl,
57
- schedule: execution.schedule,
58
- supervised: true,
59
- workflow: execution.workflow
60
- });
61
- }
62
- async function runDetachedResolvedTask(task, execution, runControl) {
63
- const worktreePath = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
64
- const runId = generateRuntimeRunId();
65
- await persistDetachedRunController({
66
- prepared: await prepareDetachedRun({
67
- config: loadPipelineConfig(worktreePath, { allowMissingLintFileReferences: true }),
68
- execution,
69
- runId,
70
- task,
71
- worktreePath
72
- }),
73
- runControl,
74
- runId,
75
- task,
76
- worktreePath
77
- });
78
- console.log(formatDetachedRunFollowUp(runId));
79
- }
80
- function persistDetachedRunController(input) {
81
- return Effect.runPromise(withRunControlStoreScoped(input.worktreePath, (store) => Effect.gen(function* () {
36
+ };
37
+ const requireRunId = (runId = "") => {
38
+ if (runId === "") throw new Error("Run id is required for local run-control persistence.");
39
+ return runId;
40
+ };
41
+ const DEFAULT_RUN_CONTROL_OPTIONS = {
42
+ effort: "normal",
43
+ mode: "write",
44
+ target: "local"
45
+ };
46
+ const resolvedRunControlOptions = (input = {}) => ({
47
+ ...DEFAULT_RUN_CONTROL_OPTIONS,
48
+ ...input
49
+ });
50
+ const plannedRunStoreNodeIds = (inputs) => {
51
+ if (inputs.pipelineRunner !== void 0) return [];
52
+ const workflowId = resolveWorkflowSelection(inputs.config, inputs.workflow, inputs.entrypoint);
53
+ return flattenNodes(compileWorkflowPlan(inputs.config, workflowId).topologicalOrder, (node) => node.children).map((node) => node.id);
54
+ };
55
+ const detachedRunRecord = (input) => ({
56
+ ...resolvedRunControlOptions(input.runControl),
57
+ nodeIds: plannedRunStoreNodeIds({
58
+ config: input.prepared.config,
59
+ entrypoint: input.prepared.entrypoint,
60
+ runControl: input.runControl,
61
+ runId: input.runId,
62
+ schedule: input.prepared.schedule,
63
+ task: input.task,
64
+ workflow: input.prepared.workflow,
65
+ worktreePath: input.worktreePath
66
+ }),
67
+ runId: input.runId,
68
+ ...input.prepared.scheduleArtifact !== void 0 && input.prepared.scheduleArtifact !== "" ? { schedule: input.prepared.scheduleArtifact } : {}
69
+ });
70
+ const persistDetachedRunController = async (input) => {
71
+ await Effect.runPromise(withRunControlStoreScoped(input.worktreePath, (store) => Effect.gen(function* effectBody() {
82
72
  yield* store.createRun(detachedRunRecord(input));
83
73
  const launch = yield* Effect.tryPromise({
84
74
  catch: (error) => error,
85
- try: () => startDetachedRunController(detachedRunControllerInput(input))
75
+ try: async () => await startDetachedRunController(detachedRunControllerInput(input))
86
76
  });
87
77
  yield* store.updateRunController({
88
78
  controller: {
@@ -95,130 +85,14 @@ function persistDetachedRunController(input) {
95
85
  runId: input.runId
96
86
  });
97
87
  })));
98
- }
99
- function detachedRunControllerInput(input) {
100
- return {
101
- entrypoint: input.prepared.entrypoint,
102
- runId: input.runId,
103
- ...input.prepared.schedule ? { schedule: input.prepared.schedule } : {},
104
- task: input.task,
105
- workflow: input.prepared.workflow,
106
- workspaceRoot: input.worktreePath
107
- };
108
- }
109
- function detachedRunRecord(input) {
110
- return {
111
- ...resolvedRunControlOptions(input.runControl),
112
- nodeIds: plannedRunStoreNodeIds({
113
- config: input.prepared.config,
114
- entrypoint: input.prepared.entrypoint,
115
- runId: input.runId,
116
- runControl: input.runControl,
117
- schedule: input.prepared.schedule,
118
- task: input.task,
119
- workflow: input.prepared.workflow,
120
- worktreePath: input.worktreePath
121
- }),
122
- runId: input.runId,
123
- ...input.prepared.scheduleArtifact ? { schedule: input.prepared.scheduleArtifact } : {}
124
- };
125
- }
126
- function withRunId(inputs) {
127
- return {
128
- ...inputs,
129
- runId: inputs.runId ?? generateRuntimeRunId()
130
- };
131
- }
132
- async function runConfiguredPipeline(rawInputs) {
133
- const inputs = withRunId(rawInputs);
134
- const config = loadPipelineConfig(inputs.worktreePath, { allowMissingLintFileReferences: true });
135
- if (inputs.schedule) {
136
- const scheduleYaml = readFileSync(inputs.schedule, "utf8");
137
- const compiled = compileScheduleArtifact(config, parseScheduleArtifact(scheduleYaml, inputs.schedule), inputs.worktreePath);
138
- await runAndPrintPipeline({
139
- ...inputs,
140
- config: compiled.config,
141
- scheduleArtifact: scheduleYaml,
142
- workflow: compiled.workflowId
143
- });
144
- return;
145
- }
146
- const scheduledEntrypoint = scheduledEntrypointId(config, inputs.workflow, inputs.entrypoint);
147
- if (scheduledEntrypoint) {
148
- if (inputs.pipelineRunner) {
149
- await runAndPrintPipeline({
150
- ...inputs,
151
- config
152
- });
153
- return;
154
- }
155
- const result = await generateScheduleArtifactInMemory({
156
- config,
157
- entrypointId: scheduledEntrypoint,
158
- runId: inputs.runId,
159
- task: inputs.task,
160
- worktreePath: inputs.worktreePath
161
- });
162
- console.log("Schedule generated in memory");
163
- const scheduleYaml = result.yaml;
164
- const compiled = compileScheduleArtifact(config, parseScheduleArtifact(scheduleYaml, "schedule.yaml"), inputs.worktreePath);
165
- await runAndPrintPipeline({
166
- ...inputs,
167
- config: compiled.config,
168
- scheduleArtifact: scheduleYaml,
169
- workflow: compiled.workflowId
170
- });
171
- return;
172
- }
173
- await runAndPrintPipeline({
174
- ...inputs,
175
- config
176
- });
177
- }
178
- async function runAndPrintPipeline(inputs) {
179
- await Effect.runPromise(withRunControlStoreScoped(inputs.worktreePath, (store) => Effect.tryPromise({
180
- catch: (error) => error,
181
- try: () => runAndPrintPipelineWithStore(inputs, store)
182
- })));
183
- }
184
- async function runAndPrintPipelineWithStore(inputs, store) {
185
- const runner = inputs.pipelineRunner ?? runPipelineFromConfig;
186
- const runStoreReporter = await createRunStoreReporter(inputs, createTerminalRuntimeReporter(), store);
187
- printSupervisedFollowUp(inputs);
188
- const result = await runPipelineSafely(inputs, runner, runStoreReporter);
189
- console.log(formatRuntimeResult(result));
190
- if (result.outcome !== "PASS") throw new Error(formatRuntimeFailureWithFollowUp(result, inputs));
191
- }
192
- function printSupervisedFollowUp(inputs) {
193
- if (inputs.supervised) console.log(formatSupervisedRunFollowUp(requireRunId(inputs.runId)));
194
- }
195
- function runPipelineSafely(inputs, runner, runStoreReporter) {
196
- return runWithFlushedReporter(runStoreReporter.flush, () => runner({
197
- config: inputs.config,
198
- entrypoint: inputs.entrypoint,
199
- reporter: runStoreReporter.reporter,
200
- runId: inputs.runId,
201
- task: inputs.task,
202
- workflowId: inputs.workflow,
203
- worktreePath: inputs.worktreePath
204
- })).catch((error) => {
205
- throw runtimeErrorWithFollowUp(error, inputs);
206
- });
207
- }
208
- async function runWithFlushedReporter(flush, run) {
209
- try {
210
- return await run();
211
- } finally {
212
- await flush();
213
- }
214
- }
215
- async function createLocalRunStoreRuntimeReporter(inputs, reporter, store) {
88
+ };
89
+ const createLocalRunStoreRuntimeReporter = async (inputs, reporter, store) => {
216
90
  const runId = requireRunId(inputs.runId);
217
91
  await Effect.runPromise(store.createRun({
218
92
  ...resolvedRunControlOptions(inputs.runControl),
219
93
  nodeIds: plannedRunStoreNodeIds(inputs),
220
94
  runId,
221
- ...inputs.scheduleArtifact ? { schedule: inputs.scheduleArtifact } : {}
95
+ ...inputs.scheduleArtifact !== void 0 && inputs.scheduleArtifact !== "" ? { schedule: inputs.scheduleArtifact } : {}
222
96
  }));
223
97
  return createRunStoreRuntimeReporter({
224
98
  reporter,
@@ -226,11 +100,11 @@ async function createLocalRunStoreRuntimeReporter(inputs, reporter, store) {
226
100
  store,
227
101
  workspaceRoot: inputs.worktreePath
228
102
  });
229
- }
230
- function createRunStoreReporter(inputs, reporter, store) {
103
+ };
104
+ const createRunStoreReporter = (inputs, reporter, store) => {
231
105
  if (inputs.runStoreMode === "reuse") {
232
106
  const runId = requireRunId(inputs.runId);
233
- if (inputs.supervisor) {
107
+ if (inputs.supervisor === true) {
234
108
  const supervisor = createRunControlSupervisor({
235
109
  reporter,
236
110
  runId,
@@ -251,71 +125,166 @@ function createRunStoreReporter(inputs, reporter, store) {
251
125
  });
252
126
  }
253
127
  return createLocalRunStoreRuntimeReporter(inputs, reporter, store);
254
- }
255
- function requireRunId(runId) {
256
- if (!runId) throw new Error("Run id is required for local run-control persistence.");
257
- return runId;
258
- }
259
- function resolvedRunControlOptions(input) {
260
- return {
261
- ...DEFAULT_RUN_CONTROL_OPTIONS,
262
- ...input
263
- };
264
- }
265
- const DEFAULT_RUN_CONTROL_OPTIONS = {
266
- effort: "normal",
267
- mode: "write",
268
- target: "local"
269
128
  };
270
- function plannedRunStoreNodeIds(inputs) {
271
- if (inputs.pipelineRunner) return [];
272
- const workflowId = resolveWorkflowSelection(inputs.config, inputs.workflow, inputs.entrypoint);
273
- return flattenNodes(compileWorkflowPlan(inputs.config, workflowId).topologicalOrder, (node) => node.children).map((node) => node.id);
274
- }
275
- function formatSupervisedRunFollowUp(runId) {
276
- return [
277
- `Run id: ${runId}`,
278
- `Status: moka status ${runId}`,
279
- `Logs: moka logs ${runId}`
280
- ].join("\n");
281
- }
282
- function formatDetachedRunFollowUp(runId) {
283
- return [
284
- `Run id: ${runId}`,
285
- `Status: moka status ${runId}`,
286
- `Logs: moka logs ${runId}`,
287
- `Stop: moka stop ${runId}`
288
- ].join("\n");
289
- }
290
- function formatRuntimeFailureWithFollowUp(result, inputs) {
129
+ const formatSupervisedRunFollowUp = (runId) => [
130
+ `Run id: ${runId}`,
131
+ `Status: moka status ${runId}`,
132
+ `Logs: moka logs ${runId}`
133
+ ].join("\n");
134
+ const printSupervisedFollowUp = (inputs) => {
135
+ if (inputs.supervised === true) console.log(formatSupervisedRunFollowUp(requireRunId(inputs.runId)));
136
+ };
137
+ const formatDetachedRunFollowUp = (runId) => [
138
+ `Run id: ${runId}`,
139
+ `Status: moka status ${runId}`,
140
+ `Logs: moka logs ${runId}`,
141
+ `Stop: moka stop ${runId}`
142
+ ].join("\n");
143
+ const formatRuntimeFailureWithFollowUp = (result, inputs) => {
291
144
  const message = formatRuntimeFailure(result);
292
- if (!(inputs.supervised && inputs.runId)) return message;
145
+ if (!(inputs.supervised === true && inputs.runId !== void 0)) return message;
293
146
  return [
294
147
  message,
295
148
  "",
296
149
  formatSupervisedRunFollowUp(inputs.runId)
297
150
  ].join("\n");
298
- }
299
- function runtimeErrorWithFollowUp(error, inputs) {
300
- if (!(inputs.supervised && inputs.runId)) return error;
151
+ };
152
+ const runtimeErrorWithFollowUp = (error, inputs) => {
153
+ if (!(inputs.supervised === true && inputs.runId !== void 0)) return error;
301
154
  const message = error instanceof Error ? error.message : String(error);
302
155
  return new Error([
303
156
  message,
304
157
  "",
305
158
  formatSupervisedRunFollowUp(inputs.runId)
306
159
  ].join("\n"));
307
- }
308
- function scheduledEntrypointId(config, workflowId, entrypointId) {
309
- return workflowId ? null : scheduledEntrypointById(config, entrypointId ?? "execute");
310
- }
311
- function scheduledEntrypointById(config, id) {
312
- const entrypoint = config.entrypoints[id];
313
- return entrypoint && "schedule" in entrypoint ? id : null;
314
- }
315
- async function prepareDetachedRun(input) {
316
- if (input.execution.schedule) {
160
+ };
161
+ const runPipelineSafely = async (inputs, runner, runStoreReporter) => await runWithFlushedReporter(runStoreReporter.flush, async () => await runner({
162
+ config: inputs.config,
163
+ entrypoint: inputs.entrypoint,
164
+ reporter: runStoreReporter.reporter,
165
+ runId: inputs.runId,
166
+ task: inputs.task,
167
+ workflowId: inputs.workflow,
168
+ worktreePath: inputs.worktreePath
169
+ })).catch((error) => {
170
+ throw runtimeErrorWithFollowUp(error, inputs);
171
+ });
172
+ const runAndPrintPipelineWithStore = async (inputs, store) => {
173
+ const runner = inputs.pipelineRunner ?? runPipelineFromConfig;
174
+ const runStoreReporter = await createRunStoreReporter(inputs, createTerminalRuntimeReporter(), store);
175
+ printSupervisedFollowUp(inputs);
176
+ const result = await runPipelineSafely(inputs, runner, runStoreReporter);
177
+ console.log(formatRuntimeResult(result));
178
+ if (result.outcome !== "PASS") throw new Error(formatRuntimeFailureWithFollowUp(result, inputs));
179
+ };
180
+ const runAndPrintPipeline = async (inputs) => {
181
+ await Effect.runPromise(withRunControlStoreScoped(inputs.worktreePath, (store) => Effect.tryPromise({
182
+ catch: (error) => error,
183
+ try: async () => {
184
+ await runAndPrintPipelineWithStore(inputs, store);
185
+ }
186
+ })));
187
+ };
188
+ const scheduledEntrypointById = (config, id) => {
189
+ if (!Object.hasOwn(config.entrypoints, id)) return "";
190
+ return "schedule" in config.entrypoints[id] ? id : "";
191
+ };
192
+ const scheduledEntrypointId = (config, workflowId, entrypointId) => workflowId !== void 0 && workflowId !== "" ? "" : scheduledEntrypointById(config, entrypointId ?? "execute");
193
+ const runConfiguredPipeline = async (rawInputs) => {
194
+ const inputs = withRunId(rawInputs);
195
+ const config = loadPipelineConfig(inputs.worktreePath, { allowMissingLintFileReferences: true });
196
+ if (inputs.schedule !== void 0 && inputs.schedule !== "") {
197
+ const scheduleYaml = readFileSync(inputs.schedule, "utf-8");
198
+ const compiled = compileScheduleArtifact(config, parseScheduleArtifact(scheduleYaml, inputs.schedule), inputs.worktreePath);
199
+ await runAndPrintPipeline({
200
+ ...inputs,
201
+ config: compiled.config,
202
+ scheduleArtifact: scheduleYaml,
203
+ workflow: compiled.workflowId
204
+ });
205
+ return;
206
+ }
207
+ const scheduledEntrypoint = scheduledEntrypointId(config, inputs.workflow, inputs.entrypoint);
208
+ if (scheduledEntrypoint !== "") {
209
+ if (inputs.pipelineRunner !== void 0) {
210
+ await runAndPrintPipeline({
211
+ ...inputs,
212
+ config
213
+ });
214
+ return;
215
+ }
216
+ const result = await generateScheduleArtifactInMemory({
217
+ config,
218
+ entrypointId: scheduledEntrypoint,
219
+ runId: inputs.runId,
220
+ task: inputs.task,
221
+ worktreePath: inputs.worktreePath
222
+ });
223
+ console.log("Schedule generated in memory");
224
+ const scheduleYaml = result.yaml;
225
+ const compiled = compileScheduleArtifact(config, parseScheduleArtifact(scheduleYaml, "schedule.yaml"), inputs.worktreePath);
226
+ await runAndPrintPipeline({
227
+ ...inputs,
228
+ config: compiled.config,
229
+ scheduleArtifact: scheduleYaml,
230
+ workflow: compiled.workflowId
231
+ });
232
+ return;
233
+ }
234
+ await runAndPrintPipeline({
235
+ ...inputs,
236
+ config
237
+ });
238
+ };
239
+ /**
240
+ * Config-driven `execute` entrypoint. Package-owned defaults are the source of
241
+ * truth; repo-local pipeline files are ignored by runtime loading.
242
+ */
243
+ const execute = async (description, options = {}) => {
244
+ try {
245
+ if (!description.trim()) throw new Error("Task description is required");
246
+ const worktreePath = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
247
+ return runConfiguredPipeline({
248
+ entrypoint: options.entrypoint,
249
+ pipelineRunner: options.pipelineRunner,
250
+ runControl: options.runControl,
251
+ runId: options.runId,
252
+ runStoreMode: options.runStoreMode,
253
+ schedule: options.schedule,
254
+ supervised: options.supervised,
255
+ supervisor: options.supervisor,
256
+ task: description,
257
+ workflow: options.workflow,
258
+ worktreePath
259
+ });
260
+ } catch (error) {
261
+ await Promise.reject(error);
262
+ return;
263
+ }
264
+ };
265
+ const quick = async (description, options = {}) => {
266
+ await execute(description, {
267
+ ...options,
268
+ entrypoint: "quick",
269
+ runControl: {
270
+ ...options.runControl,
271
+ effort: "quick"
272
+ }
273
+ });
274
+ };
275
+ const runLocalResolvedTask = async (task, execution, runControl) => {
276
+ await execute(task, {
277
+ entrypoint: execution.entrypoint,
278
+ runControl,
279
+ schedule: execution.schedule,
280
+ supervised: true,
281
+ workflow: execution.workflow
282
+ });
283
+ };
284
+ const prepareDetachedRun = async (input) => {
285
+ if (input.execution.schedule !== void 0 && input.execution.schedule !== "") {
317
286
  const schedule = resolve(input.execution.schedule);
318
- const scheduleYaml = readFileSync(schedule, "utf8");
287
+ const scheduleYaml = readFileSync(schedule, "utf-8");
319
288
  const compiled = compileScheduleArtifact(input.config, parseScheduleArtifact(scheduleYaml, schedule), input.worktreePath);
320
289
  return {
321
290
  config: compiled.config,
@@ -325,7 +294,7 @@ async function prepareDetachedRun(input) {
325
294
  };
326
295
  }
327
296
  const scheduledEntrypoint = scheduledEntrypointId(input.config, input.execution.workflow, input.execution.entrypoint);
328
- if (!scheduledEntrypoint) return {
297
+ if (scheduledEntrypoint === "") return {
329
298
  config: input.config,
330
299
  entrypoint: input.execution.entrypoint,
331
300
  workflow: input.execution.workflow
@@ -345,6 +314,24 @@ async function prepareDetachedRun(input) {
345
314
  scheduleArtifact: scheduleYaml,
346
315
  workflow: compiled.workflowId
347
316
  };
348
- }
317
+ };
318
+ const runDetachedResolvedTask = async (task, execution, runControl) => {
319
+ const worktreePath = process.env.PIPELINE_TARGET_PATH ?? process.cwd();
320
+ const runId = generateRuntimeRunId();
321
+ await persistDetachedRunController({
322
+ prepared: await prepareDetachedRun({
323
+ config: loadPipelineConfig(worktreePath, { allowMissingLintFileReferences: true }),
324
+ execution,
325
+ runId,
326
+ task,
327
+ worktreePath
328
+ }),
329
+ runControl,
330
+ runId,
331
+ task,
332
+ worktreePath
333
+ });
334
+ console.log(formatDetachedRunFollowUp(runId));
335
+ };
349
336
  //#endregion
350
337
  export { execute, quick, runDetachedResolvedTask, runLocalResolvedTask };