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
@@ -4,7 +4,12 @@ import path from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { pathExists } from '../core/fs.js';
6
6
  import { MCP_PROTOCOL_PIN, REQUIRED_MCP_TRANSPORTS } from './protocol-contract.js';
7
- import type { LoadedToolRegistry, ProtocolContract, ToolCatalog, ToolCatalogEntry } from './runtime-types.js';
7
+ import type {
8
+ LoadedToolRegistry,
9
+ ProtocolContract,
10
+ ToolCatalog,
11
+ ToolCatalogEntry,
12
+ } from './runtime-types.js';
8
13
 
9
14
  const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
10
15
 
@@ -113,7 +118,7 @@ export class ToolRegistryLoader {
113
118
  catalog,
114
119
  protocol,
115
120
  toolsByName,
116
- toolsByHandlerId
121
+ toolsByHandlerId,
117
122
  };
118
123
  }
119
124
 
@@ -167,5 +172,4 @@ export class ToolRegistryLoader {
167
172
 
168
173
  return parsed;
169
174
  }
170
-
171
175
  }
@@ -56,7 +56,8 @@ function emitToolLog(params: {
56
56
  latencyMs: number;
57
57
  response: ToolResponse;
58
58
  }): void {
59
- const operationId = typeof params.args.operation_id === 'string' ? params.args.operation_id : null;
59
+ const operationId =
60
+ typeof params.args.operation_id === 'string' ? params.args.operation_id : null;
60
61
  const featureId = typeof params.args.feature_id === 'string' ? params.args.feature_id : null;
61
62
  const errorCode = isFailResponse(params.response) ? params.response.error.code : null;
62
63
  const payload = {
@@ -67,7 +68,7 @@ function emitToolLog(params: {
67
68
  actor_type: params.claims.actor_type,
68
69
  latency_ms: params.latencyMs,
69
70
  result: params.response.ok ? 'ok' : 'error',
70
- error_code: errorCode
71
+ error_code: errorCode,
71
72
  };
72
73
 
73
74
  process.stderr.write(`${JSON.stringify(payload)}\n`);
@@ -103,7 +104,9 @@ export class ToolRuntime {
103
104
 
104
105
  async listTools(): Promise<ToolDescriptor[]> {
105
106
  const descriptors: ToolDescriptor[] = [];
106
- const sorted = [...this.registry.toolsByName.values()].sort((a, b) => a.name.localeCompare(b.name));
107
+ const sorted = [...this.registry.toolsByName.values()].sort((a, b) =>
108
+ a.name.localeCompare(b.name),
109
+ );
107
110
 
108
111
  for (const tool of sorted) {
109
112
  descriptors.push({
@@ -112,14 +115,18 @@ export class ToolRuntime {
112
115
  input_schema: await this.loader.readSchemaByRef(tool.input_schema_ref),
113
116
  output_schema: await this.loader.readSchemaByRef(tool.output_schema_ref),
114
117
  mutating: tool.mutating,
115
- requires_operation_id: tool.requires_operation_id
118
+ requires_operation_id: tool.requires_operation_id,
116
119
  });
117
120
  }
118
121
 
119
122
  return descriptors;
120
123
  }
121
124
 
122
- async callTool(toolName: string, args: Record<string, unknown>, claims: VerifiedActorClaims): Promise<ToolResponse> {
125
+ async callTool(
126
+ toolName: string,
127
+ args: Record<string, unknown>,
128
+ claims: VerifiedActorClaims,
129
+ ): Promise<ToolResponse> {
123
130
  const started = Date.now();
124
131
  const safeArgs = { ...(args ?? {}) };
125
132
  const tool = this.lookupTool(toolName);
@@ -148,7 +155,11 @@ export class ToolRuntime {
148
155
  }
149
156
 
150
157
  const executionResponse = await this.executor.execute(tool, safeArgs, claims);
151
- const outputValidationResult = await this.validateExecutionResponse(tool, toolName, executionResponse);
158
+ const outputValidationResult = await this.validateExecutionResponse(
159
+ tool,
160
+ toolName,
161
+ executionResponse,
162
+ );
152
163
  if (outputValidationResult) {
153
164
  return this.finalize(started, claims, toolName, safeArgs, outputValidationResult);
154
165
  }
@@ -159,7 +170,7 @@ export class ToolRuntime {
159
170
  idempotencyResolution.operationId,
160
171
  toolName,
161
172
  idempotencyResolution.requestHash,
162
- executionResponse
173
+ executionResponse,
163
174
  );
164
175
  }
165
176
 
@@ -173,13 +184,13 @@ export class ToolRuntime {
173
184
  private unknownToolResponse(toolName: string): ToolResponse {
174
185
  return fail(ERROR_CODES.INVALID_ARGUMENT, `Unknown tool ${toolName}`, {
175
186
  retryable: false,
176
- requires_human: true
187
+ requires_human: true,
177
188
  });
178
189
  }
179
190
 
180
191
  private authorizeFeatureScope(
181
192
  claims: VerifiedActorClaims,
182
- args: Record<string, unknown>
193
+ args: Record<string, unknown>,
183
194
  ): ToolResponse | null {
184
195
  if (featureScopeAllows(claims, args)) {
185
196
  return null;
@@ -188,7 +199,7 @@ export class ToolRuntime {
188
199
  retryable: false,
189
200
  requires_human: true,
190
201
  feature_scope: claims.feature_scope,
191
- feature_id: args.feature_id
202
+ feature_id: args.feature_id,
192
203
  });
193
204
  }
194
205
 
@@ -196,18 +207,22 @@ export class ToolRuntime {
196
207
  if (this.authorizer.isAuthorized(claims.actor_type, toolName)) {
197
208
  return null;
198
209
  }
199
- return fail(ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE, `Tool ${toolName} is not allowed for role ${claims.actor_type}`, {
200
- retryable: false,
201
- requires_human: true,
202
- actor_type: claims.actor_type,
203
- tool_name: toolName
204
- });
210
+ return fail(
211
+ ERROR_CODES.FORBIDDEN_TOOL_FOR_ROLE,
212
+ `Tool ${toolName} is not allowed for role ${claims.actor_type}`,
213
+ {
214
+ retryable: false,
215
+ requires_human: true,
216
+ actor_type: claims.actor_type,
217
+ tool_name: toolName,
218
+ },
219
+ );
205
220
  }
206
221
 
207
222
  private async validateInput(
208
223
  tool: ToolCatalogEntry,
209
224
  toolName: string,
210
- args: Record<string, unknown>
225
+ args: Record<string, unknown>,
211
226
  ): Promise<ToolResponse | null> {
212
227
  const inputValidation = await this.validator.validateInput(tool, args);
213
228
  if (inputValidation.valid) {
@@ -217,14 +232,14 @@ export class ToolRuntime {
217
232
  retryable: false,
218
233
  requires_human: true,
219
234
  errors: inputValidation.errors,
220
- tool_name: toolName
235
+ tool_name: toolName,
221
236
  });
222
237
  }
223
238
 
224
239
  private async validateExecutionResponse(
225
240
  tool: ToolCatalogEntry,
226
241
  toolName: string,
227
- response: ToolResponse
242
+ response: ToolResponse,
228
243
  ): Promise<ToolResponse | null> {
229
244
  if (response.ok) {
230
245
  const outputValidation = await this.validator.validateOutput(tool, response.data);
@@ -235,7 +250,7 @@ export class ToolRuntime {
235
250
  retryable: false,
236
251
  requires_human: true,
237
252
  errors: outputValidation.errors,
238
- tool_name: toolName
253
+ tool_name: toolName,
239
254
  });
240
255
  }
241
256
 
@@ -247,7 +262,7 @@ export class ToolRuntime {
247
262
  retryable: false,
248
263
  requires_human: true,
249
264
  errors: envelope.errors,
250
- tool_name: toolName
265
+ tool_name: toolName,
251
266
  });
252
267
  }
253
268
 
@@ -256,14 +271,14 @@ export class ToolRuntime {
256
271
  claims: VerifiedActorClaims,
257
272
  toolName: string,
258
273
  args: Record<string, unknown>,
259
- response: ToolResponse
274
+ response: ToolResponse,
260
275
  ): ToolResponse {
261
276
  emitToolLog({
262
277
  claims,
263
278
  toolName,
264
279
  args,
265
280
  latencyMs: Date.now() - started,
266
- response
281
+ response,
267
282
  });
268
283
  return response;
269
284
  }
@@ -272,8 +287,12 @@ export class ToolRuntime {
272
287
  tool: ToolCatalogEntry,
273
288
  toolName: string,
274
289
  args: Record<string, unknown>,
275
- claims: VerifiedActorClaims
276
- ): Promise<{ operationId: string | null; requestHash: string | null; result: ToolResponse | null }> {
290
+ claims: VerifiedActorClaims,
291
+ ): Promise<{
292
+ operationId: string | null;
293
+ requestHash: string | null;
294
+ result: ToolResponse | null;
295
+ }> {
277
296
  if (!tool.mutating) {
278
297
  return { operationId: null, requestHash: null, result: null };
279
298
  }
@@ -283,22 +302,30 @@ export class ToolRuntime {
283
302
  return {
284
303
  operationId: null,
285
304
  requestHash: null,
286
- result: fail(ERROR_CODES.OPERATION_ID_REQUIRED, 'operation_id is required for mutating tools', {
287
- retryable: false,
288
- requires_human: true,
289
- tool_name: toolName
290
- })
305
+ result: fail(
306
+ ERROR_CODES.OPERATION_ID_REQUIRED,
307
+ 'operation_id is required for mutating tools',
308
+ {
309
+ retryable: false,
310
+ requires_human: true,
311
+ tool_name: toolName,
312
+ },
313
+ ),
291
314
  };
292
315
  }
293
316
  if (!operationId) {
294
317
  return {
295
318
  operationId: null,
296
319
  requestHash: null,
297
- result: fail(ERROR_CODES.OPERATION_ID_REQUIRED, 'operation_id is required for mutating tools', {
298
- retryable: false,
299
- requires_human: true,
300
- tool_name: toolName
301
- })
320
+ result: fail(
321
+ ERROR_CODES.OPERATION_ID_REQUIRED,
322
+ 'operation_id is required for mutating tools',
323
+ {
324
+ retryable: false,
325
+ requires_human: true,
326
+ tool_name: toolName,
327
+ },
328
+ ),
302
329
  };
303
330
  }
304
331
 
@@ -308,7 +335,7 @@ export class ToolRuntime {
308
335
  return {
309
336
  operationId,
310
337
  requestHash,
311
- result: dedupe.response
338
+ result: dedupe.response,
312
339
  };
313
340
  }
314
341
 
@@ -322,15 +349,15 @@ export class ToolRuntime {
322
349
  operation_id: operationId,
323
350
  request_hash: requestHash,
324
351
  existing_hash: dedupe.existing_hash,
325
- tool_name: toolName
326
- })
352
+ tool_name: toolName,
353
+ }),
327
354
  };
328
355
  }
329
356
 
330
357
  return {
331
358
  operationId,
332
359
  requestHash,
333
- result: null
360
+ result: null,
334
361
  };
335
362
  }
