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
package/eslint.config.mjs CHANGED
@@ -15,8 +15,8 @@ export default tseslint.config(
15
15
  'agentic/features/**',
16
16
  'agentic/runtime/**',
17
17
  '**/*.d.ts',
18
- 'packages/web-dashboard/**'
19
- ]
18
+ 'packages/web-dashboard/**',
19
+ ],
20
20
  },
21
21
  js.configs.recommended,
22
22
  ...tseslint.configs.recommended,
@@ -24,23 +24,23 @@ export default tseslint.config(
24
24
  files: ['**/*.{js,mjs,cjs}'],
25
25
  languageOptions: {
26
26
  globals: {
27
- ...globals.node
28
- }
27
+ ...globals.node,
28
+ },
29
29
  },
30
30
  rules: {
31
- 'no-console': 'off'
32
- }
31
+ 'no-console': 'off',
32
+ },
33
33
  },
34
34
  {
35
35
  files: ['**/*.ts'],
36
36
  languageOptions: {
37
37
  globals: {
38
- ...globals.node
38
+ ...globals.node,
39
39
  },
40
40
  parserOptions: {
41
41
  projectService: true,
42
- tsconfigRootDir: import.meta.dirname
43
- }
42
+ tsconfigRootDir: import.meta.dirname,
43
+ },
44
44
  },
45
45
  rules: {
46
46
  '@typescript-eslint/consistent-type-imports': 'error',
@@ -54,8 +54,8 @@ export default tseslint.config(
54
54
  {
55
55
  argsIgnorePattern: '^_',
56
56
  caughtErrorsIgnorePattern: '^_',
57
- varsIgnorePattern: '^_'
58
- }
57
+ varsIgnorePattern: '^_',
58
+ },
59
59
  ],
60
60
  '@typescript-eslint/require-await': 'error',
61
61
  '@typescript-eslint/return-await': 'off',
@@ -64,20 +64,20 @@ export default tseslint.config(
64
64
  'no-console': [
65
65
  'error',
66
66
  {
67
- allow: ['warn', 'error']
68
- }
67
+ allow: ['warn', 'error'],
68
+ },
69
69
  ],
70
70
  'no-debugger': 'error',
71
71
  'no-var': 'error',
72
72
  'object-shorthand': ['error', 'always'],
73
- 'prefer-const': 'error'
74
- }
73
+ 'prefer-const': 'error',
74
+ },
75
75
  },
76
76
  {
77
77
  files: ['apps/control-plane/scripts/**/*.{ts,mjs}', 'apps/control-plane/src/cli/aop.ts'],
78
78
  rules: {
79
- 'no-console': 'off'
80
- }
79
+ 'no-console': 'off',
80
+ },
81
81
  },
82
82
  {
83
83
  files: ['apps/control-plane/test/**/*.ts'],
@@ -88,7 +88,7 @@ export default tseslint.config(
88
88
  '@typescript-eslint/no-unsafe-member-access': 'off',
89
89
  '@typescript-eslint/no-unsafe-return': 'off',
90
90
  '@typescript-eslint/require-await': 'off',
91
- '@typescript-eslint/unbound-method': 'off'
92
- }
93
- }
91
+ '@typescript-eslint/unbound-method': 'off',
92
+ },
93
+ },
94
94
  );
@@ -14,7 +14,7 @@ Each stack includes:
14
14
  Usage:
15
15
 
16
16
  1. Pick a stack folder.
17
- 2. Copy its files into `agentic/orchestrator/`.
17
+ 2. Copy its files into `config/agentic/orchestrator/`.
18
18
  3. Adjust commands, paths, and thresholds to your repository.
19
19
 
20
20
  Important:
@@ -1,11 +1,11 @@
1
1
  version: 1
2
2
  roles:
3
3
  planner:
4
- system_prompt_path: agentic/orchestrator/prompts/planner.system.md
4
+ system_prompt_path: config/agentic/orchestrator/prompts/planner.system.md
5
5
  builder:
6
- system_prompt_path: agentic/orchestrator/prompts/builder.system.md
6
+ system_prompt_path: config/agentic/orchestrator/prompts/builder.system.md
7
7
  qa:
8
- system_prompt_path: agentic/orchestrator/prompts/qa.system.md
8
+ system_prompt_path: config/agentic/orchestrator/prompts/qa.system.md
9
9
  missing_prompt_behavior: ignore
