agentic-orchestrator 0.1.6 → 0.1.7

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 (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  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 +4 -21
  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/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -1,7 +1,11 @@
1
1
  import { describe, it, expect, vi } from 'vitest';
2
2
 
3
3
  vi.mock('../src/providers/providers.js', () => ({
4
- resolveProviderSelection: vi.fn(() => ({ provider: 'null', model: 'none', provider_config_ref: null })),
4
+ resolveProviderSelection: vi.fn(() => ({
5
+ provider: 'null',
6
+ model: 'none',
7
+ provider_config_ref: null,
8
+ })),
5
9
  NullWorkerProvider: class NullWorkerProvider {
6
10
  selection: unknown;
7
11
 
@@ -20,7 +24,7 @@ vi.mock('../src/providers/providers.js', () => ({
20
24
  async closeSession() {
21
25
  return {};
22
26
  }
23
- }
27
+ },
24
28
  }));
25
29
 
26
30
  vi.mock('../src/supervisor/runtime.js', () => ({
@@ -30,10 +34,10 @@ vi.mock('../src/supervisor/runtime.js', () => ({
30
34
  queue_depth: features.length,
31
35
  status: 'running',
32
36
  run_metadata: {},
33
- dashboard: null
37
+ dashboard: null,
34
38
  };
35
39
  }
36
- }
40
+ },
37
41
  }));
38
42
 
39
43
  import { ResumeCommandHandler } from '../src/cli/resume-command-handler.js';
@@ -49,19 +53,22 @@ function makeKernel(overrides: Record<string, unknown> = {}) {
49
53
  owner_instance_id: 'none',
50
54
  orchestrator_session_id: 'unknown',
51
55
  orchestrator_epoch: 0,
52
- feature_sessions: {}
56
+ feature_sessions: {},
53
57
  })),
54
58
  featureDiscoverSpecs: vi.fn(async () => ({ data: { specs: [] } })),
55
59
  featureStateGet: vi.fn(async () => ({
56
- data: { front_matter: { status: STATUS.PLANNING } }
60
+ data: { front_matter: { status: STATUS.PLANNING } },
57
61
  })),
58
62
  getAgentsConfig: vi.fn(() => ({ roles: {} })),
59
63
  getPolicySnapshot: vi.fn(() => ({})),
60
- ...overrides
64
+ ...overrides,
61
65
  };
62
66
  }
63
67
 
64
- function makeContext(kernel: ReturnType<typeof makeKernel>, toolClientOverride?: Record<string, unknown>) {
68
+ function makeContext(
69
+ kernel: ReturnType<typeof makeKernel>,
70
+ toolClientOverride?: Record<string, unknown>,
71
+ ) {
65
72
  return {
66
73
  repoRoot: '/tmp/repo',
67
74
  env: process.env,
@@ -69,7 +76,9 @@ function makeContext(kernel: ReturnType<typeof makeKernel>, toolClientOverride?:
69
76
  transport: 'stdio' as unknown as ToolTransport,
70
77
  options: {} as any,
71
78
  kernel: kernel as any,
72
- toolClient: (toolClientOverride ?? { call: vi.fn(async () => ({ ok: true, data: {} })) }) as any
79
+ toolClient: (toolClientOverride ?? {
80
+ call: vi.fn(async () => ({ ok: true, data: {} })),
81
+ }) as any,
73
82
  };
74
83
  }
75
84
 
@@ -77,7 +86,7 @@ describe('ResumeCommandHandler', () => {
77
86
  it('GIVEN_no_resumable_features_WHEN_execute_called_THEN_returns_resumed_false', async () => {
78
87
  const kernel = makeKernel();
79
88
  const handler = new ResumeCommandHandler();
80
- const result = await handler.execute(makeContext(kernel)) as any;
89
+ const result = (await handler.execute(makeContext(kernel))) as any;
81
90
 
82
91
  expect(result.ok).toBe(true);
83
92
  expect(result.data.resumed).toBe(false);
@@ -91,11 +100,11 @@ describe('ResumeCommandHandler', () => {
91
100
  owner_instance_id: 'owner-abc',
92
101
  orchestrator_session_id: 'unknown',
93
102
  orchestrator_epoch: 0,
94
- feature_sessions: {}
95
- }))
103
+ feature_sessions: {},
104
+ })),
96
105
  });
