@yasserkhanorg/impact-gate 2.0.0

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 (587) hide show
  1. package/LICENSE +168 -0
  2. package/README.md +520 -0
  3. package/dist/adapters/cypress.d.ts +10 -0
  4. package/dist/adapters/cypress.d.ts.map +1 -0
  5. package/dist/adapters/cypress.js +86 -0
  6. package/dist/adapters/framework_adapter.d.ts +41 -0
  7. package/dist/adapters/framework_adapter.d.ts.map +1 -0
  8. package/dist/adapters/framework_adapter.js +152 -0
  9. package/dist/adapters/playwright.d.ts +10 -0
  10. package/dist/adapters/playwright.d.ts.map +1 -0
  11. package/dist/adapters/playwright.js +86 -0
  12. package/dist/adapters/pytest.d.ts +10 -0
  13. package/dist/adapters/pytest.d.ts.map +1 -0
  14. package/dist/adapters/pytest.js +96 -0
  15. package/dist/adapters/supertest.d.ts +12 -0
  16. package/dist/adapters/supertest.d.ts.map +1 -0
  17. package/dist/adapters/supertest.js +85 -0
  18. package/dist/agent/api_catalog.d.ts +11 -0
  19. package/dist/agent/api_catalog.d.ts.map +1 -0
  20. package/dist/agent/api_catalog.js +210 -0
  21. package/dist/agent/config.d.ts +193 -0
  22. package/dist/agent/config.d.ts.map +1 -0
  23. package/dist/agent/config.js +875 -0
  24. package/dist/agent/feedback.d.ts +91 -0
  25. package/dist/agent/feedback.d.ts.map +1 -0
  26. package/dist/agent/feedback.js +323 -0
  27. package/dist/agent/git.d.ts +19 -0
  28. package/dist/agent/git.d.ts.map +1 -0
  29. package/dist/agent/git.js +257 -0
  30. package/dist/agent/handoff.d.ts +22 -0
  31. package/dist/agent/handoff.d.ts.map +1 -0
  32. package/dist/agent/handoff.js +180 -0
  33. package/dist/agent/llm_agents_flow.d.ts +15 -0
  34. package/dist/agent/llm_agents_flow.d.ts.map +1 -0
  35. package/dist/agent/llm_agents_flow.js +434 -0
  36. package/dist/agent/native_flow.d.ts +6 -0
  37. package/dist/agent/native_flow.d.ts.map +1 -0
  38. package/dist/agent/native_flow.js +179 -0
  39. package/dist/agent/pipeline.d.ts +7 -0
  40. package/dist/agent/pipeline.d.ts.map +1 -0
  41. package/dist/agent/pipeline.js +260 -0
  42. package/dist/agent/pipeline_types.d.ts +54 -0
  43. package/dist/agent/pipeline_types.d.ts.map +1 -0
  44. package/dist/agent/pipeline_types.js +4 -0
  45. package/dist/agent/pipeline_utils.d.ts +12 -0
  46. package/dist/agent/pipeline_utils.d.ts.map +1 -0
  47. package/dist/agent/pipeline_utils.js +156 -0
  48. package/dist/agent/plan.d.ts +170 -0
  49. package/dist/agent/plan.d.ts.map +1 -0
  50. package/dist/agent/plan.js +86 -0
  51. package/dist/agent/playwright_report.d.ts +8 -0
  52. package/dist/agent/playwright_report.d.ts.map +1 -0
  53. package/dist/agent/playwright_report.js +126 -0
  54. package/dist/agent/process_runner.d.ts +10 -0
  55. package/dist/agent/process_runner.d.ts.map +1 -0
  56. package/dist/agent/process_runner.js +92 -0
  57. package/dist/agent/spec_generator.d.ts +5 -0
  58. package/dist/agent/spec_generator.d.ts.map +1 -0
  59. package/dist/agent/spec_generator.js +253 -0
  60. package/dist/agent/test_path.d.ts +2 -0
  61. package/dist/agent/test_path.d.ts.map +1 -0
  62. package/dist/agent/test_path.js +23 -0
  63. package/dist/agent/traceability_capture.d.ts +18 -0
  64. package/dist/agent/traceability_capture.d.ts.map +1 -0
  65. package/dist/agent/traceability_capture.js +313 -0
  66. package/dist/agent/traceability_ingest.d.ts +21 -0
  67. package/dist/agent/traceability_ingest.d.ts.map +1 -0
  68. package/dist/agent/traceability_ingest.js +237 -0
  69. package/dist/agent/types.d.ts +42 -0
  70. package/dist/agent/types.d.ts.map +1 -0
  71. package/dist/agent/types.js +4 -0
  72. package/dist/agent/utils.d.ts +13 -0
  73. package/dist/agent/utils.d.ts.map +1 -0
  74. package/dist/agent/utils.js +152 -0
  75. package/dist/agent/validation_runner.d.ts +5 -0
  76. package/dist/agent/validation_runner.d.ts.map +1 -0
  77. package/dist/agent/validation_runner.js +77 -0
  78. package/dist/agentic/fix_loop.d.ts +26 -0
  79. package/dist/agentic/fix_loop.d.ts.map +1 -0
  80. package/dist/agentic/fix_loop.js +96 -0
  81. package/dist/agentic/playwright_runner.d.ts +43 -0
  82. package/dist/agentic/playwright_runner.d.ts.map +1 -0
  83. package/dist/agentic/playwright_runner.js +165 -0
  84. package/dist/agentic/runner.d.ts +27 -0
  85. package/dist/agentic/runner.d.ts.map +1 -0
  86. package/dist/agentic/runner.js +210 -0
  87. package/dist/agentic/types.d.ts +62 -0
  88. package/dist/agentic/types.d.ts.map +1 -0
  89. package/dist/agentic/types.js +4 -0
  90. package/dist/agents/coverage-evaluator.d.ts +8 -0
  91. package/dist/agents/coverage-evaluator.d.ts.map +1 -0
  92. package/dist/agents/coverage-evaluator.js +41 -0
  93. package/dist/agents/cross-impact.d.ts +13 -0
  94. package/dist/agents/cross-impact.d.ts.map +1 -0
  95. package/dist/agents/cross-impact.js +140 -0
  96. package/dist/agents/executor.d.ts +8 -0
  97. package/dist/agents/executor.d.ts.map +1 -0
  98. package/dist/agents/executor.js +75 -0
  99. package/dist/agents/explorer.d.ts +12 -0
  100. package/dist/agents/explorer.d.ts.map +1 -0
  101. package/dist/agents/explorer.js +43 -0
  102. package/dist/agents/generator.d.ts +8 -0
  103. package/dist/agents/generator.d.ts.map +1 -0
  104. package/dist/agents/generator.js +77 -0
  105. package/dist/agents/healer.d.ts +8 -0
  106. package/dist/agents/healer.d.ts.map +1 -0
  107. package/dist/agents/healer.js +31 -0
  108. package/dist/agents/impact-analyst.d.ts +8 -0
  109. package/dist/agents/impact-analyst.d.ts.map +1 -0
  110. package/dist/agents/impact-analyst.js +38 -0
  111. package/dist/agents/regression-advisor.d.ts +8 -0
  112. package/dist/agents/regression-advisor.d.ts.map +1 -0
  113. package/dist/agents/regression-advisor.js +116 -0
  114. package/dist/agents/strategist.d.ts +9 -0
  115. package/dist/agents/strategist.d.ts.map +1 -0
  116. package/dist/agents/strategist.js +92 -0
  117. package/dist/agents/test-designer.d.ts +8 -0
  118. package/dist/agents/test-designer.d.ts.map +1 -0
  119. package/dist/agents/test-designer.js +111 -0
  120. package/dist/anthropic_provider.d.ts +65 -0
  121. package/dist/anthropic_provider.d.ts.map +1 -0
  122. package/dist/anthropic_provider.js +334 -0
  123. package/dist/api.d.ts +48 -0
  124. package/dist/api.d.ts.map +1 -0
  125. package/dist/api.js +151 -0
  126. package/dist/base_provider.d.ts +109 -0
  127. package/dist/base_provider.d.ts.map +1 -0
  128. package/dist/base_provider.js +203 -0
  129. package/dist/budget_ledger.d.ts +28 -0
  130. package/dist/budget_ledger.d.ts.map +1 -0
  131. package/dist/budget_ledger.js +62 -0
  132. package/dist/cache/cached_provider.d.ts +49 -0
  133. package/dist/cache/cached_provider.d.ts.map +1 -0
  134. package/dist/cache/cached_provider.js +91 -0
  135. package/dist/cache/response_cache.d.ts +79 -0
  136. package/dist/cache/response_cache.d.ts.map +1 -0
  137. package/dist/cache/response_cache.js +177 -0
  138. package/dist/cli/commands/analyze.d.ts +3 -0
  139. package/dist/cli/commands/analyze.d.ts.map +1 -0
  140. package/dist/cli/commands/analyze.js +77 -0
  141. package/dist/cli/commands/bootstrap.d.ts +3 -0
  142. package/dist/cli/commands/bootstrap.d.ts.map +1 -0
  143. package/dist/cli/commands/bootstrap.js +109 -0
  144. package/dist/cli/commands/cost_report.d.ts +3 -0
  145. package/dist/cli/commands/cost_report.d.ts.map +1 -0
  146. package/dist/cli/commands/cost_report.js +115 -0
  147. package/dist/cli/commands/crew.d.ts +3 -0
  148. package/dist/cli/commands/crew.d.ts.map +1 -0
  149. package/dist/cli/commands/crew.js +255 -0
  150. package/dist/cli/commands/feedback.d.ts +3 -0
  151. package/dist/cli/commands/feedback.d.ts.map +1 -0
  152. package/dist/cli/commands/feedback.js +39 -0
  153. package/dist/cli/commands/finalize.d.ts +3 -0
  154. package/dist/cli/commands/finalize.d.ts.map +1 -0
  155. package/dist/cli/commands/finalize.js +41 -0
  156. package/dist/cli/commands/gate.d.ts +3 -0
  157. package/dist/cli/commands/gate.d.ts.map +1 -0
  158. package/dist/cli/commands/gate.js +89 -0
  159. package/dist/cli/commands/generate.d.ts +4 -0
  160. package/dist/cli/commands/generate.d.ts.map +1 -0
  161. package/dist/cli/commands/generate.js +108 -0
  162. package/dist/cli/commands/heal.d.ts +3 -0
  163. package/dist/cli/commands/heal.d.ts.map +1 -0
  164. package/dist/cli/commands/heal.js +60 -0
  165. package/dist/cli/commands/impact.d.ts +4 -0
  166. package/dist/cli/commands/impact.d.ts.map +1 -0
  167. package/dist/cli/commands/impact.js +33 -0
  168. package/dist/cli/commands/init.d.ts +2 -0
  169. package/dist/cli/commands/init.d.ts.map +1 -0
  170. package/dist/cli/commands/init.js +169 -0
  171. package/dist/cli/commands/llm_health.d.ts +2 -0
  172. package/dist/cli/commands/llm_health.d.ts.map +1 -0
  173. package/dist/cli/commands/llm_health.js +22 -0
  174. package/dist/cli/commands/plan.d.ts +4 -0
  175. package/dist/cli/commands/plan.d.ts.map +1 -0
  176. package/dist/cli/commands/plan.js +120 -0
  177. package/dist/cli/commands/plan_crew.d.ts +17 -0
  178. package/dist/cli/commands/plan_crew.d.ts.map +1 -0
  179. package/dist/cli/commands/plan_crew.js +316 -0
  180. package/dist/cli/commands/traceability.d.ts +4 -0
  181. package/dist/cli/commands/traceability.d.ts.map +1 -0
  182. package/dist/cli/commands/traceability.js +77 -0
  183. package/dist/cli/commands/train.d.ts +3 -0
  184. package/dist/cli/commands/train.d.ts.map +1 -0
  185. package/dist/cli/commands/train.js +391 -0
  186. package/dist/cli/defaults.d.ts +35 -0
  187. package/dist/cli/defaults.d.ts.map +1 -0
  188. package/dist/cli/defaults.js +172 -0
  189. package/dist/cli/errors.d.ts +27 -0
  190. package/dist/cli/errors.d.ts.map +1 -0
  191. package/dist/cli/errors.js +57 -0
  192. package/dist/cli/parse_args.d.ts +6 -0
  193. package/dist/cli/parse_args.d.ts.map +1 -0
  194. package/dist/cli/parse_args.js +257 -0
  195. package/dist/cli/types.d.ts +87 -0
  196. package/dist/cli/types.d.ts.map +1 -0
  197. package/dist/cli/types.js +4 -0
  198. package/dist/cli/usage.d.ts +2 -0
  199. package/dist/cli/usage.d.ts.map +1 -0
  200. package/dist/cli/usage.js +109 -0
  201. package/dist/cli.d.ts +3 -0
  202. package/dist/cli.d.ts.map +1 -0
  203. package/dist/cli.js +194 -0
  204. package/dist/crew/context.d.ts +55 -0
  205. package/dist/crew/context.d.ts.map +1 -0
  206. package/dist/crew/context.js +36 -0
  207. package/dist/crew/orchestrator.d.ts +50 -0
  208. package/dist/crew/orchestrator.d.ts.map +1 -0
  209. package/dist/crew/orchestrator.js +329 -0
  210. package/dist/crew/protocol.d.ts +46 -0
  211. package/dist/crew/protocol.d.ts.map +1 -0
  212. package/dist/crew/protocol.js +4 -0
  213. package/dist/crew/provider.d.ts +17 -0
  214. package/dist/crew/provider.d.ts.map +1 -0
  215. package/dist/crew/provider.js +36 -0
  216. package/dist/crew/sanitize.d.ts +3 -0
  217. package/dist/crew/sanitize.d.ts.map +1 -0
  218. package/dist/crew/sanitize.js +31 -0
  219. package/dist/crew/types.d.ts +52 -0
  220. package/dist/crew/types.d.ts.map +1 -0
  221. package/dist/crew/types.js +4 -0
  222. package/dist/crew/workflows.d.ts +52 -0
  223. package/dist/crew/workflows.d.ts.map +1 -0
  224. package/dist/crew/workflows.js +36 -0
  225. package/dist/custom_provider.d.ts +20 -0
  226. package/dist/custom_provider.d.ts.map +1 -0
  227. package/dist/custom_provider.js +277 -0
  228. package/dist/engine/ai_enrichment.d.ts +44 -0
  229. package/dist/engine/ai_enrichment.d.ts.map +1 -0
  230. package/dist/engine/ai_enrichment.js +267 -0
  231. package/dist/engine/diff_loader.d.ts +11 -0
  232. package/dist/engine/diff_loader.d.ts.map +1 -0
  233. package/dist/engine/diff_loader.js +63 -0
  234. package/dist/engine/impact_engine.d.ts +72 -0
  235. package/dist/engine/impact_engine.d.ts.map +1 -0
  236. package/dist/engine/impact_engine.js +298 -0
  237. package/dist/engine/plan_builder.d.ts +11 -0
  238. package/dist/engine/plan_builder.d.ts.map +1 -0
  239. package/dist/engine/plan_builder.js +599 -0
  240. package/dist/esm/adapters/cypress.js +49 -0
  241. package/dist/esm/adapters/framework_adapter.js +114 -0
  242. package/dist/esm/adapters/playwright.js +49 -0
  243. package/dist/esm/adapters/pytest.js +59 -0
  244. package/dist/esm/adapters/supertest.js +48 -0
  245. package/dist/esm/agent/api_catalog.js +199 -0
  246. package/dist/esm/agent/config.js +872 -0
  247. package/dist/esm/agent/feedback.js +317 -0
  248. package/dist/esm/agent/git.js +252 -0
  249. package/dist/esm/agent/handoff.js +177 -0
  250. package/dist/esm/agent/llm_agents_flow.js +421 -0
  251. package/dist/esm/agent/native_flow.js +175 -0
  252. package/dist/esm/agent/pipeline.js +256 -0
  253. package/dist/esm/agent/pipeline_types.js +3 -0
  254. package/dist/esm/agent/pipeline_utils.js +146 -0
  255. package/dist/esm/agent/plan.js +83 -0
  256. package/dist/esm/agent/playwright_report.js +123 -0
  257. package/dist/esm/agent/process_runner.js +83 -0
  258. package/dist/esm/agent/spec_generator.js +249 -0
  259. package/dist/esm/agent/test_path.js +20 -0
  260. package/dist/esm/agent/traceability_capture.js +310 -0
  261. package/dist/esm/agent/traceability_ingest.js +234 -0
  262. package/dist/esm/agent/types.js +3 -0
  263. package/dist/esm/agent/utils.js +138 -0
  264. package/dist/esm/agent/validation_runner.js +73 -0
  265. package/dist/esm/agentic/fix_loop.js +91 -0
  266. package/dist/esm/agentic/playwright_runner.js +161 -0
  267. package/dist/esm/agentic/runner.js +207 -0
  268. package/dist/esm/agentic/types.js +3 -0
  269. package/dist/esm/agents/coverage-evaluator.js +37 -0
  270. package/dist/esm/agents/cross-impact.js +136 -0
  271. package/dist/esm/agents/executor.js +71 -0
  272. package/dist/esm/agents/explorer.js +39 -0
  273. package/dist/esm/agents/generator.js +73 -0
  274. package/dist/esm/agents/healer.js +27 -0
  275. package/dist/esm/agents/impact-analyst.js +34 -0
  276. package/dist/esm/agents/regression-advisor.js +112 -0
  277. package/dist/esm/agents/strategist.js +88 -0
  278. package/dist/esm/agents/test-designer.js +107 -0
  279. package/dist/esm/anthropic_provider.js +326 -0
  280. package/dist/esm/api.js +143 -0
  281. package/dist/esm/base_provider.js +198 -0
  282. package/dist/esm/budget_ledger.js +58 -0
  283. package/dist/esm/cache/cached_provider.js +85 -0
  284. package/dist/esm/cache/response_cache.js +140 -0
  285. package/dist/esm/cli/commands/analyze.js +74 -0
  286. package/dist/esm/cli/commands/bootstrap.js +106 -0
  287. package/dist/esm/cli/commands/cost_report.js +112 -0
  288. package/dist/esm/cli/commands/crew.js +252 -0
  289. package/dist/esm/cli/commands/feedback.js +36 -0
  290. package/dist/esm/cli/commands/finalize.js +38 -0
  291. package/dist/esm/cli/commands/gate.js +86 -0
  292. package/dist/esm/cli/commands/generate.js +105 -0
  293. package/dist/esm/cli/commands/heal.js +57 -0
  294. package/dist/esm/cli/commands/impact.js +30 -0
  295. package/dist/esm/cli/commands/init.js +133 -0
  296. package/dist/esm/cli/commands/llm_health.js +19 -0
  297. package/dist/esm/cli/commands/plan.js +117 -0
  298. package/dist/esm/cli/commands/plan_crew.js +309 -0
  299. package/dist/esm/cli/commands/traceability.js +73 -0
  300. package/dist/esm/cli/commands/train.js +355 -0
  301. package/dist/esm/cli/defaults.js +165 -0
  302. package/dist/esm/cli/errors.js +52 -0
  303. package/dist/esm/cli/parse_args.js +251 -0
  304. package/dist/esm/cli/types.js +3 -0
  305. package/dist/esm/cli/usage.js +106 -0
  306. package/dist/esm/cli.js +192 -0
  307. package/dist/esm/crew/context.js +32 -0
  308. package/dist/esm/crew/orchestrator.js +325 -0
  309. package/dist/esm/crew/protocol.js +3 -0
  310. package/dist/esm/crew/provider.js +33 -0
  311. package/dist/esm/crew/sanitize.js +27 -0
  312. package/dist/esm/crew/types.js +3 -0
  313. package/dist/esm/crew/workflows.js +33 -0
  314. package/dist/esm/custom_provider.js +273 -0
  315. package/dist/esm/engine/ai_enrichment.js +264 -0
  316. package/dist/esm/engine/diff_loader.js +59 -0
  317. package/dist/esm/engine/impact_engine.js +291 -0
  318. package/dist/esm/engine/plan_builder.js +593 -0
  319. package/dist/esm/index.js +72 -0
  320. package/dist/esm/knowledge/api_surface.js +408 -0
  321. package/dist/esm/knowledge/cluster_utils.js +60 -0
  322. package/dist/esm/knowledge/context_loader.js +85 -0
  323. package/dist/esm/knowledge/failure_history.js +121 -0
  324. package/dist/esm/knowledge/kg_bridge.js +381 -0
  325. package/dist/esm/knowledge/kg_types.js +3 -0
  326. package/dist/esm/knowledge/route_families.js +393 -0
  327. package/dist/esm/knowledge/spec_index.js +122 -0
  328. package/dist/esm/logger.js +115 -0
  329. package/dist/esm/mcp-server.js +621 -0
  330. package/dist/esm/metrics/prometheus.js +149 -0
  331. package/dist/esm/model_router.js +59 -0
  332. package/dist/esm/ollama_provider.js +301 -0
  333. package/dist/esm/openai_provider.js +243 -0
  334. package/dist/esm/package.json +3 -0
  335. package/dist/esm/pipeline/orchestrator.js +228 -0
  336. package/dist/esm/pipeline/spec_verifier.js +75 -0
  337. package/dist/esm/pipeline/stage0_preprocess.js +102 -0
  338. package/dist/esm/pipeline/stage1_impact.js +140 -0
  339. package/dist/esm/pipeline/stage2_coverage.js +153 -0
  340. package/dist/esm/pipeline/stage3_generation.js +284 -0
  341. package/dist/esm/pipeline/stage4_heal.js +288 -0
  342. package/dist/esm/progress.js +112 -0
  343. package/dist/esm/prompts/coverage.js +57 -0
  344. package/dist/esm/prompts/cross-impact.js +53 -0
  345. package/dist/esm/prompts/generation.js +297 -0
  346. package/dist/esm/prompts/generation_profile.js +147 -0
  347. package/dist/esm/prompts/heal.js +91 -0
  348. package/dist/esm/prompts/impact.js +63 -0
  349. package/dist/esm/prompts/json_extract.js +36 -0
  350. package/dist/esm/prompts/strategist.js +61 -0
  351. package/dist/esm/prompts/test-designer.js +92 -0
  352. package/dist/esm/provider_factory.js +366 -0
  353. package/dist/esm/provider_interface.js +23 -0
  354. package/dist/esm/provider_utils.js +96 -0
  355. package/dist/esm/qa-agent/cli.js +205 -0
  356. package/dist/esm/qa-agent/orchestrator.js +120 -0
  357. package/dist/esm/qa-agent/phase1/runner.js +139 -0
  358. package/dist/esm/qa-agent/phase1/scope.js +126 -0
  359. package/dist/esm/qa-agent/phase2/agent_browser.js +95 -0
  360. package/dist/esm/qa-agent/phase2/agent_loop.js +351 -0
  361. package/dist/esm/qa-agent/phase2/exploration_state.js +97 -0
  362. package/dist/esm/qa-agent/phase2/tools.js +386 -0
  363. package/dist/esm/qa-agent/phase2/vision.js +75 -0
  364. package/dist/esm/qa-agent/phase3/feedback.js +34 -0
  365. package/dist/esm/qa-agent/phase3/reporter.js +145 -0
  366. package/dist/esm/qa-agent/phase3/spec_generator.js +62 -0
  367. package/dist/esm/qa-agent/phase3/verdict.js +66 -0
  368. package/dist/esm/qa-agent/safe_env.js +23 -0
  369. package/dist/esm/qa-agent/types.js +3 -0
  370. package/dist/esm/reporters/junit.js +86 -0
  371. package/dist/esm/reporters/reporter.js +3 -0
  372. package/dist/esm/reporters/sarif.js +132 -0
  373. package/dist/esm/resilience/circuit_breaker.js +78 -0
  374. package/dist/esm/resilience/retry.js +56 -0
  375. package/dist/esm/sanitize.js +66 -0
  376. package/dist/esm/training/enricher.js +345 -0
  377. package/dist/esm/training/kg_scanner.js +115 -0
  378. package/dist/esm/training/merger.js +204 -0
  379. package/dist/esm/training/scanner.js +923 -0
  380. package/dist/esm/training/types.js +6 -0
  381. package/dist/esm/training/validator.js +254 -0
  382. package/dist/esm/validation/guardrails.js +101 -0
  383. package/dist/esm/validation/output_schema.js +80 -0
  384. package/dist/esm/version.js +33 -0
  385. package/dist/index.d.ts +99 -0
  386. package/dist/index.d.ts.map +1 -0
  387. package/dist/index.js +169 -0
  388. package/dist/knowledge/api_surface.d.ts +37 -0
  389. package/dist/knowledge/api_surface.d.ts.map +1 -0
  390. package/dist/knowledge/api_surface.js +418 -0
  391. package/dist/knowledge/cluster_utils.d.ts +28 -0
  392. package/dist/knowledge/cluster_utils.d.ts.map +1 -0
  393. package/dist/knowledge/cluster_utils.js +67 -0
  394. package/dist/knowledge/context_loader.d.ts +13 -0
  395. package/dist/knowledge/context_loader.d.ts.map +1 -0
  396. package/dist/knowledge/context_loader.js +90 -0
  397. package/dist/knowledge/failure_history.d.ts +39 -0
  398. package/dist/knowledge/failure_history.d.ts.map +1 -0
  399. package/dist/knowledge/failure_history.js +128 -0
  400. package/dist/knowledge/kg_bridge.d.ts +31 -0
  401. package/dist/knowledge/kg_bridge.d.ts.map +1 -0
  402. package/dist/knowledge/kg_bridge.js +388 -0
  403. package/dist/knowledge/kg_types.d.ts +75 -0
  404. package/dist/knowledge/kg_types.d.ts.map +1 -0
  405. package/dist/knowledge/kg_types.js +4 -0
  406. package/dist/knowledge/route_families.d.ts +98 -0
  407. package/dist/knowledge/route_families.d.ts.map +1 -0
  408. package/dist/knowledge/route_families.js +410 -0
  409. package/dist/knowledge/spec_index.d.ts +18 -0
  410. package/dist/knowledge/spec_index.d.ts.map +1 -0
  411. package/dist/knowledge/spec_index.js +128 -0
  412. package/dist/logger.d.ts +31 -0
  413. package/dist/logger.d.ts.map +1 -0
  414. package/dist/logger.js +119 -0
  415. package/dist/mcp-server.d.ts +68 -0
  416. package/dist/mcp-server.d.ts.map +1 -0
  417. package/dist/mcp-server.js +629 -0
  418. package/dist/metrics/prometheus.d.ts +37 -0
  419. package/dist/metrics/prometheus.d.ts.map +1 -0
  420. package/dist/metrics/prometheus.js +153 -0
  421. package/dist/model_router.d.ts +28 -0
  422. package/dist/model_router.d.ts.map +1 -0
  423. package/dist/model_router.js +63 -0
  424. package/dist/ollama_provider.d.ts +65 -0
  425. package/dist/ollama_provider.d.ts.map +1 -0
  426. package/dist/ollama_provider.js +309 -0
  427. package/dist/openai_provider.d.ts +23 -0
  428. package/dist/openai_provider.d.ts.map +1 -0
  429. package/dist/openai_provider.js +251 -0
  430. package/dist/pipeline/orchestrator.d.ts +33 -0
  431. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  432. package/dist/pipeline/orchestrator.js +231 -0
  433. package/dist/pipeline/spec_verifier.d.ts +20 -0
  434. package/dist/pipeline/spec_verifier.d.ts.map +1 -0
  435. package/dist/pipeline/spec_verifier.js +79 -0
  436. package/dist/pipeline/stage0_preprocess.d.ts +31 -0
  437. package/dist/pipeline/stage0_preprocess.d.ts.map +1 -0
  438. package/dist/pipeline/stage0_preprocess.js +105 -0
  439. package/dist/pipeline/stage1_impact.d.ts +19 -0
  440. package/dist/pipeline/stage1_impact.d.ts.map +1 -0
  441. package/dist/pipeline/stage1_impact.js +143 -0
  442. package/dist/pipeline/stage2_coverage.d.ts +19 -0
  443. package/dist/pipeline/stage2_coverage.d.ts.map +1 -0
  444. package/dist/pipeline/stage2_coverage.js +156 -0
  445. package/dist/pipeline/stage3_generation.d.ts +43 -0
  446. package/dist/pipeline/stage3_generation.d.ts.map +1 -0
  447. package/dist/pipeline/stage3_generation.js +287 -0
  448. package/dist/pipeline/stage4_heal.d.ts +62 -0
  449. package/dist/pipeline/stage4_heal.d.ts.map +1 -0
  450. package/dist/pipeline/stage4_heal.js +294 -0
  451. package/dist/progress.d.ts +22 -0
  452. package/dist/progress.d.ts.map +1 -0
  453. package/dist/progress.js +116 -0
  454. package/dist/prompts/coverage.d.ts +39 -0
  455. package/dist/prompts/coverage.d.ts.map +1 -0
  456. package/dist/prompts/coverage.js +61 -0
  457. package/dist/prompts/cross-impact.d.ts +23 -0
  458. package/dist/prompts/cross-impact.d.ts.map +1 -0
  459. package/dist/prompts/cross-impact.js +57 -0
  460. package/dist/prompts/generation.d.ts +25 -0
  461. package/dist/prompts/generation.d.ts.map +1 -0
  462. package/dist/prompts/generation.js +302 -0
  463. package/dist/prompts/generation_profile.d.ts +29 -0
  464. package/dist/prompts/generation_profile.d.ts.map +1 -0
  465. package/dist/prompts/generation_profile.js +151 -0
  466. package/dist/prompts/heal.d.ts +23 -0
  467. package/dist/prompts/heal.d.ts.map +1 -0
  468. package/dist/prompts/heal.js +95 -0
  469. package/dist/prompts/impact.d.ts +31 -0
  470. package/dist/prompts/impact.d.ts.map +1 -0
  471. package/dist/prompts/impact.js +67 -0
  472. package/dist/prompts/json_extract.d.ts +14 -0
  473. package/dist/prompts/json_extract.d.ts.map +1 -0
  474. package/dist/prompts/json_extract.js +39 -0
  475. package/dist/prompts/strategist.d.ts +25 -0
  476. package/dist/prompts/strategist.d.ts.map +1 -0
  477. package/dist/prompts/strategist.js +65 -0
  478. package/dist/prompts/test-designer.d.ts +35 -0
  479. package/dist/prompts/test-designer.d.ts.map +1 -0
  480. package/dist/prompts/test-designer.js +96 -0
  481. package/dist/provider_factory.d.ts +104 -0
  482. package/dist/provider_factory.d.ts.map +1 -0
  483. package/dist/provider_factory.js +371 -0
  484. package/dist/provider_interface.d.ts +365 -0
  485. package/dist/provider_interface.d.ts.map +1 -0
  486. package/dist/provider_interface.js +28 -0
  487. package/dist/provider_utils.d.ts +39 -0
  488. package/dist/provider_utils.d.ts.map +1 -0
  489. package/dist/provider_utils.js +103 -0
  490. package/dist/qa-agent/cli.d.ts +3 -0
  491. package/dist/qa-agent/cli.d.ts.map +1 -0
  492. package/dist/qa-agent/cli.js +207 -0
  493. package/dist/qa-agent/orchestrator.d.ts +3 -0
  494. package/dist/qa-agent/orchestrator.d.ts.map +1 -0
  495. package/dist/qa-agent/orchestrator.js +123 -0
  496. package/dist/qa-agent/phase1/runner.d.ts +3 -0
  497. package/dist/qa-agent/phase1/runner.d.ts.map +1 -0
  498. package/dist/qa-agent/phase1/runner.js +142 -0
  499. package/dist/qa-agent/phase1/scope.d.ts +6 -0
  500. package/dist/qa-agent/phase1/scope.d.ts.map +1 -0
  501. package/dist/qa-agent/phase1/scope.js +129 -0
  502. package/dist/qa-agent/phase2/agent_browser.d.ts +35 -0
  503. package/dist/qa-agent/phase2/agent_browser.d.ts.map +1 -0
  504. package/dist/qa-agent/phase2/agent_browser.js +99 -0
  505. package/dist/qa-agent/phase2/agent_loop.d.ts +3 -0
  506. package/dist/qa-agent/phase2/agent_loop.d.ts.map +1 -0
  507. package/dist/qa-agent/phase2/agent_loop.js +357 -0
  508. package/dist/qa-agent/phase2/exploration_state.d.ts +12 -0
  509. package/dist/qa-agent/phase2/exploration_state.d.ts.map +1 -0
  510. package/dist/qa-agent/phase2/exploration_state.js +109 -0
  511. package/dist/qa-agent/phase2/tools.d.ts +28 -0
  512. package/dist/qa-agent/phase2/tools.d.ts.map +1 -0
  513. package/dist/qa-agent/phase2/tools.js +390 -0
  514. package/dist/qa-agent/phase2/vision.d.ts +3 -0
  515. package/dist/qa-agent/phase2/vision.d.ts.map +1 -0
  516. package/dist/qa-agent/phase2/vision.js +78 -0
  517. package/dist/qa-agent/phase3/feedback.d.ts +3 -0
  518. package/dist/qa-agent/phase3/feedback.d.ts.map +1 -0
  519. package/dist/qa-agent/phase3/feedback.js +37 -0
  520. package/dist/qa-agent/phase3/reporter.d.ts +3 -0
  521. package/dist/qa-agent/phase3/reporter.d.ts.map +1 -0
  522. package/dist/qa-agent/phase3/reporter.js +148 -0
  523. package/dist/qa-agent/phase3/spec_generator.d.ts +3 -0
  524. package/dist/qa-agent/phase3/spec_generator.d.ts.map +1 -0
  525. package/dist/qa-agent/phase3/spec_generator.js +65 -0
  526. package/dist/qa-agent/phase3/verdict.d.ts +3 -0
  527. package/dist/qa-agent/phase3/verdict.d.ts.map +1 -0
  528. package/dist/qa-agent/phase3/verdict.js +69 -0
  529. package/dist/qa-agent/safe_env.d.ts +3 -0
  530. package/dist/qa-agent/safe_env.d.ts.map +1 -0
  531. package/dist/qa-agent/safe_env.js +26 -0
  532. package/dist/qa-agent/types.d.ts +130 -0
  533. package/dist/qa-agent/types.d.ts.map +1 -0
  534. package/dist/qa-agent/types.js +4 -0
  535. package/dist/reporters/junit.d.ts +6 -0
  536. package/dist/reporters/junit.d.ts.map +1 -0
  537. package/dist/reporters/junit.js +89 -0
  538. package/dist/reporters/reporter.d.ts +42 -0
  539. package/dist/reporters/reporter.d.ts.map +1 -0
  540. package/dist/reporters/reporter.js +4 -0
  541. package/dist/reporters/sarif.d.ts +7 -0
  542. package/dist/reporters/sarif.d.ts.map +1 -0
  543. package/dist/reporters/sarif.js +135 -0
  544. package/dist/resilience/circuit_breaker.d.ts +36 -0
  545. package/dist/resilience/circuit_breaker.d.ts.map +1 -0
  546. package/dist/resilience/circuit_breaker.js +82 -0
  547. package/dist/resilience/retry.d.ts +11 -0
  548. package/dist/resilience/retry.d.ts.map +1 -0
  549. package/dist/resilience/retry.js +59 -0
  550. package/dist/sanitize.d.ts +15 -0
  551. package/dist/sanitize.d.ts.map +1 -0
  552. package/dist/sanitize.js +71 -0
  553. package/dist/training/enricher.d.ts +17 -0
  554. package/dist/training/enricher.d.ts.map +1 -0
  555. package/dist/training/enricher.js +350 -0
  556. package/dist/training/kg_scanner.d.ts +13 -0
  557. package/dist/training/kg_scanner.d.ts.map +1 -0
  558. package/dist/training/kg_scanner.js +118 -0
  559. package/dist/training/merger.d.ts +15 -0
  560. package/dist/training/merger.d.ts.map +1 -0
  561. package/dist/training/merger.js +208 -0
  562. package/dist/training/scanner.d.ts +36 -0
  563. package/dist/training/scanner.d.ts.map +1 -0
  564. package/dist/training/scanner.js +932 -0
  565. package/dist/training/types.d.ts +117 -0
  566. package/dist/training/types.d.ts.map +1 -0
  567. package/dist/training/types.js +9 -0
  568. package/dist/training/validator.d.ts +21 -0
  569. package/dist/training/validator.d.ts.map +1 -0
  570. package/dist/training/validator.js +262 -0
  571. package/dist/validation/guardrails.d.ts +31 -0
  572. package/dist/validation/guardrails.d.ts.map +1 -0
  573. package/dist/validation/guardrails.js +112 -0
  574. package/dist/validation/output_schema.d.ts +67 -0
  575. package/dist/validation/output_schema.d.ts.map +1 -0
  576. package/dist/validation/output_schema.js +84 -0
  577. package/dist/version.d.ts +6 -0
  578. package/dist/version.d.ts.map +1 -0
  579. package/dist/version.js +36 -0
  580. package/package.json +126 -0
  581. package/schemas/flow-decision.schema.json +83 -0
  582. package/schemas/gap.schema.json +18 -0
  583. package/schemas/impact.schema.json +455 -0
  584. package/schemas/plan.schema.json +491 -0
  585. package/schemas/route-families.schema.json +137 -0
  586. package/schemas/subsystem-risk-map.schema.json +62 -0
  587. package/schemas/traceability-input.schema.json +122 -0
