@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
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
3
+ // See LICENSE.txt for license information.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AnthropicProvider = void 0;
9
+ exports.checkAnthropicSetup = checkAnthropicSetup;
10
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
11
+ const provider_interface_js_1 = require("./provider_interface.js");
12
+ const provider_utils_js_1 = require("./provider_utils.js");
13
+ const base_provider_js_1 = require("./base_provider.js");
14
+ const logger_js_1 = require("./logger.js");
15
+ /**
16
+ * Anthropic Provider - Claude AI models
17
+ *
18
+ * Features:
19
+ * - Highest quality AI (98% accuracy in testing)
20
+ * - Vision support (analyze screenshots, compare UI)
21
+ * - Fast response times (<1 second)
22
+ * - 200K token context window
23
+ * - Prompt caching (reduces costs by 90% on repeated prompts)
24
+ *
25
+ * Costs (Claude Sonnet 4.5):
26
+ * - Input: $3 per 1M tokens
27
+ * - Output: $15 per 1M tokens
28
+ * - Cached input: $0.30 per 1M tokens
29
+ * - Estimated: ~$30-80/month for autonomous testing
30
+ *
31
+ * Use cases:
32
+ * - Vision tasks (screenshot comparison)
33
+ * - Complex failure diagnosis
34
+ * - High-stakes production testing
35
+ * - When quality is paramount
36
+ *
37
+ * Models:
38
+ * - claude-sonnet-4-5-20250929 (recommended - best balance)
39
+ * - claude-opus-4-5-20251101 (highest quality, slower, more expensive)
40
+ * - claude-haiku-4-0-20250430 (fastest, cheapest, lower quality)
41
+ */
42
+ class AnthropicProvider extends base_provider_js_1.BaseProvider {
43
+ constructor(config) {
44
+ super();
45
+ this.name = 'anthropic';
46
+ this.capabilities = {
47
+ vision: true, // Full vision support
48
+ streaming: true,
49
+ maxTokens: 200000, // 200K context window
50
+ costPer1MInputTokens: 3, // $3 per 1M input tokens
51
+ costPer1MOutputTokens: 15, // $15 per 1M output tokens
52
+ supportsTools: true, // Function calling support
53
+ supportsPromptCaching: true, // Reduces costs by 90%
54
+ typicalResponseTimeMs: 800, // ~0.8 seconds
55
+ };
56
+ // SECURITY: Validate API key format
57
+ if (!provider_utils_js_1.API_KEY_PATTERNS.anthropic.test(config.apiKey)) {
58
+ throw new Error('Invalid API key format. Expected sk-ant-* format.');
59
+ }
60
+ // SECURITY: Validate and enforce HTTPS for remote connections
61
+ if (config.baseUrl) {
62
+ const validation = (0, provider_utils_js_1.validateAndSanitizeUrl)(config.baseUrl);
63
+ if (!validation.valid) {
64
+ throw new Error(`Invalid base URL: ${validation.warning}`);
65
+ }
66
+ if (validation.warning) {
67
+ logger_js_1.logger.warn(`HTTPS required for remote URLs: ${validation.warning}`);
68
+ }
69
+ }
70
+ this.client = new sdk_1.default({
71
+ apiKey: config.apiKey,
72
+ baseURL: config.baseUrl,
73
+ maxRetries: 0,
74
+ });
75
+ this.model = config.model || 'claude-sonnet-4-5-20250929';
76
+ }
77
+ async generateText(prompt, options) {
78
+ this.checkBudget();
79
+ const startTime = Date.now();
80
+ try {
81
+ // SECURITY: Validate prompt length to prevent resource exhaustion
82
+ if (prompt.length > 10 * 1024 * 1024) {
83
+ throw new Error('Prompt exceeds maximum size (10MB)');
84
+ }
85
+ const response = await (0, provider_utils_js_1.withTimeout)(this.client.messages.create({
86
+ model: this.model,
87
+ max_tokens: options?.maxTokens || 4000,
88
+ temperature: options?.temperature,
89
+ top_p: options?.topP,
90
+ stop_sequences: options?.stopSequences,
91
+ system: options?.systemPrompt,
92
+ messages: [
93
+ {
94
+ role: 'user',
95
+ content: prompt,
96
+ },
97
+ ],
98
+ }), options?.timeout, 'generateText');
99
+ const responseTime = Date.now() - startTime;
100
+ const text = this.extractTextFromResponse(response);
101
+ // SECURITY: Type-safe usage extraction
102
+ const usage = this.extractUsageFromResponse(response.usage);
103
+ const cost = this.calculateCost(usage, this.capabilities.costPer1MInputTokens, this.capabilities.costPer1MOutputTokens);
104
+ // Update stats
105
+ this.updateStats(usage, responseTime, cost);
106
+ return {
107
+ text,
108
+ usage,
109
+ cost,
110
+ metadata: {
111
+ model: this.model,
112
+ responseTimeMs: responseTime,
113
+ stopReason: response.stop_reason,
114
+ stopSequence: response.stop_sequence,
115
+ },
116
+ };
117
+ }
118
+ catch (error) {
119
+ this.stats.failedRequests++;
120
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'generateText'), this.name, this.extractStatusCode(error), error);
121
+ }
122
+ }
123
+ async analyzeImage(images, prompt, options) {
124
+ const startTime = Date.now();
125
+ try {
126
+ // SECURITY: Validate image array size
127
+ if (images.length === 0 || images.length > 20) {
128
+ throw new Error('Image count must be between 1 and 20');
129
+ }
130
+ // SECURITY: Validate prompt length
131
+ if (prompt.length > 10 * 1024 * 1024) {
132
+ throw new Error('Prompt exceeds maximum size (10MB)');
133
+ }
134
+ // Build content array with text and images
135
+ const content = [];
136
+ // Add prompt text first
137
+ content.push({
138
+ type: 'text',
139
+ text: prompt,
140
+ });
141
+ // Add each image
142
+ for (const image of images) {
143
+ // Validate media type
144
+ const mediaType = (image.mimeType || image.mediaType || 'image/png');
145
+ if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(mediaType)) {
146
+ throw new Error(`Unsupported image type: ${mediaType}`);
147
+ }
148
+ const data = image.data || image.base64 || '';
149
+ // SECURITY: Validate base64 data size (limit to 20MB per image)
150
+ if (data.length > 20 * 1024 * 1024) {
151
+ throw new Error('Image data exceeds maximum size (20MB)');
152
+ }
153
+ content.push({
154
+ type: 'image',
155
+ source: {
156
+ type: 'base64',
157
+ media_type: mediaType,
158
+ data: data,
159
+ },
160
+ });
161
+ // Add description if provided
162
+ if (image.description) {
163
+ content.push({
164
+ type: 'text',
165
+ text: `[Image: ${image.description}]`,
166
+ });
167
+ }
168
+ }
169
+ const response = await (0, provider_utils_js_1.withTimeout)(this.client.messages.create({
170
+ model: this.model,
171
+ max_tokens: options?.maxTokens || 4000,
172
+ temperature: options?.temperature,
173
+ top_p: options?.topP,
174
+ stop_sequences: options?.stopSequences,
175
+ system: options?.systemPrompt,
176
+ messages: [
177
+ {
178
+ role: 'user',
179
+ content,
180
+ },
181
+ ],
182
+ }), options?.timeout, 'analyzeImage');
183
+ const responseTime = Date.now() - startTime;
184
+ const text = this.extractTextFromResponse(response);
185
+ // SECURITY: Type-safe usage extraction
186
+ const usage = this.extractUsageFromResponse(response.usage);
187
+ const cost = this.calculateCost(usage, this.capabilities.costPer1MInputTokens, this.capabilities.costPer1MOutputTokens);
188
+ // Update stats
189
+ this.updateStats(usage, responseTime, cost);
190
+ return {
191
+ text,
192
+ usage,
193
+ cost,
194
+ metadata: {
195
+ model: this.model,
196
+ responseTimeMs: responseTime,
197
+ stopReason: response.stop_reason,
198
+ imageCount: images.length,
199
+ },
200
+ };
201
+ }
202
+ catch (error) {
203
+ this.stats.failedRequests++;
204
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'analyzeImage'), this.name, this.extractStatusCode(error), error);
205
+ }
206
+ }
207
+ async *streamText(prompt, options) {
208
+ try {
209
+ // SECURITY: Validate prompt length
210
+ if (prompt.length > 10 * 1024 * 1024) {
211
+ throw new Error('Prompt exceeds maximum size (10MB)');
212
+ }
213
+ const stream = await (0, provider_utils_js_1.withTimeout)(this.client.messages.create({
214
+ model: this.model,
215
+ max_tokens: options?.maxTokens || 4000,
216
+ temperature: options?.temperature,
217
+ top_p: options?.topP,
218
+ stop_sequences: options?.stopSequences,
219
+ system: options?.systemPrompt,
220
+ messages: [
221
+ {
222
+ role: 'user',
223
+ content: prompt,
224
+ },
225
+ ],
226
+ stream: true,
227
+ }), options?.timeout, 'streamText');
228
+ for await (const event of stream) {
229
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
230
+ yield event.delta.text;
231
+ }
232
+ }
233
+ // Note: Streaming doesn't provide detailed usage stats
234
+ // We increment request count but can't track exact tokens/cost
235
+ this.stats.requestCount++;
236
+ this.stats.lastUpdated = new Date();
237
+ }
238
+ catch (error) {
239
+ this.stats.failedRequests++;
240
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'streamText'), this.name, this.extractStatusCode(error), error);
241
+ }
242
+ }
243
+ extractTextFromResponse(response) {
244
+ const textBlocks = response.content.filter((block) => block.type === 'text');
245
+ return textBlocks.map((block) => {
246
+ if (block.type === 'text') {
247
+ return block.text;
248
+ }
249
+ return '';
250
+ }).join('\n');
251
+ }
252
+ /**
253
+ * SECURITY: Type-safe usage extraction
254
+ * Avoids unsafe `as any` casts
255
+ */
256
+ extractUsageFromResponse(usage) {
257
+ return {
258
+ inputTokens: usage.input_tokens || 0,
259
+ outputTokens: usage.output_tokens || 0,
260
+ totalTokens: (usage.input_tokens || 0) + (usage.output_tokens || 0),
261
+ cachedTokens: usage.cache_read_input_tokens ?? undefined,
262
+ };
263
+ }
264
+ /**
265
+ * SECURITY: Extract status code safely
266
+ */
267
+ extractStatusCode(error) {
268
+ if (error && typeof error === 'object') {
269
+ const err = error;
270
+ const status = err.status;
271
+ if (typeof status === 'number') {
272
+ return status;
273
+ }
274
+ }
275
+ return undefined;
276
+ }
277
+ /**
278
+ * Check if API key is valid and service is accessible
279
+ */
280
+ async checkHealth() {
281
+ try {
282
+ // Try a minimal request to verify API key
283
+ await (0, provider_utils_js_1.withTimeout)(this.client.messages.create({
284
+ model: this.model,
285
+ max_tokens: 10,
286
+ messages: [
287
+ {
288
+ role: 'user',
289
+ content: 'Hi',
290
+ },
291
+ ],
292
+ }), 5000, 'health check');
293
+ return {
294
+ healthy: true,
295
+ message: `Anthropic API is accessible`,
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ healthy: false,
301
+ message: `Anthropic API error: ${(0, provider_utils_js_1.sanitizeErrorMessage)(error, 'health check')}`,
302
+ };
303
+ }
304
+ }
305
+ }
306
+ exports.AnthropicProvider = AnthropicProvider;
307
+ /**
308
+ * Helper to check Anthropic setup
309
+ */
310
+ async function checkAnthropicSetup(apiKey) {
311
+ if (!apiKey) {
312
+ return {
313
+ valid: false,
314
+ message: 'No API key provided',
315
+ estimatedMonthlyCost: 'N/A',
316
+ };
317
+ }
318
+ try {
319
+ const provider = new AnthropicProvider({ apiKey });
320
+ const health = await provider.checkHealth();
321
+ return {
322
+ valid: health.healthy,
323
+ message: health.message,
324
+ estimatedMonthlyCost: '$30-80 for autonomous testing (24 cycles/day)',
325
+ };
326
+ }
327
+ catch (error) {
328
+ return {
329
+ valid: false,
330
+ message: `Setup check failed: ${(0, provider_utils_js_1.sanitizeErrorMessage)(error, 'setup check')}`,
331
+ estimatedMonthlyCost: 'N/A',
332
+ };
333
+ }
334
+ }
package/dist/api.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ import { type ConfigOverrides } from './agent/config.js';
2
+ import { type PlanReport } from './agent/plan.js';
3
+ import { type ImpactResult } from './engine/impact_engine.js';
4
+ import { type AIEnrichmentResult } from './engine/ai_enrichment.js';
5
+ import { type FinalizeGeneratedTestsOptions, type FinalizeGeneratedTestsResult } from './agent/handoff.js';
6
+ import { type TraceabilityIngestOptions, type TraceabilityIngestResult } from './agent/traceability_ingest.js';
7
+ import { type TraceabilityCaptureResult } from './agent/traceability_capture.js';
8
+ export interface AgentApiOptions extends Omit<ConfigOverrides, 'mode'> {
9
+ cwd?: string;
10
+ configPath?: string;
11
+ apply?: boolean;
12
+ allowFallback?: boolean;
13
+ }
14
+ export interface TraceabilityIngestApiOptions {
15
+ cwd?: string;
16
+ configPath?: string;
17
+ path?: string;
18
+ testsRoot?: string;
19
+ payload: unknown;
20
+ options?: TraceabilityIngestOptions;
21
+ }
22
+ export interface TraceabilityCaptureApiOptions {
23
+ cwd?: string;
24
+ configPath?: string;
25
+ path?: string;
26
+ testsRoot?: string;
27
+ reportPath: string;
28
+ sinceRef?: string;
29
+ outputPath?: string;
30
+ coverageMapPath?: string;
31
+ changedFilesPath?: string;
32
+ }
33
+ export declare function handoffGeneratedTests(options: FinalizeGeneratedTestsOptions): FinalizeGeneratedTestsResult;
34
+ export declare function ingestTraceability(options: TraceabilityIngestApiOptions): TraceabilityIngestResult;
35
+ export interface RecommendTestsV2Result {
36
+ impact: ImpactResult;
37
+ plan: PlanReport;
38
+ planPath: string;
39
+ ciSummaryMarkdown: string;
40
+ ciSummaryPath: string;
41
+ }
42
+ export declare function analyzeImpactDeterministic(options?: AgentApiOptions): ImpactResult;
43
+ export declare function recommendTestsDeterministic(options?: AgentApiOptions): RecommendTestsV2Result;
44
+ export declare function recommendTestsAI(options?: AgentApiOptions): Promise<RecommendTestsV2Result & {
45
+ aiEnrichment?: AIEnrichmentResult;
46
+ }>;
47
+ export declare function captureTraceability(options: TraceabilityCaptureApiOptions): TraceabilityCaptureResult;
48
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,eAAe,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAEH,KAAK,UAAU,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAmC,KAAK,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAU9F,OAAO,EAAqB,KAAK,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,6BAA6B,EAAE,KAAK,4BAA4B,EAAC,MAAM,oBAAoB,CAAC;AACjI,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAChC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGH,KAAK,yBAAyB,EACjC,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAcD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,6BAA6B,GAAG,4BAA4B,CAE1G;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,4BAA4B,GAAG,wBAAwB,CASlG;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,eAAoB,GAAG,YAAY,CAStF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,eAAoB,GAAG,sBAAsB,CAgBjG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,sBAAsB,GAAG;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC,CA+D7I;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,6BAA6B,GAAG,yBAAyB,CAkBrG"}
package/dist/api.js ADDED
@@ -0,0 +1,151 @@
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.handoffGeneratedTests = handoffGeneratedTests;
6
+ exports.ingestTraceability = ingestTraceability;
7
+ exports.analyzeImpactDeterministic = analyzeImpactDeterministic;
8
+ exports.recommendTestsDeterministic = recommendTestsDeterministic;
9
+ exports.recommendTestsAI = recommendTestsAI;
10
+ exports.captureTraceability = captureTraceability;
11
+ const config_js_1 = require("./agent/config.js");
12
+ const plan_js_1 = require("./agent/plan.js");
13
+ const impact_engine_js_1 = require("./engine/impact_engine.js");
14
+ const plan_builder_js_1 = require("./engine/plan_builder.js");
15
+ const git_js_1 = require("./agent/git.js");
16
+ const feedback_js_1 = require("./agent/feedback.js");
17
+ const diff_loader_js_1 = require("./engine/diff_loader.js");
18
+ const ai_enrichment_js_1 = require("./engine/ai_enrichment.js");
19
+ const provider_factory_js_1 = require("./provider_factory.js");
20
+ const handoff_js_1 = require("./agent/handoff.js");
21
+ const traceability_ingest_js_1 = require("./agent/traceability_ingest.js");
22
+ const traceability_capture_js_1 = require("./agent/traceability_capture.js");
23
+ function resolveAgent(options, mode) {
24
+ const cwd = options.cwd || process.cwd();
25
+ const { config } = (0, config_js_1.resolveConfig)(cwd, options.configPath, {
26
+ ...options,
27
+ mode,
28
+ });
29
+ if (options.allowFallback) {
30
+ config.impact.allowFallback = true;
31
+ }
32
+ return config;
33
+ }
34
+ function handoffGeneratedTests(options) {
35
+ return (0, handoff_js_1.finalizeGeneratedTests)(options);
36
+ }
37
+ function ingestTraceability(options) {
38
+ const cwd = options.cwd || process.cwd();
39
+ const { config } = (0, config_js_1.resolveConfig)(cwd, options.configPath, {
40
+ path: options.path,
41
+ testsRoot: options.testsRoot,
42
+ mode: 'impact',
43
+ });
44
+ const reportRoot = config.testsRoot || config.path;
45
+ return (0, traceability_ingest_js_1.ingestTraceabilityInput)(reportRoot, config.impact.traceability, options.payload, options.options);
46
+ }
47
+ function analyzeImpactDeterministic(options = {}) {
48
+ const config = resolveAgent(options, 'impact');
49
+ const reportRoot = config.testsRoot || config.path;
50
+ const gitResult = (0, git_js_1.getChangedFiles)(config.path, config.git.since, { includeUncommitted: config.git.includeUncommitted });
51
+ return (0, impact_engine_js_1.analyzeImpact)(gitResult.files, {
52
+ testsRoot: reportRoot,
53
+ routeFamilies: config.routeFamilies,
54
+ filteredTestFiles: gitResult.filteredTestFiles,
55
+ });
56
+ }
57
+ function recommendTestsDeterministic(options = {}) {
58
+ const config = resolveAgent(options, 'impact');
59
+ const reportRoot = config.testsRoot || config.path;
60
+ const gitResult = (0, git_js_1.getChangedFiles)(config.path, config.git.since, { includeUncommitted: config.git.includeUncommitted });
61
+ const impact = (0, impact_engine_js_1.analyzeImpact)(gitResult.files, {
62
+ testsRoot: reportRoot,
63
+ routeFamilies: config.routeFamilies,
64
+ filteredTestFiles: gitResult.filteredTestFiles,
65
+ });
66
+ const adaptive = (0, feedback_js_1.getAdaptiveThresholds)(reportRoot);
67
+ const plan = (0, plan_builder_js_1.buildPlanFromImpact)(impact, config.policy, undefined, adaptive);
68
+ const planPath = (0, plan_builder_js_1.writePlanReport)(reportRoot, plan);
69
+ const ciSummaryMarkdown = (0, plan_builder_js_1.renderCiSummaryMarkdown)(plan);
70
+ const ciSummaryPath = (0, plan_builder_js_1.writeCiSummary)(reportRoot, ciSummaryMarkdown);
71
+ (0, plan_js_1.appendPlanMetrics)(reportRoot, plan);
72
+ return { impact, plan, planPath, ciSummaryMarkdown, ciSummaryPath };
73
+ }
74
+ async function recommendTestsAI(options = {}) {
75
+ const config = resolveAgent(options, 'impact');
76
+ const reportRoot = config.testsRoot || config.path;
77
+ const gitResult = (0, git_js_1.getChangedFiles)(config.path, config.git.since, { includeUncommitted: config.git.includeUncommitted });
78
+ const impact = (0, impact_engine_js_1.analyzeImpact)(gitResult.files, {
79
+ testsRoot: reportRoot,
80
+ routeFamilies: config.routeFamilies,
81
+ filteredTestFiles: gitResult.filteredTestFiles,
82
+ });
83
+ let aiEnrichment;
84
+ let provider;
85
+ try {
86
+ provider = await provider_factory_js_1.LLMProviderFactory.createFromPreference(config.llm.provider);
87
+ }
88
+ catch (error) {
89
+ const configuredProvider = config.llm.provider?.trim().toLowerCase();
90
+ const envProvider = process.env.LLM_PROVIDER?.trim().toLowerCase();
91
+ const shouldThrow = Boolean((configuredProvider && configuredProvider !== 'auto') ||
92
+ (envProvider && envProvider !== 'auto'));
93
+ if (shouldThrow) {
94
+ throw error;
95
+ }
96
+ }
97
+ if (provider) {
98
+ const diffs = (0, diff_loader_js_1.loadDiffs)(config.path, config.git.since, gitResult.files);
99
+ // Collect all known spec paths and scenario details from impacted features
100
+ const specSet = new Set();
101
+ const specDetailsMap = new Map();
102
+ for (const feature of impact.impactedFeatures) {
103
+ for (const s of feature.playwrightSpecs) {
104
+ specSet.add(s);
105
+ }
106
+ for (const detail of feature.playwrightSpecDetails) {
107
+ if (!specDetailsMap.has(detail.file)) {
108
+ specDetailsMap.set(detail.file, detail);
109
+ }
110
+ }
111
+ for (const detail of feature.cypressSpecDetails) {
112
+ if (!specDetailsMap.has(detail.file)) {
113
+ specDetailsMap.set(detail.file, detail);
114
+ }
115
+ }
116
+ }
117
+ aiEnrichment = await (0, ai_enrichment_js_1.enrichImpactWithAI)({
118
+ deterministicImpact: impact,
119
+ diffs,
120
+ provider,
121
+ specList: [...specSet],
122
+ specDetails: [...specDetailsMap.values()],
123
+ });
124
+ }
125
+ const adaptive = (0, feedback_js_1.getAdaptiveThresholds)(reportRoot);
126
+ const plan = (0, plan_builder_js_1.buildPlanFromImpact)(impact, config.policy, aiEnrichment, adaptive);
127
+ const planPath = (0, plan_builder_js_1.writePlanReport)(reportRoot, plan);
128
+ const ciSummaryMarkdown = (0, plan_builder_js_1.renderCiSummaryMarkdown)(plan);
129
+ const ciSummaryPath = (0, plan_builder_js_1.writeCiSummary)(reportRoot, ciSummaryMarkdown);
130
+ (0, plan_js_1.appendPlanMetrics)(reportRoot, plan);
131
+ return { impact, plan, planPath, ciSummaryMarkdown, ciSummaryPath, aiEnrichment };
132
+ }
133
+ function captureTraceability(options) {
134
+ const cwd = options.cwd || process.cwd();
135
+ const { config } = (0, config_js_1.resolveConfig)(cwd, options.configPath, {
136
+ path: options.path,
137
+ testsRoot: options.testsRoot,
138
+ mode: 'impact',
139
+ });
140
+ const reportRoot = config.testsRoot || config.path;
141
+ const captureOptions = {
142
+ appPath: config.path,
143
+ testsRoot: reportRoot,
144
+ reportPath: options.reportPath,
145
+ sinceRef: options.sinceRef || config.git.since,
146
+ outputPath: options.outputPath,
147
+ coverageMapPath: options.coverageMapPath,
148
+ changedFilesPath: options.changedFilesPath,
149
+ };
150
+ return (0, traceability_capture_js_1.captureTraceabilityInput)(captureOptions);
151
+ }
@@ -0,0 +1,109 @@
1
+ import type { GenerateOptions, ImageInput, LLMProvider, LLMResponse, ProviderCapabilities, ProviderUsageStats } from './provider_interface.js';
2
+ import { CircuitBreaker } from './resilience/circuit_breaker.js';
3
+ import type { BudgetLedger } from './budget_ledger.js';
4
+ /**
5
+ * Abstract base class for all LLM providers
6
+ * Eliminates 240+ lines of duplicate stats management code
7
+ * Provides common functionality for token tracking, cost calculation, and stats management
8
+ */
9
+ export declare class BudgetExceededError extends Error {
10
+ currentCost: number;
11
+ budgetUSD: number;
12
+ constructor(currentCost: number, budgetUSD: number);
13
+ }
14
+ export declare abstract class BaseProvider implements LLMProvider {
15
+ abstract name: string;
16
+ abstract capabilities: ProviderCapabilities;
17
+ /**
18
+ * Shared circuit breakers keyed by provider name (e.g., "anthropic", "openai").
19
+ * All instances of the same provider type share one breaker, so if Anthropic is
20
+ * down, ALL agents discover it after 3 total failures instead of 3 × N.
21
+ */
22
+ private static readonly _sharedBreakers;
23
+ protected stats: ProviderUsageStats;
24
+ private _budgetUSD;
25
+ private _ledger;
26
+ /** Tracks the current in-flight budget reservation for this provider instance. */
27
+ private _activeReservation;
28
+ constructor();
29
+ /** Lazily get-or-create a circuit breaker shared across all instances of this provider type. */
30
+ protected get circuitBreaker(): CircuitBreaker;
31
+ /**
32
+ * Set a hard budget limit. Once totalCost reaches this value,
33
+ * subsequent calls will throw BudgetExceededError.
34
+ */
35
+ setBudget(usd: number | undefined): void;
36
+ get budgetUSD(): number | undefined;
37
+ /**
38
+ * Attach a shared budget ledger so aggregate cost across all providers
39
+ * in a crew run is checked before each LLM call.
40
+ */
41
+ setBudgetLedger(ledger: BudgetLedger | undefined): void;
42
+ /**
43
+ * Check budget and pre-reserve estimated cost for the upcoming LLM call.
44
+ *
45
+ * When a shared ledger exists, reserves an estimate derived from the provider's
46
+ * output token cost × maxTokens (default 4096). This blocks parallel agents from
47
+ * spending into the same headroom — like a credit card authorization hold.
48
+ *
49
+ * Self-healing: if a prior call failed without reaching updateStats(), the stale
50
+ * reservation is released here before placing the new one.
51
+ */
52
+ protected checkBudget(): void;
53
+ /**
54
+ * Conservative cost estimate for the upcoming call.
55
+ * Uses maxTokens (or 4096 default) × output cost rate.
56
+ * Overestimating is safe — the reservation is replaced with actual cost in updateStats.
57
+ */
58
+ private estimateCallCost;
59
+ /**
60
+ * Initialize stats object with default values
61
+ */
62
+ protected initializeStats(): void;
63
+ /**
64
+ * Update stats with new usage data
65
+ * Maintains rolling average for response time
66
+ */
67
+ protected updateStats(usage: {
68
+ inputTokens: number;
69
+ outputTokens: number;
70
+ totalTokens: number;
71
+ }, responseTime: number, cost: number): void;
72
+ /**
73
+ * Get a copy of current usage stats
74
+ */
75
+ getUsageStats(): ProviderUsageStats;
76
+ /**
77
+ * Reset all usage stats to initial state
78
+ */
79
+ resetUsageStats(): void;
80
+ /**
81
+ * Wrap an async call with circuit breaker + retry logic.
82
+ * Circuit breaker protects against cascading failures from a down provider;
83
+ * retry handles transient failures within a healthy circuit.
84
+ *
85
+ * Non-transient errors (budget, auth, validation) are thrown directly and
86
+ * bypass the circuit breaker so they don't incorrectly trip it.
87
+ */
88
+ protected retryCall<T>(fn: () => Promise<T>): Promise<T>;
89
+ /**
90
+ * Abstract methods that must be implemented by subclasses
91
+ */
92
+ abstract generateText(prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
93
+ abstract analyzeImage(images: ImageInput[], prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
94
+ abstract streamText(prompt: string, options?: GenerateOptions): AsyncGenerator<string, void, unknown>;
95
+ abstract checkHealth(): Promise<{
96
+ healthy: boolean;
97
+ message: string;
98
+ }>;
99
+ /**
100
+ * Calculate cost for token usage, accounting for prompt caching discounts
101
+ * Cached tokens cost 90% less than regular tokens
102
+ */
103
+ protected calculateCost(usage: {
104
+ inputTokens: number;
105
+ outputTokens: number;
106
+ cachedTokens?: number;
107
+ }, costPer1MInputTokens: number, costPer1MOutputTokens: number): number;
108
+ }
109
+ //# sourceMappingURL=base_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base_provider.d.ts","sourceRoot":"","sources":["../src/base_provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IACvB,WAAW,EAAE,MAAM;IAAS,SAAS,EAAE,MAAM;gBAA7C,WAAW,EAAE,MAAM,EAAS,SAAS,EAAE,MAAM;CAInE;AAED,8BAAsB,YAAa,YAAW,WAAW;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAE5C;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAqC;IAE5E,SAAS,CAAC,KAAK,EAAG,kBAAkB,CAAC;IACrC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAA2B;IAC1C,kFAAkF;IAClF,OAAO,CAAC,kBAAkB,CAAK;;IAM/B,gGAAgG;IAChG,SAAS,KAAK,cAAc,IAAI,cAAc,CAiB7C;IAED;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIxC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI;IAIvD;;;;;;;;;OASG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IA4B7B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,SAAS,CAAC,eAAe,IAAI,IAAI;IAcjC;;;OAGG;IACH,SAAS,CAAC,WAAW,CACjB,KAAK,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,EACvE,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACb,IAAI;IAuBP;;OAEG;IACH,aAAa,IAAI,kBAAkB;IAInC;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;;;;;;OAOG;IACH,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAOxD;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IACtF,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAC5G,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IACrG,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;IAEpE;;;OAGG;IACH,SAAS,CAAC,aAAa,CACnB,KAAK,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAC,EACzE,oBAAoB,EAAE,MAAM,EAC5B,qBAAqB,EAAE,MAAM,GAC9B,MAAM;CAmBZ"}