97
106
  const handler = new ResumeCommandHandler();
98
- const result = await handler.execute(makeContext(kernel)) as any;
107
+ const result = (await handler.execute(makeContext(kernel))) as any;
99
108
 
100
109
  expect(result.ok).toBe(true);
101
110
  expect(result.data.resumed).toBe(false);
@@ -104,14 +113,18 @@ describe('ResumeCommandHandler', () => {
104
113
  it('GIVEN_two_features_same_phase_WHEN_sorted_THEN_localeCompares_feature_ids', async () => {
105
114
  // Exercises the secondary sort (localeCompare on feature_id when phaseDelta === 0)
106
115
  const kernel = makeKernel({
107
- readIndex: vi.fn(async () => ({ active: ['feature_b', 'feature_a'], blocked: [], blocked_queue: [] })),
116
+ readIndex: vi.fn(async () => ({
117
+ active: ['feature_b', 'feature_a'],
118
+ blocked: [],
119
+ blocked_queue: [],
120
+ })),
108
121
  featureStateGet: vi.fn(async (_fid: string) => ({
109
- data: { front_matter: { status: STATUS.BUILDING } }
110
- }))
122
+ data: { front_matter: { status: STATUS.BUILDING } },
123
+ })),
111
124
  });
112
125
  const handler = new ResumeCommandHandler();
113
126
  // Features have non-terminal status, will be returned sorted
114
- const result = await handler.execute(makeContext(kernel)) as any;
127
+ const result = (await handler.execute(makeContext(kernel))) as any;
115
128
 
116
129
  // Both features at BUILDING phase → sort by localeCompare; supervisor mock returns ok
117
130
  expect(result.ok).toBe(true);
@@ -122,13 +135,17 @@ describe('ResumeCommandHandler', () => {
122
135
 
123
136
  it('GIVEN_feature_with_terminal_status_WHEN_buildResumePlan_THEN_excludes_from_resumable', async () => {
124
137
  const kernel = makeKernel({
125
- readIndex: vi.fn(async () => ({ active: ['merged-feature'], blocked: [], blocked_queue: [] })),
138
+ readIndex: vi.fn(async () => ({
139
+ active: ['merged-feature'],
140
+ blocked: [],
141
+ blocked_queue: [],
142
+ })),
126
143
  featureStateGet: vi.fn(async () => ({
127
- data: { front_matter: { status: STATUS.MERGED } }
128
- }))
144
+ data: { front_matter: { status: STATUS.MERGED } },
145
+ })),
129
146
  });
130
147
  const handler = new ResumeCommandHandler();
131
- const result = await handler.execute(makeContext(kernel)) as any;
148
+ const result = (await handler.execute(makeContext(kernel))) as any;
132
149
 
133
150
  expect(result.ok).toBe(true);
134
151
  expect(result.data.resumed).toBe(false); // Terminal feature excluded, no resumables
@@ -141,18 +158,18 @@ describe('ResumeCommandHandler', () => {
141
158
  active: [],
142
159
  blocked: [],
143
160
  blocked_queue: [
144
- { feature_id: '' }, // empty → guarded
161
+ { feature_id: '' }, // empty → guarded
145
162
  { feature_id: null }, // not string → skipped
146
- { feature_id: 'valid-feature' }
147
- ]
163
+ { feature_id: 'valid-feature' },
164
+ ],
148
165
  })),
149
166
  featureStateGet: vi.fn(async () => ({
150
- data: { front_matter: { status: STATUS.PLANNING } }
151
- }))
167
+ data: { front_matter: { status: STATUS.PLANNING } },
168
+ })),
152
169
  });
153
170
  const handler = new ResumeCommandHandler();
154
171
  // Should not throw on empty/null feature_ids