package/dist/cli.js ADDED
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
4
+ // See LICENSE.txt for license information.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const config_js_1 = require("./agent/config.js");
7
+ const parse_args_js_1 = require("./cli/parse_args.js");
8
+ const defaults_js_1 = require("./cli/defaults.js");
9
+ const usage_js_1 = require("./cli/usage.js");
10
+ const llm_health_js_1 = require("./cli/commands/llm_health.js");
11
+ const analyze_js_1 = require("./cli/commands/analyze.js");
12
+ const feedback_js_1 = require("./cli/commands/feedback.js");
13
+ const traceability_js_1 = require("./cli/commands/traceability.js");
14
+ const finalize_js_1 = require("./cli/commands/finalize.js");
15
+ const heal_js_1 = require("./cli/commands/heal.js");
16
+ const impact_js_1 = require("./cli/commands/impact.js");
17
+ const plan_js_1 = require("./cli/commands/plan.js");
18
+ const generate_js_1 = require("./cli/commands/generate.js");
19
+ const init_js_1 = require("./cli/commands/init.js");
20
+ const train_js_1 = require("./cli/commands/train.js");
21
+ const crew_js_1 = require("./cli/commands/crew.js");
22
+ const cost_report_js_1 = require("./cli/commands/cost_report.js");
23
+ const gate_js_1 = require("./cli/commands/gate.js");
24
+ const bootstrap_js_1 = require("./cli/commands/bootstrap.js");
25
+ const errors_js_1 = require("./cli/errors.js");
26
+ // Commands that skip default resolution (they handle their own setup)
27
+ const SKIP_DEFAULTS_COMMANDS = new Set(['init', 'llm-health', 'cost-report', 'bootstrap']);
28
+ // Commands that need path/testsRoot/framework/since
29
+ const NEEDS_DEFAULTS_COMMANDS = new Set([
30
+ 'impact', 'plan', 'suggest', 'crew', 'generate', 'heal', 'analyze', 'train',
31
+ 'feedback', 'traceability-capture', 'traceability-ingest', 'finalize-generated-tests',
32
+ ]);
33
+ async function main() {
34
+ const args = (0, parse_args_js_1.parseArgs)(process.argv.slice(2));
35
+ const autoConfig = (0, parse_args_js_1.resolveAutoConfig)(args);
36
+ // Auto-detect defaults for commands that need them (when no config file found)
37
+ if (args.command && NEEDS_DEFAULTS_COMMANDS.has(args.command) && !SKIP_DEFAULTS_COMMANDS.has(args.command)) {
38
+ const defaults = (0, defaults_js_1.resolveDefaults)({
39
+ path: args.path,
40
+ testsRoot: args.testsRoot,
41
+ framework: args.framework,
42
+ gitSince: args.gitSince,
43
+ });
44
+ args.path = args.path || defaults.path;
45
+ args.testsRoot = args.testsRoot || defaults.testsRoot;
46
+ args.framework = args.framework || defaults.framework;
47
+ args.gitSince = args.gitSince || defaults.since;
48
+ }
49
+ if (args.command === 'init') {
50
+ const hasYes = process.argv.includes('--yes') || process.argv.includes('-y');
51
+ await (0, init_js_1.runInitCommand)(hasYes);
52
+ return;
53
+ }
54
+ if (args.command === 'bootstrap') {
55
+ await (0, bootstrap_js_1.runBootstrapCommand)(args);
56
+ return;
57
+ }
58
+ if (args.command === 'train') {
59
+ await (0, train_js_1.runTrainCommand)(args, autoConfig);
60
+ return;
61
+ }
62
+ if (args.help) {
63
+ (0, usage_js_1.printUsage)();
64
+ process.exit(0);
65
+ }
66
+ if (!args.command) {
67
+ (0, usage_js_1.printUsage)();
68
+ process.exit(1);
69
+ }
70
+ if (args.command === 'llm-health') {
71
+ await (0, llm_health_js_1.runLlmHealth)();
72
+ return;
73
+ }
74
+ if (args.command === 'analyze') {
75
+ await (0, analyze_js_1.runAnalyzeCommand)(args, autoConfig);
76
+ return;
77
+ }
78
+ if (args.command === 'feedback') {
79
+ (0, feedback_js_1.runFeedbackCommand)(args, autoConfig);
80
+ return;
81
+ }
82
+ if (args.command === 'traceability-capture') {
83
+ (0, traceability_js_1.runTraceabilityCaptureCommand)(args, autoConfig);
84
+ return;
85
+ }
86
+ if (args.command === 'traceability-ingest') {
87
+ (0, traceability_js_1.runTraceabilityIngestCommand)(args, autoConfig);
88
+ return;
89
+ }
90
+ if (args.command === 'finalize-generated-tests') {
91
+ (0, finalize_js_1.runFinalizeCommand)(args, autoConfig);
92
+ return;
93
+ }
94
+ if (args.command === 'heal') {
95
+ (0, heal_js_1.runHealCommand)(args, autoConfig);
96
+ return;
97
+ }
98
+ if (args.command === 'crew') {
99
+ await (0, crew_js_1.runCrewCommand)(args, autoConfig);
100
+ return;
101
+ }
102
+ if (args.command === 'cost-report') {
103
+ (0, cost_report_js_1.runCostReportCommand)(args);
104
+ return;
105
+ }
106
+ if (args.command === 'gate') {
107
+ await (0, gate_js_1.runGateCommand)(args, autoConfig);
108
+ return;
109
+ }
110
+ if (!args.path && !autoConfig) {
111
+ console.error('Error: --path is required (or provide a config file with path set)');
112
+ (0, usage_js_1.printUsage)();
113
+ process.exit(1);
114
+ }
115
+ const { config } = (0, config_js_1.resolveConfig)(process.cwd(), autoConfig, {
116
+ path: args.path,
117
+ profile: args.profile,
118
+ testsRoot: args.testsRoot,
119
+ mode: 'impact',
120
+ framework: args.framework,
121
+ timeLimitMinutes: args.timeLimitMinutes,
122
+ budget: {
123
+ maxUSD: args.budgetUSD,
124
+ maxTokens: args.budgetTokens,
125
+ },
126
+ testPatterns: args.testPatterns,
127
+ flowPatterns: args.flowPatterns,
128
+ flowExclude: args.flowExclude,
129
+ flowCatalogPath: args.flowCatalogPath,
130
+ specPDF: args.specPDF,
131
+ gitSince: args.gitSince,
132
+ llmProvider: args.llmProvider,
133
+ pipeline: args.pipeline
134
+ ? {
135
+ enabled: true,
136
+ scenarios: args.pipelineScenarios,
137
+ outputDir: args.pipelineOutput,
138
+ baseUrl: args.pipelineBaseUrl,
139
+ browser: args.pipelineBrowser,
140
+ headless: args.pipelineHeadless,
141
+ project: args.pipelineProject,
142
+ parallel: args.pipelineParallel,
143
+ dryRun: args.pipelineDryRun,
144
+ mcp: args.pipelineMcp,
145
+ mcpAllowFallback: args.pipelineMcpAllowFallback,
146
+ mcpOnly: args.pipelineMcpOnly,
147
+ mcpCommandTimeoutMs: args.pipelineMcpTimeoutMs,
148
+ mcpRetries: args.pipelineMcpRetries,
149
+ }
150
+ : undefined,
151
+ policy: args.policyMinConfidence !== undefined ||
152
+ args.policySafeMergeConfidence !== undefined ||
153
+ args.policyWarningsThreshold !== undefined ||
154
+ (args.policyRiskyPatterns && args.policyRiskyPatterns.length > 0) ||
155
+ args.policyEnforcementMode !== undefined ||
156
+ (args.policyBlockActions && args.policyBlockActions.length > 0)
157
+ ? {
158
+ minConfidenceForTargeted: args.policyMinConfidence,
159
+ safeMergeMinConfidence: args.policySafeMergeConfidence,
160
+ forceFullOnWarningsAtOrAbove: args.policyWarningsThreshold,
161
+ riskyFilePatterns: args.policyRiskyPatterns,
162
+ enforcementMode: args.policyEnforcementMode,
163
+ blockOnActions: args.policyBlockActions,
164
+ }
165
+ : undefined,
166
+ });
167
+ if (args.command === 'impact') {
168
+ (0, impact_js_1.runImpactCommand)(args, config);
169
+ return;
170
+ }
171
+ if (args.command === 'suggest' || args.command === 'plan') {
172
+ await (0, plan_js_1.runPlanCommand)(args, autoConfig, config);
173
+ return;
174
+ }
175
+ if (args.command === 'generate') {
176
+ await (0, generate_js_1.runGenerateCommand)(args, config);
177
+ return;
178
+ }
179
+ console.error(`Unknown command: ${args.command}`);
180
+ (0, usage_js_1.printUsage)();
181
+ process.exit(1);
182
+ }
183
+ main().catch((error) => {
184
+ const exitCode = (0, errors_js_1.classifyError)(error);
185
+ const message = error instanceof Error ? error.message : String(error);
186
+ console.error(message);
187
+ if (exitCode === errors_js_1.EXIT_CODES.BUDGET_EXCEEDED) {
188
+ console.error('Hint: Increase --budget or use --degraded-mode to skip AI features.');
189
+ }
190
+ else if (exitCode === errors_js_1.EXIT_CODES.PROVIDER_UNAVAILABLE) {
191
+ console.error('Hint: Check API key or use --degraded-mode for deterministic analysis only.');
192
+ }
193
+ process.exit(exitCode);
194
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Crew Context — shared mutable state accumulated by agents across workflow phases.
3
+ */
4
+ import type { RouteFamily, RouteFamilyManifest } from '../knowledge/route_families.js';
5
+ import type { ApiSurfaceCatalog } from '../knowledge/api_surface.js';
6
+ import type { SpecIndex } from '../knowledge/spec_index.js';
7
+ import type { FlowDecision } from '../validation/output_schema.js';
8
+ import type { ProviderUsageStats } from '../provider_interface.js';
9
+ import type { GeneratedSpec } from '../pipeline/stage3_generation.js';
10
+ import type { LoadedContext } from '../knowledge/context_loader.js';
11
+ import type { FamilyGroup, PreprocessResult } from '../pipeline/stage0_preprocess.js';
12
+ import type { BudgetLedger } from '../budget_ledger.js';
13
+ import type { AgentMessage } from './protocol.js';
14
+ import type { TestDesign, CrossImpact, Finding, StrategyEntry, RegressionRisk } from './types.js';
15
+ export interface CrewContext {
16
+ changedFiles: string[];
17
+ routeFamilies: RouteFamily[];
18
+ manifest: RouteFamilyManifest | null;
19
+ apiSurface: ApiSurfaceCatalog;
20
+ specIndex: SpecIndex;
21
+ context: LoadedContext;
22
+ familyGroups: FamilyGroup[];
23
+ preprocessResult: PreprocessResult | null;
24
+ appPath: string;
25
+ testsRoot: string;
26
+ gitSince: string;
27
+ providerOverride?: string;
28
+ budgetUSD?: number;
29
+ modelRoutingProviderType?: string;
30
+ modelRoutingOverrides?: Record<string, string>;
31
+ /** @internal Shared budget enforcement — not part of the public API. */
32
+ budgetLedger?: BudgetLedger;
33
+ impactedFlows: FlowDecision[];
34
+ strategyEntries: StrategyEntry[];
35
+ testDesigns: TestDesign[];
36
+ crossImpacts: CrossImpact[];
37
+ regressionRisks: RegressionRisk[];
38
+ findings: Finding[];
39
+ generatedSpecs: GeneratedSpec[];
40
+ usage: ProviderUsageStats;
41
+ agentUsage: AgentUsageEntry[];
42
+ messages: AgentMessage[];
43
+ warnings: string[];
44
+ }
45
+ export interface AgentUsageEntry {
46
+ agent: string;
47
+ family?: string;
48
+ inputTokens: number;
49
+ outputTokens: number;
50
+ cost: number;
51
+ durationMs: number;
52
+ }
53
+ export declare function createEmptyUsageStats(): ProviderUsageStats;
54
+ export declare function mergeUsageStats(target: ProviderUsageStats, source: ProviderUsageStats): void;
55
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/crew/context.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACrF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AACpF,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAC,MAAM,YAAY,CAAC;AAEhG,MAAM,WAAW,WAAW;IAExB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAG1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,wEAAwE;IACxE,YAAY,CAAC,EAAE,YAAY,CAAC;IAG5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAGhC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CAa1D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAe5F"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.createEmptyUsageStats = createEmptyUsageStats;
6
+ exports.mergeUsageStats = mergeUsageStats;
7
+ function createEmptyUsageStats() {
8
+ const now = new Date();
9
+ return {
10
+ requestCount: 0,
11
+ totalInputTokens: 0,
12
+ totalOutputTokens: 0,
13
+ totalTokens: 0,
14
+ totalCost: 0,
15
+ averageResponseTimeMs: 0,
16
+ failedRequests: 0,
17
+ startTime: now,
18
+ lastUpdated: now,
19
+ };
20
+ }
21
+ function mergeUsageStats(target, source) {
22
+ const prevRequestCount = target.requestCount;
23
+ target.requestCount += source.requestCount;
24
+ target.totalInputTokens += source.totalInputTokens;
25
+ target.totalOutputTokens += source.totalOutputTokens;
26
+ target.totalTokens += source.totalTokens;
27
+ target.totalCost += source.totalCost;
28
+ target.failedRequests += source.failedRequests;
29
+ if (source.requestCount > 0 && target.requestCount > 0) {
30
+ const prevWeight = prevRequestCount / target.requestCount;
31
+ const newWeight = source.requestCount / target.requestCount;
32
+ target.averageResponseTimeMs =
33
+ target.averageResponseTimeMs * prevWeight + source.averageResponseTimeMs * newWeight;
34
+ }
35
+ target.lastUpdated = new Date();
36
+ }
@@ -0,0 +1,50 @@
1
+ import type { RouteFamilyConfig } from '../knowledge/route_families.js';
2
+ import type { ApiSurfaceConfig } from '../knowledge/api_surface.js';
3
+ import type { Agent, AgentMessage, AgentResult } from './protocol.js';
4
+ import type { CrewContext } from './context.js';
5
+ import type { AgentRole } from './types.js';
6
+ import type { WorkflowName } from './workflows.js';
7
+ export interface CrewConfig {
8
+ appPath: string;
9
+ testsRoot: string;
10
+ gitSince: string;
11
+ gitIncludeUncommitted?: boolean;
12
+ routeFamilies?: RouteFamilyConfig;
13
+ apiSurface?: ApiSurfaceConfig;
14
+ workflow?: WorkflowName;
15
+ providerOverride?: string;
16
+ budgetUSD?: number;
17
+ dryRun?: boolean;
18
+ plugins?: string[];
19
+ }
20
+ export interface CrewResult {
21
+ context: CrewContext;
22
+ warnings: string[];
23
+ timings: Record<string, number>;
24
+ dryRun?: boolean;
25
+ }
26
+ export declare class CrewOrchestrator {
27
+ private agents;
28
+ registerAgent(agent: Agent): void;
29
+ /**
30
+ * Load and register plugins from file paths.
31
+ * Each module must default-export an object satisfying AgentPlugin.
32
+ */
33
+ loadPlugins(pluginPaths: string[]): Promise<string[]>;
34
+ run(config: CrewConfig): Promise<CrewResult>;
35
+ dispatch(role: AgentRole, action: string, ctx: CrewContext): Promise<AgentResult>;
36
+ parallel(roles: AgentRole[], action: string, ctx: CrewContext): Promise<AgentResult[]>;
37
+ broadcast(msg: AgentMessage, ctx: CrewContext): Promise<void>;
38
+ private runBuiltInPhase;
39
+ private runParallel;
40
+ private runSequential;
41
+ /**
42
+ * Inject loaded plugins into workflow phases based on their `phase` and `runAfter` fields.
43
+ * Plugins with `runAfter` dependencies are appended to the sequential list of the matching phase;
44
+ * plugins without `runAfter` are appended to the parallel list.
45
+ * Returns a new array of phases (does not mutate the original workflow definition).
46
+ */
47
+ private injectPluginsIntoPhases;
48
+ private checkPhaseResults;
49
+ }
50
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/crew/orchestrator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAC,KAAK,EAAE,YAAY,EAAe,WAAW,EAAY,MAAM,eAAe,CAAC;AAC5F,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAA6B,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAG7E,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAA+B;IAE7C,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIjC;;;OAGG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqCrD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAiG5C,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA0CjF,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtF,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAerD,eAAe;YAwBf,WAAW;YAMX,aAAa;IAS3B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA2E/B,OAAO,CAAC,iBAAiB;CAM5B"}
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.CrewOrchestrator = void 0;
6
+ /**
7
+ * Crew Orchestrator — executes workflow definitions by dispatching to agents.
8
+ */
9
+ const git_js_1 = require("../agent/git.js");
10
+ const stage0_preprocess_js_1 = require("../pipeline/stage0_preprocess.js");
11
+ const logger_js_1 = require("../logger.js");
12
+ const base_provider_js_1 = require("../base_provider.js");
13
+ const budget_ledger_js_1 = require("../budget_ledger.js");
14
+ const context_js_1 = require("./context.js");
15
+ const workflows_js_1 = require("./workflows.js");
16
+ class CrewOrchestrator {
17
+ constructor() {
18
+ this.agents = new Map();
19
+ }
20
+ registerAgent(agent) {
21
+ this.agents.set(agent.role, agent);
22
+ }
23
+ /**
24
+ * Load and register plugins from file paths.
25
+ * Each module must default-export an object satisfying AgentPlugin.
26
+ */
27
+ async loadPlugins(pluginPaths) {
28
+ const loaded = [];
29
+ for (const pluginPath of pluginPaths) {
30
+ try {
31
+ // Security: Only allow relative paths (starting with . or ..) to prevent loading arbitrary modules.
32
+ // Absolute paths, URLs, and node_modules references are rejected.
33
+ if (!pluginPath.startsWith('.')) {
34
+ logger_js_1.logger.warn(`Plugin path must be relative (start with ./): ${pluginPath} — skipped`);
35
+ continue;
36
+ }
37
+ const resolved = new URL(pluginPath, `file://${process.cwd()}/`).href;
38
+ // Security: reject paths that resolve outside the workspace (e.g., ../../etc/evil.js)
39
+ const cwd = `file://${process.cwd()}/`;
40
+ if (!resolved.startsWith(cwd)) {
41
+ logger_js_1.logger.warn(`Plugin path '${pluginPath}' resolves outside workspace — skipped`);
42
+ continue;
43
+ }
44
+ const mod = await import(resolved);
45
+ const plugin = mod.default || mod;
46
+ if (!plugin.role || typeof plugin.execute !== 'function') {
47
+ logger_js_1.logger.warn(`Plugin at ${pluginPath} missing required role/execute — skipped`);
48
+ continue;
49
+ }
50
+ // Warn if plugin overrides a built-in agent
51
+ if (this.agents.has(plugin.role)) {
52
+ logger_js_1.logger.warn(`Plugin '${plugin.role}' overrides built-in agent — ensure this is intentional`);
53
+ }
54
+ this.agents.set(plugin.role, plugin);
55
+ loaded.push(plugin.role);
56
+ }
57
+ catch (error) {
58
+ const msg = error instanceof Error ? error.message : String(error);
59
+ logger_js_1.logger.warn(`Failed to load plugin ${pluginPath}: ${msg}`);
60
+ }
61
+ }
62
+ return loaded;
63
+ }
64
+ async run(config) {
65
+ const workflow = workflows_js_1.WORKFLOWS[config.workflow || 'full-qa'];
66
+ const timings = {};
67
+ const warnings = [];
68
+ // Load plugins if configured, then inject them into workflow phases
69
+ const pluginRoles = [];
70
+ if (config.plugins && config.plugins.length > 0) {
71
+ const loaded = await this.loadPlugins(config.plugins);
72
+ pluginRoles.push(...loaded);
73
+ if (loaded.length > 0) {
74
+ logger_js_1.logger.info(`Loaded ${loaded.length} plugins: ${loaded.join(', ')}`);
75
+ }
76
+ }
77
+ const effectivePhases = this.injectPluginsIntoPhases(workflow.phases, pluginRoles);
78
+ // Step 1: Get changed files
79
+ const gitResult = (0, git_js_1.getChangedFiles)(config.appPath, config.gitSince, {
80
+ includeUncommitted: config.gitIncludeUncommitted,
81
+ });
82
+ if (gitResult.error) {
83
+ warnings.push(`Git diff warning: ${gitResult.error}`);
84
+ }
85
+ const changedFiles = gitResult.files
86
+ .map((f) => f.replace(/\\/g, '/'))
87
+ .filter((f) => !(0, git_js_1.isTestFile)(f));
88
+ if (changedFiles.length === 0) {
89
+ warnings.push('No changed application files detected.');
90
+ }
91
+ // Create shared budget ledger for aggregate cost tracking across all agents
92
+ const budgetLedger = config.budgetUSD ? new budget_ledger_js_1.BudgetLedger(config.budgetUSD) : undefined;
93
+ // Initialize context (will be populated during preprocess phase)
94
+ const ctx = {
95
+ changedFiles,
96
+ routeFamilies: [],
97
+ manifest: null,
98
+ apiSurface: { pageObjects: [], generatedAt: '' },
99
+ specIndex: { specs: [], indexedAt: '' },
100
+ context: { documents: [], warnings: [] },
101
+ familyGroups: [],
102
+ preprocessResult: null,
103
+ appPath: config.appPath,
104
+ testsRoot: config.testsRoot,
105
+ gitSince: config.gitSince,
106
+ providerOverride: config.providerOverride,
107
+ budgetUSD: config.budgetUSD,
108
+ budgetLedger,
109
+ impactedFlows: [],
110
+ strategyEntries: [],
111
+ testDesigns: [],
112
+ crossImpacts: [],
113
+ regressionRisks: [],
114
+ findings: [],
115
+ generatedSpecs: [],
116
+ usage: (0, context_js_1.createEmptyUsageStats)(),
117
+ agentUsage: [],
118
+ messages: [],
119
+ warnings,
120
+ };
121
+ // Execute each phase
122
+ for (const phase of effectivePhases) {
123
+ const timer = logger_js_1.logger.timer(`crew:${phase.name}`);
124
+ if (phase.handler === 'built-in') {
125
+ await this.runBuiltInPhase(phase.name, ctx, config);
126
+ // Dry-run: after preprocess, return summary without running agents
127
+ if (config.dryRun && phase.name === 'preprocess') {
128
+ timings[phase.name] = timer.end();
129
+ ctx.warnings.push('Dry run — no LLM calls were made.');
130
+ return { context: ctx, warnings, timings, dryRun: true };
131
+ }
132
+ }
133
+ else if (phase.parallel && phase.parallel.length > 0) {
134
+ await this.runParallel(phase.parallel, phase.name, ctx);
135
+ }
136
+ else if (phase.sequential && phase.sequential.length > 0) {
137
+ await this.runSequential(phase.sequential, phase.name, ctx);
138
+ }
139
+ else {
140
+ warnings.push(`Phase '${phase.name}' has no handler, parallel, or sequential agents — skipped.`);
141
+ }
142
+ timings[phase.name] = timer.end();
143
+ // Budget check — prefer ledger (aggregate across all providers) over ctx.usage
144
+ const currentCost = budgetLedger ? budgetLedger.totalCost : ctx.usage.totalCost;
145
+ if (config.budgetUSD && currentCost >= config.budgetUSD) {
146
+ warnings.push(`Budget limit reached ($${currentCost.toFixed(4)} >= $${config.budgetUSD}). Stopping workflow.`);
147
+ break;
148
+ }
149
+ }
150
+ return { context: ctx, warnings, timings };
151
+ }
152
+ async dispatch(role, action, ctx) {
153
+ const agent = this.agents.get(role);
154
+ if (!agent) {
155
+ return {
156
+ role,
157
+ status: 'failed',
158
+ output: null,
159
+ warnings: [`Agent '${role}' is not registered.`],
160
+ };
161
+ }
162
+ const task = { role, action, input: null };
163
+ const startMs = Date.now();
164
+ try {
165
+ const result = await agent.execute(task, ctx);
166
+ const durationMs = Date.now() - startMs;
167
+ if (result.usage) {
168
+ (0, context_js_1.mergeUsageStats)(ctx.usage, result.usage);
169
+ ctx.agentUsage.push({
170
+ agent: role,
171
+ inputTokens: result.usage.totalInputTokens,
172
+ outputTokens: result.usage.totalOutputTokens,
173
+ cost: result.usage.totalCost,
174
+ durationMs,
175
+ });
176
+ }
177
+ if (result.warnings && result.warnings.length > 0) {
178
+ ctx.warnings.push(...result.warnings);
179
+ }
180
+ return result;
181
+ }
182
+ catch (error) {
183
+ if (error instanceof base_provider_js_1.BudgetExceededError) {
184
+ ctx.warnings.push(`Budget exceeded ($${error.currentCost.toFixed(4)} >= $${error.budgetUSD}). Agent '${role}' skipped.`);
185
+ return { role, status: 'failed', output: null, warnings: [error.message] };
186
+ }
187
+ const message = error instanceof Error ? error.message : String(error);
188
+ ctx.warnings.push(`Agent '${role}' failed: ${message}`);
189
+ return { role, status: 'failed', output: null, warnings: [message] };
190
+ }
191
+ }
192
+ async parallel(roles, action, ctx) {
193
+ const promises = roles.map((role) => this.dispatch(role, action, ctx));
194
+ return Promise.all(promises);
195
+ }
196
+ async broadcast(msg, ctx) {
197
+ ctx.messages.push(msg);
198
+ const promises = [];
199
+ for (const agent of this.agents.values()) {
200
+ if (agent.onMessage && agent.role !== msg.from) {
201
+ promises.push(agent.onMessage(msg).catch((err) => {
202
+ ctx.warnings.push(`Broadcast to ${agent.role} failed: ${err instanceof Error ? err.message : String(err)}`);
203
+ }));
204
+ }
205
+ }
206
+ await Promise.all(promises);
207
+ }
208
+ async runBuiltInPhase(name, ctx, config) {
209
+ if (name === 'preprocess') {
210
+ if (ctx.changedFiles.length === 0) {
211
+ return;
212
+ }
213
+ const result = (0, stage0_preprocess_js_1.preprocess)(ctx.changedFiles, {
214
+ appPath: config.appPath,
215
+ testsRoot: config.testsRoot,
216
+ routeFamilies: config.routeFamilies,
217
+ apiSurface: config.apiSurface,
218
+ });
219
+ ctx.preprocessResult = result;
220
+ ctx.manifest = result.manifest;
221
+ ctx.routeFamilies = result.manifest?.families || [];
222
+ ctx.apiSurface = result.apiSurface;
223
+ ctx.specIndex = result.specIndex;
224
+ ctx.context = result.context;
225
+ ctx.familyGroups = result.familyGroups;
226
+ ctx.warnings.push(...result.warnings);
227
+ }
228
+ }
229
+ async runParallel(roles, phaseName, ctx) {
230
+ logger_js_1.logger.info(`Crew phase '${phaseName}': running ${roles.join(', ')} in parallel`);
231
+ const results = await this.parallel(roles, phaseName, ctx);
232
+ this.checkPhaseResults(phaseName, results, ctx);
233
+ }
234
+ async runSequential(roles, phaseName, ctx) {
235
+ logger_js_1.logger.info(`Crew phase '${phaseName}': running ${roles.join(' → ')} sequentially`);
236
+ const results = [];
237
+ for (const role of roles) {
238
+ results.push(await this.dispatch(role, phaseName, ctx));
239
+ }
240
+ this.checkPhaseResults(phaseName, results, ctx);
241
+ }
242
+ /**
243
+ * Inject loaded plugins into workflow phases based on their `phase` and `runAfter` fields.
244
+ * Plugins with `runAfter` dependencies are appended to the sequential list of the matching phase;
245
+ * plugins without `runAfter` are appended to the parallel list.
246
+ * Returns a new array of phases (does not mutate the original workflow definition).
247
+ */
248
+ injectPluginsIntoPhases(phases, pluginRoles) {
249
+ if (pluginRoles.length === 0)
250
+ return phases;
251
+ // Build mutable copies keyed by phase name
252
+ const phaseMap = new Map();
253
+ const ordered = [];
254
+ for (const p of phases) {
255
+ ordered.push(p.name);
256
+ if (p.handler === 'built-in') {
257
+ phaseMap.set(p.name, { handler: 'built-in' });
258
+ }
259
+ else if (p.parallel) {
260
+ phaseMap.set(p.name, { parallel: [...p.parallel] });
261
+ }
262
+ else if (p.sequential) {
263
+ phaseMap.set(p.name, { sequential: [...p.sequential] });
264
+ }
265
+ }
266
+ for (const role of pluginRoles) {
267
+ const agent = this.agents.get(role);
268
+ if (!agent)
269
+ continue;
270
+ const plugin = agent;
271
+ if (!plugin.phase)
272
+ continue;
273
+ const target = phaseMap.get(plugin.phase);
274
+ if (!target) {
275
+ logger_js_1.logger.warn(`Plugin '${role}' targets phase '${plugin.phase}' which does not exist in workflow — skipped`);
276
+ continue;
277
+ }
278
+ if (target.handler === 'built-in') {
279
+ logger_js_1.logger.warn(`Plugin '${role}' targets built-in phase '${plugin.phase}' — not supported, skipped`);
280
+ continue;
281
+ }
282
+ const pluginRole = role;
283
+ if (plugin.runAfter && plugin.runAfter.length > 0) {
284
+ // Validate that runAfter dependencies are either in this phase or a prior phase
285
+ const phaseRoles = target.parallel || target.sequential || [];
286
+ const missingDeps = plugin.runAfter.filter((dep) => !phaseRoles.includes(dep) && !this.agents.has(dep));
287
+ if (missingDeps.length > 0) {
288
+ logger_js_1.logger.warn(`Plugin '${role}' has unresolved runAfter deps [${missingDeps.join(', ')}] — injecting anyway`);
289
+ }
290
+ // Plugin has dependencies — must run sequentially
291
+ if (target.sequential) {
292
+ target.sequential.push(pluginRole);
293
+ }
294
+ else if (target.parallel) {
295
+ // Convert to sequential to respect dependency ordering
296
+ target.sequential = [...target.parallel, pluginRole];
297
+ delete target.parallel;
298
+ }
299
+ }
300
+ else {
301
+ if (target.parallel) {
302
+ target.parallel.push(pluginRole);
303
+ }
304
+ else if (target.sequential) {
305
+ target.sequential.push(pluginRole);
306
+ }
307
+ }
308
+ logger_js_1.logger.info(`Plugin '${role}' injected into phase '${plugin.phase}'`);
309
+ }
310
+ // Rebuild WorkflowPhase array
311
+ return ordered.map((name) => {
312
+ const entry = phaseMap.get(name);
313
+ if (entry.handler === 'built-in')
314
+ return { name, handler: 'built-in' };
315
+ if (entry.parallel)
316
+ return { name, parallel: entry.parallel };
317
+ if (entry.sequential)
318
+ return { name, sequential: entry.sequential };
319
+ throw new Error(`Phase '${name}' has no handler, parallel, or sequential agents after plugin injection`);
320
+ });
321
+ }
322
+ checkPhaseResults(phaseName, results, ctx) {
323
+ const allFailed = results.length > 0 && results.every((r) => r.status === 'failed');
324
+ if (allFailed) {
325
+ ctx.warnings.push(`Phase '${phaseName}': all ${results.length} agent(s) failed. Downstream phases may produce empty results.`);
326
+ }
327
+ }
328
+ }
329
+ exports.CrewOrchestrator = CrewOrchestrator;