agentic-orchestrator 0.1.6 → 0.1.8

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 (438) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +71 -48
  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 +5 -22
  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/env-file.ts +115 -0
  107. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  108. package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
  109. package/apps/control-plane/src/cli/io.ts +7 -3
  110. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  111. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  112. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  113. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  114. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  115. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  116. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  117. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  118. package/apps/control-plane/src/cli/tooling.ts +3 -3
  119. package/apps/control-plane/src/cli/types.ts +1 -1
  120. package/apps/control-plane/src/core/collisions.ts +27 -10
  121. package/apps/control-plane/src/core/constants.ts +13 -7
  122. package/apps/control-plane/src/core/error-codes.ts +1 -1
  123. package/apps/control-plane/src/core/fs.ts +11 -5
  124. package/apps/control-plane/src/core/gates.ts +53 -27
  125. package/apps/control-plane/src/core/git.ts +18 -6
  126. package/apps/control-plane/src/core/kernel.ts +513 -227
  127. package/apps/control-plane/src/core/patch.ts +7 -3
  128. package/apps/control-plane/src/core/path-layout.ts +5 -1
  129. package/apps/control-plane/src/core/path-rules.ts +19 -5
  130. package/apps/control-plane/src/core/qa-index.ts +26 -12
  131. package/apps/control-plane/src/core/response.ts +9 -6
  132. package/apps/control-plane/src/core/schemas.ts +29 -10
  133. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  134. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  135. package/apps/control-plane/src/index.ts +3 -9
  136. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
  137. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  138. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  139. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  140. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  141. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  142. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  143. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  144. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  145. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  146. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  147. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  148. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  149. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  150. package/apps/control-plane/src/providers/providers.ts +137 -54
  151. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  152. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  153. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  154. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  155. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  156. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  157. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  158. package/apps/control-plane/src/supervisor/types.ts +22 -7
  159. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  160. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  161. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  162. package/apps/control-plane/test/aop.spec.ts +4 -4
  163. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  164. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  165. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  166. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  167. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  168. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  169. package/apps/control-plane/test/cli.spec.ts +1 -1
  170. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  171. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  172. package/apps/control-plane/test/collisions.spec.ts +30 -30
  173. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  174. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  175. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  176. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  177. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  178. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  179. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  180. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  181. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  182. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  183. package/apps/control-plane/test/gates.spec.ts +101 -81
  184. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  185. package/apps/control-plane/test/helpers.ts +10 -6
  186. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  187. package/apps/control-plane/test/init-wizard.spec.ts +328 -68
  188. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  189. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  190. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  191. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  192. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  193. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  194. package/apps/control-plane/test/kernel.spec.ts +134 -51
  195. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  196. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  197. package/apps/control-plane/test/mcp.spec.ts +231 -115
  198. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  199. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  200. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  201. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  202. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  203. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  204. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  205. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  206. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  207. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  208. package/apps/control-plane/test/providers.spec.ts +208 -104
  209. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  210. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  211. package/apps/control-plane/test/reactions.spec.ts +88 -45
  212. package/apps/control-plane/test/response.spec.ts +5 -5
  213. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  214. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  215. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  216. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  217. package/apps/control-plane/test/services.spec.ts +147 -129
  218. package/apps/control-plane/test/session-management.spec.ts +136 -74
  219. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  220. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  221. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  222. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  223. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  224. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  225. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  226. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  227. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  228. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  229. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  230. package/apps/control-plane/tsconfig.build.json +2 -7
  231. package/apps/control-plane/tsconfig.json +1 -5
  232. package/apps/control-plane/vitest.config.ts +7 -7
  233. package/config/agentic/orchestrator/adapters.yaml +3 -0
  234. package/config/agentic/orchestrator/agents.yaml +14 -0
  235. package/config/agentic/orchestrator/gates.yaml +28 -0
  236. package/config/agentic/orchestrator/policy.yaml +22 -0
  237. package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
  238. package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
  239. package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
  240. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  241. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  242. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  243. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  244. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  245. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  246. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  247. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  248. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  249. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  250. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  252. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  254. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  256. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  258. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  260. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  262. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  264. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  266. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  268. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  270. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  271. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  272. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  273. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  274. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  275. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  276. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  277. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  279. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  281. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  282. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  283. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  284. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  285. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  286. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  287. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  288. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  289. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  290. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  291. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  292. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  293. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  294. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  295. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  296. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  297. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  298. package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
  299. package/dist/apps/control-plane/cli/env-file.js +89 -0
  300. package/dist/apps/control-plane/cli/env-file.js.map +1 -0
  301. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  302. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  303. package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
  304. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  305. package/dist/apps/control-plane/cli/io.js +2 -2
  306. package/dist/apps/control-plane/cli/io.js.map +1 -1
  307. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  308. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  310. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  311. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  312. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  313. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  314. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  315. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  316. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  317. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  318. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  319. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  320. package/dist/apps/control-plane/cli/tooling.js +1 -1
  321. package/dist/apps/control-plane/core/collisions.js +11 -8
  322. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  323. package/dist/apps/control-plane/core/constants.js +13 -7
  324. package/dist/apps/control-plane/core/constants.js.map +1 -1
  325. package/dist/apps/control-plane/core/error-codes.js +1 -1
  326. package/dist/apps/control-plane/core/fs.js.map +1 -1
  327. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  328. package/dist/apps/control-plane/core/gates.js +26 -19
  329. package/dist/apps/control-plane/core/gates.js.map +1 -1
  330. package/dist/apps/control-plane/core/git.js +3 -3
  331. package/dist/apps/control-plane/core/git.js.map +1 -1
  332. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  333. package/dist/apps/control-plane/core/kernel.js +134 -81
  334. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  335. package/dist/apps/control-plane/core/patch.js +7 -3
  336. package/dist/apps/control-plane/core/patch.js.map +1 -1
  337. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  338. package/dist/apps/control-plane/core/path-layout.js +4 -1
  339. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  340. package/dist/apps/control-plane/core/path-rules.js +3 -1
  341. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  342. package/dist/apps/control-plane/core/qa-index.js +5 -5
  343. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  344. package/dist/apps/control-plane/core/response.js +3 -3
  345. package/dist/apps/control-plane/core/response.js.map +1 -1
  346. package/dist/apps/control-plane/core/schemas.js +10 -6
  347. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  348. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  349. package/dist/apps/control-plane/index.d.ts +1 -1
  350. package/dist/apps/control-plane/index.js +1 -1
  351. package/dist/apps/control-plane/index.js.map +1 -1
  352. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
  353. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  355. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  357. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  359. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  361. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  362. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  363. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  364. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  365. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  366. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  367. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  368. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  369. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  370. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  371. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  372. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  373. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  374. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  375. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  376. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  377. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  378. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  379. package/dist/apps/control-plane/providers/providers.d.ts +3 -2
  380. package/dist/apps/control-plane/providers/providers.js +81 -39
  381. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  383. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  385. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  387. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  388. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  389. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  390. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  391. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  392. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  393. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  394. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  395. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  396. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  397. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  398. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  399. package/eslint.config.mjs +20 -20
  400. package/example-configurations/README.md +1 -1
  401. package/example-configurations/java/agents.yaml +3 -3
  402. package/example-configurations/java/policy.yaml +1 -1
  403. package/example-configurations/node/agents.yaml +3 -3
  404. package/example-configurations/node/policy.yaml +1 -1
  405. package/package.json +10 -5
  406. package/packages/web-dashboard/next.config.js +2 -2
  407. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  408. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  409. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  410. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  411. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  412. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  413. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  414. package/packages/web-dashboard/src/app/globals.css +10 -2
  415. package/packages/web-dashboard/src/app/page.tsx +100 -37
  416. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  417. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  418. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  419. package/packages/web-dashboard/tsconfig.json +3 -11
  420. package/scripts/nx-safe.mjs +10 -10
  421. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  422. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
  423. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  424. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  425. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  426. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  427. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  428. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  429. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  430. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  431. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  432. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  433. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  434. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  435. package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
  436. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  437. package/spec-files/progress.md +186 -175
  438. package/tsconfig.json +2 -8
