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,116 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import YAML from 'yaml';
5
+
6
+ const MULTI_PROJECT_CONFIG_PATH = ['agentic', 'orchestrator', 'multi-project.yaml'] as const;
7
+
8
+ export interface MultiProjectDashboardConfig {
9
+ defaults?: {
10
+ max_active_features?: number;
11
+ max_parallel_gate_runs?: number;
12
+ dashboard_port?: number;
13
+ default_project?: string;
14
+ policy?: string;
15
+ gates?: string;
16
+ notifications?: { enabled?: boolean };
17
+ };
18
+ projects: Array<{
19
+ name: string;
20
+ path: string;
21
+ policy?: string;
22
+ gates?: string;
23
+ dashboard_port?: number;
24
+ }>;
25
+ }
26
+
27
+ function resolveHomePath(rawPath: string): string {
28
+ if (rawPath.startsWith('~/') || rawPath === '~') {
29
+ return path.join(os.homedir(), rawPath.slice(1));
30
+ }
31
+ return rawPath;
32
+ }
33
+
34
+ function resolveConfiguredPath(rawPath: string, baseDir: string): string {
35
+ const expanded = resolveHomePath(rawPath);
36
+ if (path.isAbsolute(expanded)) {
37
+ return expanded;
38
+ }
39
+ return path.resolve(baseDir, expanded);
40
+ }
41
+
42
+ function parseConfig(raw: string, repoRoot: string): MultiProjectDashboardConfig | null {
43
+ const parsed = YAML.parse(raw) as unknown;
44
+ if (!parsed || typeof parsed !== 'object') {
45
+ return null;
46
+ }
47
+
48
+ const candidate = parsed as {
49
+ defaults?: MultiProjectDashboardConfig['defaults'];
50
+ projects?: Array<{
51
+ name?: unknown;
52
+ path?: unknown;
53
+ policy?: unknown;
54
+ gates?: unknown;
55
+ dashboard_port?: unknown;
56
+ }>;
57
+ };
58
+
59
+ if (!Array.isArray(candidate.projects)) {
60
+ return null;
61
+ }
62
+
63
+ const projects = candidate.projects
64
+ .filter((project) => typeof project.name === 'string' && typeof project.path === 'string')
65
+ .map((project) => {
66
+ const absoluteProjectPath = resolveConfiguredPath(project.path as string, repoRoot);
67
+ const policyPath =
68
+ typeof project.policy === 'string'
69
+ ? resolveConfiguredPath(project.policy, absoluteProjectPath)
70
+ : undefined;
71
+ const gatesPath =
72
+ typeof project.gates === 'string'
73
+ ? resolveConfiguredPath(project.gates, absoluteProjectPath)
74
+ : undefined;
75
+
76
+ return {
77
+ name: project.name as string,
78
+ path: absoluteProjectPath,
79
+ policy: policyPath,
80
+ gates: gatesPath,
81
+ dashboard_port: typeof project.dashboard_port === 'number' ? project.dashboard_port : undefined
82
+ };
83
+ });
84
+
85
+ return {
86
+ defaults: candidate.defaults,
87
+ projects
88
+ };
89
+ }
90
+
91
+ export async function readMultiProjectConfig(repoRoot: string): Promise<MultiProjectDashboardConfig | null> {
92
+ const configPath = path.join(repoRoot, ...MULTI_PROJECT_CONFIG_PATH);
93
+ try {
94
+ const raw = await readFile(configPath, 'utf8');
95
+ return parseConfig(raw, repoRoot);
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
100
+
101
+ export async function multiProjectConfigExists(repoRoot: string): Promise<boolean> {
102
+ const configPath = path.join(repoRoot, ...MULTI_PROJECT_CONFIG_PATH);
103
+ try {
104
+ await access(configPath);
105
+ return true;
106
+ } catch {
107
+ return false;
108
+ }
109
+ }
110
+
111
+ export function getProjectByName(
112
+ config: MultiProjectDashboardConfig,
113
+ name: string
114
+ ): MultiProjectDashboardConfig['projects'][number] | null {
115
+ return config.projects.find((project) => project.name === name) ?? null;
116
+ }
@@ -0,0 +1,284 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { getAopRoot } from './aop-client';
5
+
6
+ const STATUS = {
7
+ BLOCKED: 'blocked'
8
+ } as const;
9
+
10
+ const TOOLS = {
11
+ FEATURE_READY_TO_MERGE: 'feature.ready_to_merge',
12
+ FEATURE_STATE_GET: 'feature.state_get',
13
+ FEATURE_STATE_PATCH: 'feature.state_patch',
14
+ FEATURE_LOG_APPEND: 'feature.log_append',
15
+ FEATURE_SEND_MESSAGE: 'feature.send_message'
16
+ } as const;
17
+
18
+ interface ToolResponse<TData = Record<string, unknown>> {
19
+ ok: boolean;
20
+ data?: TData;
21
+ error?: {
22
+ code?: string;
23
+ message?: string;
24
+ details?: Record<string, unknown>;
25
+ };
26
+ }
27
+
28
+ interface ToolClientIdentity {
29
+ run_id: string;
30
+ actor_type: string;
31
+ actor_id: string;
32
+ session_id: string;
33
+ }
34
+
35
+ interface ToolClient {
36
+ call(toolName: string, args: Record<string, unknown>, identity: ToolClientIdentity): Promise<ToolResponse>;
37
+ }
38
+
39
+ interface ToolingRuntime {
40
+ inProcessClient: ToolClient;
41
+ }
42
+
43
+ interface KernelLike {
44
+ ensureLoaded(): Promise<void>;
45
+ setProvider(provider: unknown): void;
46
+ getAgentsConfig?: () => unknown;
47
+ }
48
+
49
+ interface RuntimeBridge {
50
+ AopKernel: new (repoRoot: string) => KernelLike;
51
+ NullWorkerProvider: new (selection: unknown) => unknown;
52
+ resolveProviderSelection: (input: { cli: Record<string, string | undefined>; env: NodeJS.ProcessEnv; agentsConfig?: unknown }) => unknown;
53
+ createToolingRuntime: (
54
+ repoRoot: string,
55
+ kernel: KernelLike,
56
+ options: { generateToolsMarkdown: boolean }
57
+ ) => Promise<ToolingRuntime>;
58
+ createOperationId?: (toolName: string, featureId?: string) => string;
59
+ }
60
+
61
+ interface DashboardToolRuntime {
62
+ client: ToolClient;
63
+ createOperationId: (toolName: string, featureId?: string) => string;
64
+ }
65
+
66
+ const runtimeCacheByRoot = new Map<string, DashboardToolRuntime>();
67
+ let runtimeBridgePromise: Promise<RuntimeBridge> | null = null;
68
+
69
+ function makeClaims(): ToolClientIdentity {
70
+ const stamp = Date.now();
71
+ return {
72
+ run_id: `run:dashboard:${stamp}`,
73
+ actor_type: 'orchestrator',
74
+ actor_id: 'dashboard',
75
+ session_id: `dashboard:${randomUUID()}`
76
+ };
77
+ }
78
+
79
+ function defaultCreateOperationId(toolName: string, featureId?: string): string {
80
+ const parts = [toolName.replace(/[^a-zA-Z0-9]/g, '_')];
81
+ if (featureId) {
82
+ parts.push(featureId.replace(/[^a-zA-Z0-9_-]/g, '_'));
83
+ }
84
+ parts.push(randomUUID());
85
+ return parts.join('__');
86
+ }
87
+
88
+ function normalizeError(error: unknown, fallbackCode = 'internal_error'): ToolResponse {
89
+ if (error && typeof error === 'object') {
90
+ const maybe = error as { code?: unknown; message?: unknown; details?: unknown };
91
+ return {
92
+ ok: false,
93
+ error: {
94
+ code: typeof maybe.code === 'string' ? maybe.code : fallbackCode,
95
+ message: typeof maybe.message === 'string' ? maybe.message : 'Operation failed',
96
+ details: maybe.details && typeof maybe.details === 'object' ? (maybe.details as Record<string, unknown>) : undefined
97
+ }
98
+ };
99
+ }
100
+ return {
101
+ ok: false,
102
+ error: {
103
+ code: fallbackCode,
104
+ message: typeof error === 'string' ? error : 'Operation failed'
105
+ }
106
+ };
107
+ }
108
+
109
+ async function loadRuntimeBridge(): Promise<RuntimeBridge> {
110
+ if (runtimeBridgePromise) {
111
+ return runtimeBridgePromise;
112
+ }
113
+
114
+ runtimeBridgePromise = (async () => {
115
+ const modulePath = path.join(getAopRoot(), 'dist', 'apps', 'control-plane', 'index.js');
116
+ const moduleUrl = pathToFileURL(modulePath).href;
117
+ const loaded = (await import(/* webpackIgnore: true */ moduleUrl)) as Partial<RuntimeBridge>;
118
+ if (
119
+ typeof loaded.AopKernel !== 'function' ||
120
+ typeof loaded.NullWorkerProvider !== 'function' ||
121
+ typeof loaded.resolveProviderSelection !== 'function' ||
122
+ typeof loaded.createToolingRuntime !== 'function'
123
+ ) {
124
+ throw new Error(`Control-plane runtime exports unavailable from ${modulePath}`);
125
+ }
126
+ return loaded as RuntimeBridge;
127
+ })();
128
+
129
+ return runtimeBridgePromise;
130
+ }
131
+
132
+ async function getRuntime(repoRoot: string): Promise<DashboardToolRuntime> {
133
+ const cached = runtimeCacheByRoot.get(repoRoot);
134
+ if (cached) {
135
+ return cached;
136
+ }
137
+
138
+ const bridge = await loadRuntimeBridge();
139
+ const kernel = new bridge.AopKernel(repoRoot);
140
+ await kernel.ensureLoaded();
141
+
142
+ try {
143
+ const agentsConfig = typeof kernel.getAgentsConfig === 'function' ? kernel.getAgentsConfig() : undefined;
144
+ const selection = bridge.resolveProviderSelection({
145
+ cli: {},
146
+ env: process.env,
147
+ agentsConfig
148
+ });
149
+ kernel.setProvider(new bridge.NullWorkerProvider(selection));
150
+ } catch {
151
+ kernel.setProvider(
152
+ new bridge.NullWorkerProvider({
153
+ provider: 'custom',
154
+ model: 'dashboard-default',
155
+ provider_config_env: null,
156
+ provider_config_ref: null
157
+ })
158
+ );
159
+ }
160
+
161
+ const tooling = await bridge.createToolingRuntime(repoRoot, kernel, { generateToolsMarkdown: false });
162
+ const runtime = {
163
+ client: tooling.inProcessClient,
164
+ createOperationId: bridge.createOperationId ?? defaultCreateOperationId
165
+ };
166
+ runtimeCacheByRoot.set(repoRoot, runtime);
167
+ return runtime;
168
+ }
169
+
170
+ export async function callOrchestratorTool<TData = Record<string, unknown>>(
171
+ toolName: string,
172
+ args: Record<string, unknown>,
173
+ options: { mutating?: boolean; featureId?: string; repoRoot?: string } = {}
174
+ ): Promise<ToolResponse<TData>> {
175
+ try {
176
+ const repoRoot = options.repoRoot ?? getAopRoot();
177
+ const runtime = await getRuntime(repoRoot);
178
+ const claims = makeClaims();
179
+ const payload: Record<string, unknown> = { ...args };
180
+
181
+ if (options.mutating) {
182
+ payload.operation_id = runtime.createOperationId(toolName, options.featureId);
183
+ }
184
+
185
+ return (await runtime.client.call(toolName, payload, claims)) as ToolResponse<TData>;
186
+ } catch (error) {
187
+ return normalizeError(error, 'runtime_unavailable') as ToolResponse<TData>;
188
+ }
189
+ }
190
+
191
+ export async function approveFeatureReview(
192
+ featureId: string,
193
+ approvalToken: string,
194
+ mergeStrategy = 'merge_commit',
195
+ commitMessage?: string,
196
+ repoRoot?: string
197
+ ): Promise<ToolResponse> {
198
+ return await callOrchestratorTool(
199
+ TOOLS.FEATURE_READY_TO_MERGE,
200
+ {
201
+ feature_id: featureId,
202
+ commit_message: commitMessage ?? `feat(${featureId}): merge via dashboard approval`,
203
+ merge_strategy: mergeStrategy,
204
+ user_approval_token: approvalToken
205
+ },
206
+ { mutating: true, featureId, repoRoot }
207
+ );
208
+ }
209
+
210
+ export async function denyFeatureReview(featureId: string, reason: string, repoRoot?: string): Promise<ToolResponse> {
211
+ const state = await callOrchestratorTool<{ front_matter: { version: number } }>(
212
+ TOOLS.FEATURE_STATE_GET,
213
+ { feature_id: featureId },
214
+ { repoRoot }
215
+ );
216
+ if (!state.ok || !state.data) {
217
+ return state;
218
+ }
219
+
220
+ const expectedVersion = state.data.front_matter.version;
221
+ const patchResult = await callOrchestratorTool(
222
+ TOOLS.FEATURE_STATE_PATCH,
223
+ {
224
+ feature_id: featureId,
225
+ expected_version: expectedVersion,
226
+ patch: {
227
+ front_matter: {
228
+ status: STATUS.BLOCKED,
229
+ status_reason: `Dashboard review denied: ${reason}`
230
+ }
231
+ }
232
+ },
233
+ { mutating: true, featureId, repoRoot }
234
+ );
235
+ if (!patchResult.ok) {
236
+ return patchResult;
237
+ }
238
+
239
+ await callOrchestratorTool(
240
+ TOOLS.FEATURE_LOG_APPEND,
241
+ {
242
+ feature_id: featureId,
243
+ note: JSON.stringify({
244
+ type: 'dashboard_review',
245
+ decision: 'deny',
246
+ reason,
247
+ reviewed_at: new Date().toISOString()
248
+ })
249
+ },
250
+ { mutating: true, featureId, repoRoot }
251
+ );
252
+
253
+ return patchResult;
254
+ }
255
+
256
+ export async function requestFeatureChanges(featureId: string, message: string, repoRoot?: string): Promise<ToolResponse> {
257
+ const normalized = message.trim().length > 0 ? message.trim() : 'Please address reviewer feedback and re-run QA.';
258
+ const send = await callOrchestratorTool(
259
+ TOOLS.FEATURE_SEND_MESSAGE,
260
+ {
261
+ feature_id: featureId,
262
+ message: `Reviewer requested changes:\n${normalized}`
263
+ },
264
+ { mutating: true, featureId, repoRoot }
265
+ );
266
+ if (send.ok) {
267
+ return send;
268
+ }
269
+
270
+ return await callOrchestratorTool(
271
+ TOOLS.FEATURE_LOG_APPEND,
272
+ {
273
+ feature_id: featureId,
274
+ note: JSON.stringify({
275
+ type: 'dashboard_review',
276
+ decision: 'request_changes',
277
+ message: normalized,
278
+ reviewed_at: new Date().toISOString(),
279
+ dispatch_fallback: true
280
+ })
281
+ },
282
+ { mutating: true, featureId, repoRoot }
283
+ );
284
+ }
@@ -0,0 +1,58 @@
1
+ export interface FeatureSummary {
2
+ id: string;
3
+ feature_id: string;
4
+ status: string;
5
+ phase?: 'planning' | 'building' | 'qa' | 'ready_to_merge' | 'merged' | 'blocked' | 'unknown';
6
+ plan_version?: number;
7
+ locks_held?: string[];
8
+ gate_profile?: string;
9
+ branch?: string | null;
10
+ worktree_path?: string | null;
11
+ last_updated?: string;
12
+ status_reason?: string;
13
+ activity_state?: 'active' | 'idle' | 'waiting_input' | 'blocked' | 'exited' | 'unknown';
14
+ activity_last_event_at?: string;
15
+ activity_detected_via?: 'jsonl' | 'ledger' | 'process' | 'unknown';
16
+ pr?: {
17
+ number?: number;
18
+ url?: string;
19
+ ci_status?: string;
20
+ review_decision?: string;
21
+ merge_ready?: boolean;
22
+ pending_review_threads?: number;
23
+ has_conflicts?: boolean;
24
+ merge_score?: number;
25
+ } | null;
26
+ }
27
+
28
+ export interface FeaturesIndex {
29
+ active: string[];
30
+ blocked: string[];
31
+ merged: string[];
32
+ blocked_queue?: Array<{ feature_id: string; detected_at: string; collision_fingerprint: string }>;
33
+ }
34
+
35
+ export interface SSEEvent {
36
+ type: 'snapshot' | 'error';
37
+ features?: FeaturesIndex;
38
+ payload?: DashboardStatusPayload;
39
+ message?: string;
40
+ }
41
+
42
+ export interface EvidenceArtifact {
43
+ name: string;
44
+ path: string;
45
+ updated_at: string;
46
+ }
47
+
48
+ export interface FeatureDetail {
49
+ feature: FeatureSummary;
50
+ plan: Record<string, unknown> | null;
51
+ diff: string;
52
+ evidence: EvidenceArtifact[];
53
+ }
54
+
55
+ export interface DashboardStatusPayload {
56
+ index: FeaturesIndex;
57
+ features: FeatureSummary[];
58
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "target": "ES2017",
5
+ "lib": [
6
+ "dom",
7
+ "dom.iterable",
8
+ "esnext"
9
+ ],
10
+ "jsx": "preserve",
11
+ "module": "esnext",
12
+ "moduleResolution": "bundler",
13
+ "allowJs": true,
14
+ "noEmit": true,
15
+ "strict": true,
16
+ "skipLibCheck": true,
17
+ "paths": {
18
+ "@/*": [
19
+ "./src/*"
20
+ ]
21
+ },
22
+ "incremental": true,
23
+ "isolatedModules": true,
24
+ "plugins": [
25
+ {
26
+ "name": "next"
27
+ }
28
+ ]
29
+ },
30
+ "include": [
31
+ "next-env.d.ts",
32
+ "src/**/*.ts",
33
+ "src/**/*.tsx",
34
+ ".next/types/**/*.ts",
35
+ "next.config.js"
36
+ ],
37
+ "exclude": [
38
+ "node_modules"
39
+ ]
40
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ export default defineConfig({
3
+ test: {
4
+ environment: 'node',
5
+ },
6
+ });