10
10
  runtime:
11
11
  default_provider: custom
@@ -24,7 +24,7 @@ locks:
24
24
  multiplier: 2
25
25
  jitter_ms: 150
26
26
  protected_areas:
27
- - agentic/orchestrator/schemas
27
+ - config/agentic/orchestrator/schemas
28
28
  - pom.xml
29
29
  exclusive_areas:
30
30
  - src/main/java
@@ -1,11 +1,11 @@
1
1
  version: 1
2
2
  roles:
3
3
  planner:
4
- system_prompt_path: agentic/orchestrator/prompts/planner.system.md
4
+ system_prompt_path: config/agentic/orchestrator/prompts/planner.system.md
5
5
  builder:
6
- system_prompt_path: agentic/orchestrator/prompts/builder.system.md
6
+ system_prompt_path: config/agentic/orchestrator/prompts/builder.system.md
7
7
  qa:
8
- system_prompt_path: agentic/orchestrator/prompts/qa.system.md
8
+ system_prompt_path: config/agentic/orchestrator/prompts/qa.system.md
9
9
  missing_prompt_behavior: ignore
10
10
  runtime:
11
11
  default_provider: custom
@@ -24,7 +24,7 @@ locks:
24
24
  multiplier: 2
25
25
  jitter_ms: 150
26
26
  protected_areas:
27
- - agentic/orchestrator/schemas
27
+ - config/agentic/orchestrator/schemas
28
28
  - package-lock.json
29
29
  exclusive_areas:
30
30
  - apps/api
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-orchestrator",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "packages/*"
@@ -12,6 +12,7 @@
12
12
  "test": "npm run nx -- run control-plane:test",
13
13
  "run": "tsx apps/control-plane/src/cli/aop.ts",
14
14
  "build": "npm run lint && npm run nx -- run control-plane:build",
15
+ "verify": "npm run typecheck && npm run validate:all && npm run lint:fix && npm run format && npm run test && npm run nx -- run control-plane:build",
15
16
  "typecheck": "tsc -p tsconfig.json --noEmit",
16
17
  "validate:mcp-contracts": "tsx apps/control-plane/scripts/validate-mcp-contracts.ts",
17
18
  "validate:docker-mcp": "node apps/control-plane/scripts/validate-docker-mcp-contract.mjs",
@@ -19,7 +20,10 @@
19
20
  "validate:all": "npm run validate:mcp-contracts && npm run validate:docker-mcp && npm run validate:architecture",
20
21
  "lint": "eslint . --max-warnings 0",
21
22
  "lint:fix": "npm run lint -- --fix",
22
- "publish:npm": "npm run typecheck && npm run validate:all && npm run test && npm run build && npm publish",
23
+ "format": "prettier . --cache --write --ignore-unknown",
24
+ "format:check": "prettier . --cache --check --ignore-unknown",
25
+ "publish:docker": "docker build -t agentic-orchestrator:latest . && docker push agentic-orchestrator:latest",
26
+ "publish:npm": "npm run verify && npm publish",
23
27
  "dashboard:dev": "npm run --workspace @aop/web-dashboard dev",
24
28
  "dashboard:build": "npm run --workspace @aop/web-dashboard build",
25
29
  "dashboard:start": "npm run --workspace @aop/web-dashboard start"
@@ -28,17 +32,18 @@
28
32
  "aop": "dist/apps/control-plane/cli/aop.js"
29
33
  },
30
34
  "devDependencies": {
31
- "@testing-library/react": "^16.3.2",
32
35
  "@eslint/js": "^10.0.1",
36
+ "@testing-library/react": "^16.3.2",
33
37
  "@types/node": "^25.3.3",
34
38
  "@vitest/coverage-v8": "^4.0.18",
35
39
  "eslint": "^10.0.2",
36
40
  "globals": "^17.4.0",
41
+ "msw": "^2.12.10",
37
42
  "nx": "^22.5.3",
43
+ "prettier": "^3.8.1",
38
44
  "tsx": "^4.21.0",
39
- "typescript-eslint": "^8.56.1",
40
45
  "typescript": "^5.9.3",
41
- "msw": "^2.12.10",
46
+ "typescript-eslint": "^8.56.1",
42
47
  "vitest": "^4.0.18"
43
48
  },
44
49
  "dependencies": {
@@ -1,7 +1,7 @@
1
1
  /** @type {import('next').NextConfig} */