@@ -8,25 +8,27 @@ describe('provider selection', () => {
8
8
  cli: {
9
9
  agent_provider: 'custom',
10
10
  agent_model: 'cli-model',
11
- provider_config_env: 'CLI_CONFIG'
11
+ provider_config_env: 'CLI_CONFIG',
12
12
  },
13
13
  env: {
14
14
  AOP_AGENT_PROVIDER: 'codex',
15
15
  AOP_AGENT_MODEL: 'env-model',
16
- AOP_PROVIDER_CONFIG_ENV: 'ENV_CONFIG'
16
+ CLI_CONFIG: 'cli-token',
17
+ AOP_PROVIDER_CONFIG_ENV: 'ENV_CONFIG',
17
18
  },
18
19
  agentsConfig: {
19
20
  runtime: {
20
21
  default_provider: 'claude',
21
22
  default_model: 'cfg-model',
22
- provider_config_env: 'CFG_CONFIG'
23
- }
24
- }
23
+ provider_config_env: 'CFG_CONFIG',
24
+ },
25
+ },
25
26
  });
26
27
 
27
28
  expect(selection.provider).toBe('custom');
28
29
  expect(selection.model).toBe('cli-model');
29
30
  expect(selection.provider_config_env).toBe('CLI_CONFIG');