336
363
  }
@@ -11,7 +11,12 @@ export class ToolsMarkdownGenerator {
11
11
 
12
12
  renderFromCatalog(catalog: ToolCatalog): string {
13
13
  const names = [...catalog.tools].map((tool) => tool.name).sort((a, b) => a.localeCompare(b));
14
- const lines = ['# AOP MCP Tool Surface', '', 'Generated from `agentic/orchestrator/tools/catalog.json`.', ''];
14
+ const lines = [
15
+ '# AOP MCP Tool Surface',
16
+ '',
17
+ 'Generated from `agentic/orchestrator/tools/catalog.json`.',
18
+ '',
19
+ ];
15
20
  for (const name of names) {
16
21
  lines.push(`- ${name}`);
17
22
  }
@@ -31,6 +31,7 @@ interface ResolveSelectionInput {
31
31
  }
32
32
 
33
33
  type ResolveSelectionRuntimeConfig = NonNullable<ResolveSelectionInput['agentsConfig']>['runtime'];
34
+ const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
34
35
 
35
36
  function isPlainObject(value: unknown): value is Record<string, unknown> {
36
37
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -52,7 +53,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
52
53
  reason: 'Invalid agent config JSON',
53
54
  source,
54
55
  value: raw,
55
- parse_error: error instanceof Error ? error.message : String(error)
56
+ parse_error: error instanceof Error ? error.message : String(error),
56
57
  });
57
58
  }