2
2
  const nextConfig = {
3
3
  experimental: {
4
- externalDir: true
5
- }
4
+ externalDir: true,
5
+ },
6
6
  };
7
7
  export default nextConfig;
@@ -1,4 +1,8 @@
1
- import { approveFeatureReview, denyFeatureReview, requestFeatureChanges } from '@/lib/orchestrator-tools.js';
1
+ import {
2
+ approveFeatureReview,
3
+ denyFeatureReview,
4
+ requestFeatureChanges,
5
+ } from '@/lib/orchestrator-tools.js';
2
6
  import { resolveProjectRoot } from '@/lib/aop-client.js';
3
7
 
4
8
  export const dynamic = 'force-dynamic';
@@ -20,15 +24,21 @@ export async function POST(req: Request): Promise<Response> {
20
24
  if (!body.feature_id) {
21
25
  return Response.json(
22
26
  { ok: false, error: { code: 'feature_id_required', message: 'feature_id is required' } },
23
- { status: 400 }
27
+ { status: 400 },
24
28
  );
25
29
  }
26
30
 
27
31
  if (body.action === 'review.approve') {
28
32
  if (!body.approval_token) {
29
33
  return Response.json(
30
- { ok: false, error: { code: 'approval_token_required', message: 'approval_token is required for approval' } },
31
- { status: 400 }
34
+ {
35
+ ok: false,
36
+ error: {
37
+ code: 'approval_token_required',
38
+ message: 'approval_token is required for approval',
39
+ },
40
+ },
41
+ { status: 400 },
32
42
  );
33
43
  }
34
44
  const response = await approveFeatureReview(
@@ -36,7 +46,7 @@ export async function POST(req: Request): Promise<Response> {
36
46
  body.approval_token,
37
47
  body.merge_strategy ?? 'merge_commit',
38
48
  body.commit_message,
39
- repoRoot
49
+ repoRoot,
40
50
  );
41
51
  return Response.json(response, { status: response.ok ? 200 : 409 });
42
52
  }
@@ -44,8 +54,11 @@ export async function POST(req: Request): Promise<Response> {
44
54
  if (body.action === 'review.deny') {
45
55
  if (!body.reason || body.reason.trim().length === 0) {
46
56
  return Response.json(
47
- { ok: false, error: { code: 'reason_required', message: 'reason is required for deny action' } },
48
- { status: 400 }
57
+ {
58
+ ok: false,
59
+ error: { code: 'reason_required', message: 'reason is required for deny action' },
60
+ },
61
+ { status: 400 },
49
62
  );
50
63
  }
51
64
  const response = await denyFeatureReview(body.feature_id, body.reason.trim(), repoRoot);
@@ -58,7 +71,10 @@ export async function POST(req: Request): Promise<Response> {
58
71
  }
59
72
 
60
73
  return Response.json(
61
- { ok: false, error: { code: 'unsupported_action', message: `Unsupported action: ${String(body.action)}` } },
62
- { status: 400 }
74
+ {
75
+ ok: false,
76
+ error: { code: 'unsupported_action', message: `Unsupported action: ${String(body.action)}` },
77
+ },
78
+ { status: 400 },
63
79
  );
64
80
  }
@@ -15,13 +15,21 @@ export async function GET(req: Request): Promise<Response> {
15
15
  // Send initial snapshot
16
16
  void (async () => {
17
17
  const payload = await readDashboardStatus(repoRoot);
18
- controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'snapshot', features: payload.index, payload })}\n\n`));
18
+ controller.enqueue(
19
+ encoder.encode(
20
+ `data: ${JSON.stringify({ type: 'snapshot', features: payload.index, payload })}\n\n`,
21
+ ),
22
+ );
19
23
  })();
20
24
 
21
25
  // Heartbeat every 15s
22
26
  heartbeatInterval = setInterval(() => {
23
- try { controller.enqueue(encoder.encode(': heartbeat\n\n')); }
24
- catch { clearInterval(heartbeatInterval); clearInterval(pollInterval); }
27
+ try {
28
+ controller.enqueue(encoder.encode(': heartbeat\n\n'));
29
+ } catch {
30
+ clearInterval(heartbeatInterval);
31
+ clearInterval(pollInterval);
32
+ }
25
33
  }, 15000);
26
34
 
27
35
  // Poll every 2s
@@ -29,8 +37,14 @@ export async function GET(req: Request): Promise<Response> {
29
37
  void (async () => {
30
38
  try {
31
39
  const payload = await readDashboardStatus(repoRoot);
32
- controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'snapshot', features: payload.index, payload })}\n\n`));
33
- } catch { /* ignore */ }
40
+ controller.enqueue(
41
+ encoder.encode(
42
+ `data: ${JSON.stringify({ type: 'snapshot', features: payload.index, payload })}\n\n`,
43
+ ),
44
+ );
45
+ } catch {
46
+ /* ignore */
47
+ }
34
48
  })();