31
+ expect(selection.provider_config_ref).toBe('cli-token');
30
32
  });
31
33
 
32
34
  it('GIVEN_no_provider_WHEN_resolving_THEN_throws_agent_provider_not_configured', () => {
@@ -34,8 +36,8 @@ describe('provider selection', () => {
34
36
  resolveProviderSelection({
35
37
  cli: {},
36
38
  env: {},
37
- agentsConfig: {}
38
- })
39
+ agentsConfig: {},
40
+ }),
39
41
  ).toThrow(ERROR_CODES.AGENT_PROVIDER_NOT_CONFIGURED);
40
42
  });
41
43
 
@@ -44,31 +46,51 @@ describe('provider selection', () => {
44
46
  resolveProviderSelection({
45
47
  cli: { agent_provider: 'bogus' },
46
48
  env: {},
47
- agentsConfig: {}
48
- })
49
+ agentsConfig: {},
50
+ }),
49
51
  ).toThrow(ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER);
50
52
  });
51
53
 
52
- it('GIVEN_non_custom_provider_without_credentials_WHEN_resolving_THEN_throws_provider_auth_missing', () => {
54
+ it('GIVEN_credential_required_provider_without_credentials_WHEN_resolving_THEN_throws_provider_auth_missing', () => {
53
55
  expect(() =>
54
56
  resolveProviderSelection({
55
- cli: { agent_provider: 'codex', provider_config_env: 'AOP_KEY' },
57
+ cli: { agent_provider: 'gemini', provider_config_env: 'GEMINI_API_KEY' },
56
58
  env: {},
57
- agentsConfig: {}
58
- })
59
+ agentsConfig: {},
60
+ }),
59
61
  ).toThrow(ERROR_CODES.PROVIDER_AUTH_MISSING);
60
62
  });
61
63
 
