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
@@ -54,7 +54,7 @@ export interface NotificationConfig {
54
54
  const DEFAULT_ROUTING: Record<NotificationPriority, string[]> = {
55
55
  critical: ['desktop', 'slack'],
56
56
  warning: ['slack', 'desktop'],
57
- info: ['slack']
57
+ info: ['slack'],
58
58
  };
59
59
 
60
60
  const EVENT_PRIORITY: Record<NotificationEvent, CanonicalPriority> = {
@@ -67,7 +67,7 @@ const EVENT_PRIORITY: Record<NotificationEvent, CanonicalPriority> = {
67
67
  agent_stuck: 'warning',
68
68
  changes_requested: 'warning',
69
69
  budget_exceeded: 'critical',
70
- budget_alert: 'warning'
70
+ budget_alert: 'warning',
71
71
  };
72
72
 
73
73
  const THROTTLE_WINDOW_MS = 5 * 60 * 1000; // 5 minutes
@@ -116,17 +116,22 @@ export class SlackNotifierChannel implements NotifierChannel {
116
116
  : null;
117
117
  const detailsJson = JSON.stringify(details);
118
118
  const detailsSuffix =
119
- detailsJson !== '{}' ? `\nContext: \`${detailsJson.length > 800 ? `${detailsJson.slice(0, 800)}…` : detailsJson}\`` : '';
119
+ detailsJson !== '{}'
120
+ ? `\nContext: \`${detailsJson.length > 800 ? `${detailsJson.slice(0, 800)}…` : detailsJson}\``
121
+ : '';
120
122
  const dashboardSuffix = dashboardFeatureUrl ? `\nDashboard: ${dashboardFeatureUrl}` : '';
121
123
  const text = payload.feature_id
122
124
  ? `*[${payload.priority.toUpperCase()}]* \`${payload.feature_id}\`: ${payload.message}`
123
125
  : `*[${payload.priority.toUpperCase()}]* ${payload.message}`;
124
126
 
125
- const body = JSON.stringify({ channel: this.channel, text: `${text}${dashboardSuffix}${detailsSuffix}` });
127
+ const body = JSON.stringify({
128
+ channel: this.channel,
129
+ text: `${text}${dashboardSuffix}${detailsSuffix}`,
130
+ });
126
131
  const response = await fetch(this.webhookUrl, {
127
132
  method: 'POST',
128
133
  headers: { 'Content-Type': 'application/json' },
129
- body
134
+ body,
130
135
  });
131
136
  if (!response.ok) {
132
137
  throw new Error(`Slack webhook returned ${response.status}`);
@@ -146,7 +151,7 @@ export class WebhookNotifierChannel implements NotifierChannel {
146
151
  const response = await fetch(this.url, {
147
152
  method: 'POST',
148
153
  headers: { 'Content-Type': 'application/json' },
149
- body: JSON.stringify(payload)
154
+ body: JSON.stringify(payload),
150
155
  });
151
156
  if (!response.ok) {
152
157
  throw new Error(`Webhook returned ${response.status}`);
@@ -169,16 +174,21 @@ export class NotifierService {
169
174
  this.dashboardUrl = dashboardUrl;
170
175
  }
171
176
 
172
- private buildRouting(routing: NotificationRoutingConfig | undefined): Record<CanonicalPriority, string[]> {
173
- const critical = routing?.critical ?? routing?.urgent ?? routing?.action ?? DEFAULT_ROUTING.critical;
177
+ private buildRouting(
178
+ routing: NotificationRoutingConfig | undefined,
179
+ ): Record<CanonicalPriority, string[]> {
180
+ const critical =
181
+ routing?.critical ?? routing?.urgent ?? routing?.action ?? DEFAULT_ROUTING.critical;
174
182
  return {
175
183
  critical,
176
184
  warning: routing?.warning ?? DEFAULT_ROUTING.warning,
177
- info: routing?.info ?? DEFAULT_ROUTING.info
185
+ info: routing?.info ?? DEFAULT_ROUTING.info,
178
186
  };
179
187
  }
180
188
 
181
- private buildChannels(channelsConfig: NotificationChannelConfig | undefined): Map<string, NotifierChannel> {
189
+ private buildChannels(
190
+ channelsConfig: NotificationChannelConfig | undefined,
191
+ ): Map<string, NotifierChannel> {
182
192
  const map = new Map<string, NotifierChannel>();
183
193
  if (!channelsConfig) {
184
194
  return map;
@@ -214,7 +224,7 @@ export class NotifierService {
214
224
 
215
225
  async notify(
216
226
  event: NotificationEvent,
217
- context: { feature_id?: string; message: string; details?: Record<string, unknown> }
227
+ context: { feature_id?: string; message: string; details?: Record<string, unknown> },
218
228
  ): Promise<void> {
219
229
  if (!this.config.enabled) {
220
230
  return;
@@ -225,7 +235,7 @@ export class NotifierService {
225
235
 
226
236
  const priority = EVENT_PRIORITY[event];
227
237
  const details: Record<string, unknown> = {
228
- ...(context.details ?? {})
238
+ ...(context.details ?? {}),
229
239
  };
230
240
  if (this.dashboardUrl) {
231
241
  details.dashboard_url = this.dashboardUrl;
@@ -239,7 +249,7 @@ export class NotifierService {
239
249
  feature_id: context.feature_id,
240
250
  message: context.message,
241
251
  details,
242
- timestamp: new Date().toISOString()
252
+ timestamp: new Date().toISOString(),
243
253
  };
244
254
 
245
255
  const targetChannelNames = this.routing[priority] ?? [];
@@ -260,7 +270,7 @@ export class NotifierService {
260
270
 
261
271
  export function createNotifierService(
262
272
  policySnapshot: Record<string, unknown>,
263
- preferredChannel: string | null = null
273
+ preferredChannel: string | null = null,
264
274
  ): NotifierService {
265
275
  const raw = policySnapshot.notifications;
266
276
  if (!raw || typeof raw !== 'object') {
@@ -270,15 +280,24 @@ export function createNotifierService(
270
280
  const config: NotificationConfig = {
271
281
  enabled: n.enabled === true,
272
282
  channels: (n.channels as NotificationChannelConfig | undefined) ?? {},
273
- routing: (n.routing as NotificationRoutingConfig | undefined) ?? {}
283
+ routing: (n.routing as NotificationRoutingConfig | undefined) ?? {},
274
284
  };
275
285
  if (preferredChannel) {
276
286
  const channels = config.channels ?? {};
277
287
  const forceEnabled = { enabled: true };
278
288
  config.channels = {
279
- desktop: preferredChannel === 'desktop' ? { ...(channels.desktop ?? {}), ...forceEnabled } : { enabled: false },
280
- slack: preferredChannel === 'slack' ? { ...(channels.slack ?? {}), ...forceEnabled } : { enabled: false },
281
- webhook: preferredChannel === 'webhook' ? { ...(channels.webhook ?? {}), ...forceEnabled } : { enabled: false }
289
+ desktop:
290
+ preferredChannel === 'desktop'
291
+ ? { ...(channels.desktop ?? {}), ...forceEnabled }
292
+ : { enabled: false },
293
+ slack:
294
+ preferredChannel === 'slack'
295
+ ? { ...(channels.slack ?? {}), ...forceEnabled }
296
+ : { enabled: false },
297
+ webhook:
298
+ preferredChannel === 'webhook'
299
+ ? { ...(channels.webhook ?? {}), ...forceEnabled }
300
+ : { enabled: false },
282
301
  };
283
302
  }
284
303
  const dashboardRaw =
@@ -286,9 +305,12 @@ export function createNotifierService(
286
305
  ? (policySnapshot.dashboard as Record<string, unknown>)
287
306
  : {};
288
307
  const dashboardPort =
289
- typeof dashboardRaw.port === 'number' && Number.isFinite(dashboardRaw.port) ? Math.floor(dashboardRaw.port) : 3000;
308
+ typeof dashboardRaw.port === 'number' && Number.isFinite(dashboardRaw.port)
309
+ ? Math.floor(dashboardRaw.port)
310
+ : 3000;
290
311
  const dashboardUrl =
291
- typeof process.env.AOP_DASHBOARD_URL === 'string' && process.env.AOP_DASHBOARD_URL.trim().length > 0
312
+ typeof process.env.AOP_DASHBOARD_URL === 'string' &&
313
+ process.env.AOP_DASHBOARD_URL.trim().length > 0
292
314
  ? process.env.AOP_DASHBOARD_URL.trim()
293
315
  : `http://localhost:${dashboardPort}`;
294
316
  return new NotifierService(config, dashboardUrl);
@@ -1,18 +1,22 @@
1
1
  import path from 'node:path';
2
- import {atomicWriteJson, readJson} from '../../core/fs.js';
3
- import {parseUnifiedDiff, touchedPathsFromDiff} from '../../core/patch.js';
4
- import {anyAreaMatch, normalizeRepoPath, sortResourcesDeterministically} from '../../core/path-rules.js';
5
- import {runGit} from '../../core/git.js';
6
- import {buildQaIndex, makeRequiredTests} from '../../core/qa-index.js';
7
- import {ERROR_CODES} from '../../core/error-codes.js';
8
- import {fail} from '../../core/response.js';
2
+ import { atomicWriteJson, readJson } from '../../core/fs.js';
3
+ import { parseUnifiedDiff, touchedPathsFromDiff } from '../../core/patch.js';
4
+ import {
5
+ anyAreaMatch,
6
+ normalizeRepoPath,
7
+ sortResourcesDeterministically,
8
+ } from '../../core/path-rules.js';
9
+ import { runGit } from '../../core/git.js';
10
+ import { buildQaIndex, makeRequiredTests } from '../../core/qa-index.js';
11
+ import { ERROR_CODES } from '../../core/error-codes.js';
12
+ import { fail } from '../../core/response.js';
9
13
 
10
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
15
  type AnyRecord = Record<string, any>;
12
16
 
13
17
  type StateUpdater = (
14
18
  frontMatter: AnyRecord,
15
- body: string
19
+ body: string,
16
20
  ) => Promise<{ frontMatter?: AnyRecord; body?: string }>;
17
21
 
18
22
  function asArray<T = unknown>(value: unknown): T[] {
@@ -29,7 +33,11 @@ function readHeldLocks(frontMatter: AnyRecord): string[] {
29
33
  return asArray<string>(locks.held).filter((item) => typeof item === 'string');
30
34
  }
31
35
 
32
- function normalizeFromWorktree(worktreePath: string, repoRoot: string, repoRelativeFromWorktree: string): string {
36
+ function normalizeFromWorktree(
37
+ worktreePath: string,
38
+ repoRoot: string,
39
+ repoRelativeFromWorktree: string,
40
+ ): string {
33
41
  const absolute = path.resolve(repoRoot, repoRelativeFromWorktree);
34
42
  const maybeRelativeToWorktree = path.relative(worktreePath, absolute).replaceAll('\\\\', '/');
35
43
  if (!maybeRelativeToWorktree.startsWith('../')) {
@@ -47,7 +55,11 @@ export interface PatchServicePort {
47
55
  worktreePath(featureId: string): string;
48
56
  readState(featureId: string): Promise<{ frontMatter: AnyRecord }>;
49
57
  validateSchema(schemaName: string, value: unknown): Promise<{ valid: boolean; errors?: unknown }>;
50
- updateState(featureId: string, expectedVersion: number | null, updater: StateUpdater): Promise<AnyRecord>;
58
+ updateState(
59
+ featureId: string,
60
+ expectedVersion: number | null,
61
+ updater: StateUpdater,
62
+ ): Promise<AnyRecord>;
51
63
  }
52
64
 
53
65
  export class PatchService {
@@ -65,8 +77,8 @@ export class PatchService {
65
77
  feature_id: featureId,
66
78
  retryable: false,
67
79
  requires_human: true,
68
- suggested_next_actions: ['Submit plan before applying patches']
69
- })
80
+ suggested_next_actions: ['Submit plan before applying patches'],
81
+ }),
70
82
  };
71
83
  }
72
84
  return plan;
@@ -94,13 +106,17 @@ export class PatchService {
94
106
  const missing = required.filter((resource) => !held.has(resource));
95
107
  if (missing.length > 0) {
96
108
  throw {
97
- normalizedResponse: fail(ERROR_CODES.LOCK_NOT_HELD, 'Plan requires lock(s) that are not held', {
98
- feature_id: featureId,
99
- missing_resources: missing,
100
- retryable: true,
101
- requires_human: false,
102
- suggested_next_actions: ['Acquire required locks before applying patch']
103
- })
109
+ normalizedResponse: fail(
110
+ ERROR_CODES.LOCK_NOT_HELD,
111
+ 'Plan requires lock(s) that are not held',
112
+ {
113
+ feature_id: featureId,
114
+ missing_resources: missing,
115
+ retryable: true,
116
+ requires_human: false,
117
+ suggested_next_actions: ['Acquire required locks before applying patch'],
118
+ },
119
+ ),
104
120
  };
105
121
  }
106
122
  }
@@ -108,7 +124,7 @@ export class PatchService {
108
124
  async validatePatchPaths(
109
125
  featureId: string,
110
126
  parsedDiff: ReturnType<typeof parseUnifiedDiff>,
111
- plan: AnyRecord | null
127
+ plan: AnyRecord | null,
112
128
  ): Promise<string[]> {
113
129
  const policy = this.port.getPolicySnapshot();
114
130
  const repoRoot = this.port.getRepoRoot();
@@ -121,9 +137,11 @@ export class PatchService {
121
137
  const normalized = await normalizeRepoPath(
122
138
  repoRoot,
123
139
  path.join(this.port.worktreePath(featureId), touchedPath),
124
- allowSymlinkTraversal
140
+ allowSymlinkTraversal,
125
141
  )
126
- .then((relativePath) => normalizeFromWorktree(this.port.worktreePath(featureId), repoRoot, relativePath))
142
+ .then((relativePath) =>
143
+ normalizeFromWorktree(this.port.worktreePath(featureId), repoRoot, relativePath),
144
+ )
127
145
  .catch(async () => {
128
146
  return await normalizeRepoPath(repoRoot, touchedPath, allowSymlinkTraversal);
129
147
  });
@@ -137,12 +155,16 @@ export class PatchService {
137
155
  const plannedFiles = new Set([
138
156
  ...asArray<string>(plan?.files?.create),
139
157
  ...asArray<string>(plan?.files?.modify),
140
- ...asArray<string>(plan?.files?.delete)
158
+ ...asArray<string>(plan?.files?.delete),
141
159
  ]);
142
160
 
143
161
  const violations: Array<{ path: string; reason: string }> = [];
144
162
  for (const filePath of normalizedTouched) {
145
- if (policy.patch_policy.enforce_allowed_areas && allowed.length > 0 && !anyAreaMatch(filePath, allowed, matchingMode)) {
163
+ if (
164
+ policy.patch_policy.enforce_allowed_areas &&
165
+ allowed.length > 0 &&
166
+ !anyAreaMatch(filePath, allowed, matchingMode)
167
+ ) {
146
168
  violations.push({ path: filePath, reason: 'outside_allowed_areas' });
147
169
  }
148
170
  if (forbidden.length > 0 && anyAreaMatch(filePath, forbidden, matchingMode)) {
@@ -158,12 +180,16 @@ export class PatchService {
158
180
 
159
181
  if (violations.length > 0) {
160
182
  throw {
161
- normalizedResponse: fail(ERROR_CODES.PATCH_POLICY_VIOLATION, 'Patch violates plan/policy constraints', {
162
- feature_id: featureId,
163
- violations,
164
- retryable: false,
165
- requires_human: true
166
- })
183
+ normalizedResponse: fail(
184
+ ERROR_CODES.PATCH_POLICY_VIOLATION,
185
+ 'Patch violates plan/policy constraints',
186
+ {
187
+ feature_id: featureId,
188
+ violations,
189
+ retryable: false,
190
+ requires_human: true,
191
+ },
192
+ ),
167
193
  };
168
194
  }
169
195
 
@@ -172,7 +198,7 @@ export class PatchService {
172
198
 
173
199
  async repoApplyPatch(
174
200
  featureId: string,
175
- unifiedDiff: string
201
+ unifiedDiff: string,
176
202
  ): Promise<{
177
203
  data: {
178
204
  feature_id: string;
@@ -185,13 +211,16 @@ export class PatchService {
185
211
  const parsedDiff = parseUnifiedDiff(unifiedDiff);
186
212
 
187
213
  await this.validatePatchPaths(featureId, parsedDiff, plan);
188
- await this.assertPlanLocksHeld(featureId, plan ?? { contracts: { openapi: 'none', events: 'none', db: 'none' } });
214
+ await this.assertPlanLocksHeld(
215
+ featureId,
216
+ plan ?? { contracts: { openapi: 'none', events: 'none', db: 'none' } },
217
+ );
189
218
 
190
219
  const repoRoot = this.port.getRepoRoot();
191
220
  const worktree = this.port.worktreePath(featureId);
192
221
  const apply = await runGit(repoRoot, ['apply', '--whitespace=nowarn', '-'], {
193
222
  cwd: worktree,
194
- stdin: unifiedDiff
223
+ stdin: unifiedDiff,
195
224
  });
196
225
 
197
226
  if (apply.code !== 0) {
@@ -202,13 +231,13 @@ export class PatchService {
202
231
  {
203
232
  stderr: apply.stderr,
204
233
  retryable: true,
205
- requires_human: false
234
+ requires_human: false,
206
235
  },
207
236
  {
208
237
  command: ['git', 'apply', '--whitespace=nowarn', '-'],
209
- exit_code: apply.code
210
- }
211
- )
238
+ exit_code: apply.code,
239
+ },
240
+ ),
212
241
  };
213
242
  }
214
243
 
@@ -230,8 +259,8 @@ export class PatchService {
230
259
  normalizedResponse: fail(ERROR_CODES.INTERNAL_ERROR, 'qa_test_index validation failed', {
231
260
  errors: qaValidation.errors,
232
261
  retryable: false,
233
- requires_human: true
234
- })
262
+ requires_human: true,
263
+ }),
235
264
  };
236
265
  }
237
266
 
@@ -241,10 +270,10 @@ export class PatchService {
241
270
  Promise.resolve({
242
271
  frontMatter: {
243
272
  status: frontMatter.status,
244
- gates: frontMatter.gates
273
+ gates: frontMatter.gates,
245
274
  },
246
- body
247
- })
275
+ body,
276
+ }),
248
277
  );
249
278
 
250
279
  return {
@@ -252,8 +281,8 @@ export class PatchService {
252
281
  feature_id: featureId,
253
282
  changed_files: changedFiles,
254
283
  status_porcelain: status.stdout.trim().split('\n').filter(Boolean),
255
- qa_index_version: qaIndex.version
256
- }
284
+ qa_index_version: qaIndex.version,
285
+ },
257
286
  };
258
287
  }
259
288
  }
@@ -66,7 +66,7 @@ function computeAggregates(outcomes: FeatureOutcome[]): ProviderModelStats[] {
66
66
  avg_retry_count: total > 0 ? sumRetry / total : 0,
67
67
  avg_duration_ms: total > 0 ? sumDuration / total : 0,
68
68
  avg_cost_usd: total > 0 ? sumCost / total : 0,
69
- last_updated: nowIso()
69
+ last_updated: nowIso(),
70
70
  });
71
71
  }
72
72
 
@@ -113,10 +113,12 @@ export class PerformanceAnalyticsService {
113
113
 
114
114
  private async readSnapshot(): Promise<AnalyticsSnapshot> {
115
115
  const existing = await readJson<AnalyticsSnapshot>(this.port.analyticsPath(), null);
116
- return existing ?? {
117
- outcomes: [],
118
- aggregates: [],
119
- generated_at: nowIso()
120
- };
116
+ return (
117
+ existing ?? {
118
+ outcomes: [],
119
+ aggregates: [],
120
+ generated_at: nowIso(),
121
+ }
122
+ );
121
123
  }
122
124
  }