agentic-orchestrator 0.1.6 → 0.1.7

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 (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -52,7 +52,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
52
52
  reason: 'Invalid agent config JSON',
53
53
  source,
54
54
  value: raw,
55
- parse_error: error instanceof Error ? error.message : String(error)
55
+ parse_error: error instanceof Error ? error.message : String(error),
56
56
  });
57
57
  }
58
58
 
@@ -60,7 +60,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
60
60
  throw invalidAgentConfigError({
61
61
  reason: 'Agent config JSON must be an object',
62
62
  source,
63
- value: raw
63
+ value: raw,
64
64
  });
65
65
  }
66
66
 
@@ -69,7 +69,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
69
69
 
70
70
  function resolveConfiguredAgentConfig(
71
71
  provider: string,
72
- runtime: ResolveSelectionRuntimeConfig
72
+ runtime: ResolveSelectionRuntimeConfig,
73
73
  ): Record<string, unknown> | null {
74
74
  if (!runtime) {
75
75
  return null;
@@ -93,16 +93,10 @@ export type ProviderSelectionResolver = (input: ResolveSelectionInput) => Provid
93
93
 
94
94
  export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env, agentsConfig }) => {
95
95
  const provider =
96
- cli.agent_provider ||
97
- env.AOP_AGENT_PROVIDER ||
98
- agentsConfig?.runtime?.default_provider ||
99
- null;
96
+ cli.agent_provider || env.AOP_AGENT_PROVIDER || agentsConfig?.runtime?.default_provider || null;
100
97
 
101
98
  const model =
102
- cli.agent_model ||
103
- env.AOP_AGENT_MODEL ||
104
- agentsConfig?.runtime?.default_model ||
105
- null;
99
+ cli.agent_model || env.AOP_AGENT_MODEL || agentsConfig?.runtime?.default_model || null;
106
100
 
107
101
  const providerConfigEnv =
108
102
  cli.provider_config_env ||
@@ -123,15 +117,12 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
123
117
  throw error;
124
118
  }
125
119
 
126
- if (
127
- AUTH_REQUIRED_PROVIDERS.has(provider) &&
128
- (!providerConfigEnv || !env[providerConfigEnv])
129
- ) {
120
+ if (AUTH_REQUIRED_PROVIDERS.has(provider) && (!providerConfigEnv || !env[providerConfigEnv])) {
130
121
  const error = new Error(ERROR_CODES.PROVIDER_AUTH_MISSING) as AppError;
131
122
  error.code = ERROR_CODES.PROVIDER_AUTH_MISSING;
132
123
  error.details = {
133
124
  provider,
134
- provider_config_env: providerConfigEnv
125
+ provider_config_env: providerConfigEnv,
135
126
  };
136
127
  throw error;
137
128
  }
@@ -149,8 +140,8 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
149
140
  provider,
150
141
  model: model ?? `${provider}-default`,
151
142
  provider_config_env: providerConfigEnv,
152
- provider_config_ref: providerConfigEnv ? env[providerConfigEnv] ?? null : null,
153
- agent_config: agentConfig
143
+ provider_config_ref: providerConfigEnv ? (env[providerConfigEnv] ?? null) : null,
144
+ agent_config: agentConfig,
154
145
  };
155
146
  };
156
147
 