64
+ it('GIVEN_codex_provider_without_credentials_WHEN_resolving_THEN_does_not_throw', () => {
65
+ const selection = resolveProviderSelection({
66
+ cli: { agent_provider: 'codex' },
67
+ env: {},
68
+ agentsConfig: {},
69
+ });
70
+ expect(selection.provider).toBe('codex');
71
+ expect(selection.provider_config_ref).toBeNull();
72
+ });
73
+
74
+ it('GIVEN_claude_provider_without_credentials_WHEN_resolving_THEN_does_not_throw', () => {
75
+ const selection = resolveProviderSelection({
76
+ cli: { agent_provider: 'claude' },
77
+ env: {},
78
+ agentsConfig: {},
79
+ });
80
+ expect(selection.provider).toBe('claude');
81
+ expect(selection.provider_config_ref).toBeNull();
82
+ });
83
+
62
84
  it('GIVEN_non_custom_provider_without_model_WHEN_resolving_THEN_uses_default_model_name', () => {
63
85
  const selection = resolveProviderSelection({
64
86
  cli: {
65
87
  agent_provider: 'codex',
66
- provider_config_env: 'AOP_KEY'
88
+ provider_config_env: 'AOP_KEY',
67
89
  },
68
90
  env: {
69
- AOP_KEY: 'token'
91
+ AOP_KEY: 'token',
70
92
  },
71
- agentsConfig: {}
93
+ agentsConfig: {},
72
94
  });
73
95
 
74
96
  expect(selection.model).toBe('codex-default');
@@ -78,23 +100,74 @@ describe('provider selection', () => {
78
100
  it('GIVEN_custom_provider_without_credentials_WHEN_resolving_THEN_allows_null_config_ref', () => {
79
101
  const selection = resolveProviderSelection({
80
102
  cli: {
81
- agent_provider: 'custom'
103
+ agent_provider: 'custom',
82
104
  },
83
105
  env: {},
84
- agentsConfig: {}
106
+ agentsConfig: {},
85
107
  });
86
108
 
87
109
  expect(selection.provider).toBe('custom');
88
110
  expect(selection.provider_config_ref).toBeNull();
89
111
  });
90
112
 
113
+ it('GIVEN_AOP_provider_config_env_holds_direct_credential_WHEN_resolving_THEN_uses_direct_value', () => {
114
+ const selection = resolveProviderSelection({
115
+ cli: {
116
+ agent_provider: 'gemini',
117
+ },
118
+ env: {
119
+ AOP_PROVIDER_CONFIG_ENV: 'direct-bootstrap-key',
120
+ },
121
+ agentsConfig: {},
122
+ });
123
+
124
+ expect(selection.provider_config_env).toBe('AOP_PROVIDER_CONFIG_ENV');
125
+ expect(selection.provider_config_ref).toBe('direct-bootstrap-key');
126
+ });
127
+
128
+ it('GIVEN_AOP_provider_config_env_points_to_existing_env_var_WHEN_resolving_THEN_uses_legacy_indirection', () => {
129
+ const selection = resolveProviderSelection({
130
+ cli: {
131
+ agent_provider: 'gemini',
132
+ },
133
+ env: {
134
+ AOP_PROVIDER_CONFIG_ENV: 'GEMINI_API_KEY',
135
+ GEMINI_API_KEY: 'legacy-indirect-key',
136
+ },
137
+ agentsConfig: {},
138
+ });
139
+
140
+ expect(selection.provider_config_env).toBe('GEMINI_API_KEY');
141
+ expect(selection.provider_config_ref).toBe('legacy-indirect-key');
142
+ });
143
+
144
+ it('GIVEN_cli_provider_config_env_missing_but_runtime_provider_config_env_present_WHEN_resolving_THEN_runtime_env_name_is_used', () => {
145
+ const selection = resolveProviderSelection({
146
+ cli: {
147
+ agent_provider: 'gemini',
148
+ provider_config_env: 'MISSING_CLI_KEY',
149
+ },
150
+ env: {
151
+ CFG_KEY: 'cfg-token',
152
+ },
153
+ agentsConfig: {
154
+ runtime: {
155
+ provider_config_env: 'CFG_KEY',
156
+ },
157
+ },
158
+ });
159
+
160
+ expect(selection.provider_config_env).toBe('CFG_KEY');
161
+ expect(selection.provider_config_ref).toBe('cfg-token');
162
+ });
163
+
91
164
  it('GIVEN_kiro_cli_provider_without_credentials_WHEN_resolving_THEN_allows_null_config_ref', () => {
92
165
  const selection = resolveProviderSelection({
93
166
  cli: {
94
- agent_provider: 'kiro-cli'
167
+ agent_provider: 'kiro-cli',
95
168
  },
96
169
  env: {},
97
- agentsConfig: {}
170
+ agentsConfig: {},
98
171
  });
99
172
 
100
173
  expect(selection.provider).toBe('kiro-cli');
@@ -104,7 +177,7 @@ describe('provider selection', () => {
104
177
  it('GIVEN_provider_configured_agent_config_WHEN_resolving_THEN_returns_provider_specific_config', () => {
105
178
  const selection = resolveProviderSelection({
106
179
  cli: {
107
- agent_provider: 'kiro-cli'
180
+ agent_provider: 'kiro-cli',
108
181
  },
109
182
  env: {},
110
183
  agentsConfig: {
@@ -112,16 +185,16 @@ describe('provider selection', () => {
112
185
  provider_configs: {
113
186
  'kiro-cli': {
114
187
  command: 'kiro-cli',
115
- args: ['chat', '--agent', 'dev']
116
- }
117
- }
118
- }
119
- }
188
+ args: ['chat', '--agent', 'dev'],
189
+ },
190
+ },
191
+ },
192
+ },
120
193
  });
121
194
 
122
195
  expect(selection.agent_config).toEqual({
123
196
  command: 'kiro-cli',
124
- args: ['chat', '--agent', 'dev']
197
+ args: ['chat', '--agent', 'dev'],
125
198
  });
126
199
  });
127
200
 
@@ -131,8 +204,8 @@ describe('provider selection', () => {
131
204
  agent_provider: 'copilot',
132
205
  agent_config: JSON.stringify({
133
206
  command: 'copilot',
134
- args: ['chat', '--agent', 'review']
135
- })
207
+ args: ['chat', '--agent', 'review'],
208
+ }),
136
209
  },
137
210
  env: {},
138
211
  agentsConfig: {
@@ -140,16 +213,16 @@ describe('provider selection', () => {
140
213
  provider_configs: {
141
214
  copilot: {
142
215
  command: 'copilot',
143
- args: ['chat']
144
- }
145
- }
146
- }
147
- }
216
+ args: ['chat'],
217
+ },
218
+ },
219
+ },
220
+ },
148
221
  });
149
222
 
150
223
  expect(selection.agent_config).toEqual({
151
224
  command: 'copilot',
152
- args: ['chat', '--agent', 'review']
225
+ args: ['chat', '--agent', 'review'],
153
226
  });
154
227
  });
155
228
 
@@ -158,11 +231,11 @@ describe('provider selection', () => {
158
231
  resolveProviderSelection({
159
232
  cli: {
160
233
  agent_provider: 'kiro-cli',
161
- agent_config: '{not-json'
234
+ agent_config: '{not-json',
162
235
  },
163
236
  env: {},
164
- agentsConfig: {}
165
- })
237
+ agentsConfig: {},
238
+ }),
166
239
  ).toThrow(ERROR_CODES.INVALID_CLI_ARGS);
167
240
  });