155
- const result = await handler.execute(makeContext(kernel)) as any;
172
+ const result = (await handler.execute(makeContext(kernel))) as any;
156
173
 
157
174
  expect(result.ok).toBe(true);
158
175
  });
@@ -163,14 +180,14 @@ describe('ResumeCommandHandler', () => {
163
180
  readIndex: vi.fn(async () => ({
164
181
  active: ['shared-feature'],
165
182
  blocked: ['shared-feature'], // same ID in both active and blocked
166
- blocked_queue: []
183
+ blocked_queue: [],
167
184
  })),
168
185
  featureStateGet: vi.fn(async () => ({
169
- data: { front_matter: { status: STATUS.PLANNING } }
170
- }))
186
+ data: { front_matter: { status: STATUS.PLANNING } },
187
+ })),
171
188
  });
172
189
  const handler = new ResumeCommandHandler();
173
- const result = await handler.execute(makeContext(kernel)) as any;
190
+ const result = (await handler.execute(makeContext(kernel))) as any;
174
191
 
175
192
  expect(result.ok).toBe(true);
176
193
  // 'shared-feature' appears in both sources, addSource should merge them
@@ -179,10 +196,12 @@ describe('ResumeCommandHandler', () => {
179
196
  it('GIVEN_feature_state_throws_WHEN_buildResumePlan_THEN_silently_skips_feature', async () => {
180
197
  const kernel = makeKernel({
181
198
  readIndex: vi.fn(async () => ({ active: ['bad-feature'], blocked: [], blocked_queue: [] })),
182
- featureStateGet: vi.fn(async () => { throw new Error('state parse error'); })
199
+ featureStateGet: vi.fn(async () => {
200
+ throw new Error('state parse error');
201
+ }),
183
202
  });
184
203
  const handler = new ResumeCommandHandler();
185
- const result = await handler.execute(makeContext(kernel)) as any;
204
+ const result = (await handler.execute(makeContext(kernel))) as any;
186
205
 
187
206
  expect(result.ok).toBe(true);
188
207
  expect(result.data.resumed).toBe(false);
@@ -191,14 +210,14 @@ describe('ResumeCommandHandler', () => {
191
210
  it('GIVEN_discovered_specs_WHEN_buildResumePlan_THEN_includes_spec_feature_ids', async () => {
192
211
  const kernel = makeKernel({
193
212
  featureDiscoverSpecs: vi.fn(async () => ({
194
- data: { specs: [{ feature_id: 'spec-feature-1' }] }
213
+ data: { specs: [{ feature_id: 'spec-feature-1' }] },
195
214
  })),
196
215
  featureStateGet: vi.fn(async () => ({
197
- data: { front_matter: { status: STATUS.QA } }
198
- }))
216
+ data: { front_matter: { status: STATUS.QA } },
217
+ })),
199
218
  });
200
219
  const handler = new ResumeCommandHandler();
201
- const result = await handler.execute(makeContext(kernel)) as any;
220
+ const result = (await handler.execute(makeContext(kernel))) as any;
202
221
 
203
222
  expect(result.ok).toBe(true);
204
223
  // spec-feature-1 is non-terminal, will be included (no supervisor to run it)
@@ -211,14 +230,14 @@ describe('ResumeCommandHandler', () => {
211
230
  owner_instance_id: 'owner-def',
212
231
  orchestrator_session_id: 'sess-1',
213
232
  orchestrator_epoch: 1,
214
- feature_sessions: { 'session-feature': { planner: 's1' } }
233
+ feature_sessions: { 'session-feature': { planner: 's1' } },
215
234
  })),
216
235
  featureStateGet: vi.fn(async () => ({
217
- data: { front_matter: { status: STATUS.PLANNING } }
218
- }))
236
+ data: { front_matter: { status: STATUS.PLANNING } },
237
+ })),
219
238
  });
220
239
  const handler = new ResumeCommandHandler();
221
- const result = await handler.execute(makeContext(kernel)) as any;
240
+ const result = (await handler.execute(makeContext(kernel))) as any;
222
241
 