@@ -163,7 +154,11 @@ export interface WorkerSession {
163
154
 
164
155
  export interface WorkerProvider {
165
156
  selection: ProviderSelection;
166
- createSession(role: string, featureId: string, systemPrompt: string | null): Promise<WorkerSession>;
157
+ createSession(
158
+ role: string,
159
+ featureId: string,
160
+ systemPrompt: string | null,
161
+ ): Promise<WorkerSession>;
167
162
  reattachSession(sessionId: string): Promise<WorkerSession | null>;
168
163
  closeSession(sessionId: string): Promise<{ closed: true }>;
169
164
  runWorker(input: {
@@ -197,23 +192,31 @@ export interface ProviderCommandRunnerOptions {
197
192
  }
198
193
 
199
194
  export interface ProviderCommandRunner {
200
- run(command: string, args: string[], options?: ProviderCommandRunnerOptions): Promise<ProviderCommandResult>;
195
+ run(
196
+ command: string,
197
+ args: string[],
198
+ options?: ProviderCommandRunnerOptions,
199
+ ): Promise<ProviderCommandResult>;
201
200
  }
202
201
 
203
202
  export class NodeProviderCommandRunner implements ProviderCommandRunner {
204
- async run(command: string, args: string[], options: ProviderCommandRunnerOptions = {}): Promise<ProviderCommandResult> {
203
+ async run(
204
+ command: string,
205
+ args: string[],
206
+ options: ProviderCommandRunnerOptions = {},
207
+ ): Promise<ProviderCommandResult> {
205
208
  return await new Promise<ProviderCommandResult>((resolve) => {
206
209
  let child;
207
210
  try {
208
211
  child = spawn(command, args, {
209
212
  env: options.env,
210
- stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe']
213
+ stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe'],
211
214
  });
212
215
  } catch {
213
216
  resolve({
214
217
  exitCode: 127,
215
218
  signal: null,
216
- errorCode: 'ENOENT'
219
+ errorCode: 'ENOENT',
217
220
  });
218
221
  return;
219
222
  }
@@ -244,7 +247,7 @@ export class NodeProviderCommandRunner implements ProviderCommandRunner {
244
247
  resolve({
245
248
  exitCode: code ?? (spawnErrorCode === 'ENOENT' ? 127 : 1),
246
249
  signal,
247
- errorCode: spawnErrorCode
250
+ errorCode: spawnErrorCode,
248
251
  });
249
252
  });
250
253
  });
@@ -276,7 +279,7 @@ function readStringArray(value: unknown): string[] | null {
276
279
  function resolveTemplateFromAgentConfig(
277
280
  agentConfig: Record<string, unknown> | null | undefined,
278
281
  kind: 'attach' | 'send',
279
- fallback: ProviderCommandTemplate | undefined
282
+ fallback: ProviderCommandTemplate | undefined,
280
283
  ): ProviderCommandTemplate | undefined {
281
284
  const nested = agentConfig?.[kind];
282
285
  const nestedRecord = isPlainObject(nested) ? nested : null;
@@ -307,24 +310,34 @@ function resolveProviderCommands(selection: ProviderSelection): ProviderCliComma
307
310
  const defaults: Record<string, ProviderCliCommands> = {
308
311
  codex: {
309
312
  attach: { command: 'codex', args: ['chat', '--session', '{session_id}'] },
310
- send: { command: 'codex', args: ['chat', '--session', '{session_id}', '--message', '{message}'] }
313
+ send: {
314
+ command: 'codex',
315
+ args: ['chat', '--session', '{session_id}', '--message', '{message}'],
316
+ },
311
317
  },
312
318
  claude: {
313
319
  attach: { command: 'claude-code', args: ['chat', '--session', '{session_id}'] },
314
- send: { command: 'claude-code', args: ['chat', '--session', '{session_id}', '--message', '{message}'] }
315
- }
320
+ send: {
321
+ command: 'claude-code',
322
+ args: ['chat', '--session', '{session_id}', '--message', '{message}'],
323
+ },
324
+ },
316
325
  };
317
326
 
318
327
  const defaultsForProvider = defaults[selection.provider] ?? {};
319
328
  return {
320
- attach: resolveTemplateFromAgentConfig(selection.agent_config, 'attach', defaultsForProvider.attach),
321
- send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send)
329
+ attach: resolveTemplateFromAgentConfig(
330
+ selection.agent_config,
331
+ 'attach',
332
+ defaultsForProvider.attach,
333
+ ),
334
+ send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send),
322
335
  };
323
336
  }
324
337
 
325
338
  function applyCommandArgsTemplate(
326
339
  args: string[],
327
- values: { sessionId: string; message?: string }
340
+ values: { sessionId: string; message?: string },
328
341
  ): string[] {
329
342
  return args.map((arg) => {
330
343
  if (arg === '{session_id}') {
@@ -341,7 +354,7 @@ function commandFailureError(
341
354
  provider: string,
342
355
  capability: 'attach' | 'send',
343
356
  details: Record<string, unknown>,
344
- code: string
357
+ code: string,
345
358
  ): AppError {
346
359
  const error = new Error(`${provider} provider ${capability} failed`) as AppError;
347
360
  error.code = code;
@@ -374,17 +387,21 @@ export class NullWorkerProvider implements WorkerProvider {
374
387
  this.getSessionInfo = (sessionId: string) =>
375
388
  Promise.resolve({
376
389
  active: Boolean(sessionId) && sessionId !== 'unknown' && sessionId !== 'unassigned',
377
- provider: this.selection.provider
390
+ provider: this.selection.provider,
378
391
  });
379
392
  }
380
393
  }
381
394
 
382
- createSession(role: string, featureId: string, systemPrompt: string | null): Promise<WorkerSession> {
395
+ createSession(
396
+ role: string,
397
+ featureId: string,
398
+ systemPrompt: string | null,
399
+ ): Promise<WorkerSession> {
383
400
  return Promise.resolve({
384
401
  session_id: `${role}-${featureId}-${crypto.randomUUID()}`,
385
402
  role,
386
403
  feature_id: featureId,
387
- system_prompt_loaded: Boolean(systemPrompt)
404
+ system_prompt_loaded: Boolean(systemPrompt),
388
405
  });
389
406
  }
390
407
  reattachSession(sessionId: string): Promise<WorkerSession | null> {
@@ -395,7 +412,7 @@ export class NullWorkerProvider implements WorkerProvider {
395
412
  session_id: sessionId,
396
413
  role: 'orchestrator',
397
414
  feature_id: 'global',
398
- system_prompt_loaded: false
415
+ system_prompt_loaded: false,
399
416
  });
400
417
  }
401
418
  closeSession(_sessionId: string): Promise<{ closed: true }> {
@@ -405,7 +422,7 @@ export class NullWorkerProvider implements WorkerProvider {
405
422
  runWorker({
406
423
  role,
407
424
  feature_id,
408
- context_bundle
425
+ context_bundle,
409
426
  }: {
410
427
  role: string;
411
428
  feature_id: string;
@@ -421,9 +438,7 @@ export class NullWorkerProvider implements WorkerProvider {
421
438
  if (role === 'planner') {
422
439
  const state = context_bundle?.state;
423
440
  const frontMatter =
424
- state && typeof state === 'object'
425
- ? (state as Record<string, unknown>).front_matter
426
- : null;
441
+ state && typeof state === 'object' ? (state as Record<string, unknown>).front_matter : null;
427
442
  const status =
428
443
  frontMatter && typeof frontMatter === 'object'
429
444
  ? (frontMatter as Record<string, unknown>).status
@@ -432,32 +447,36 @@ export class NullWorkerProvider implements WorkerProvider {
432
447
  type: 'NOTE',
433
448
  content: `Planner session active for ${feature_id}.`,
434
449
  context_snapshot: {
435
- status: typeof status === 'string' ? status : 'unknown'
436
- }
450
+ status: typeof status === 'string' ? status : 'unknown',
451
+ },
437
452
  });
438
453
  }
439
454
 
440
455
  return Promise.resolve({
441
456
  type: 'NOTE',
442
- content: `${role} session active for ${feature_id}.`
457
+ content: `${role} session active for ${feature_id}.`,
443
458
  });
444
459
  }
445
460
 
446
- private async executeCommand(kind: 'attach' | 'send', sessionId: string, message?: string): Promise<void> {
461
+ private async executeCommand(
462
+ kind: 'attach' | 'send',
463
+ sessionId: string,
464
+ message?: string,
465
+ ): Promise<void> {
447
466
  const template = kind === 'attach' ? this.commands.attach : this.commands.send;
448
467
  if (!template) {
449
468
  throw commandFailureError(
450
469
  this.selection.provider,
451
470
  kind,
452
471
  { reason: `Provider ${this.selection.provider} does not support ${kind}` },
453
- ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER
472
+ ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
454
473
  );
455
474
  }
456
475
 
457
476
  const args = applyCommandArgsTemplate(template.args, { sessionId, message });
458
477
  const result = await this.commandRunner.run(template.command, args, {
459
478
  interactive: kind === 'attach',
460
- timeoutMs: kind === 'send' ? 15_000 : undefined
479
+ timeoutMs: kind === 'send' ? 15_000 : undefined,
461
480
  });
462
481
 
463
482
  if (result.exitCode === 0) {
@@ -469,10 +488,15 @@ export class NullWorkerProvider implements WorkerProvider {
469
488
  args,
470
489
  exit_code: result.exitCode,
471
490
  signal: result.signal,
472
- error_code: result.errorCode
491
+ error_code: result.errorCode,
473
492
  };
474
493
  if (result.exitCode === 127 || result.errorCode === 'ENOENT') {
475
- throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER);
494
+ throw commandFailureError(
495
+ this.selection.provider,
496
+ kind,
497
+ details,
498
+ ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
499
+ );
476
500
  }
477
501
  throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.INTERNAL_ERROR);
478
502
  }
@@ -1,7 +1,10 @@
1
1
  import { GATE_RESULT, STATUS, TOOLS } from '../core/constants.js';
2
2
  import type { FeatureStatePayload, SupervisorToolCaller } from './types.js';
3
3
  import { NOOP_WORKER_DECISION_RUNNER, type WorkerDecisionRunner } from './worker-decision-loop.js';
4
- import type { GateRepairContext, ReactionsService } from '../application/services/reactions-service.js';
4
+ import type {
5
+ GateRepairContext,
6
+ ReactionsService,
7
+ } from '../application/services/reactions-service.js';
5
8
 
6
9
  interface GatesRunData {
7
10
  overall?: string;
@@ -28,9 +31,13 @@ export class BuildWaveExecutor {
28
31
  async run(featureIds: string[], maxParallelGateRuns: number): Promise<void> {
29
32
  const batch: string[] = [];
30
33
  for (const featureId of featureIds) {
31
- const state = await this.toolCaller.callTool<FeatureStatePayload>('builder', TOOLS.FEATURE_STATE_GET, {
32
- feature_id: featureId
33
- });
34
+ const state = await this.toolCaller.callTool<FeatureStatePayload>(
35
+ 'builder',
36
+ TOOLS.FEATURE_STATE_GET,
37
+ {
38
+ feature_id: featureId,
39
+ },
40
+ );
34
41
 
35
42
  if (state.data.front_matter.status === STATUS.BUILDING) {
36
43
  batch.push(featureId);
@@ -40,21 +47,25 @@ export class BuildWaveExecutor {
40
47
  const selected = batch.slice(0, maxParallelGateRuns);
41
48
  for (const featureId of selected) {
42
49
  const context = await this.toolCaller.callTool('builder', TOOLS.FEATURE_GET_CONTEXT, {
43
- feature_id: featureId
50
+ feature_id: featureId,
44
51
  });
45
52
  await this.workerDecisionRunner.execute({
46
53
  role: 'builder',
47
54
  featureId,
48
55
  contextBundle: context.data,
49
56
  instructions:
50
- 'Emit PATCH outputs for code changes, NOTE outputs for progress context, and REQUEST outputs for lock/context needs.'
57
+ 'Emit PATCH outputs for code changes, NOTE outputs for progress context, and REQUEST outputs for lock/context needs.',
51
58
  });
52
59
  }
53
60
 
54
61
  const executing = selected.map(async (featureId) => {
55
- const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>('builder', TOOLS.FEATURE_STATE_GET, {
56
- feature_id: featureId
57
- });
62
+ const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>(
63
+ 'builder',
64
+ TOOLS.FEATURE_STATE_GET,
65
+ {
66
+ feature_id: featureId,
67
+ },
68
+ );
58
69
  const initialRetryCount = stateForRetry.data.front_matter.gate_retry_count ?? 0;
59
70
 
60
71
  let gateOverall: string;
@@ -64,11 +75,15 @@ export class BuildWaveExecutor {
64
75
  const failureHistory: GateRepairContext['failureHistory'] = [];
65
76
 
66
77
  try {
67
- const gateResult = await this.toolCaller.callTool<GatesRunData>('builder', TOOLS.GATES_RUN, {
68
- feature_id: featureId,
69
- profile: null,
70
- mode: 'fast'
71
- });
78
+ const gateResult = await this.toolCaller.callTool<GatesRunData>(
79
+ 'builder',
80
+ TOOLS.GATES_RUN,
81
+ {
82
+ feature_id: featureId,
83
+ profile: null,
84
+ mode: 'fast',
85
+ },
86
+ );
72
87
  gateOverall = gateResult.data.overall ?? GATE_RESULT.PASS;
73
88
  gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
74
89
  gateEvidencePath = gateResult.data.evidence_path ?? '';
@@ -87,13 +102,13 @@ export class BuildWaveExecutor {
87
102
  evidence_summary: gateEvidencePath,
88
103
  logs_excerpt: gateLogs.slice(0, 800),
89
104
  failed_at: new Date().toISOString(),
90
- retry_delay_ms: this.reactionsService?.retryDelayMs()
105
+ retry_delay_ms: this.reactionsService?.retryDelayMs(),
91
106
  });
92
107
  }
93
108
 
94
109
  if (this.reactionsService && gateOverall === GATE_RESULT.FAIL) {
95
110
  const context = await this.toolCaller.callTool('builder', TOOLS.FEATURE_GET_CONTEXT, {
96
- feature_id: featureId
111
+ feature_id: featureId,
97
112
  });
98
113
  let retryCount = initialRetryCount;
99
114
  const retryDelayMs = this.reactionsService.retryDelayMs();
@@ -109,22 +124,26 @@ export class BuildWaveExecutor {
109
124
  logs: gateLogs,
110
125
  evidenceSummary: gateEvidencePath,
111
126
  retryCount,
112
- failureHistory
127
+ failureHistory,
113
128
  };
114
129
  const repairPrompt = this.reactionsService.buildRepairPrompt(ctx);
115
130
  await this.workerDecisionRunner.execute({
116
131
  role: 'builder',
117
132
  featureId,
118
133
  contextBundle: context.data,
119
- instructions: repairPrompt
134
+ instructions: repairPrompt,
120
135
  });
121
136
 
122
137
  try {
123
- const retryResult = await this.toolCaller.callTool<GatesRunData>('builder', TOOLS.GATES_RUN, {
124
- feature_id: featureId,
125
- profile: null,
126
- mode: 'fast'
127
- });
138
+ const retryResult = await this.toolCaller.callTool<GatesRunData>(
139
+ 'builder',
140
+ TOOLS.GATES_RUN,
141
+ {
142
+ feature_id: featureId,
143
+ profile: null,
144
+ mode: 'fast',
145
+ },
146
+ );
128
147
  gateOverall = retryResult.data.overall ?? GATE_RESULT.PASS;
129
148
  gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
130
149
  gateEvidencePath = retryResult.data.evidence_path ?? gateEvidencePath;
@@ -147,7 +166,7 @@ export class BuildWaveExecutor {
147
166
  evidence_summary: gateEvidencePath,
148
167
  logs_excerpt: gateLogs.slice(0, 800),
149
168
  failed_at: new Date().toISOString(),
150
- retry_delay_ms: retryDelayMs
169
+ retry_delay_ms: retryDelayMs,
151
170
  });
152
171
  }
153
172
 
@@ -164,7 +183,7 @@ export class BuildWaveExecutor {
164
183
  logs: gateLogs,
165
184
  evidenceSummary: gateEvidencePath,
166
185
  retryCount,
167
- failureHistory
186
+ failureHistory,
168
187
  };
169
188
  await this.reactionsService.notifyEscalation(featureId, escalateCtx);
170
189
  }
@@ -1,9 +1,5 @@
1
1
  import { STATUS, TOOLS } from '../core/constants.js';
2
- import type {
3
- FeatureContextPayload,
4
- InitialPlanGenerator,
5
- SupervisorToolCaller
6
- } from './types.js';
2
+ import type { FeatureContextPayload, InitialPlanGenerator, SupervisorToolCaller } from './types.js';
7
3
  import { NOOP_WORKER_DECISION_RUNNER, type WorkerDecisionRunner } from './worker-decision-loop.js';
8
4
 
9
5
  type AnyRecord = Record<string, unknown>;
@@ -78,7 +74,7 @@ function deriveEdgeCaseChecklist(specText: string): string[] {
78
74
  const checklist = [
79
75
  'Edge-case: boundary values and size limits are covered.',
80
76
  'Edge-case: negative-path input validation and error handling are covered.',
81
- 'Edge-case: dependency failure and retry behavior are covered.'
77
+ 'Edge-case: dependency failure and retry behavior are covered.',
82
78
  ];
83
79
 
84
80
  const normalizedSpec = specText.toLowerCase();
@@ -123,9 +119,13 @@ export class PlanningWaveExecutor {
123
119
 
124
120
  async run(featureIds: string[]): Promise<void> {
125
121
  for (const featureId of featureIds) {
126
- const context = await this.toolCaller.callTool<FeatureContextPayload>('planner', TOOLS.FEATURE_GET_CONTEXT, {
127
- feature_id: featureId
128
- });
122
+ const context = await this.toolCaller.callTool<FeatureContextPayload>(
123
+ 'planner',
124
+ TOOLS.FEATURE_GET_CONTEXT,
125
+ {
126
+ feature_id: featureId,
127
+ },
128
+ );
129
129
 
130
130
  const state = context.data.state.front_matter;
131
131
  if (state.status !== STATUS.PLANNING && state.status !== STATUS.BLOCKED) {
@@ -138,7 +138,7 @@ export class PlanningWaveExecutor {
138
138
  featureId,
139
139
  contextBundle: asRecord(context.data),
140
140
  instructions:
141
- 'Review feature context and emit PLAN_SUBMISSION/REQUEST/NOTE outputs to advance planning deterministically.'
141
+ 'Review feature context and emit PLAN_SUBMISSION/REQUEST/NOTE outputs to advance planning deterministically.',
142
142
  });
143
143
 
144
144
  if (decision.planSubmission || existingPlan) {
@@ -148,16 +148,20 @@ export class PlanningWaveExecutor {
148
148
  const plan = await this.planGenerator.generateInitialPlan(featureId);
149
149
  await this.toolCaller.callTool('planner', TOOLS.PLAN_SUBMIT, {
150
150
  feature_id: featureId,
151
- plan_json: plan
151
+ plan_json: plan,
152
152
  });
153
153
  }
154
154
  }
155
155
 
156
156
  async runPostQaReconciliation(featureIds: string[], iteration: number): Promise<void> {
157
157
  for (const featureId of featureIds) {
158
- const context = await this.toolCaller.callTool<FeatureContextPayload>('planner', TOOLS.FEATURE_GET_CONTEXT, {
159
- feature_id: featureId
160
- });
158
+ const context = await this.toolCaller.callTool<FeatureContextPayload>(
159
+ 'planner',
160
+ TOOLS.FEATURE_GET_CONTEXT,
161
+ {
162
+ feature_id: featureId,
163
+ },
164
+ );
161
165
 
162
166
  const frontMatter = asRecord(asRecord(context.data.state).front_matter);
163
167
  const status = readStatus(frontMatter.status);
@@ -172,7 +176,7 @@ export class PlanningWaveExecutor {
172
176
  iteration,
173
177
  decision: 'no_update',
174
178
  reasons: ['missing_plan'],
175
- status
179
+ status,
176
180
  });
177
181
  continue;
178
182
  }
@@ -184,7 +188,7 @@ export class PlanningWaveExecutor {
184
188
  iteration,
185
189
  decision: 'no_update',
186
190
  reasons: ['existing_plan_version_invalid'],
187
- status
191
+ status,
188
192
  });
189
193
  continue;
190
194
  }
@@ -199,7 +203,7 @@ export class PlanningWaveExecutor {
199
203
  reasons: decision.reasons,
200
204
  qa_summary: decision.qaSummary,
201
205
  latest_gate_overall: decision.latestGateOverall,
202
- edge_case_checklist: decision.edgeCaseChecklist
206
+ edge_case_checklist: decision.edgeCaseChecklist,
203
207
  });
204
208
  continue;
205
209
  }
@@ -208,7 +212,7 @@ export class PlanningWaveExecutor {
208
212
  await this.toolCaller.callTool('planner', TOOLS.PLAN_UPDATE, {
209
213
  feature_id: featureId,
210
214
  expected_plan_version: planVersion,
211
- plan_json: nextPlan
215
+ plan_json: nextPlan,
212
216
  });
213
217
 
214
218
  await this.appendDecisionLog(featureId, {
@@ -222,7 +226,7 @@ export class PlanningWaveExecutor {
222
226
  reasons: decision.reasons,
223
227
  qa_summary: decision.qaSummary,
224
228
  latest_gate_overall: decision.latestGateOverall,
225
- edge_case_checklist: decision.edgeCaseChecklist
229
+ edge_case_checklist: decision.edgeCaseChecklist,
226
230
  });
227
231
  }
228
232
  }
@@ -230,7 +234,7 @@ export class PlanningWaveExecutor {
230
234
  private evaluateReconciliationDecision(
231
235
  context: FeatureContextPayload,
232
236
  plan: AnyRecord,
233
- status: string
237
+ status: string,
234
238
  ): ReconciliationDecision {
235
239
  const acceptanceCriteria = asStringArray(plan.acceptance_criteria);
236
240
  const riskItems = asStringArray(plan.risk);
@@ -240,9 +244,10 @@ export class PlanningWaveExecutor {
240
244
  const pending = readCount(qaSummary, 'pending');
241
245
  const failed = readCount(qaSummary, 'failed');
242
246
  const running = readCount(qaSummary, 'running');
243
- const latestGateOverall = typeof asRecord(context.latest_evidence).overall === 'string'
244
- ? String(asRecord(context.latest_evidence).overall)
245
- : null;
247
+ const latestGateOverall =
248
+ typeof asRecord(context.latest_evidence).overall === 'string'
249
+ ? String(asRecord(context.latest_evidence).overall)
250
+ : null;
246
251
 
247
252
  const reasons: string[] = [];
248
253
  const acceptanceCriteriaAdditions: string[] = [];
@@ -251,16 +256,17 @@ export class PlanningWaveExecutor {
251
256
  if (missingEdgeCases.length > 0) {
252
257
  reasons.push(`edge_case_checklist_missing:${missingEdgeCases.length}`);
253
258
  acceptanceCriteriaAdditions.push(
254
- 'Planner edge-case checklist has been reviewed and incorporated into the execution plan.'
259
+ 'Planner edge-case checklist has been reviewed and incorporated into the execution plan.',
255
260
  );
256
261
  }
257
262
 
258
- const hasQaSignals = status === STATUS.BLOCKED || failed > 0 || pending > 0 || latestGateOverall === 'fail';
263
+ const hasQaSignals =
264
+ status === STATUS.BLOCKED || failed > 0 || pending > 0 || latestGateOverall === 'fail';
259
265
  const qaCheckpoint = `Planner reconciliation checkpoint [status=${status};failed=${failed};pending=${pending};latest=${latestGateOverall ?? 'unknown'}]`;
260
266
  if (hasQaSignals && !acceptanceCriteria.includes(qaCheckpoint)) {
261
267
  reasons.push(`qa_signals_detected:${status}:failed=${failed}:pending=${pending}`);
262
268
  acceptanceCriteriaAdditions.push(
263
- 'Reconcile QA/gate findings against plan scope and apply corrective updates before merge.'
269
+ 'Reconcile QA/gate findings against plan scope and apply corrective updates before merge.',
264
270
  );
265
271
  acceptanceCriteriaAdditions.push(qaCheckpoint);
266
272
  }
@@ -274,9 +280,9 @@ export class PlanningWaveExecutor {
274
280
  qaSummary: {
275
281
  pending,
276
282
  failed,
277
- running
283
+ running,
278
284
  },
279
- latestGateOverall
285
+ latestGateOverall,
280
286
  };
281
287
  }
282
288
 
@@ -288,13 +294,17 @@ export class PlanningWaveExecutor {
288
294
  qaSummary: {
289
295
  pending,
290
296
  failed,
291
- running
297
+ running,
292
298
  },
293
- latestGateOverall
299
+ latestGateOverall,
294
300
  };
295
301
  }
296
302
 
297
- private buildUpdatedPlan(plan: AnyRecord, planVersion: number, decision: ReconciliationDecision): AnyRecord {
303
+ private buildUpdatedPlan(
304
+ plan: AnyRecord,
305
+ planVersion: number,
306
+ decision: ReconciliationDecision,
307
+ ): AnyRecord {
298
308
  const nextPlan = structuredClone(plan);
299
309
  const acceptanceCriteria = asStringArray(nextPlan.acceptance_criteria);
300
310
  const riskItems = asStringArray(nextPlan.risk);
@@ -302,7 +312,10 @@ export class PlanningWaveExecutor {
302
312
  nextPlan.plan_version = planVersion + 1;
303
313
  nextPlan.revision_of = planVersion;
304
314
  nextPlan.revision_reason = decision.reasons.join('; ');
305
- nextPlan.acceptance_criteria = normalizeList([...acceptanceCriteria, ...decision.acceptanceCriteriaAdditions]);
315
+ nextPlan.acceptance_criteria = normalizeList([
316
+ ...acceptanceCriteria,
317
+ ...decision.acceptanceCriteriaAdditions,
318
+ ]);
306
319
  nextPlan.risk = normalizeList([...riskItems, ...decision.edgeCaseChecklist]);
307
320
  return nextPlan;
308
321
  }
@@ -310,7 +323,7 @@ export class PlanningWaveExecutor {
310
323
  private async appendDecisionLog(featureId: string, note: AnyRecord): Promise<void> {
311
324
  await this.toolCaller.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, {
312
325
  feature_id: featureId,
313
- note: JSON.stringify(note)
326
+ note: JSON.stringify(note),
314
327
  });
315
328
  }
316
329
  }
@@ -23,7 +23,7 @@ export class PromptBundleLoader implements AgentPromptProvider {
23
23
  const prompts: PromptBundle = {
24
24
  planner: null,
25
25
  builder: null,
26
- qa: null
26
+ qa: null,
27
27
  };
28
28
 
29
29
  for (const role of ['planner', 'builder', 'qa'] as const) {