168
241
 
@@ -171,7 +244,7 @@ describe('provider selection', () => {
171
244
  const selection = resolveProviderSelection({
172
245
  cli: { agent_provider: 'kiro-cli' },
173
246
  env: { AOP_AGENT_CONFIG: JSON.stringify(agentConfig) },
174
- agentsConfig: {}
247
+ agentsConfig: {},
175
248
  });
176
249
  expect(selection.agent_config).toEqual(agentConfig);
177
250
  });
@@ -181,7 +254,7 @@ describe('provider selection', () => {
181
254
  const selection = resolveProviderSelection({
182
255
  cli: { agent_provider: 'kiro-cli' },
183
256
  env: { AOP_AGENT_CONFIG_JSON: JSON.stringify(agentConfig) },
184
- agentsConfig: {}
257
+ agentsConfig: {},
185
258
  });
186
259
  expect(selection.agent_config).toEqual(agentConfig);
187
260
  });
@@ -191,8 +264,8 @@ describe('provider selection', () => {
191
264
  resolveProviderSelection({
192
265
  cli: { agent_provider: 'kiro-cli' },
193
266
  env: { AOP_AGENT_CONFIG: JSON.stringify([1, 2, 3]) },
194
- agentsConfig: {}
195
- })
267
+ agentsConfig: {},
268
+ }),
196
269
  ).toThrow(ERROR_CODES.INVALID_CLI_ARGS);
197
270
  });
198
271
 
@@ -201,7 +274,7 @@ describe('provider selection', () => {
201
274
  const selection = resolveProviderSelection({
202
275
  cli: { agent_provider: 'kiro-cli' },
203
276
  env: {},
204
- agentsConfig: { runtime: { default_agent_config: defaultConfig } }
277
+ agentsConfig: { runtime: { default_agent_config: defaultConfig } },
205
278
  });
206
279
  expect(selection.agent_config).toEqual(defaultConfig);
207
280
  });