223
242
  expect(result.ok).toBe(true);
224
243
  });
@@ -229,28 +248,36 @@ describe('ResumeCommandHandler additional branches', () => {
229
248
  const kernel = makeKernel({
230
249
  readIndex: vi.fn(async () => ({ active: ['feature_rtm'], blocked: [], blocked_queue: [] })),
231
250
  featureStateGet: vi.fn(async () => ({
232
- data: { front_matter: { status: STATUS.READY_TO_MERGE } }
233
- }))
251
+ data: { front_matter: { status: STATUS.READY_TO_MERGE } },
252
+ })),
234
253
  });
235
254
  const handler = new ResumeCommandHandler();
236
- const result = await handler.execute(makeContext(kernel)) as any;
255
+ const result = (await handler.execute(makeContext(kernel))) as any;
237
256
  expect(result.ok).toBe(true);
238
257
  // Feature is non-terminal, included → supervisor called → resumed: true
239
258
  expect(result.data.resumed).toBe(true);
240
- expect(result.data.resumed_features?.some((f: any) => f.resume_phase === STATUS.READY_TO_MERGE)).toBe(true);
259
+ expect(
260
+ result.data.resumed_features?.some((f: any) => f.resume_phase === STATUS.READY_TO_MERGE),
261
+ ).toBe(true);
241
262
  });
242
263
 
243
264
  it('GIVEN_feature_with_FAILED_status_WHEN_buildResumePlan_THEN_feature_excluded_as_terminal', async () => {
244
265
  const kernel = makeKernel({
245
- readIndex: vi.fn(async () => ({ active: ['feature_failed'], blocked: [], blocked_queue: [] })),
266
+ readIndex: vi.fn(async () => ({
267
+ active: ['feature_failed'],
268
+ blocked: [],
269
+ blocked_queue: [],
270
+ })),
246
271
  featureStateGet: vi.fn(async () => ({
247
- data: { front_matter: { status: STATUS.FAILED } }
248
- }))
272
+ data: { front_matter: { status: STATUS.FAILED } },
273
+ })),
249
274
  });
250
275
  const handler = new ResumeCommandHandler();
251
- const result = await handler.execute(makeContext(kernel)) as any;
276
+ const result = (await handler.execute(makeContext(kernel))) as any;
252
277
  expect(result.ok).toBe(true);
253
- expect(result.data.resume_plan?.features?.some((f: any) => f.feature_id === 'feature_failed')).toBe(false);
278
+ expect(
279
+ result.data.resume_plan?.features?.some((f: any) => f.feature_id === 'feature_failed'),
280
+ ).toBe(false);
254
281
  });
255
282
 
256
283
  it('GIVEN_runtime_sessions_with_real_run_id_WHEN_execute_THEN_uses_session_run_id_and_owner', async () => {
@@ -260,11 +287,11 @@ describe('ResumeCommandHandler additional branches', () => {
260
287
  owner_instance_id: 'owner:real',
261
288
  orchestrator_session_id: 'orch-sess',
262
289
  orchestrator_epoch: 1,
263
- feature_sessions: {}
264
- }))
290
+ feature_sessions: {},
291
+ })),
265
292
  });
266
293
  const handler = new ResumeCommandHandler();
267
- const result = await handler.execute(makeContext(kernel)) as any;
294
+ const result = (await handler.execute(makeContext(kernel))) as any;
268
295
  expect(result.ok).toBe(true);
269
296
  expect(result.data.resume_plan?.run_id).toBe('run:real-session');
270
297
  expect(result.data.resume_plan?.owner_instance_id).toBe('owner:real');
@@ -274,11 +301,11 @@ describe('ResumeCommandHandler additional branches', () => {
274
301
  const kernel = makeKernel({
275
302
  readIndex: vi.fn(async () => ({ active: ['feature_rtm'], blocked: [], blocked_queue: [] })),
276
303
  featureStateGet: vi.fn(async () => ({
277
- data: { front_matter: { status: STATUS.READY_TO_MERGE } }
278
- }))
304
+ data: { front_matter: { status: STATUS.READY_TO_MERGE } },
305
+ })),
279
306
  });
