agentic-orchestrator 0.1.2 → 0.1.4

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 (300) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +126 -0
  3. package/README.md +166 -25
  4. package/agentic/orchestrator/adapters.yaml +3 -0
  5. package/agentic/orchestrator/gates.yaml +47 -0
  6. package/agentic/orchestrator/policy.yaml +89 -0
  7. package/agentic/orchestrator/schemas/adapters.schema.json +12 -0
  8. package/agentic/orchestrator/schemas/gates.schema.json +6 -1
  9. package/agentic/orchestrator/schemas/index.schema.json +14 -0
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +41 -0
  11. package/agentic/orchestrator/schemas/policy.schema.json +449 -52
  12. package/agentic/orchestrator/schemas/state.schema.json +16 -0
  13. package/agentic/orchestrator/tools/catalog.json +68 -0
  14. package/agentic/orchestrator/tools/schemas/input/cost.get.input.schema.json +10 -0
  15. package/agentic/orchestrator/tools/schemas/input/cost.record.input.schema.json +13 -0
  16. package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +11 -0
  17. package/agentic/orchestrator/tools/schemas/input/performance.get_analytics.input.schema.json +10 -0
  18. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +18 -0
  19. package/agentic/orchestrator/tools/schemas/output/cost.get.output.schema.json +13 -0
  20. package/agentic/orchestrator/tools/schemas/output/cost.record.output.schema.json +13 -0
  21. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +7 -0
  22. package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +23 -0
  23. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +46 -0
  24. package/agentic/orchestrator/tools/schemas/output/performance.record_outcome.output.schema.json +10 -0
  25. package/agentic/orchestrator/tools.md +5 -0
  26. package/apps/control-plane/scripts/validate-architecture-rules.mjs +28 -2
  27. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +12 -0
  28. package/apps/control-plane/scripts/validate-mcp-contracts.ts +92 -0
  29. package/apps/control-plane/src/application/adapters/adapter-registry.ts +169 -0
  30. package/apps/control-plane/src/application/multi-project-loader.ts +119 -0
  31. package/apps/control-plane/src/application/services/activity-monitor-service.ts +199 -0
  32. package/apps/control-plane/src/application/services/cost-tracking-service.ts +82 -0
  33. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +86 -0
  34. package/apps/control-plane/src/application/services/feature-deletion-service.ts +8 -7
  35. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +15 -0
  36. package/apps/control-plane/src/application/services/gate-service.ts +38 -2
  37. package/apps/control-plane/src/application/services/instance-isolation-service.ts +18 -0
  38. package/apps/control-plane/src/application/services/issue-tracker-service.ts +469 -0
  39. package/apps/control-plane/src/application/services/merge-service.ts +67 -3
  40. package/apps/control-plane/src/application/services/notifier-service.ts +295 -0
  41. package/apps/control-plane/src/application/services/performance-analytics-service.ts +122 -0
  42. package/apps/control-plane/src/application/services/plan-service.ts +51 -0
  43. package/apps/control-plane/src/application/services/pr-monitor-service.ts +262 -0
  44. package/apps/control-plane/src/application/services/reactions-service.ts +175 -0
  45. package/apps/control-plane/src/application/services/reporting-service.ts +17 -2
  46. package/apps/control-plane/src/application/services/run-lease-service.ts +16 -38
  47. package/apps/control-plane/src/application/tools/tool-metadata.ts +4 -1
  48. package/apps/control-plane/src/cli/aop.ts +1 -1
  49. package/apps/control-plane/src/cli/attach-command-handler.ts +120 -0
  50. package/apps/control-plane/src/cli/cleanup-command-handler.ts +190 -0
  51. package/apps/control-plane/src/cli/cli-argument-parser.ts +69 -3
  52. package/apps/control-plane/src/cli/dashboard-command-handler.ts +57 -0
  53. package/apps/control-plane/src/cli/help-command-handler.ts +163 -0
  54. package/apps/control-plane/src/cli/init-command-handler.ts +609 -0
  55. package/apps/control-plane/src/cli/resume-command-handler.ts +1 -0
  56. package/apps/control-plane/src/cli/retry-command-handler.ts +138 -0
  57. package/apps/control-plane/src/cli/run-command-handler.ts +115 -3
  58. package/apps/control-plane/src/cli/send-command-handler.ts +65 -0
  59. package/apps/control-plane/src/cli/status-command-handler.ts +102 -2
  60. package/apps/control-plane/src/cli/types.ts +26 -1
  61. package/apps/control-plane/src/core/constants.ts +8 -2
  62. package/apps/control-plane/src/core/error-codes.ts +3 -1
  63. package/apps/control-plane/src/core/gates.ts +170 -50
  64. package/apps/control-plane/src/core/kernel.ts +280 -5
  65. package/apps/control-plane/src/core/path-layout.ts +12 -0
  66. package/apps/control-plane/src/core/tool-caller.ts +36 -0
  67. package/apps/control-plane/src/core/workspace-hooks.ts +87 -0
  68. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +258 -9
  69. package/apps/control-plane/src/providers/providers.ts +235 -14
  70. package/apps/control-plane/src/supervisor/build-wave-executor.ts +129 -8
  71. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +123 -5
  72. package/apps/control-plane/src/supervisor/run-coordinator.ts +143 -6
  73. package/apps/control-plane/src/supervisor/runtime.ts +135 -6
  74. package/apps/control-plane/src/supervisor/types.ts +12 -21
  75. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +8 -0
  76. package/apps/control-plane/test/activity-monitor.spec.ts +294 -0
  77. package/apps/control-plane/test/adapter-registry.spec.ts +132 -0
  78. package/apps/control-plane/test/batch-operations.spec.ts +112 -0
  79. package/apps/control-plane/test/bootstrap-attach.spec.ts +102 -0
  80. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +252 -0
  81. package/apps/control-plane/test/bootstrap.spec.ts +560 -0
  82. package/apps/control-plane/test/cleanup-command.spec.ts +301 -0
  83. package/apps/control-plane/test/cli-helpers.spec.ts +404 -1
  84. package/apps/control-plane/test/cli.unit.spec.ts +182 -1
  85. package/apps/control-plane/test/collision-queue.spec.ts +104 -1
  86. package/apps/control-plane/test/core-utils.spec.ts +175 -2
  87. package/apps/control-plane/test/cost-tracking.spec.ts +143 -0
  88. package/apps/control-plane/test/dashboard-api.integration.spec.ts +247 -0
  89. package/apps/control-plane/test/dashboard-client.spec.ts +116 -0
  90. package/apps/control-plane/test/dashboard-command.spec.ts +103 -0
  91. package/apps/control-plane/test/dependency-scheduler.spec.ts +189 -0
  92. package/apps/control-plane/test/epoch-tracking.spec.ts +4 -4
  93. package/apps/control-plane/test/feature-deletion-service.spec.ts +422 -0
  94. package/apps/control-plane/test/feature-lifecycle.spec.ts +202 -0
  95. package/apps/control-plane/test/git-spawn-error.spec.ts +24 -0
  96. package/apps/control-plane/test/incremental-gates.spec.ts +137 -0
  97. package/apps/control-plane/test/init-wizard.spec.ts +506 -0
  98. package/apps/control-plane/test/instance-isolation.spec.ts +83 -0
  99. package/apps/control-plane/test/issue-tracker.spec.ts +890 -0
  100. package/apps/control-plane/test/kernel.coverage.spec.ts +3 -5
  101. package/apps/control-plane/test/kernel.coverage2.spec.ts +871 -0
  102. package/apps/control-plane/test/kernel.spec.ts +13 -11
  103. package/apps/control-plane/test/lock-service.spec.ts +508 -0
  104. package/apps/control-plane/test/mcp-helpers.spec.ts +176 -0
  105. package/apps/control-plane/test/mcp.spec.ts +50 -15
  106. package/apps/control-plane/test/merge-service.spec.ts +67 -4
  107. package/apps/control-plane/test/multi-project.spec.ts +372 -0
  108. package/apps/control-plane/test/notifier-service.spec.ts +388 -0
  109. package/apps/control-plane/test/parallel-gates.spec.ts +312 -0
  110. package/apps/control-plane/test/patch-service.spec.ts +253 -0
  111. package/apps/control-plane/test/performance-analytics.spec.ts +338 -0
  112. package/apps/control-plane/test/planning-wave-executor.spec.ts +168 -0
  113. package/apps/control-plane/test/pr-monitor.spec.ts +385 -0
  114. package/apps/control-plane/test/providers.spec.ts +344 -1
  115. package/apps/control-plane/test/reactions.spec.ts +392 -0
  116. package/apps/control-plane/test/resume-command.spec.ts +390 -0
  117. package/apps/control-plane/test/run-coordinator.spec.ts +481 -2
  118. package/apps/control-plane/test/schema-date-time.spec.ts +46 -0
  119. package/apps/control-plane/test/service-retry-paths.spec.ts +30 -0
  120. package/apps/control-plane/test/services.spec.ts +95 -2
  121. package/apps/control-plane/test/session-management.spec.ts +450 -0
  122. package/apps/control-plane/test/spec-ingestion.spec.ts +190 -0
  123. package/apps/control-plane/test/supervisor-collaborators.spec.ts +699 -2
  124. package/apps/control-plane/test/supervisor.spec.ts +36 -30
  125. package/apps/control-plane/test/supervisor.unit.spec.ts +405 -0
  126. package/apps/control-plane/test/worker-decision-loop.spec.ts +57 -0
  127. package/apps/control-plane/test/workspace-hooks.spec.ts +177 -0
  128. package/apps/control-plane/vitest.config.ts +21 -5
  129. package/dist/apps/control-plane/application/adapters/adapter-registry.d.ts +44 -0
  130. package/dist/apps/control-plane/application/adapters/adapter-registry.js +76 -0
  131. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -0
  132. package/dist/apps/control-plane/application/multi-project-loader.d.ts +31 -0
  133. package/dist/apps/control-plane/application/multi-project-loader.js +82 -0
  134. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -0
  135. package/dist/apps/control-plane/application/services/activity-monitor-service.d.ts +43 -0
  136. package/dist/apps/control-plane/application/services/activity-monitor-service.js +132 -0
  137. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -0
  138. package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +28 -0
  139. package/dist/apps/control-plane/application/services/cost-tracking-service.js +48 -0
  140. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -0
  141. package/dist/apps/control-plane/application/services/dependency-scheduler-service.d.ts +26 -0
  142. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js +75 -0
  143. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -0
  144. package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +2 -0
  145. package/dist/apps/control-plane/application/services/feature-deletion-service.js +6 -7
  146. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  147. package/dist/apps/control-plane/application/services/gate-interpolation-service.d.ts +7 -0
  148. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +7 -0
  149. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -0
  150. package/dist/apps/control-plane/application/services/gate-service.js +32 -2
  151. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  152. package/dist/apps/control-plane/application/services/instance-isolation-service.d.ts +11 -0
  153. package/dist/apps/control-plane/application/services/instance-isolation-service.js +17 -0
  154. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -0
  155. package/dist/apps/control-plane/application/services/issue-tracker-service.d.ts +65 -0
  156. package/dist/apps/control-plane/application/services/issue-tracker-service.js +358 -0
  157. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -0
  158. package/dist/apps/control-plane/application/services/merge-service.d.ts +4 -0
  159. package/dist/apps/control-plane/application/services/merge-service.js +44 -2
  160. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  161. package/dist/apps/control-plane/application/services/notifier-service.d.ts +74 -0
  162. package/dist/apps/control-plane/application/services/notifier-service.js +212 -0
  163. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -0
  164. package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +39 -0
  165. package/dist/apps/control-plane/application/services/performance-analytics-service.js +75 -0
  166. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -0
  167. package/dist/apps/control-plane/application/services/plan-service.d.ts +1 -0
  168. package/dist/apps/control-plane/application/services/plan-service.js +53 -0
  169. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  170. package/dist/apps/control-plane/application/services/pr-monitor-service.d.ts +44 -0
  171. package/dist/apps/control-plane/application/services/pr-monitor-service.js +192 -0
  172. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -0
  173. package/dist/apps/control-plane/application/services/reactions-service.d.ts +67 -0
  174. package/dist/apps/control-plane/application/services/reactions-service.js +114 -0
  175. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -0
  176. package/dist/apps/control-plane/application/services/reporting-service.d.ts +1 -0
  177. package/dist/apps/control-plane/application/services/reporting-service.js +13 -2
  178. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  179. package/dist/apps/control-plane/application/services/run-lease-service.d.ts +2 -0
  180. package/dist/apps/control-plane/application/services/run-lease-service.js +14 -38
  181. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  182. package/dist/apps/control-plane/application/tools/tool-metadata.js +3 -1
  183. package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
  184. package/dist/apps/control-plane/cli/aop.d.ts +1 -1
  185. package/dist/apps/control-plane/cli/aop.js +1 -1
  186. package/dist/apps/control-plane/cli/attach-command-handler.d.ts +12 -0
  187. package/dist/apps/control-plane/cli/attach-command-handler.js +98 -0
  188. package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -0
  189. package/dist/apps/control-plane/cli/cleanup-command-handler.d.ts +12 -0
  190. package/dist/apps/control-plane/cli/cleanup-command-handler.js +162 -0
  191. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -0
  192. package/dist/apps/control-plane/cli/cli-argument-parser.js +73 -3
  193. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  194. package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +7 -0
  195. package/dist/apps/control-plane/cli/dashboard-command-handler.js +45 -0
  196. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -0
  197. package/dist/apps/control-plane/cli/help-command-handler.d.ts +8 -0
  198. package/dist/apps/control-plane/cli/help-command-handler.js +146 -0
  199. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -0
  200. package/dist/apps/control-plane/cli/init-command-handler.d.ts +26 -0
  201. package/dist/apps/control-plane/cli/init-command-handler.js +517 -0
  202. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -0
  203. package/dist/apps/control-plane/cli/resume-command-handler.js +1 -1
  204. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  205. package/dist/apps/control-plane/cli/retry-command-handler.d.ts +8 -0
  206. package/dist/apps/control-plane/cli/retry-command-handler.js +111 -0
  207. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -0
  208. package/dist/apps/control-plane/cli/run-command-handler.d.ts +5 -0
  209. package/dist/apps/control-plane/cli/run-command-handler.js +82 -3
  210. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  211. package/dist/apps/control-plane/cli/send-command-handler.d.ts +8 -0
  212. package/dist/apps/control-plane/cli/send-command-handler.js +55 -0
  213. package/dist/apps/control-plane/cli/send-command-handler.js.map +1 -0
  214. package/dist/apps/control-plane/cli/status-command-handler.d.ts +12 -1
  215. package/dist/apps/control-plane/cli/status-command-handler.js +55 -2
  216. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  217. package/dist/apps/control-plane/cli/types.d.ts +26 -1
  218. package/dist/apps/control-plane/cli/types.js +15 -1
  219. package/dist/apps/control-plane/cli/types.js.map +1 -1
  220. package/dist/apps/control-plane/core/constants.d.ts +6 -0
  221. package/dist/apps/control-plane/core/constants.js +8 -2
  222. package/dist/apps/control-plane/core/constants.js.map +1 -1
  223. package/dist/apps/control-plane/core/error-codes.d.ts +2 -0
  224. package/dist/apps/control-plane/core/error-codes.js +3 -1
  225. package/dist/apps/control-plane/core/error-codes.js.map +1 -1
  226. package/dist/apps/control-plane/core/gates.d.ts +4 -0
  227. package/dist/apps/control-plane/core/gates.js +140 -43
  228. package/dist/apps/control-plane/core/gates.js.map +1 -1
  229. package/dist/apps/control-plane/core/kernel.d.ts +50 -1
  230. package/dist/apps/control-plane/core/kernel.js +220 -7
  231. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  232. package/dist/apps/control-plane/core/path-layout.d.ts +3 -0
  233. package/dist/apps/control-plane/core/path-layout.js +9 -0
  234. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  235. package/dist/apps/control-plane/core/tool-caller.d.ts +32 -0
  236. package/dist/apps/control-plane/core/tool-caller.js +2 -0
  237. package/dist/apps/control-plane/core/tool-caller.js.map +1 -0
  238. package/dist/apps/control-plane/core/workspace-hooks.d.ts +20 -0
  239. package/dist/apps/control-plane/core/workspace-hooks.js +69 -0
  240. package/dist/apps/control-plane/core/workspace-hooks.js.map +1 -0
  241. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +245 -9
  242. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  243. package/dist/apps/control-plane/providers/providers.d.ts +42 -3
  244. package/dist/apps/control-plane/providers/providers.js +216 -5
  245. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  246. package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +3 -0
  247. package/dist/apps/control-plane/supervisor/build-wave-executor.js +115 -6
  248. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  249. package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +3 -0
  250. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +109 -5
  251. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  252. package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +15 -0
  253. package/dist/apps/control-plane/supervisor/run-coordinator.js +132 -6
  254. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  255. package/dist/apps/control-plane/supervisor/runtime.d.ts +3 -0
  256. package/dist/apps/control-plane/supervisor/runtime.js +110 -6
  257. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  258. package/dist/apps/control-plane/supervisor/types.d.ts +9 -16
  259. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  260. package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +3 -0
  261. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +5 -0
  262. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  263. package/eslint.config.mjs +2 -1
  264. package/package.json +12 -2
  265. package/packages/web-dashboard/next-env.d.ts +5 -0
  266. package/packages/web-dashboard/next.config.js +7 -0
  267. package/packages/web-dashboard/package.json +26 -0
  268. package/packages/web-dashboard/src/app/api/actions/route.ts +64 -0
  269. package/packages/web-dashboard/src/app/api/events/route.ts +51 -0
  270. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +256 -0
  271. package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +10 -0
  272. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +25 -0
  273. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +63 -0
  274. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +16 -0
  275. package/packages/web-dashboard/src/app/api/projects/route.ts +31 -0
  276. package/packages/web-dashboard/src/app/api/status/route.ts +15 -0
  277. package/packages/web-dashboard/src/app/globals.css +2 -0
  278. package/packages/web-dashboard/src/app/layout.tsx +15 -0
  279. package/packages/web-dashboard/src/app/page.tsx +393 -0
  280. package/packages/web-dashboard/src/lib/aop-client.ts +244 -0
  281. package/packages/web-dashboard/src/lib/multi-project-config.ts +116 -0
  282. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +284 -0
  283. package/packages/web-dashboard/src/lib/types.ts +58 -0
  284. package/packages/web-dashboard/tsconfig.json +40 -0
  285. package/packages/web-dashboard/vitest.config.ts +6 -0
  286. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +1764 -0
  287. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +348 -0
  288. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +344 -0
  289. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +374 -0
  290. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +1059 -0
  291. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +466 -0
  292. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +198 -0
  293. package/spec-files/outstanding/agentic_orchestrator_validator_hardening_spec.md +365 -0
  294. package/spec-files/progress.md +481 -52
  295. /package/spec-files/{agentic_orchestrator_cli_delete_command_spec.md → completed/agentic_orchestrator_cli_delete_command_spec.md} +0 -0
  296. /package/spec-files/{agentic_orchestrator_dot_aop_generated_artifacts_spec.md → completed/agentic_orchestrator_dot_aop_generated_artifacts_spec.md} +0 -0
  297. /package/spec-files/{agentic_orchestrator_mcp_formalization_spec.md → completed/agentic_orchestrator_mcp_formalization_spec.md} +0 -0
  298. /package/spec-files/{agentic_orchestrator_oop_refactor_spec.md → completed/agentic_orchestrator_oop_refactor_spec.md} +0 -0
  299. /package/spec-files/{agentic_orchestrator_single_global_orchestrator_spec.md → completed/agentic_orchestrator_single_global_orchestrator_spec.md} +0 -0
  300. /package/spec-files/{agentic_orchestrator_spec.md → completed/agentic_orchestrator_spec.md} +0 -0