35
49
  }, 2000);
36
50
  },
@@ -44,7 +58,7 @@ export async function GET(req: Request): Promise<Response> {
44
58
  headers: {
45
59
  'Content-Type': 'text/event-stream',
46
60
  'Cache-Control': 'no-cache',
47
- 'Connection': 'keep-alive',
61
+ Connection: 'keep-alive',
48
62
  'X-Accel-Buffering': 'no',
49
63
  },
50
64
  });
@@ -29,11 +29,14 @@ async function git(repoRoot: string, args: string[]): Promise<{ stdout: string;
29
29
  const result = await execFileAsync('git', args, { cwd: repoRoot });
30
30
  return {
31
31
  stdout: result.stdout ?? '',
32
- stderr: result.stderr ?? ''
32
+ stderr: result.stderr ?? '',
33
33
  };
34
34
  }
35
35
 
36
- async function gitTry(repoRoot: string, args: string[]): Promise<{ ok: boolean; stdout: string; stderr: string }> {
36
+ async function gitTry(
37
+ repoRoot: string,
38
+ args: string[],
39
+ ): Promise<{ ok: boolean; stdout: string; stderr: string }> {
37
40
  try {
38
41
  const result = await git(repoRoot, args);
39
42
  return { ok: true, stdout: result.stdout, stderr: result.stderr };
@@ -42,7 +45,7 @@ async function gitTry(repoRoot: string, args: string[]): Promise<{ ok: boolean;
42
45
  return {
43
46
  ok: false,
44
47
  stdout: typed.stdout ?? '',
45
- stderr: typed.stderr ?? ''
48
+ stderr: typed.stderr ?? '',
46
49
  };
47
50
  }
48
51
  }
@@ -61,7 +64,12 @@ async function branchExists(repoRoot: string, branch: string): Promise<boolean>
61
64
  if (local.ok) {
62
65
  return true;
63
66
  }
64
- const remote = await gitTry(repoRoot, ['show-ref', '--verify', '--quiet', `refs/remotes/origin/${branch}`]);
67
+ const remote = await gitTry(repoRoot, [
68
+ 'show-ref',
69
+ '--verify',
70
+ '--quiet',
71
+ `refs/remotes/origin/${branch}`,
72
+ ]);
65
73
  return remote.ok;
66
74
  }
67
75
 
@@ -84,11 +92,18 @@ async function currentBranch(repoRoot: string): Promise<string> {
84
92
  return result.stdout.trim();
85
93
  }
86
94
 
87
- async function checkoutFeature(repoRoot: string, featureId: string, stashChanges: boolean): Promise<Response> {
95
+ async function checkoutFeature(
96
+ repoRoot: string,
97
+ featureId: string,
98
+ stashChanges: boolean,
99
+ ): Promise<Response> {
88
100
  if (await mergeInProgress(repoRoot)) {
89
101
  return Response.json(
90
- { ok: false, error: { code: 'merge_in_progress', message: 'Cannot checkout while merge is in progress' } },
91
- { status: 409 }
102
+ {
103
+ ok: false,
104
+ error: { code: 'merge_in_progress', message: 'Cannot checkout while merge is in progress' },
105
+ },
106
+ { status: 409 },
92
107
  );
93
108
  }
94
109
 
@@ -99,26 +114,32 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
99
114
  ok: false,
100
115
  error: {
101
116
  code: 'checkout_already_active',
102
- message: `Checkout already active for feature ${existing.checked_out_feature_id}; restore first`
103
- }
117
+ message: `Checkout already active for feature ${existing.checked_out_feature_id}; restore first`,
118
+ },
104
119
  },
105
- { status: 409 }
120
+ { status: 409 },
106
121
  );
107
122
  }
108
123
 