280
307
  const handler = new ResumeCommandHandler();
281
- const result = await handler.execute(makeContext(kernel)) as any;
308
+ const result = (await handler.execute(makeContext(kernel))) as any;
282
309
  expect(result.ok).toBe(true);
283
310
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
284
311
  const feature = features.find((f: any) => f.feature_id === 'feature_rtm');
@@ -289,11 +316,11 @@ describe('ResumeCommandHandler additional branches', () => {
289
316
  const kernel = makeKernel({
290
317
  readIndex: vi.fn(async () => ({ active: ['feature_unk'], blocked: [], blocked_queue: [] })),
291
318
  featureStateGet: vi.fn(async () => ({
292
- data: { front_matter: { status: 'some_unknown_status' } }
293
- }))
319
+ data: { front_matter: { status: 'some_unknown_status' } },
320
+ })),
294
321
  });
295
322
  const handler = new ResumeCommandHandler();
296
- const result = await handler.execute(makeContext(kernel)) as any;
323
+ const result = (await handler.execute(makeContext(kernel))) as any;
297
324
  expect(result.ok).toBe(true);
298
325
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
299
326
  const feature = features.find((f: any) => f.feature_id === 'feature_unk');
@@ -305,20 +332,24 @@ describe('ResumeCommandHandler additional branches', () => {
305
332
  readIndex: vi.fn(async () => ({ active: null, blocked: 42, blocked_queue: [] })),
306
333
  });
307
334
  const handler = new ResumeCommandHandler();
308
- const result = await handler.execute(makeContext(kernel)) as any;
335
+ const result = (await handler.execute(makeContext(kernel))) as any;
309
336
  expect(result.ok).toBe(true);
310
337
  expect(result.data.resumed).toBe(false);
311
338
  });
312
339
 
313
340
  it('GIVEN_index_active_with_non_string_items_WHEN_buildResumePlan_THEN_non_string_items_filtered', async () => {
314
341
  const kernel = makeKernel({
315
- readIndex: vi.fn(async () => ({ active: [42, null, 'feature_valid', ' '], blocked: [], blocked_queue: [] })),
342
+ readIndex: vi.fn(async () => ({
343
+ active: [42, null, 'feature_valid', ' '],
344
+ blocked: [],
345
+ blocked_queue: [],
346
+ })),
316
347
  featureStateGet: vi.fn(async () => ({
317
- data: { front_matter: { status: STATUS.PLANNING } }
318
- }))
348
+ data: { front_matter: { status: STATUS.PLANNING } },
349
+ })),
319
350
  });
320
351
  const handler = new ResumeCommandHandler();
321
- const result = await handler.execute(makeContext(kernel)) as any;
352
+ const result = (await handler.execute(makeContext(kernel))) as any;
322
353
  expect(result.ok).toBe(true);
323
354
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
324
355
  expect(features.some((f: any) => f.feature_id === 'feature_valid')).toBe(true);
@@ -330,14 +361,14 @@ describe('ResumeCommandHandler additional branches', () => {
330
361
  readIndex: vi.fn(async () => ({
331
362
  active: [],
332
363
  blocked: [],
333
- blocked_queue: [{ feature_id: '' }, { feature_id: 'valid_feature' }]
364
+ blocked_queue: [{ feature_id: '' }, { feature_id: 'valid_feature' }],
334
365
  })),
335
366
  featureStateGet: vi.fn(async () => ({
336
- data: { front_matter: { status: STATUS.PLANNING } }
337
- }))
367
+ data: { front_matter: { status: STATUS.PLANNING } },
368
+ })),
338
369
  });
339
370
  const handler = new ResumeCommandHandler();
340
- const result = await handler.execute(makeContext(kernel)) as any;
371
+ const result = (await handler.execute(makeContext(kernel))) as any;
341
372
  expect(result.ok).toBe(true);