@@ -0,0 +1,392 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { ReactionsService } from '../src/application/services/reactions-service.js';
3
+ import type { GateRepairContext, ReactionsPolicy } from '../src/application/services/reactions-service.js';
4
+ import { TOOLS } from '../src/core/constants.js';
5
+
6
+ function makeToolCaller(statePatchFn?: () => Promise<Record<string, unknown>>) {
7
+ return {
8
+ callTool: vi.fn(async (_role: string, toolName: string, _args?: Record<string, unknown>) => {
9
+ if (toolName === TOOLS.FEATURE_STATE_GET) {
10
+ return { ok: true, data: { front_matter: { version: 1, status: 'qa', gate_retry_count: 0 } } };
11
+ }
12
+ if (toolName === TOOLS.FEATURE_STATE_PATCH) {
13
+ if (statePatchFn) {
14
+ await statePatchFn();
15
+ }
16
+ return { ok: true, data: { updated: true } };
17
+ }
18
+ return { ok: true, data: {} };
19
+ })
20
+ };
21
+ }
22
+
23
+ function makeNotifier() {
24
+ return {
25
+ notify: vi.fn(async () => undefined)
26
+ };
27
+ }
28
+
29
+ function makeEnabledPolicy(overrides: Partial<ReactionsPolicy['gate_failed']> = {}): ReactionsPolicy {
30
+ return {
31
+ gate_failed: {
32
+ enabled: true,
33
+ max_retries: 2,
34
+ action: 'retry_with_agent_repair',
35
+ escalate_after: 2,
36
+ retry_delay_ms: 30000,
37
+ ...overrides
38
+ }
39
+ };
40
+ }
41
+
42
+ describe('ReactionsService', () => {
43
+ it('GIVEN gate_failed reaction enabled WHEN gate fails THEN retry prompt injected', () => {
44
+ const toolCaller = makeToolCaller();
45
+ const service = new ReactionsService({
46
+ toolCaller: toolCaller as never,
47
+ policy: makeEnabledPolicy()
48
+ });
49
+
50
+ const ctx: GateRepairContext = {
51
+ featureId: 'feature_a',
52
+ gateName: 'full',
53
+ exitCode: 1,
54
+ logs: 'Test run failed',
55
+ evidenceSummary: '.aop/features/feature_a/evidence/full.json',
56
+ retryCount: 0
57
+ };
58
+
59
+ const shouldRetry = service.shouldRetry('feature_a', 0);
60
+ const prompt = service.buildRepairPrompt(ctx);
61
+
62
+ expect(shouldRetry).toBe(true);
63
+ expect(prompt).toContain('Gate execution failed');
64
+ expect(prompt).toContain('Gate: full');
65
+ expect(prompt).toContain('Test run failed');
66
+ });
67
+
68
+ it('GIVEN max_retries exceeded WHEN gate fails THEN escalation notification sent', async () => {
69
+ const toolCaller = makeToolCaller();
70
+ const notifier = makeNotifier();
71
+ const service = new ReactionsService({
72
+ toolCaller: toolCaller as never,
73
+ notifier: notifier as never,
74
+ policy: makeEnabledPolicy({ max_retries: 2, escalate_after: 2 })
75
+ });
76
+
77
+ const ctx: GateRepairContext = {
78
+ featureId: 'feature_b',
79
+ gateName: 'full',
80
+ exitCode: 1,
81
+ logs: 'error',
82
+ evidenceSummary: '',
83
+ retryCount: 2
84
+ };
85
+
86
+ const shouldEscalate = service.shouldEscalate(2);
87
+ await service.notifyEscalation('feature_b', ctx);
88
+
89
+ expect(shouldEscalate).toBe(true);
90
+ expect(notifier.notify).toHaveBeenCalledWith(
91
+ 'gate_failed',
92
+ expect.objectContaining({ feature_id: 'feature_b' })
93
+ );
94
+ });
95
+
96
+ it('GIVEN gate_failed reaction disabled WHEN gate fails THEN no retry attempted', () => {
97
+ const toolCaller = makeToolCaller();
98
+ const service = new ReactionsService({
99
+ toolCaller: toolCaller as never,
100
+ policy: {
101
+ gate_failed: {
102
+ enabled: false,
103
+ max_retries: 2,
104
+ action: 'retry_with_agent_repair',
105
+ escalate_after: 2,
106
+ retry_delay_ms: 30000
107
+ }
108
+ }
109
+ });
110
+
111
+ const shouldRetry = service.shouldRetry('feature_c', 0);
112
+ expect(shouldRetry).toBe(false);
113
+ });
114
+
115
+ it('GIVEN retry succeeds WHEN second gate run passes THEN retry count recorded', async () => {
116
+ let patchCallCount = 0;
117
+ const toolCaller = makeToolCaller(() => {
118
+ patchCallCount++;
119
+ return Promise.resolve({});
120
+ });
121
+ const service = new ReactionsService({
122
+ toolCaller: toolCaller as never,
123
+ policy: makeEnabledPolicy()
124
+ });
125
+
126
+ await service.recordRetry('feature_d', 1);
127
+
128
+ expect(patchCallCount).toBe(1);
129
+ const patchCall = toolCaller.callTool.mock.calls.find(([, tool]) => tool === TOOLS.FEATURE_STATE_PATCH);
130
+ expect(patchCall).toBeDefined();
131
+ const patchArgs = patchCall?.[2] ?? {};
132
+ const patch = (patchArgs['patch'] ?? {}) as Record<string, unknown>;
133
+ const frontMatter = (patch['front_matter'] ?? {}) as Record<string, unknown>;
134
+ expect(frontMatter.gate_retry_count).toBe(1);
135
+ });
136
+
137
+ it('GIVEN force flag WHEN aop retry called THEN gate_retry_count reset to 0', async () => {
138
+ const toolCaller = makeToolCaller();
139
+ const service = new ReactionsService({
140
+ toolCaller: toolCaller as never,
141
+ policy: makeEnabledPolicy()
142
+ });
143
+
144
+ // Simulate force reset by calling recordRetry with 0
145
+ await service.recordRetry('feature_e', 0);
146
+
147
+ const patchCall = toolCaller.callTool.mock.calls.find(([, tool]) => tool === TOOLS.FEATURE_STATE_PATCH);
148
+ expect(patchCall).toBeDefined();
149
+ const patchArgs = patchCall?.[2] ?? {};
150
+ const patch = (patchArgs['patch'] ?? {}) as Record<string, unknown>;
151
+ const frontMatter = (patch['front_matter'] ?? {}) as Record<string, unknown>;
152
+ expect(frontMatter.gate_retry_count).toBe(0);
153
+ });
154
+
155
+ it('GIVEN escalate_after=2 WHEN 3rd failure THEN notification sent to critical channels', async () => {
156
+ const toolCaller = makeToolCaller();
157
+ const notifier = makeNotifier();
158
+ const service = new ReactionsService({
159
+ toolCaller: toolCaller as never,
160
+ notifier: notifier as never,
161
+ policy: makeEnabledPolicy({ escalate_after: 2 })
162
+ });
163
+
164
+ const shouldEscalateAt2 = service.shouldEscalate(2);
165
+ const shouldEscalateAt3 = service.shouldEscalate(3);
166
+ const shouldNotEscalateAt1 = service.shouldEscalate(1);
167
+
168
+ expect(shouldEscalateAt2).toBe(true);
169
+ expect(shouldEscalateAt3).toBe(true);
170
+ expect(shouldNotEscalateAt1).toBe(false);
171
+
172
+ const ctx: GateRepairContext = {
173
+ featureId: 'feature_f',
174
+ gateName: 'full',
175
+ exitCode: 1,
176
+ logs: 'failed',
177
+ evidenceSummary: 'no evidence',
178
+ retryCount: 2
179
+ };
180
+ await service.notifyEscalation('feature_f', ctx);
181
+ expect(notifier.notify).toHaveBeenCalledOnce();
182
+ });
183
+
184
+ it('GIVEN reactions service WHEN buildRepairPrompt called THEN prompt contains gate name/logs/evidence', () => {
185
+ const toolCaller = makeToolCaller();
186
+ const service = new ReactionsService({
187
+ toolCaller: toolCaller as never,
188
+ policy: makeEnabledPolicy()
189
+ });
190
+
191
+ const ctx: GateRepairContext = {
192
+ featureId: 'feature_g',
193
+ gateName: 'fast',
194
+ exitCode: 2,
195
+ logs: 'compilation error on line 42',
196
+ evidenceSummary: 'build-fast.json summary',
197
+ retryCount: 1
198
+ };
199
+
200
+ const prompt = service.buildRepairPrompt(ctx);
201
+
202
+ expect(prompt).toContain('Gate: fast');
203
+ expect(prompt).toContain('Exit Code: 2');
204
+ expect(prompt).toContain('compilation error on line 42');
205
+ expect(prompt).toContain('build-fast.json summary');
206
+ expect(prompt).toContain('Retry: 2 of 2');
207
+ });
208
+
209
+ it('GIVEN policy undefined WHEN reactions service created THEN defaults applied (disabled)', () => {
210
+ const toolCaller = makeToolCaller();
211
+ const service = new ReactionsService({
212
+ toolCaller: toolCaller as never
213
+ });
214
+
215
+ const shouldRetry = service.shouldRetry('feature_h', 0);
216
+ const shouldEscalate = service.shouldEscalate(0);
217
+
218
+ expect(shouldRetry).toBe(false);
219
+ // Default escalate_after is 2, so at count 0 should NOT escalate
220
+ expect(shouldEscalate).toBe(false);
221
+ });
222
+
223
+ it('GIVEN notify_only action WHEN shouldRetry called THEN returns false', () => {
224
+ const toolCaller = makeToolCaller();
225
+ const service = new ReactionsService({
226
+ toolCaller: toolCaller as never,
227
+ policy: {
228
+ gate_failed: {
229
+ enabled: true,
230
+ max_retries: 3,
231
+ action: 'notify_only',
232
+ escalate_after: 2,
233
+ retry_delay_ms: 5000
234
+ }
235
+ }
236
+ });
237
+
238
+ const shouldRetry = service.shouldRetry('feature_i', 0);
239
+ expect(shouldRetry).toBe(false);
240
+ });
241
+
242
+ it('GIVEN_no_notifier_WHEN_notifyEscalation_called_THEN_returns_without_error', async () => {
243
+ const toolCaller = makeToolCaller();
244
+ const service = new ReactionsService({
245
+ toolCaller: toolCaller as never,
246
+ policy: makeEnabledPolicy()
247
+ // no notifier provided
248
+ });
249
+
250
+ const ctx: GateRepairContext = {
251
+ featureId: 'feature_z',
252
+ gateName: 'full',
253
+ exitCode: 1,
254
+ logs: 'error log',
255
+ evidenceSummary: 'no evidence',
256
+ retryCount: 3
257
+ };
258
+
259
+ // notifier is undefined → early return, no notification sent
260
+ await expect(service.notifyEscalation('feature_z', ctx)).resolves.toBeUndefined();
261
+ });
262
+ });
263
+
264
+ describe('ReactionsService branch coverage', () => {
265
+ it('GIVEN_policy_with_retry_delay_ms_WHEN_retryDelayMs_called_THEN_returns_configured_value', () => {
266
+ const service = new ReactionsService({
267
+ toolCaller: makeToolCaller(),
268
+ policy: makeEnabledPolicy({ retry_delay_ms: 5000 })
269
+ });
270
+ expect(service.retryDelayMs()).toBe(5000);
271
+ });
272
+
273
+ it('GIVEN_policy_with_invalid_retry_delay_ms_WHEN_retryDelayMs_called_THEN_returns_default', () => {
274
+ const service = new ReactionsService({
275
+ toolCaller: makeToolCaller(),
276
+ policy: makeEnabledPolicy({ retry_delay_ms: -1 })
277
+ });
278
+ // Negative → falls through to default (30000)
279
+ expect(service.retryDelayMs()).toBe(30000);
280
+ });
281
+
282
+ it('GIVEN_policy_with_max_retries_WHEN_maxRetries_called_THEN_returns_configured_value', () => {
283
+ const service = new ReactionsService({
284
+ toolCaller: makeToolCaller(),
285
+ policy: makeEnabledPolicy({ max_retries: 5 })
286
+ });
287
+ expect(service.maxRetries()).toBe(5);
288
+ });
289
+
290
+ it('GIVEN_no_policy_WHEN_maxRetries_called_THEN_returns_default', () => {
291
+ const service = new ReactionsService({
292
+ toolCaller: makeToolCaller(),
293
+ policy: {}
294
+ });
295
+ expect(service.maxRetries()).toBeGreaterThanOrEqual(0);
296
+ });
297
+
298
+ it('GIVEN_delay_ms_zero_WHEN_waitBeforeRetry_called_THEN_resolves_immediately', async () => {
299
+ const service = new ReactionsService({
300
+ toolCaller: makeToolCaller(),
301
+ policy: makeEnabledPolicy({ retry_delay_ms: 0 })
302
+ });
303
+ await expect(service.waitBeforeRetry()).resolves.toBeUndefined();
304
+ });
305
+
306
+ it('GIVEN_delay_ms_positive_WHEN_waitBeforeRetry_called_THEN_waits_then_resolves', async () => {
307
+ vi.useFakeTimers();
308
+ const service = new ReactionsService({
309
+ toolCaller: makeToolCaller(),
310
+ policy: makeEnabledPolicy({ retry_delay_ms: 1000 })
311
+ });
312
+ const waitPromise = service.waitBeforeRetry();
313
+ vi.advanceTimersByTime(1001);
314
+ await waitPromise;
315
+ vi.useRealTimers();
316
+ });
317
+
318
+ it('GIVEN_buildRepairPrompt_with_empty_failure_history_WHEN_called_THEN_shows_none', () => {
319
+ const service = new ReactionsService({
320
+ toolCaller: makeToolCaller(),
321
+ policy: makeEnabledPolicy()
322
+ });
323
+ const ctx: GateRepairContext = {
324
+ gateName: 'unit-tests',
325
+ exitCode: 1,
326
+ logs: 'test output',
327
+ evidenceSummary: 'summary',
328
+ retryCount: 0
329
+ };
330
+ const prompt = service.buildRepairPrompt(ctx);
331
+ expect(prompt).toContain('(none)');
332
+ });
333
+ });
334
+
335
+ describe('ReactionsService additional coverage', () => {
336
+ it('GIVEN_policy_with_valid_max_retries_number_WHEN_maxRetries_called_THEN_returns_floor_of_value', () => {
337
+ const service = new ReactionsService({
338
+ toolCaller: makeToolCaller(),
339
+ policy: { gate_failed: { enabled: true, action: 'retry_with_agent_repair', max_retries: 3.7, retry_delay_ms: 0 } }
340
+ });
341
+ expect(service.maxRetries()).toBe(3);
342
+ });
343
+
344
+ it('GIVEN_non_finite_max_retries_WHEN_maxRetries_called_THEN_returns_default', () => {
345
+ const service = new ReactionsService({
346
+ toolCaller: makeToolCaller(),
347
+ policy: { gate_failed: { enabled: true, action: 'retry_with_agent_repair', max_retries: Infinity, retry_delay_ms: 0 } }
348
+ });
349
+ expect(service.maxRetries()).toBeGreaterThanOrEqual(0);
350
+ });
351
+
352
+ it('GIVEN_failure_history_with_items_WHEN_buildRepairPrompt_called_THEN_shows_history', () => {
353
+ const service = new ReactionsService({
354
+ toolCaller: makeToolCaller(),
355
+ policy: makeEnabledPolicy()
356
+ });
357
+ const ctx: GateRepairContext = {
358
+ featureId: 'feat_hist',
359
+ gateName: 'fast',
360
+ exitCode: 1,
361
+ logs: 'some logs',
362
+ evidenceSummary: 'summary',
363
+ retryCount: 1,
364
+ failureHistory: [
365
+ { attempt: 1, gate_name: 'fast', exit_code: 1, evidence_summary: 'ev1', logs_excerpt: 'log1', failed_at: new Date().toISOString(), retry_delay_ms: 1000 }
366
+ ]
367
+ };
368
+ const prompt = service.buildRepairPrompt(ctx);
369
+ expect(prompt).toContain('attempt=1');
370
+ expect(prompt).toContain('gate=fast');
371
+ });
372
+
373
+ it('GIVEN_evidence_summary_empty_in_history_WHEN_buildRepairPrompt_called_THEN_shows_n_a', () => {
374
+ const service = new ReactionsService({
375
+ toolCaller: makeToolCaller(),
376
+ policy: makeEnabledPolicy()
377
+ });
378
+ const ctx: GateRepairContext = {
379
+ featureId: 'feat_hist2',
380
+ gateName: 'fast',
381
+ exitCode: 1,
382
+ logs: '',
383
+ evidenceSummary: '',
384
+ retryCount: 1,
385
+ failureHistory: [
386
+ { attempt: 1, gate_name: 'fast', exit_code: 1, evidence_summary: '', logs_excerpt: '', failed_at: new Date().toISOString() }
387
+ ]
388
+ };
389
+ const prompt = service.buildRepairPrompt(ctx);
390
+ expect(prompt).toContain('n/a');
391
+ });
392
+ });