58
59
 
@@ -60,7 +61,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
60
61
  throw invalidAgentConfigError({
61
62
  reason: 'Agent config JSON must be an object',
62
63
  source,
63
- value: raw
64
+ value: raw,
64
65
  });
65
66
  }
66
67
 
@@ -69,7 +70,7 @@ function parseAgentConfigJson(raw: string, source: 'cli' | 'env'): Record<string
69
70
 
70
71
  function resolveConfiguredAgentConfig(
71
72
  provider: string,
72
- runtime: ResolveSelectionRuntimeConfig
73
+ runtime: ResolveSelectionRuntimeConfig,
73
74
  ): Record<string, unknown> | null {
74
75
  if (!runtime) {
75
76
  return null;
@@ -87,28 +88,80 @@ function resolveConfiguredAgentConfig(
87
88
  return null;
88
89
  }
89
90
 
91
+ function readNonEmptyEnvValue(env: NodeJS.ProcessEnv, key: string | null): string | null {
92
+ if (!key) {
93
+ return null;
94
+ }
95
+ const value = env[key];
96
+ if (typeof value !== 'string') {
97
+ return null;
98
+ }
99
+ return value.trim().length > 0 ? value : null;
100
+ }
101
+
102
+ function resolveProviderCredentialReference(
103
+ cliProviderConfigEnv: string | undefined,
104
+ configProviderConfigEnv: string | undefined,
105
+ env: NodeJS.ProcessEnv,
106
+ ): { providerConfigEnv: string | null; providerConfigRef: string | null } {
107
+ const cliConfiguredName = cliProviderConfigEnv?.trim() || null;
108
+ const configConfiguredName = configProviderConfigEnv?.trim() || null;
109
+ const unresolvedConfiguredName = cliConfiguredName ?? configConfiguredName ?? null;
110
+
111
+ const cliValue = readNonEmptyEnvValue(env, cliConfiguredName);
112
+ if (cliValue) {
113
+ return { providerConfigEnv: cliConfiguredName, providerConfigRef: cliValue };
114
+ }
115
+
116
+ const configValue = readNonEmptyEnvValue(env, configConfiguredName);
117
+ if (configValue) {
118
+ return { providerConfigEnv: configConfiguredName, providerConfigRef: configValue };
119
+ }
120
+
121
+ const aopFallback = readNonEmptyEnvValue(env, 'AOP_PROVIDER_CONFIG_ENV');
122
+ if (aopFallback) {
123
+ if (ENV_VAR_NAME_PATTERN.test(aopFallback)) {
124
+ const indirectValue = readNonEmptyEnvValue(env, aopFallback);
125
+ if (indirectValue) {
126
+ return { providerConfigEnv: aopFallback, providerConfigRef: indirectValue };
127
+ }
128
+ }
129
+
130
+ return {
131
+ providerConfigEnv: 'AOP_PROVIDER_CONFIG_ENV',
132
+ providerConfigRef: aopFallback,
133
+ };
134
+ }
135
+
136
+ return {
137
+ providerConfigEnv: unresolvedConfiguredName,
138
+ providerConfigRef: null,
139
+ };
140
+ }
141
+
90
142
  export const SUPPORTED_PROVIDERS: Set<string> = new Set(REGISTERED_PROVIDER_NAMES);
91
- export const AUTH_REQUIRED_PROVIDERS: Set<string> = new Set(['codex', 'claude', 'gemini']);
143
+ export const LOCAL_CLI_PROVIDERS: Set<string> = new Set([
144
+ 'codex',
145
+ 'claude',
146
+ 'kiro-cli',
147
+ 'copilot',
148
+ 'custom',
149
+ ]);
150
+ export const CREDENTIAL_REQUIRED_PROVIDERS: Set<string> = new Set(['gemini']);
92
151
  export type ProviderSelectionResolver = (input: ResolveSelectionInput) => ProviderSelection;
93
152
 
94
153
  export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env, agentsConfig }) => {
95
154
  const provider =
96
- cli.agent_provider ||
97
- env.AOP_AGENT_PROVIDER ||
98
- agentsConfig?.runtime?.default_provider ||
99
- null;
155
+ cli.agent_provider || env.AOP_AGENT_PROVIDER || agentsConfig?.runtime?.default_provider || null;
100
156
 
101
157
  const model =
102
- cli.agent_model ||
103
- env.AOP_AGENT_MODEL ||
104
- agentsConfig?.runtime?.default_model ||
105
- null;
158
+ cli.agent_model || env.AOP_AGENT_MODEL || agentsConfig?.runtime?.default_model || null;
106
159
 
107
- const providerConfigEnv =
108
- cli.provider_config_env ||
109
- env.AOP_PROVIDER_CONFIG_ENV ||
110
- agentsConfig?.runtime?.provider_config_env ||
111
- null;
160
+ const { providerConfigEnv, providerConfigRef } = resolveProviderCredentialReference(
161
+ cli.provider_config_env,
162
+ agentsConfig?.runtime?.provider_config_env,
163
+ env,
164
+ );
112
165
 
113
166
  if (!provider) {
114
167
  const error = new Error(ERROR_CODES.AGENT_PROVIDER_NOT_CONFIGURED) as AppError;
@@ -123,15 +176,12 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
123
176
  throw error;
124
177
  }
125
178
 
126
- if (
127
- AUTH_REQUIRED_PROVIDERS.has(provider) &&
128
- (!providerConfigEnv || !env[providerConfigEnv])
129
- ) {
179
+ if (CREDENTIAL_REQUIRED_PROVIDERS.has(provider) && !providerConfigRef) {
130
180
  const error = new Error(ERROR_CODES.PROVIDER_AUTH_MISSING) as AppError;
131
181
  error.code = ERROR_CODES.PROVIDER_AUTH_MISSING;
132
182
  error.details = {
133
183
  provider,
134
- provider_config_env: providerConfigEnv
184
+ provider_config_env: providerConfigEnv,
135
185
  };
136
186
  throw error;
137
187
  }
@@ -149,8 +199,8 @@ export const resolveProviderSelection: ProviderSelectionResolver = ({ cli, env,
149
199
  provider,
150
200
  model: model ?? `${provider}-default`,
151
201
  provider_config_env: providerConfigEnv,
152
- provider_config_ref: providerConfigEnv ? env[providerConfigEnv] ?? null : null,
153
- agent_config: agentConfig
202
+ provider_config_ref: providerConfigRef,
203
+ agent_config: agentConfig,
154
204
  };
155
205
  };
156
206
 
@@ -163,7 +213,11 @@ export interface WorkerSession {
163
213
 
164
214
  export interface WorkerProvider {
165
215
  selection: ProviderSelection;
166
- createSession(role: string, featureId: string, systemPrompt: string | null): Promise<WorkerSession>;
216
+ createSession(
217
+ role: string,
218
+ featureId: string,
219
+ systemPrompt: string | null,
220
+ ): Promise<WorkerSession>;
167
221
  reattachSession(sessionId: string): Promise<WorkerSession | null>;
168
222
  closeSession(sessionId: string): Promise<{ closed: true }>;
169
223
  runWorker(input: {
@@ -197,23 +251,31 @@ export interface ProviderCommandRunnerOptions {
197
251
  }
198
252
 
199
253
  export interface ProviderCommandRunner {
200
- run(command: string, args: string[], options?: ProviderCommandRunnerOptions): Promise<ProviderCommandResult>;
254
+ run(
255
+ command: string,
256
+ args: string[],
257
+ options?: ProviderCommandRunnerOptions,
258
+ ): Promise<ProviderCommandResult>;
201
259
  }
202
260
 
203
261
  export class NodeProviderCommandRunner implements ProviderCommandRunner {
204
- async run(command: string, args: string[], options: ProviderCommandRunnerOptions = {}): Promise<ProviderCommandResult> {
262
+ async run(
263
+ command: string,
264
+ args: string[],
265
+ options: ProviderCommandRunnerOptions = {},
266
+ ): Promise<ProviderCommandResult> {
205
267
  return await new Promise<ProviderCommandResult>((resolve) => {
206
268
  let child;
207
269
  try {
208
270
  child = spawn(command, args, {
209
271
  env: options.env,
210
- stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe']
272
+ stdio: options.interactive ? 'inherit' : ['pipe', 'pipe', 'pipe'],
211
273
  });
212
274
  } catch {
213
275
  resolve({
214
276
  exitCode: 127,
215
277
  signal: null,
216
- errorCode: 'ENOENT'
278
+ errorCode: 'ENOENT',
217
279
  });
218
280
  return;
219
281
  }
@@ -244,7 +306,7 @@ export class NodeProviderCommandRunner implements ProviderCommandRunner {
244
306
  resolve({
245
307
  exitCode: code ?? (spawnErrorCode === 'ENOENT' ? 127 : 1),
246
308
  signal,
247
- errorCode: spawnErrorCode
309
+ errorCode: spawnErrorCode,
248
310
  });
249
311
  });
250
312
  });
@@ -276,7 +338,7 @@ function readStringArray(value: unknown): string[] | null {
276
338
  function resolveTemplateFromAgentConfig(
277
339
  agentConfig: Record<string, unknown> | null | undefined,
278
340
  kind: 'attach' | 'send',
279
- fallback: ProviderCommandTemplate | undefined
341
+ fallback: ProviderCommandTemplate | undefined,
280
342
  ): ProviderCommandTemplate | undefined {
281
343
  const nested = agentConfig?.[kind];
282
344
  const nestedRecord = isPlainObject(nested) ? nested : null;
@@ -307,24 +369,34 @@ function resolveProviderCommands(selection: ProviderSelection): ProviderCliComma
307
369
  const defaults: Record<string, ProviderCliCommands> = {
308
370
  codex: {
309
371
  attach: { command: 'codex', args: ['chat', '--session', '{session_id}'] },
310
- send: { command: 'codex', args: ['chat', '--session', '{session_id}', '--message', '{message}'] }
372
+ send: {
373
+ command: 'codex',
374
+ args: ['chat', '--session', '{session_id}', '--message', '{message}'],
375
+ },
311
376
  },
312
377
  claude: {
313
378
  attach: { command: 'claude-code', args: ['chat', '--session', '{session_id}'] },
314
- send: { command: 'claude-code', args: ['chat', '--session', '{session_id}', '--message', '{message}'] }
315
- }
379
+ send: {
380
+ command: 'claude-code',
381
+ args: ['chat', '--session', '{session_id}', '--message', '{message}'],
382
+ },
383
+ },
316
384
  };
317
385
 
318
386
  const defaultsForProvider = defaults[selection.provider] ?? {};
319
387
  return {
320
- attach: resolveTemplateFromAgentConfig(selection.agent_config, 'attach', defaultsForProvider.attach),
321
- send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send)
388
+ attach: resolveTemplateFromAgentConfig(
389
+ selection.agent_config,
390
+ 'attach',
391
+ defaultsForProvider.attach,
392
+ ),
393
+ send: resolveTemplateFromAgentConfig(selection.agent_config, 'send', defaultsForProvider.send),
322
394
  };
323
395
  }
324
396
 
325
397
  function applyCommandArgsTemplate(
326
398
  args: string[],
327
- values: { sessionId: string; message?: string }
399
+ values: { sessionId: string; message?: string },
328
400
  ): string[] {
329
401
  return args.map((arg) => {
330
402
  if (arg === '{session_id}') {
@@ -341,7 +413,7 @@ function commandFailureError(
341
413
  provider: string,
342
414
  capability: 'attach' | 'send',
343
415
  details: Record<string, unknown>,
344
- code: string
416
+ code: string,
345
417
  ): AppError {
346
418
  const error = new Error(`${provider} provider ${capability} failed`) as AppError;
347
419
  error.code = code;
@@ -374,17 +446,21 @@ export class NullWorkerProvider implements WorkerProvider {
374
446
  this.getSessionInfo = (sessionId: string) =>
375
447
  Promise.resolve({
376
448
  active: Boolean(sessionId) && sessionId !== 'unknown' && sessionId !== 'unassigned',
377
- provider: this.selection.provider
449
+ provider: this.selection.provider,
378
450
  });
379
451
  }
380
452
  }
381
453
 
382
- createSession(role: string, featureId: string, systemPrompt: string | null): Promise<WorkerSession> {
454
+ createSession(
455
+ role: string,
456
+ featureId: string,
457
+ systemPrompt: string | null,
458
+ ): Promise<WorkerSession> {
383
459
  return Promise.resolve({
384
460
  session_id: `${role}-${featureId}-${crypto.randomUUID()}`,
385
461
  role,
386
462
  feature_id: featureId,
387
- system_prompt_loaded: Boolean(systemPrompt)
463
+ system_prompt_loaded: Boolean(systemPrompt),
388
464
  });
389
465
  }
390
466
  reattachSession(sessionId: string): Promise<WorkerSession | null> {
@@ -395,7 +471,7 @@ export class NullWorkerProvider implements WorkerProvider {
395
471
  session_id: sessionId,
396
472
  role: 'orchestrator',
397
473
  feature_id: 'global',
398
- system_prompt_loaded: false
474
+ system_prompt_loaded: false,
399
475
  });
400
476
  }
401
477
  closeSession(_sessionId: string): Promise<{ closed: true }> {
@@ -405,7 +481,7 @@ export class NullWorkerProvider implements WorkerProvider {
405
481
  runWorker({
406
482
  role,
407
483
  feature_id,
408
- context_bundle
484
+ context_bundle,
409
485
  }: {
410
486
  role: string;
411
487
  feature_id: string;
@@ -421,9 +497,7 @@ export class NullWorkerProvider implements WorkerProvider {
421
497
  if (role === 'planner') {
422
498
  const state = context_bundle?.state;
423
499
  const frontMatter =
424
- state && typeof state === 'object'
425
- ? (state as Record<string, unknown>).front_matter
426
- : null;
500
+ state && typeof state === 'object' ? (state as Record<string, unknown>).front_matter : null;
427
501
  const status =
428
502
  frontMatter && typeof frontMatter === 'object'
429
503
  ? (frontMatter as Record<string, unknown>).status
@@ -432,32 +506,36 @@ export class NullWorkerProvider implements WorkerProvider {
432
506
  type: 'NOTE',
433
507
  content: `Planner session active for ${feature_id}.`,
434
508
  context_snapshot: {
435
- status: typeof status === 'string' ? status : 'unknown'
436
- }
509
+ status: typeof status === 'string' ? status : 'unknown',
510
+ },
437
511
  });
438
512
  }
439
513
 
440
514
  return Promise.resolve({
441
515
  type: 'NOTE',
442
- content: `${role} session active for ${feature_id}.`
516
+ content: `${role} session active for ${feature_id}.`,
443
517
  });
444
518
  }
445
519
 
446
- private async executeCommand(kind: 'attach' | 'send', sessionId: string, message?: string): Promise<void> {
520
+ private async executeCommand(
521
+ kind: 'attach' | 'send',
522
+ sessionId: string,
523
+ message?: string,
524
+ ): Promise<void> {
447
525
  const template = kind === 'attach' ? this.commands.attach : this.commands.send;
448
526
  if (!template) {
449
527
  throw commandFailureError(
450
528
  this.selection.provider,
451
529
  kind,
452
530
  { reason: `Provider ${this.selection.provider} does not support ${kind}` },
453
- ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER
531
+ ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
454
532
  );
455
533
  }
456
534
 
457
535
  const args = applyCommandArgsTemplate(template.args, { sessionId, message });
458
536
  const result = await this.commandRunner.run(template.command, args, {
459
537
  interactive: kind === 'attach',
460
- timeoutMs: kind === 'send' ? 15_000 : undefined
538
+ timeoutMs: kind === 'send' ? 15_000 : undefined,
461
539
  });
462
540
 
463
541
  if (result.exitCode === 0) {
@@ -469,10 +547,15 @@ export class NullWorkerProvider implements WorkerProvider {
469
547
  args,
470
548
  exit_code: result.exitCode,
471
549
  signal: result.signal,
472
- error_code: result.errorCode
550
+ error_code: result.errorCode,
473
551
  };
474
552
  if (result.exitCode === 127 || result.errorCode === 'ENOENT') {
475
- throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER);
553
+ throw commandFailureError(
554
+ this.selection.provider,
555
+ kind,
556
+ details,
557
+ ERROR_CODES.UNSUPPORTED_AGENT_PROVIDER,
558
+ );
476
559
  }
477
560
  throw commandFailureError(this.selection.provider, kind, details, ERROR_CODES.INTERNAL_ERROR);
478
561
  }