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
@@ -44,12 +44,16 @@ if (nodeMajor < MIN_NODE_MAJOR) {
44
44
  fail(`Dockerfile Node version ${nodeMajor} is below minimum required ${MIN_NODE_MAJOR}`);
45
45
  }
46
46
 
47
- assertContains(dockerfile, /apt-get install[^]*\bgit\b/m, 'docker image must include git toolchain');
47
+ assertContains(
48
+ dockerfile,
49
+ /apt-get install[^]*\bgit\b/m,
50
+ 'docker image must include git toolchain',
51
+ );
48
52
  assertContains(dockerfile, /ENV\s+AOP_REPO_ROOT=\/repo/m, 'docker image must declare /repo root');
49
53
  assertContains(
50
54
  dockerfile,
51
55
  /ENTRYPOINT\s+\["\/bin\/sh",\s*"\/app\/docker\/mcp\.entrypoint\.sh"]/m,
52
- 'docker entrypoint must enforce runtime preflight checks'
56
+ 'docker entrypoint must enforce runtime preflight checks',
53
57
  );
54
58
 
55
59
  assertContains(compose, /aop-mcp:/m, 'compose must declare aop-mcp service');
@@ -57,7 +61,11 @@ assertContains(compose, /- \.\.\/:\/repo/m, 'compose must bind-mount repository
57
61
  assertContains(compose, /working_dir:\s*\/repo/m, 'compose service must execute from /repo');
58
62
 
59
63
  assertContains(entrypoint, /if \[ ! -d "\/repo" ]/m, 'entrypoint must enforce /repo mount check');
60
- assertContains(entrypoint, /for tool in node npm npx git;/m, 'entrypoint must verify required toolchains');
64
+ assertContains(
65
+ entrypoint,
66
+ /for tool in node npm npx git;/m,
67
+ 'entrypoint must verify required toolchains',
68
+ );
61
69
  assertContains(entrypoint, /\bexec\s+"\$@"/, 'entrypoint must contain exec "$@" passthrough');
62
70
 
63
71
  if (!runSmoke) {
@@ -66,7 +74,7 @@ if (!runSmoke) {
66
74
 
67
75
  const config = spawnSync('docker', ['compose', '-f', composePath, 'config'], {
68
76
  cwd: repoRoot,
69
- stdio: 'inherit'
77
+ stdio: 'inherit',
70
78
  });
71
79
  if (config.status !== 0) {
72
80
  fail('docker compose config validation failed');
@@ -74,7 +82,7 @@ if (config.status !== 0) {
74
82
 
75
83
  const build = spawnSync('docker', ['compose', '-f', composePath, 'build', 'aop-mcp'], {
76
84
  cwd: repoRoot,
77
- stdio: 'inherit'
85
+ stdio: 'inherit',
78
86
  });
79
87
  if (build.status !== 0) {
80
88
  fail('docker compose build smoke check failed');
@@ -82,11 +90,25 @@ if (build.status !== 0) {
82
90
 
83
91
  const smoke = spawnSync(
84
92
  'docker',
85
- ['compose', '-f', composePath, 'run', '--rm', 'aop-mcp', 'npm', 'run', 'run', '--', 'status', '--transport', 'mcp'],
93
+ [
94
+ 'compose',
95
+ '-f',
96
+ composePath,
97
+ 'run',
98
+ '--rm',
99
+ 'aop-mcp',
100
+ 'npm',
101
+ 'run',
102
+ 'run',
103
+ '--',
104
+ 'status',
105
+ '--transport',
106
+ 'mcp',
107
+ ],
86
108
  {
87
109
  cwd: repoRoot,
88
- stdio: 'inherit'
89
- }
110
+ stdio: 'inherit',
111
+ },
90
112
  );
91
113
  if (smoke.status !== 0) {
92
114
  fail('docker compose run smoke check failed');
@@ -13,7 +13,7 @@ const KNOWN_ROLES = new Set(['orchestrator', 'planner', 'builder', 'qa', 'system
13
13
  const KNOWN_SHARED_SCHEMAS = new Set([
14
14
  'schemas/input/mutating.schema.json',
15
15
  'schemas/input/read.schema.json',
16
- 'schemas/output/standard_success.schema.json'
16
+ 'schemas/output/standard_success.schema.json',
17
17
  ]);
18
18
 
19
19
  function fail(message: string): never {
@@ -40,14 +40,18 @@ async function main(): Promise<void> {
40
40
 
41
41
  if (protocol.mcp_protocol_version !== MCP_PROTOCOL_PIN.mcp_protocol_version) {
42
42
  fail(
43
- `protocol_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.mcp_protocol_version} actual=${protocol.mcp_protocol_version}`
43
+ `protocol_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.mcp_protocol_version} actual=${protocol.mcp_protocol_version}`,
44
44
  );
45
45
  }
46
46
  if (protocol.sdk.package !== MCP_PROTOCOL_PIN.sdk.package) {
47
- fail(`protocol_sdk_package_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.package} actual=${protocol.sdk.package}`);
47
+ fail(
48
+ `protocol_sdk_package_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.package} actual=${protocol.sdk.package}`,
49
+ );
48
50
  }
49
51
  if (protocol.sdk.version !== MCP_PROTOCOL_PIN.sdk.version) {
50
- fail(`protocol_sdk_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.version} actual=${protocol.sdk.version}`);
52
+ fail(
53
+ `protocol_sdk_version_pin_mismatch expected=${MCP_PROTOCOL_PIN.sdk.version} actual=${protocol.sdk.version}`,
54
+ );
51
55
  }
52
56
 
53
57
  for (const transport of REQUIRED_MCP_TRANSPORTS) {
@@ -90,7 +94,7 @@ async function main(): Promise<void> {
90
94
  const mutatingInCode = TOOL_BEHAVIOR_METADATA[tool.handler_id]?.mutating === true;
91
95
  if (mutatingInCatalog !== mutatingInCode) {
92
96
  errors.push(
93
- `Tool "${tool.handler_id}" mutating flag mismatch: catalog=${String(mutatingInCatalog)}, code=${String(mutatingInCode)}`
97
+ `Tool "${tool.handler_id}" mutating flag mismatch: catalog=${String(mutatingInCatalog)}, code=${String(mutatingInCode)}`,
94
98
  );
95
99
  }
96
100
 
@@ -103,7 +107,9 @@ async function main(): Promise<void> {
103
107
 
104
108
  // V1.2: AJV schema compilation + V1.3: orphan tracking
105
109
  for (const schemaRef of [tool.input_schema_ref, tool.output_schema_ref]) {
106
- if (!schemaRef) { continue; }
110
+ if (!schemaRef) {
111
+ continue;
112
+ }
107
113
  referencedSchemas.add(schemaRef);
108
114
  const schemaPath = path.resolve(toolsDir, schemaRef);
109
115
  try {
@@ -122,7 +128,7 @@ async function main(): Promise<void> {
122
128
  // V1.3: orphan schema detection
123
129
  const allSchemaFiles = [
124
130
  ...globSchemaFiles(path.join(toolsDir, 'schemas', 'input'), 'schemas/input'),
125
- ...globSchemaFiles(path.join(toolsDir, 'schemas', 'output'), 'schemas/output')
131
+ ...globSchemaFiles(path.join(toolsDir, 'schemas', 'output'), 'schemas/output'),
126
132
  ];
127
133
  for (const file of allSchemaFiles) {
128
134
  if (!referencedSchemas.has(file) && !KNOWN_SHARED_SCHEMAS.has(file)) {
@@ -12,7 +12,11 @@ export interface AdapterManifest {
12
12
  }
13
13
 
14
14
  export interface AdapterRegistry {
15
- register<T>(slot: AdapterSlot<T>, manifest: AdapterManifest, factory: (config: unknown) => T): void;
15
+ register<T>(
16
+ slot: AdapterSlot<T>,
17
+ manifest: AdapterManifest,
18
+ factory: (config: unknown) => T,
19
+ ): void;
16
20
  resolve<T>(slot: AdapterSlot<T>, name: string, config: unknown): T;
17
21
  list(slot: string): ReadonlyArray<AdapterManifest>;
18
22
  has(slot: string, name: string): boolean;
@@ -28,7 +32,11 @@ export interface AdapterRegistryError extends Error {
28
32
  details?: Record<string, unknown>;
29
33
  }
30
34
 
31
- function makeRegistryError(message: string, code: string, details?: Record<string, unknown>): AdapterRegistryError {
35
+ function makeRegistryError(
36
+ message: string,
37
+ code: string,
38
+ details?: Record<string, unknown>,
39
+ ): AdapterRegistryError {
32
40
  const error = new Error(message) as AdapterRegistryError;
33
41
  error.code = code;
34
42
  if (details !== undefined) {
@@ -41,12 +49,17 @@ export class DefaultAdapterRegistry implements AdapterRegistry {
41
49
  // slot name → adapter name → entry
42
50
  private readonly _entries = new Map<string, Map<string, AdapterEntry<unknown>>>();
43
51
 
44
- register<T>(slot: AdapterSlot<T>, manifest: AdapterManifest, factory: (config: unknown) => T): void {
52
+ register<T>(
53
+ slot: AdapterSlot<T>,
54
+ manifest: AdapterManifest,
55
+ factory: (config: unknown) => T,
56
+ ): void {
45
57
  let byName = this._entries.get(slot.name);
46
58
  if (!byName) {
47
59
  byName = new Map();
48
60
  this._entries.set(slot.name, byName);
49
- } byName.set(manifest.name, { manifest, factory: factory as (config: unknown) => unknown });
61
+ }
62
+ byName.set(manifest.name, { manifest, factory: factory as (config: unknown) => unknown });
50
63
  }
51
64
 
52
65
  resolve<T>(slot: AdapterSlot<T>, name: string, config: unknown): T {
@@ -57,7 +70,7 @@ export class DefaultAdapterRegistry implements AdapterRegistry {
57
70
  throw makeRegistryError(
58
71
  ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
59
72
  ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
60
- { slot: slot.name, name }
73
+ { slot: slot.name, name },
61
74
  );
62
75
  }
63
76
 
@@ -84,7 +97,7 @@ export interface AgentProviderContract {
84
97
  }
85
98
 
86
99
  export const AGENT_PROVIDER_SLOT: AdapterSlot<AgentProviderContract> = {
87
- name: 'agent-provider'
100
+ name: 'agent-provider',
88
101
  };
89
102
 
90
103
  // ---- Activity detector slot ----
@@ -94,7 +107,7 @@ export interface ActivityDetectorContract {
94
107
  }
95
108
 
96
109
  export const ACTIVITY_DETECTOR_SLOT: AdapterSlot<ActivityDetectorContract> = {
97
- name: 'activity-detector'
110
+ name: 'activity-detector',
98
111
  };
99
112
 
100
113
  // ---- Notification channel slot ----
@@ -104,7 +117,7 @@ export interface NotificationChannelContract {
104
117
  }
105
118
 
106
119
  export const NOTIFICATION_CHANNEL_SLOT: AdapterSlot<NotificationChannelContract> = {
107
- name: 'notification-channel'
120
+ name: 'notification-channel',
108
121
  };
109
122
 
110
123
  // ---- SCM provider slot ----
@@ -114,10 +127,17 @@ export interface ScmProviderContract {
114
127
  }
115
128
 
116
129
  export const SCM_PROVIDER_SLOT: AdapterSlot<ScmProviderContract> = {
117
- name: 'scm-provider'
130
+ name: 'scm-provider',
118
131
  };
119
132
 
120
- const BUILT_IN_PROVIDER_NAMES = ['codex', 'claude', 'gemini', 'kiro-cli', 'copilot', 'custom'] as const;
133
+ const BUILT_IN_PROVIDER_NAMES = [
134
+ 'codex',
135
+ 'claude',
136
+ 'gemini',
137
+ 'kiro-cli',
138
+ 'copilot',
139
+ 'custom',
140
+ ] as const;
121
141
  const BUILT_IN_ACTIVITY_DETECTORS = ['claude-jsonl', 'codex-rpc', 'process-heuristic'] as const;
122
142
  const BUILT_IN_NOTIFICATION_CHANNELS = ['desktop', 'slack', 'webhook'] as const;
123
143
  const BUILT_IN_SCM_PROVIDERS = ['github'] as const;
@@ -136,7 +156,7 @@ for (const providerName of BUILT_IN_PROVIDER_NAMES) {
136
156
  globalAdapterRegistry.register(
137
157
  AGENT_PROVIDER_SLOT,
138
158
  makeProviderManifest(providerName),
139
- makeProviderFactory(providerName)
159
+ makeProviderFactory(providerName),
140
160
  );
141
161
  }
142
162
 
@@ -144,7 +164,7 @@ for (const detectorName of BUILT_IN_ACTIVITY_DETECTORS) {
144
164
  globalAdapterRegistry.register(
145
165
  ACTIVITY_DETECTOR_SLOT,
146
166
  { slot: ACTIVITY_DETECTOR_SLOT.name, name: detectorName },
147
- () => ({ name: detectorName })
167
+ () => ({ name: detectorName }),
148
168
  );
149
169
  }
150
170
 
@@ -152,7 +172,7 @@ for (const channelName of BUILT_IN_NOTIFICATION_CHANNELS) {
152
172
  globalAdapterRegistry.register(
153
173
  NOTIFICATION_CHANNEL_SLOT,
154
174
  { slot: NOTIFICATION_CHANNEL_SLOT.name, name: channelName },
155
- () => ({ name: channelName })
175
+ () => ({ name: channelName }),
156
176
  );
157
177
  }
158
178
 
@@ -160,10 +180,10 @@ for (const scmProviderName of BUILT_IN_SCM_PROVIDERS) {
160
180
  globalAdapterRegistry.register(
161
181
  SCM_PROVIDER_SLOT,
162
182
  { slot: SCM_PROVIDER_SLOT.name, name: scmProviderName },
163
- () => ({ name: scmProviderName })
183
+ () => ({ name: scmProviderName }),
164
184
  );
165
185
  }
166
186
 
167
187
  export const REGISTERED_PROVIDER_NAMES: ReadonlySet<string> = new Set(
168
- globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((m) => m.name)
188
+ globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((m) => m.name),
169
189
  );
@@ -32,6 +32,8 @@ export interface MultiProjectConfig {
32
32
 
33
33
  const MULTI_PROJECT_YAML = 'multi-project.yaml';
34
34
  const SCHEMA_NAME = 'multi-project.schema.json';
35
+ const PRIMARY_MULTI_PROJECT_DIR = ['config', 'agentic', 'orchestrator'] as const;
36
+ const LEGACY_MULTI_PROJECT_DIR = ['agentic', 'orchestrator'] as const;
35
37
 
36
38
  function resolveHomePath(rawPath: string): string {
37
39
  if (rawPath.startsWith('~/') || rawPath === '~') {
@@ -50,13 +52,18 @@ function resolveConfiguredPath(rawPath: string, baseDir: string): string {
50
52
 
51
53
  export class MultiProjectLoader {
52
54
  async load(baseDir: string): Promise<MultiProjectConfig | null> {
53
- const yamlPath = path.join(baseDir, 'agentic', 'orchestrator', MULTI_PROJECT_YAML);
55
+ const primaryYamlPath = path.join(baseDir, ...PRIMARY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML);
56
+ const legacyYamlPath = path.join(baseDir, ...LEGACY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML);
54
57
 
55
58
  let raw: string;
56
59
  try {
57
- raw = await fs.readFile(yamlPath, 'utf8');
60
+ raw = await fs.readFile(primaryYamlPath, 'utf8');
58
61
  } catch {
59
- return null;
62
+ try {
63
+ raw = await fs.readFile(legacyYamlPath, 'utf8');
64
+ } catch {
65
+ return null;
66
+ }
60
67
  }
61
68
 
62
69
  const parsed = YAML.parse(raw) as MultiProjectConfig;
@@ -65,13 +72,13 @@ export class MultiProjectLoader {
65
72
  const result = await schemaRegistry.validate(SCHEMA_NAME, parsed);
66
73
  if (!result.valid) {
67
74
  const error = new Error(
68
- `multi-project.yaml validation failed: ${result.errors.map((e) => e.message).join(', ')}`
75
+ `multi-project.yaml validation failed: ${result.errors.map((e) => e.message).join(', ')}`,
69
76
  ) as AppError;
70
77
  error.code = ERROR_CODES.INVALID_ARGUMENT;
71
78
  error.details = {
72
79
  retryable: false,
73
80
  requires_human: true,
74
- validation_errors: result.errors
81
+ validation_errors: result.errors,
75
82
  };
76
83
  throw error;
77
84
  }
@@ -80,8 +87,14 @@ export class MultiProjectLoader {
80
87
  const projects: ProjectConfig[] = parsed.projects.map((p) => ({
81
88
  ...p,
82
89
  path: resolveConfiguredPath(p.path, baseDir),
83
- policy: typeof p.policy === 'string' ? resolveConfiguredPath(p.policy, resolveConfiguredPath(p.path, baseDir)) : undefined,
84
- gates: typeof p.gates === 'string' ? resolveConfiguredPath(p.gates, resolveConfiguredPath(p.path, baseDir)) : undefined
90
+ policy:
91
+ typeof p.policy === 'string'
92
+ ? resolveConfiguredPath(p.policy, resolveConfiguredPath(p.path, baseDir))
93
+ : undefined,
94
+ gates:
95
+ typeof p.gates === 'string'
96
+ ? resolveConfiguredPath(p.gates, resolveConfiguredPath(p.path, baseDir))
97
+ : undefined,
85
98
  }));
86
99
 
87
100
  return { ...parsed, projects };
@@ -108,12 +121,16 @@ export class MultiProjectLoader {
108
121
  }
109
122
 
110
123
  async exists(baseDir: string): Promise<boolean> {
111
- const yamlPath = path.join(baseDir, 'agentic', 'orchestrator', MULTI_PROJECT_YAML);
112
124
  try {
113
- await fs.access(yamlPath);
125
+ await fs.access(path.join(baseDir, ...PRIMARY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML));
114
126
  return true;
115
127
  } catch {
116
- return false;
128
+ try {
129
+ await fs.access(path.join(baseDir, ...LEGACY_MULTI_PROJECT_DIR, MULTI_PROJECT_YAML));
130
+ return true;
131
+ } catch {
132
+ return false;
133
+ }
117
134
  }
118
135
  }
119
136
  }
@@ -1,5 +1,9 @@
1
1
  import { TOOLS } from '../../core/constants.js';
2
- import type { FeatureStateFrontMatter, FeatureStatePayload, ToolCaller as SupervisorToolCaller } from '../../core/tool-caller.js';
2
+ import type {
3
+ FeatureStateFrontMatter,
4
+ FeatureStatePayload,
5
+ ToolCaller as SupervisorToolCaller,
6
+ } from '../../core/tool-caller.js';
3
7
  import type { NotifierService } from './notifier-service.js';
4
8
 
5
9
  export type ActivityState = 'active' | 'idle' | 'waiting_input' | 'blocked' | 'exited' | 'unknown';
@@ -40,7 +44,9 @@ const DEFAULT_IDLE_THRESHOLD_MS = 300_000;
40
44
 
41
45
  export class ActivityMonitorService {
42
46
  private readonly toolCaller: SupervisorToolCaller;
43
- private readonly operationLedger: { getLastOperationAt(featureId: string): string | null } | undefined;
47
+ private readonly operationLedger:
48
+ | { getLastOperationAt(featureId: string): string | null }
49
+ | undefined;
44
50
  private readonly idleThresholdMs: number;
45
51
  private readonly notifier: NotifierService | undefined;
46
52
  private readonly reactionsPolicy: { agent_stuck?: AgentStuckReaction } | undefined;
@@ -66,7 +72,8 @@ export class ActivityMonitorService {
66
72
  }
67
73
 
68
74
  private resolveLastEvent(featureId: string, frontMatter: ActivityFrontMatter): string | null {
69
- const statusReason = typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
75
+ const statusReason =
76
+ typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
70
77
  if (statusReason.includes('waiting_input') || statusReason.includes('awaiting_input')) {
71
78
  return frontMatter.last_heartbeat_at ?? frontMatter.last_run_at ?? null;
72
79
  }
@@ -85,7 +92,8 @@ export class ActivityMonitorService {
85
92
 
86
93
  private deriveState(frontMatter: ActivityFrontMatter, lastEventAt: string | null): ActivityState {
87
94
  const status = frontMatter.status;
88
- const statusReason = typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
95
+ const statusReason =
96
+ typeof frontMatter.status_reason === 'string' ? frontMatter.status_reason.toLowerCase() : '';
89
97
 
90
98
  if (status === 'failed' || status === 'merged') {
91
99
  return 'exited';
@@ -106,9 +114,13 @@ export class ActivityMonitorService {
106
114
 
107
115
  private async persistSnapshot(featureId: string, snapshot: ActivitySnapshot): Promise<void> {
108
116
  try {
109
- const current = await this.toolCaller.callTool<FeatureStatePayload>('orchestrator', TOOLS.FEATURE_STATE_GET, {
110
- feature_id: featureId
111
- });
117
+ const current = await this.toolCaller.callTool<FeatureStatePayload>(
118
+ 'orchestrator',
119
+ TOOLS.FEATURE_STATE_GET,
120
+ {
121
+ feature_id: featureId,
122
+ },
123
+ );
112
124
  const frontMatter = current.data.front_matter as ActivityFrontMatter & {
113
125
  version: number;
114
126
  activity_state?: string;
@@ -131,9 +143,9 @@ export class ActivityMonitorService {
131
143
  activity_state: snapshot.state,
132
144
  activity_last_event_at: snapshot.lastEventAt,
133
145
  activity_detected_via: snapshot.detectedVia,
134
- activity_detector: this.detectorName
135
- }
136
- }
146
+ activity_detector: this.detectorName,
147
+ },
148
+ },
137
149
  });
138
150
  } catch {
139
151
  // Activity persistence is best-effort and should not block orchestration.
@@ -144,7 +156,7 @@ export class ActivityMonitorService {
144
156
  const response = await this.toolCaller.callTool<FeatureStatePayload>(
145
157
  'orchestrator',
146
158
  TOOLS.FEATURE_STATE_GET,
147
- { feature_id: featureId }
159
+ { feature_id: featureId },
148
160
  );
149
161
 
150
162
  const frontMatter = response.data.front_matter as ActivityFrontMatter;
@@ -153,7 +165,7 @@ export class ActivityMonitorService {
153
165
  featureId,
154
166
  state: this.deriveState(frontMatter, lastEventAt),
155
167
  lastEventAt,
156
- detectedVia: this.detectedVia(featureId)
168
+ detectedVia: this.detectedVia(featureId),
157
169
  };
158
170
  }
159
171
 
@@ -177,8 +189,8 @@ export class ActivityMonitorService {
177
189
  details: {
178
190
  state: snapshot.state,
179
191
  last_event_at: snapshot.lastEventAt,
180
- idle_threshold_ms: this.idleThresholdMs
181
- }
192
+ idle_threshold_ms: this.idleThresholdMs,
193
+ },
182
194
  });
183
195
  }
184
196
 
@@ -11,7 +11,7 @@ type StateReadResult = {
11
11
 
12
12
  type StateUpdater = (
13
13
  frontMatter: AnyRecord,
14
- body: string
14
+ body: string,
15
15
  ) => Promise<{ frontMatter?: AnyRecord; body?: string }>;
16
16
 
17
17
  function asArray<T = unknown>(value: unknown): T[] {
@@ -47,8 +47,16 @@ export interface CollisionQueueServicePort {
47
47
  withIndexLock<T>(operation: () => Promise<T>): Promise<T>;
48
48
  readIndex(): Promise<AnyRecord>;
49
49
  writeIndex(index: AnyRecord): Promise<void>;
50
- updateState(featureId: string, expectedVersion: number | null, updater: StateUpdater): Promise<AnyRecord>;
51
- planSubmit(featureId: string, plan: AnyRecord, expectedVersion: number | null): Promise<{ data: { feature_id: string; accepted: boolean; plan_version: number } }>;
50
+ updateState(
51
+ featureId: string,
52
+ expectedVersion: number | null,
53
+ updater: StateUpdater,
54
+ ): Promise<AnyRecord>;
55
+ planSubmit(
56
+ featureId: string,
57
+ plan: AnyRecord,
58
+ expectedVersion: number | null,
59
+ ): Promise<{ data: { feature_id: string; accepted: boolean; plan_version: number } }>;
52
60
  }
53
61
 
54
62
  export class CollisionQueueService {
@@ -96,18 +104,21 @@ export class CollisionQueueService {
96
104
  return missing.length === 0;
97
105
  }
98
106
 
99
- async checkPlanCollision(featureId: string, plan: AnyRecord): Promise<{ hasCollisions: boolean; fingerprint?: string }> {
107
+ async checkPlanCollision(
108
+ featureId: string,
109
+ plan: AnyRecord,
110
+ ): Promise<{ hasCollisions: boolean; fingerprint?: string }> {
100
111
  const policy = this.port.getPolicySnapshot();
101
112
  const acceptedPlans = await this.collectAcceptedPlans(featureId);
102
113
  const collisionResult = detectPlanCollisions(
103
114
  plan as Parameters<typeof detectPlanCollisions>[0],
104
115
  acceptedPlans as Parameters<typeof detectPlanCollisions>[1],
105
- policy as Parameters<typeof detectPlanCollisions>[2]
116
+ policy as Parameters<typeof detectPlanCollisions>[2],
106
117
  );
107
118
 
108
119
  return {
109
120
  hasCollisions: collisionResult.hasCollisions,
110
- fingerprint: collisionResult.fingerprint
121
+ fingerprint: collisionResult.fingerprint,
111
122
  };
112
123
  }
113
124
 
@@ -146,35 +157,38 @@ export class CollisionQueueService {
146
157
  }
147
158
  }
148
159
 
149
- async reDriveBlockedQueue(): Promise<{ data: { processed: number; retried: number; still_blocked: number } }> {
160
+ async reDriveBlockedQueue(): Promise<{
161
+ data: { processed: number; retried: number; still_blocked: number };
162
+ }> {
150
163
  const policy = this.port.getPolicySnapshot();
151
-
164
+
152
165
  if (policy.collision_policy !== 'block') {
153
166
  return {
154
167
  data: {
155
168
  processed: 0,
156
169
  retried: 0,
157
- still_blocked: 0
158
- }
170
+ still_blocked: 0,
171
+ },
159
172
  };
160
173
  }
161
174
 
162
175
  return await this.port.withIndexLock(async () => {
163
176
  const index = await this.port.readIndex();
164
177
  const queue: QueueEntry[] = asArray<QueueEntry>(index.blocked_queue);
165
-
178
+
166
179
  if (queue.length === 0) {
167
180
  return {
168
181
  data: {
169
182
  processed: 0,
170
183
  retried: 0,
171
- still_blocked: 0
172
- }
184
+ still_blocked: 0,
185
+ },
173
186
  };
174
187
  }
175
188
 
176
189
  const sortedQueue = [...queue].sort(
177
- (a, b) => a.detected_at.localeCompare(b.detected_at) || a.feature_id.localeCompare(b.feature_id)
190
+ (a, b) =>
191
+ a.detected_at.localeCompare(b.detected_at) || a.feature_id.localeCompare(b.feature_id),
178
192
  );
179
193
 
180
194
  const stillBlocked: QueueEntry[] = [];
@@ -199,8 +213,8 @@ export class CollisionQueueService {
199
213
  data: {
200
214
  processed: sortedQueue.length,
201
215
  retried: retriedCount,
202
- still_blocked: stillBlocked.length
203
- }
216
+ still_blocked: stillBlocked.length,
217
+ },
204
218
  };
205
219
  });
206
220
  }
@@ -211,7 +225,7 @@ export class CollisionQueueService {
211
225
  const queue: QueueEntry[] = asArray<QueueEntry>(index.blocked_queue);
212
226
  const before = queue.length;
213
227
  const filtered = queue.filter((entry) => entry.feature_id !== featureId);
214
-
228
+
215
229
  if (filtered.length === before) {
216
230
  return { data: { removed: false } };
217
231
  }
@@ -34,21 +34,27 @@ export class CostTrackingService {
34
34
 
35
35
  async getFeatureCost(featureId: string): Promise<FeatureCost> {
36
36
  const existing = await readJson<FeatureCost>(this.port.featureCostPath(featureId), null);
37
- return existing ?? {
38
- feature_id: featureId,
39
- tokens_used: 0,
40
- estimated_cost_usd: 0.0,
41
- last_updated: nowIso()
42
- };
37
+ return (
38
+ existing ?? {
39
+ feature_id: featureId,
40
+ tokens_used: 0,
41
+ estimated_cost_usd: 0.0,
42
+ last_updated: nowIso(),
43
+ }
44
+ );
43
45
  }
44
46
 
45
- async recordCost(featureId: string, tokensDelta: number, costUsdDelta: number): Promise<FeatureCost> {
47
+ async recordCost(
48
+ featureId: string,
49
+ tokensDelta: number,
50
+ costUsdDelta: number,
51
+ ): Promise<FeatureCost> {
46
52
  const current = await this.getFeatureCost(featureId);
47
53
  const updated: FeatureCost = {
48
54
  feature_id: featureId,
49
55
  tokens_used: current.tokens_used + tokensDelta,
50
56
  estimated_cost_usd: current.estimated_cost_usd + costUsdDelta,
51
- last_updated: nowIso()
57
+ last_updated: nowIso(),
52
58
  };
53
59
  await atomicWriteJson(this.port.featureCostPath(featureId), updated);
54
60
  return updated;
@@ -60,23 +66,24 @@ export class CostTrackingService {
60
66
  policy.budget && typeof policy.budget === 'object' ? policy.budget : {}
61
67
  ) as BudgetPolicy;
62
68
 
63
- const limitUsd = typeof budgetPolicy.per_feature_limit_usd === 'number'
64
- ? budgetPolicy.per_feature_limit_usd
65
- : Infinity;
66
- const alertThreshold = typeof budgetPolicy.alert_threshold === 'number'
67
- ? budgetPolicy.alert_threshold
68
- : 0.8;
69
+ const limitUsd =
70
+ typeof budgetPolicy.per_feature_limit_usd === 'number'
71
+ ? budgetPolicy.per_feature_limit_usd
72
+ : Infinity;
73
+ const alertThreshold =
74
+ typeof budgetPolicy.alert_threshold === 'number' ? budgetPolicy.alert_threshold : 0.8;
69
75
 
70
76
  const cost = await this.getFeatureCost(featureId);
71
77
  const overBudget = Number.isFinite(limitUsd) && cost.estimated_cost_usd >= limitUsd;
72
- const alertThresholdReached = Number.isFinite(limitUsd) && cost.estimated_cost_usd >= limitUsd * alertThreshold;
78
+ const alertThresholdReached =
79
+ Number.isFinite(limitUsd) && cost.estimated_cost_usd >= limitUsd * alertThreshold;
73
80
 
74
81
  return {
75
82
  over_budget: overBudget,
76
83
  alert_threshold_reached: alertThresholdReached,
77
84
  current_cost_usd: cost.estimated_cost_usd,
78
85
  limit_usd: Number.isFinite(limitUsd) ? limitUsd : -1,
79
- alert_threshold: alertThreshold
86
+ alert_threshold: alertThreshold,
80
87
  };
81
88
  }
82
89
  }