109
124
  const state = await readFeatureState(featureId, repoRoot);
110
125
  if (!state) {
111
126
  return Response.json(
112
- { ok: false, error: { code: 'feature_not_found', message: `Feature ${featureId} not found` } },
113
- { status: 404 }
127
+ {
128
+ ok: false,
129
+ error: { code: 'feature_not_found', message: `Feature ${featureId} not found` },
130
+ },
131
+ { status: 404 },
114
132
  );
115
133
  }
116
134
 
117
135
  const branch = state.branch ?? featureId;
118
136
  if (!(await branchExists(repoRoot, branch))) {
119
137
  return Response.json(
120
- { ok: false, error: { code: 'branch_not_found', message: `Feature branch not found: ${branch}` } },
121
- { status: 404 }
138
+ {
139
+ ok: false,
140
+ error: { code: 'branch_not_found', message: `Feature branch not found: ${branch}` },
141
+ },
142
+ { status: 404 },
122
143
  );
123
144
  }
124
145
 
@@ -127,8 +148,14 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
127
148
  await access(worktreePath);
128
149
  } catch {
129
150
  return Response.json(
130
- { ok: false, error: { code: 'worktree_not_found', message: `Feature worktree not found: ${worktreePath}` } },
131
- { status: 404 }
151
+ {
152
+ ok: false,
153
+ error: {
154
+ code: 'worktree_not_found',
155
+ message: `Feature worktree not found: ${worktreePath}`,
156
+ },
157
+ },
158
+ { status: 404 },
132
159
  );
133
160
  }
134
161
 
@@ -137,9 +164,18 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
137
164
 
138
165
  if (stashChanges && (await isDirtyWorkspace(repoRoot))) {
139
166
  const beforeStash = await gitTry(repoRoot, ['rev-parse', '--verify', '-q', 'refs/stash']);
140
- await git(repoRoot, ['stash', 'push', '-u', '-m', `aop-dashboard-checkout:${featureId}:${Date.now()}`]);
167
+ await git(repoRoot, [
168
+ 'stash',
169
+ 'push',
170
+ '-u',
171
+ '-m',
172
+ `aop-dashboard-checkout:${featureId}:${Date.now()}`,
173
+ ]);
141
174
  const afterStash = await gitTry(repoRoot, ['rev-parse', '--verify', '-q', 'refs/stash']);
142
- if (afterStash.ok && (!beforeStash.ok || beforeStash.stdout.trim() !== afterStash.stdout.trim())) {
175
+ if (
176
+ afterStash.ok &&
177
+ (!beforeStash.ok || beforeStash.stdout.trim() !== afterStash.stdout.trim())
178
+ ) {
143
179
  stashRef = afterStash.stdout.trim();
144
180
  }
145
181
  }
@@ -147,8 +183,14 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
147
183
  const checkoutResult = await gitTry(repoRoot, ['checkout', branch]);
148
184
  if (!checkoutResult.ok) {
149
185
  return Response.json(
150
- { ok: false, error: { code: 'checkout_failed', message: checkoutResult.stderr.trim() || 'git checkout failed' } },
151
- { status: 409 }
186
+ {
187
+ ok: false,
188
+ error: {
189
+ code: 'checkout_failed',
190
+ message: checkoutResult.stderr.trim() || 'git checkout failed',
191
+ },
192
+ },
193
+ { status: 409 },
152
194
  );
153
195
  }
154
196
 
@@ -157,7 +199,7 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
157
199
  checked_out_branch: branch,
158
200
  previous_branch: previous,
159
201
  stash_ref: stashRef,
160
- created_at: new Date().toISOString()
202
+ created_at: new Date().toISOString(),
161
203
  };
162
204
  const restoreFile = restoreFilePath(repoRoot);
163
205
  await mkdir(path.dirname(restoreFile), { recursive: true });
@@ -170,8 +212,8 @@ async function checkoutFeature(repoRoot: string, featureId: string, stashChanges
170
212
  branch,
171
213
  previous_branch: previous,
172
214
  stashed: Boolean(stashRef),
173
- stash_ref: stashRef ?? null
174
- }
215
+ stash_ref: stashRef ?? null,
216
+ },
175
217
  });
176
218
  }
177
219
 
@@ -179,8 +221,14 @@ async function restoreCheckout(repoRoot: string, featureId: string): Promise<Res
179
221
  const saved = await readRestoreRecord(repoRoot);