@@ -212,7 +285,7 @@ describe('NullWorkerProvider', () => {
212
285
  provider: 'custom' as const,
213
286
  model: 'test-model',
214
287
  provider_config_env: null,
215
- provider_config_ref: null
288
+ provider_config_ref: null,
216
289
  };
217
290
 
218
291
  it('GIVEN_system_prompt_WHEN_createSession_THEN_marks_prompt_loaded', async () => {
@@ -230,13 +303,13 @@ describe('NullWorkerProvider', () => {
230
303
  const output = await provider.runWorker({
231
304
  role: 'planner',
232
305
  feature_id: 'feature_two',
233
- context_bundle: { state: { front_matter: { status: 'building' } } }
306
+ context_bundle: { state: { front_matter: { status: 'building' } } },
234
307
  });
235
308
 
236
309
  expect(output).toMatchObject({
237
310
  type: 'NOTE',
238
311
  content: 'Planner session active for feature_two.',
239
- context_snapshot: { status: 'building' }
312
+ context_snapshot: { status: 'building' },
240
313
  });
241
314
  });
242
315
 
@@ -246,7 +319,7 @@ describe('NullWorkerProvider', () => {
246
319
 
247
320
  expect(output).toMatchObject({
248
321
  type: 'NOTE',
249
- content: 'qa session active for feature_three.'
322
+ content: 'qa session active for feature_three.',
250
323
  });
251
324
  });
252
325
 
@@ -254,13 +327,13 @@ describe('NullWorkerProvider', () => {
254
327
  const provider = new NullWorkerProvider(selection);
255
328
  const output = await provider.runWorker({
256
329
  role: 'planner',
257
- feature_id: 'feature_unknown'
330
+ feature_id: 'feature_unknown',
258
331
  });
259
332
 
260
333
  expect(output).toMatchObject({
261
334
  type: 'NOTE',
262
335
  content: 'Planner session active for feature_unknown.',
263
- context_snapshot: { status: 'unknown' }
336
+ context_snapshot: { status: 'unknown' },
264
337
  });
265
338
  });
266
339
 
@@ -269,13 +342,13 @@ describe('NullWorkerProvider', () => {
269
342
  const output = await provider.runWorker({
270
343
  role: 'planner',
271
344
  feature_id: 'feature_weird',
272
- context_bundle: { state: 'invalid' as unknown as Record<string, unknown> }
345
+ context_bundle: { state: 'invalid' as unknown as Record<string, unknown> },
273
346
  });
274
347
 
275
348
  expect(output).toMatchObject({
276
349
  type: 'NOTE',
277
350
  content: 'Planner session active for feature_weird.',
278
- context_snapshot: { status: 'unknown' }
351
+ context_snapshot: { status: 'unknown' },
279
352
  });
280
353
  });
281
354
 
@@ -286,16 +359,16 @@ describe('NullWorkerProvider', () => {
286
359
 
287
360
  it('GIVEN_codex_provider_WHEN_attachToSession_called_THEN_executes_interactive_attach_command', async () => {
288
361
  const runner = {
289
- run: vi.fn(async () => ({ exitCode: 0, signal: null }))
362
+ run: vi.fn(async () => ({ exitCode: 0, signal: null })),
290
363
  };
291
364
  const provider = new NullWorkerProvider(
292
365
  {
293
366
  provider: 'codex',
294
367
  model: 'codex-default',
295
368
  provider_config_env: null,
296
- provider_config_ref: null
369
+ provider_config_ref: null,
297
370
  },
298
- { commandRunner: runner }
371
+ { commandRunner: runner },
299
372
  );
300
373
 
301
374
  expect(provider.attachToSession).toBeTypeOf('function');
@@ -304,22 +377,22 @@ describe('NullWorkerProvider', () => {
304
377
  expect(runner.run).toHaveBeenCalledWith(
305
378
  'codex',
306
379
  ['chat', '--session', 'session-codex-1'],
307
- expect.objectContaining({ interactive: true })
380
+ expect.objectContaining({ interactive: true }),
308
381
  );
309
382
  });
310
383
 
311
384
  it('GIVEN_claude_provider_WHEN_sendMessage_called_THEN_executes_send_command_with_message_argument', async () => {
312
385
  const runner = {
313
- run: vi.fn(async () => ({ exitCode: 0, signal: null }))
386
+ run: vi.fn(async () => ({ exitCode: 0, signal: null })),
314
387
  };
315
388
  const provider = new NullWorkerProvider(
316
389
  {
317
390
  provider: 'claude',
318
391
  model: 'claude-default',
319
392
  provider_config_env: null,
320
- provider_config_ref: null
393
+ provider_config_ref: null,
321
394
  },
322
- { commandRunner: runner }
395
+ { commandRunner: runner },
323
396
  );
324
397
 
325
398
  expect(provider.sendMessage).toBeTypeOf('function');
@@ -328,7 +401,7 @@ describe('NullWorkerProvider', () => {
328
401
  expect(runner.run).toHaveBeenCalledWith(
329
402
  'claude-code',
330
403
  ['chat', '--session', 'session-claude-1', '--message', 'Please rerun the QA gate'],
331
- expect.objectContaining({ interactive: false })
404
+ expect.objectContaining({ interactive: false }),
332
405
  );
333
406
  });
334
407
 
@@ -337,7 +410,7 @@ describe('NullWorkerProvider', () => {
337
410
  provider: 'custom',
338
411
  model: 'custom-default',
339
412
  provider_config_env: null,
340
- provider_config_ref: null
413
+ provider_config_ref: null,
341
414
  });
342
415
 
343
416
  expect(provider.attachToSession).toBeUndefined();
@@ -346,7 +419,7 @@ describe('NullWorkerProvider', () => {
346
419
 
347
420
  it('GIVEN_custom_provider_with_agent_config_overrides_WHEN_attach_called_THEN_uses_overridden_command_template', async () => {
348
421
  const runner = {
349
- run: vi.fn(async () => ({ exitCode: 0, signal: null }))
422
+ run: vi.fn(async () => ({ exitCode: 0, signal: null })),
350
423
  };
351
424
  const provider = new NullWorkerProvider(
352
425
  {
@@ -356,17 +429,17 @@ describe('NullWorkerProvider', () => {
356
429
  provider_config_ref: null,
357
430
  agent_config: {
358
431
  attach_command: 'my-agent-cli',
359
- attach_args: ['open', '--session-id', '{session_id}']
360
- }
432
+ attach_args: ['open', '--session-id', '{session_id}'],
433
+ },
361
434
  },
362
- { commandRunner: runner }
435
+ { commandRunner: runner },
363
436
  );
364
437
 
365
438
  await provider.attachToSession?.('session-custom-1');
366
439
  expect(runner.run).toHaveBeenCalledWith(
367
440
  'my-agent-cli',
368
441
  ['open', '--session-id', 'session-custom-1'],
369
- expect.objectContaining({ interactive: true })
442
+ expect.objectContaining({ interactive: true }),
370
443
  );
371
444
  });
372
445
  });
@@ -374,47 +447,65 @@ describe('NullWorkerProvider', () => {
374
447
  describe('NullWorkerProvider executeCommand error branches', () => {
375
448
  it('GIVEN_command_exits_with_127_WHEN_executeCommand_called_THEN_throws_unsupported_agent_provider', async () => {
376
449
  const runner = {
377
- run: vi.fn(async () => ({ exitCode: 127, signal: null, errorCode: undefined }))
450
+ run: vi.fn(async () => ({ exitCode: 127, signal: null, errorCode: undefined })),
378
451
  };
379
452
  const provider = new NullWorkerProvider(
380
- { provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null },
381
- { commandRunner: runner }
453
+ {
454
+ provider: 'claude',
455
+ model: 'claude-default',
456
+ provider_config_env: null,
457
+ provider_config_ref: null,
458
+ },
459
+ { commandRunner: runner },
382
460
  );
383
461
  await expect(provider.sendMessage?.('session-1', 'hello')).rejects.toMatchObject({
384
- code: 'unsupported_agent_provider'
462
+ code: 'unsupported_agent_provider',
385
463
  });
386
464
  });
387
465
 
388
466
  it('GIVEN_command_exits_with_ENOENT_error_code_WHEN_executeCommand_called_THEN_throws_unsupported_agent_provider', async () => {
389
467
  const runner = {
390
- run: vi.fn(async () => ({ exitCode: 1, signal: null, errorCode: 'ENOENT' }))
468
+ run: vi.fn(async () => ({ exitCode: 1, signal: null, errorCode: 'ENOENT' })),
391
469
  };
392
470
  const provider = new NullWorkerProvider(
393
- { provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null },
394
- { commandRunner: runner }
471
+ {
472
+ provider: 'claude',
473
+ model: 'claude-default',
474
+ provider_config_env: null,
475
+ provider_config_ref: null,
476
+ },
477
+ { commandRunner: runner },
395
478
  );
396
479
  await expect(provider.sendMessage?.('session-1', 'hello')).rejects.toMatchObject({
397
- code: 'unsupported_agent_provider'
480
+ code: 'unsupported_agent_provider',
398
481
  });
399
482
  });
400
483
 
401
484
  it('GIVEN_command_exits_with_generic_nonzero_code_WHEN_executeCommand_called_THEN_throws_internal_error', async () => {
402
485
  const runner = {
403
- run: vi.fn(async () => ({ exitCode: 1, signal: null, errorCode: undefined }))
486
+ run: vi.fn(async () => ({ exitCode: 1, signal: null, errorCode: undefined })),
404
487
  };
405
488
  const provider = new NullWorkerProvider(
406
- { provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null },
407
- { commandRunner: runner }
489
+ {
490
+ provider: 'claude',
491
+ model: 'claude-default',
492
+ provider_config_env: null,
493
+ provider_config_ref: null,
494
+ },
495
+ { commandRunner: runner },
408
496
  );
409
497
  await expect(provider.sendMessage?.('session-1', 'hello')).rejects.toMatchObject({
410
- code: 'internal_error'
498
+ code: 'internal_error',
411
499
  });
412
500
  });
413
501
 
414
502
  it('GIVEN_provider_without_send_command_WHEN_executeCommand_invoked_THEN_would_throw_if_called', () => {
415
- const provider = new NullWorkerProvider(
416
- { provider: 'custom', model: 'custom-default', provider_config_env: null, provider_config_ref: null }
417
- );
503
+ const provider = new NullWorkerProvider({
504
+ provider: 'custom',
505
+ model: 'custom-default',
506
+ provider_config_env: null,
507
+ provider_config_ref: null,
508
+ });
418
509
  // sendMessage should be undefined for custom provider without agent_config
419
510
  expect(provider.sendMessage).toBeUndefined();
420
511
  });
@@ -423,7 +514,10 @@ describe('NullWorkerProvider executeCommand error branches', () => {
423
514
  describe('NullWorkerProvider additional coverage', () => {
424
515
  it('GIVEN_empty_sessionId_WHEN_reattachSession_called_THEN_returns_null', async () => {
425
516
  const provider = new NullWorkerProvider({
426
- provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null
517
+ provider: 'claude',
518
+ model: 'claude-default',
519
+ provider_config_env: null,
520
+ provider_config_ref: null,
427
521
  });
428
522
  const result = await provider.reattachSession('');
429
523
  expect(result).toBeNull();
@@ -431,7 +525,10 @@ describe('NullWorkerProvider additional coverage', () => {
431
525
 
432
526
  it('GIVEN_unknown_sessionId_WHEN_reattachSession_called_THEN_returns_null', async () => {
433
527
  const provider = new NullWorkerProvider({
434
- provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null
528
+ provider: 'claude',
529
+ model: 'claude-default',
530
+ provider_config_env: null,
531
+ provider_config_ref: null,
435
532
  });
436
533
  const result = await provider.reattachSession('unknown');
437
534
  expect(result).toBeNull();
@@ -439,7 +536,10 @@ describe('NullWorkerProvider additional coverage', () => {
439
536
 
440
537
  it('GIVEN_valid_sessionId_WHEN_reattachSession_called_THEN_returns_worker_session', async () => {
441
538
  const provider = new NullWorkerProvider({
442
- provider: 'claude', model: 'claude-default', provider_config_env: null, provider_config_ref: null
539
+ provider: 'claude',
540
+ model: 'claude-default',
541
+ provider_config_env: null,
542
+ provider_config_ref: null,
443
543
  });
444
544
  const result = await provider.reattachSession('session-abc-1');
445
545
  expect(result).toMatchObject({ session_id: 'session-abc-1', role: 'orchestrator' });
@@ -450,13 +550,16 @@ describe('NullWorkerProvider additional coverage', () => {
450
550
  const runner = { run: vi.fn() };
451
551
  const provider = new NullWorkerProvider(
452
552
  {
453
- provider: 'custom', model: 'custom', provider_config_env: null, provider_config_ref: null,
553
+ provider: 'custom',
554
+ model: 'custom',
555
+ provider_config_env: null,
556
+ provider_config_ref: null,
454
557
  agent_config: {
455
558
  send_command: 'my-cli',
456
- send_args: ['send', '--session', '{session_id}', '--msg', '{message}']
457
- }
559
+ send_args: ['send', '--session', '{session_id}', '--msg', '{message}'],
560
+ },
458
561
  },
459
- { commandRunner: runner }
562
+ { commandRunner: runner },
460
563
  );
461
564
  // attachToSession should be undefined (no attach_command in config)
462
565
  expect(provider.attachToSession).toBeUndefined();
@@ -471,10 +574,10 @@ describe('resolveConfiguredAgentConfig branches', () => {
471
574
  agentsConfig: {
472
575
  runtime: {
473
576
  provider_configs: {
474
- custom: { command: 'my-cli', args: ['--agent'] }
475
- }
476
- }
477
- }
577
+ custom: { command: 'my-cli', args: ['--agent'] },
578
+ },
579
+ },
580
+ },
478
581
  });
479
582
  expect(selection.agent_config).toMatchObject({ command: 'my-cli' });
480
583
  });
@@ -486,9 +589,9 @@ describe('resolveConfiguredAgentConfig branches', () => {
486
589
  agentsConfig: {
487
590
  runtime: {
488
591
  provider_configs: {},
489
- default_agent_config: { command: 'default-cli', args: [] }
490
- }
491
- }
592
+ default_agent_config: { command: 'default-cli', args: [] },
593
+ },
594
+ },
492
595
  });
493
596
  expect(selection.agent_config).toMatchObject({ command: 'default-cli' });
494
597
  });
@@ -498,8 +601,8 @@ describe('resolveConfiguredAgentConfig branches', () => {
498
601
  cli: { agent_provider: 'custom' },
499
602
  env: {},
500
603
  agentsConfig: {
501
- runtime: {}
502
- }
604
+ runtime: {},
605
+ },
503
606
  });
504
607
  expect(selection.agent_config).toBeNull();
505
608
  });
@@ -514,8 +617,8 @@ describe('NullWorkerProvider getSessionInfo branch', () => {
514
617
  provider_config_ref: null,
515
618
  agent_config: {
516
619
  attach_command: 'claude-code',
517
- attach_args: ['chat', '--session', '{session_id}']
518
- }
620
+ attach_args: ['chat', '--session', '{session_id}'],
621
+ },
519
622
  });
520
623
 
521
624
  expect(provider.getSessionInfo).toBeDefined();
@@ -532,8 +635,8 @@ describe('NullWorkerProvider getSessionInfo branch', () => {
532
635
  provider_config_ref: null,
533
636
  agent_config: {
534
637
  attach_command: 'claude-code',
535
- attach_args: ['chat', '--session', '{session_id}']
536
- }
638
+ attach_args: ['chat', '--session', '{session_id}'],
639
+ },
537
640
  });
538
641
 
539
642
  const info = await provider.getSessionInfo('unknown');
@@ -545,15 +648,16 @@ describe('NullWorkerProvider getSessionInfo branch', () => {
545
648
  provider: 'null',
546
649
  model: 'none',
547
650
  provider_config_env: null,
548
- provider_config_ref: null
651
+ provider_config_ref: null,
549
652
  });
550
653
 
551
654
  // Access executeCommand directly to cover the !template guard
552
655
  await expect(
553
- (provider as never as { executeCommand: (kind: string, sessionId: string) => Promise<void> })
554
- .executeCommand('attach', 'session-123')
656
+ (
657
+ provider as never as { executeCommand: (kind: string, sessionId: string) => Promise<void> }
658
+ ).executeCommand('attach', 'session-123'),
555
659
  ).rejects.toMatchObject({
556
- code: ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER
660
+ code: ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
557
661
  });
558
662
  });
559
663
  });