342
373
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
343
374
  expect(features.some((f: any) => f.feature_id === 'valid_feature')).toBe(true);
@@ -348,13 +379,19 @@ describe('ResumeCommandHandler additional branches', () => {
348
379
  describe('ResumeCommandHandler phaseRank and addSource branches', () => {
349
380
  it('GIVEN_two_features_one_READY_TO_MERGE_WHEN_execute_THEN_phaseRank_called_with_ready_to_merge', async () => {
350
381
  const kernel = makeKernel({
351
- readIndex: vi.fn(async () => ({ active: ['feature_rtm', 'feature_qa'], blocked: [], blocked_queue: [] })),
382
+ readIndex: vi.fn(async () => ({
383
+ active: ['feature_rtm', 'feature_qa'],
384
+ blocked: [],
385
+ blocked_queue: [],
386
+ })),
352
387
  featureStateGet: vi.fn(async (featureId: string) => ({
353
- data: { front_matter: { status: featureId.includes('rtm') ? STATUS.READY_TO_MERGE : STATUS.QA } }
354
- }))
388
+ data: {
389
+ front_matter: { status: featureId.includes('rtm') ? STATUS.READY_TO_MERGE : STATUS.QA },
390
+ },
391
+ })),
355
392
  });
356
393
  const handler = new ResumeCommandHandler();
357
- const result = await handler.execute(makeContext(kernel)) as any;
394
+ const result = (await handler.execute(makeContext(kernel))) as any;
358
395
  expect(result.ok).toBe(true);
359
396
  const features = result.data.resumed_features ?? [];
360
397
  expect(features.length).toBe(2);
@@ -368,11 +405,11 @@ describe('ResumeCommandHandler phaseRank and addSource branches', () => {
368
405
  owner_instance_id: 'none',
369
406
  orchestrator_session_id: 'unknown',
370
407
  orchestrator_epoch: 0,
371
- feature_sessions: { '': 'session-x' }
372
- }))
408
+ feature_sessions: { '': 'session-x' },
409
+ })),
373
410
  });
374
411
  const handler = new ResumeCommandHandler();
375
- const result = await handler.execute(makeContext(kernel)) as any;
412
+ const result = (await handler.execute(makeContext(kernel))) as any;
376
413
  expect(result.ok).toBe(true);
377
414
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
378
415
  expect(features.every((f: any) => f.feature_id !== '')).toBe(true);
@@ -385,20 +422,24 @@ describe('ResumeCommandHandler phaseRank and addSource branches', () => {
385
422
  owner_instance_id: 'none',
386
423
  orchestrator_session_id: 'unknown',
387
424
  orchestrator_epoch: 0,
388
- feature_sessions: null
389
- }))
425
+ feature_sessions: null,
426
+ })),
390
427
  });
391
428
  const handler = new ResumeCommandHandler();
392
- const result = await handler.execute(makeContext(kernel)) as any;
429
+ const result = (await handler.execute(makeContext(kernel))) as any;
393
430
  expect(result.ok).toBe(true);
394
431
  });
395
432
 
396
433
  it('GIVEN_blocked_queue_with_non_string_feature_id_WHEN_execute_THEN_skips_entry', async () => {
397
434
  const kernel = makeKernel({
398
- readIndex: vi.fn(async () => ({ active: [], blocked: [], blocked_queue: [{ feature_id: 123 }, { feature_id: null }] }))
435
+ readIndex: vi.fn(async () => ({
436
+ active: [],
437
+ blocked: [],
438
+ blocked_queue: [{ feature_id: 123 }, { feature_id: null }],
439
+ })),
399
440
  });
400
441
  const handler = new ResumeCommandHandler();
401
- const result = await handler.execute(makeContext(kernel)) as any;
442
+ const result = (await handler.execute(makeContext(kernel))) as any;
402
443
  expect(result.ok).toBe(true);
403
444
  const features = result.data.resumed_features ?? result.data.resume_plan?.features ?? [];
404
445
  expect(features.length).toBe(0);