180
222
  if (!saved) {
181
223
  return Response.json(
182
- { ok: false, error: { code: 'restore_not_available', message: 'No active dashboard checkout to restore' } },
183
- { status: 404 }
224
+ {
225
+ ok: false,
226
+ error: {
227
+ code: 'restore_not_available',
228
+ message: 'No active dashboard checkout to restore',
229
+ },
230
+ },
231
+ { status: 404 },
184
232
  );
185
233
  }
186
234
 
@@ -190,10 +238,10 @@ async function restoreCheckout(repoRoot: string, featureId: string): Promise<Res
190
238
  ok: false,
191
239
  error: {
192
240
  code: 'restore_feature_mismatch',
193
- message: `Active checkout belongs to ${saved.checked_out_feature_id}; restore that feature first`
194
- }
241
+ message: `Active checkout belongs to ${saved.checked_out_feature_id}; restore that feature first`,
242
+ },
195
243
  },
196
- { status: 409 }
244
+ { status: 409 },
197
245
  );
198
246
  }
199
247
 
@@ -204,10 +252,10 @@ async function restoreCheckout(repoRoot: string, featureId: string): Promise<Res
204
252
  ok: false,
205
253
  error: {
206
254
  code: 'restore_checkout_failed',
207
- message: checkoutResult.stderr.trim() || 'Failed to restore previous branch'
208
- }
255
+ message: checkoutResult.stderr.trim() || 'Failed to restore previous branch',
256
+ },
209
257
  },
210
- { status: 409 }
258
+ { status: 409 },
211
259
  );
212
260
  }
213
261
 
@@ -223,10 +271,10 @@ async function restoreCheckout(repoRoot: string, featureId: string): Promise<Res
223
271
  ok: false,
224
272
  error: {
225
273
  code: 'stash_restore_failed',
226
- message: apply.stderr.trim() || 'Failed to restore stashed changes'
227
- }
274
+ message: apply.stderr.trim() || 'Failed to restore stashed changes',
275
+ },
228
276
  },
229
- { status: 409 }
277
+ { status: 409 },
230
278
  );
231
279
  }
232
280
  }
@@ -238,12 +286,15 @@ async function restoreCheckout(repoRoot: string, featureId: string): Promise<Res
238
286
  data: {
239
287
  restored_to: saved.previous_branch,
240
288
  stash_restored: stashRestored,
241
- stash_ref: saved.stash_ref ?? null
242
- }
289
+ stash_ref: saved.stash_ref ?? null,
290
+ },
243
291
  });
244
292
  }
245
293
 
246
- export async function POST(req: Request, { params }: { params: { id: string } }): Promise<Response> {
294
+ export async function POST(
295
+ req: Request,
296
+ { params }: { params: { id: string } },
297
+ ): Promise<Response> {
247
298
  const url = new URL(req.url);
248
299
  const project = url.searchParams.get('project');
249
300
  const repoRoot = await resolveProjectRoot(project);
@@ -4,22 +4,25 @@ export const dynamic = 'force-dynamic';
4
4
 
5
5
  export async function GET(
6
6
  req: Request,
7
- { params }: { params: { id: string; artifact: string } }
7
+ { params }: { params: { id: string; artifact: string } },
8
8
  ): Promise<Response> {
9
9
  const project = new URL(req.url).searchParams.get('project');
10
10
  const repoRoot = await resolveProjectRoot(project);
11
11
  const content = await readEvidenceArtifact(params.id, params.artifact, repoRoot);
12
12
  if (content == null) {
13
13
  return Response.json(
14
- { ok: false, error: { code: 'artifact_not_found', message: `Artifact not found: ${params.artifact}` } },
15
- { status: 404 }
14
+ {
15
+ ok: false,
16
+ error: { code: 'artifact_not_found', message: `Artifact not found: ${params.artifact}` },
17
+ },
18
+ { status: 404 },
16
19
  );
17
20
  }
18
21
 
19
22
  return new Response(content, {
20
23
  headers: {
21
24
  'Content-Type': params.artifact.endsWith('.json') ? 'application/json' : 'text/plain',
22
- 'Content-Disposition': `attachment; filename="${params.artifact}"`
23
- }
25
+ 'Content-Disposition': `attachment; filename="${params.artifact}"`,
26
+ },
24
27
  });
25
28
  }