@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,203 @@
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.BaseProvider = exports.BudgetExceededError = void 0;
6
+ const retry_js_1 = require("./resilience/retry.js");
7
+ const circuit_breaker_js_1 = require("./resilience/circuit_breaker.js");
8
+ /**
9
+ * Abstract base class for all LLM providers
10
+ * Eliminates 240+ lines of duplicate stats management code
11
+ * Provides common functionality for token tracking, cost calculation, and stats management
12
+ */
13
+ class BudgetExceededError extends Error {
14
+ constructor(currentCost, budgetUSD) {
15
+ super(`Budget exceeded: $${currentCost.toFixed(4)} >= $${budgetUSD} limit`);
16
+ this.currentCost = currentCost;
17
+ this.budgetUSD = budgetUSD;
18
+ this.name = 'BudgetExceededError';
19
+ }
20
+ }
21
+ exports.BudgetExceededError = BudgetExceededError;
22
+ class BaseProvider {
23
+ constructor() {
24
+ /** Tracks the current in-flight budget reservation for this provider instance. */
25
+ this._activeReservation = 0;
26
+ this.initializeStats();
27
+ }
28
+ /** Lazily get-or-create a circuit breaker shared across all instances of this provider type. */
29
+ get circuitBreaker() {
30
+ let cb = BaseProvider._sharedBreakers.get(this.name);
31
+ if (!cb) {
32
+ cb = new circuit_breaker_js_1.CircuitBreaker({
33
+ shouldCount: (error) => {
34
+ if (error instanceof BudgetExceededError)
35
+ return false;
36
+ if (!(error instanceof Error))
37
+ return true;
38
+ const msg = error.message.toLowerCase();
39
+ return msg.includes('429') || msg.includes('rate limit') ||
40
+ msg.includes('500') || msg.includes('502') || msg.includes('503') || msg.includes('504') ||
41
+ msg.includes('econnreset') || msg.includes('econnrefused') || msg.includes('etimedout') ||
42
+ msg.includes('overloaded') || msg.includes('socket hang up') || msg.includes('network error');
43
+ },
44
+ });
45
+ BaseProvider._sharedBreakers.set(this.name, cb);
46
+ }
47
+ return cb;
48
+ }
49
+ /**
50
+ * Set a hard budget limit. Once totalCost reaches this value,
51
+ * subsequent calls will throw BudgetExceededError.
52
+ */
53
+ setBudget(usd) {
54
+ this._budgetUSD = usd;
55
+ }
56
+ get budgetUSD() {
57
+ return this._budgetUSD;
58
+ }
59
+ /**
60
+ * Attach a shared budget ledger so aggregate cost across all providers
61
+ * in a crew run is checked before each LLM call.
62
+ */
63
+ setBudgetLedger(ledger) {
64
+ this._ledger = ledger;
65
+ }
66
+ /**
67
+ * Check budget and pre-reserve estimated cost for the upcoming LLM call.
68
+ *
69
+ * When a shared ledger exists, reserves an estimate derived from the provider's
70
+ * output token cost × maxTokens (default 4096). This blocks parallel agents from
71
+ * spending into the same headroom — like a credit card authorization hold.
72
+ *
73
+ * Self-healing: if a prior call failed without reaching updateStats(), the stale
74
+ * reservation is released here before placing the new one.
75
+ */
76
+ checkBudget() {
77
+ if (this._ledger) {
78
+ // Release stale reservation from a prior failed call that never hit updateStats
79
+ if (this._activeReservation > 0) {
80
+ this._ledger.release(this._activeReservation);
81
+ this._activeReservation = 0;
82
+ }
83
+ // Reserve estimated cost for the upcoming call
84
+ const estimate = this.estimateCallCost();
85
+ this._ledger.reserve(estimate);
86
+ this._activeReservation = estimate;
87
+ try {
88
+ this._ledger.check();
89
+ }
90
+ catch (err) {
91
+ // Budget exceeded — release reservation immediately so it doesn't leak
92
+ this._ledger.release(estimate);
93
+ this._activeReservation = 0;
94
+ throw err;
95
+ }
96
+ return;
97
+ }
98
+ if (this._budgetUSD !== undefined && this.stats.totalCost >= this._budgetUSD) {
99
+ throw new BudgetExceededError(this.stats.totalCost, this._budgetUSD);
100
+ }
101
+ }
102
+ /**
103
+ * Conservative cost estimate for the upcoming call.
104
+ * Uses maxTokens (or 4096 default) × output cost rate.
105
+ * Overestimating is safe — the reservation is replaced with actual cost in updateStats.
106
+ */
107
+ estimateCallCost() {
108
+ const outputTokenEstimate = 4096;
109
+ const costRate = this.capabilities?.costPer1MOutputTokens ?? 15; // default to ~Sonnet
110
+ return (outputTokenEstimate / 1000000) * costRate;
111
+ }
112
+ /**
113
+ * Initialize stats object with default values
114
+ */
115
+ initializeStats() {
116
+ this.stats = {
117
+ requestCount: 0,
118
+ totalInputTokens: 0,
119
+ totalOutputTokens: 0,
120
+ totalTokens: 0,
121
+ totalCost: 0,
122
+ averageResponseTimeMs: 0,
123
+ failedRequests: 0,
124
+ startTime: new Date(),
125
+ lastUpdated: new Date(),
126
+ };
127
+ }
128
+ /**
129
+ * Update stats with new usage data
130
+ * Maintains rolling average for response time
131
+ */
132
+ updateStats(usage, responseTime, cost) {
133
+ this.stats.requestCount++;
134
+ this.stats.totalInputTokens += usage.inputTokens;
135
+ this.stats.totalOutputTokens += usage.outputTokens;
136
+ this.stats.totalTokens += usage.totalTokens;
137
+ this.stats.totalCost += cost;
138
+ if (this._ledger) {
139
+ // Settle: release the estimate, record actual
140
+ if (this._activeReservation > 0) {
141
+ this._ledger.release(this._activeReservation);
142
+ this._activeReservation = 0;
143
+ }
144
+ this._ledger.record(cost);
145
+ }
146
+ // Update rolling average response time
147
+ const totalRequests = this.stats.requestCount;
148
+ this.stats.averageResponseTimeMs =
149
+ (this.stats.averageResponseTimeMs * (totalRequests - 1) + responseTime) / totalRequests;
150
+ this.stats.lastUpdated = new Date();
151
+ }
152
+ /**
153
+ * Get a copy of current usage stats
154
+ */
155
+ getUsageStats() {
156
+ return { ...this.stats };
157
+ }
158
+ /**
159
+ * Reset all usage stats to initial state
160
+ */
161
+ resetUsageStats() {
162
+ this.initializeStats();
163
+ }
164
+ /**
165
+ * Wrap an async call with circuit breaker + retry logic.
166
+ * Circuit breaker protects against cascading failures from a down provider;
167
+ * retry handles transient failures within a healthy circuit.
168
+ *
169
+ * Non-transient errors (budget, auth, validation) are thrown directly and
170
+ * bypass the circuit breaker so they don't incorrectly trip it.
171
+ */
172
+ retryCall(fn) {
173
+ return this.circuitBreaker.call(() => (0, retry_js_1.withRetry)(fn, { maxRetries: 2, baseDelayMs: 1000, maxDelayMs: 10000, jitter: true }), () => { throw new Error(`${this.name} provider circuit open — too many consecutive failures`); });
174
+ }
175
+ /**
176
+ * Calculate cost for token usage, accounting for prompt caching discounts
177
+ * Cached tokens cost 90% less than regular tokens
178
+ */
179
+ calculateCost(usage, costPer1MInputTokens, costPer1MOutputTokens) {
180
+ // Calculate input token cost
181
+ let inputCost = 0;
182
+ // Cached tokens cost 90% less
183
+ if (usage.cachedTokens) {
184
+ const cachedCost = (usage.cachedTokens / 1000000) * (costPer1MInputTokens * 0.1);
185
+ const uncachedInputTokens = usage.inputTokens - usage.cachedTokens;
186
+ const uncachedCost = (uncachedInputTokens / 1000000) * costPer1MInputTokens;
187
+ inputCost = cachedCost + uncachedCost;
188
+ }
189
+ else {
190
+ inputCost = (usage.inputTokens / 1000000) * costPer1MInputTokens;
191
+ }
192
+ // Calculate output token cost
193
+ const outputCost = (usage.outputTokens / 1000000) * costPer1MOutputTokens;
194
+ return inputCost + outputCost;
195
+ }
196
+ }
197
+ exports.BaseProvider = BaseProvider;
198
+ /**
199
+ * Shared circuit breakers keyed by provider name (e.g., "anthropic", "openai").
200
+ * All instances of the same provider type share one breaker, so if Anthropic is
201
+ * down, ALL agents discover it after 3 total failures instead of 3 × N.
202
+ */
203
+ BaseProvider._sharedBreakers = new Map();
@@ -0,0 +1,28 @@
1
+ export declare class BudgetLedger {
2
+ private _totalCost;
3
+ private _reserved;
4
+ private readonly _limitUSD;
5
+ constructor(limitUSD: number);
6
+ get totalCost(): number;
7
+ get limitUSD(): number;
8
+ /**
9
+ * Record actual cost from a completed LLM call.
10
+ */
11
+ record(cost: number): void;
12
+ /**
13
+ * Pre-reserve estimated cost before an LLM call begins.
14
+ * Blocks parallel agents from spending into the same headroom.
15
+ * Like a credit card authorization hold.
16
+ */
17
+ reserve(estimate: number): void;
18
+ /**
19
+ * Release a prior reservation (after API response or on error).
20
+ */
21
+ release(estimate: number): void;
22
+ /**
23
+ * Throws BudgetExceededError if committed cost + in-flight reservations
24
+ * have reached the limit.
25
+ */
26
+ check(): void;
27
+ }
28
+ //# sourceMappingURL=budget_ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget_ledger.d.ts","sourceRoot":"","sources":["../src/budget_ledger.ts"],"names":[],"mappings":"AAcA,qBAAa,YAAY;IACrB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,QAAQ,EAAE,MAAM;IAI5B,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK/B;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,KAAK,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,62 @@
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.BudgetLedger = void 0;
6
+ /**
7
+ * Shared budget ledger — tracks aggregate cost across all provider instances
8
+ * in a single crew run. Prevents parallel agents from each seeing only 1/N
9
+ * of actual spend and overshooting the budget by N×limit.
10
+ *
11
+ * Usage: create one BudgetLedger per crew run, pass it to getCrewProvider(),
12
+ * which attaches it to each provider via setBudgetLedger().
13
+ */
14
+ const base_provider_js_1 = require("./base_provider.js");
15
+ class BudgetLedger {
16
+ constructor(limitUSD) {
17
+ this._totalCost = 0;
18
+ this._reserved = 0;
19
+ this._limitUSD = limitUSD;
20
+ }
21
+ get totalCost() {
22
+ return this._totalCost;
23
+ }
24
+ get limitUSD() {
25
+ return this._limitUSD;
26
+ }
27
+ /**
28
+ * Record actual cost from a completed LLM call.
29
+ */
30
+ record(cost) {
31
+ if (!Number.isFinite(cost) || cost < 0)
32
+ return;
33
+ this._totalCost += cost;
34
+ }
35
+ /**
36
+ * Pre-reserve estimated cost before an LLM call begins.
37
+ * Blocks parallel agents from spending into the same headroom.
38
+ * Like a credit card authorization hold.
39
+ */
40
+ reserve(estimate) {
41
+ if (!Number.isFinite(estimate) || estimate <= 0)
42
+ return;
43
+ this._reserved += estimate;
44
+ }
45
+ /**
46
+ * Release a prior reservation (after API response or on error).
47
+ */
48
+ release(estimate) {
49
+ this._reserved = Math.max(0, this._reserved - estimate);
50
+ }
51
+ /**
52
+ * Throws BudgetExceededError if committed cost + in-flight reservations
53
+ * have reached the limit.
54
+ */
55
+ check() {
56
+ const effective = this._totalCost + this._reserved;
57
+ if (effective >= this._limitUSD) {
58
+ throw new base_provider_js_1.BudgetExceededError(effective, this._limitUSD);
59
+ }
60
+ }
61
+ }
62
+ exports.BudgetLedger = BudgetLedger;
@@ -0,0 +1,49 @@
1
+ import type { LLMProvider, LLMResponse, GenerateOptions, ImageInput, ProviderCapabilities, ProviderUsageStats } from '../provider_interface.js';
2
+ import { ResponseCache } from './response_cache.js';
3
+ /**
4
+ * Context that ties a cached provider to a specific agent + family scope.
5
+ */
6
+ export interface CacheContext {
7
+ /** The agent role performing the request (e.g. 'impact-analyst', 'generator') */
8
+ agent: string;
9
+ /** The route-family name being processed */
10
+ family: string;
11
+ /** Content hashes of the source files used in the prompt */
12
+ fileHashes: string[];
13
+ }
14
+ /**
15
+ * Decorator that adds transparent response caching to any LLMProvider.
16
+ *
17
+ * - `generateText()` checks the cache first and returns a cached response on hit.
18
+ * On a miss it delegates to the inner provider, stores the result, and returns it.
19
+ * - All other methods (analyzeImage, streamText, capabilities, usage stats)
20
+ * delegate directly to the wrapped provider.
21
+ *
22
+ * The TTL is selected based on the agent role: agents whose name contains
23
+ * "generat" use the shorter GENERATION TTL; all others use ANALYSIS.
24
+ */
25
+ export declare class CachedProvider implements LLMProvider {
26
+ readonly name: string;
27
+ readonly capabilities: ProviderCapabilities;
28
+ private readonly inner;
29
+ private readonly cache;
30
+ private readonly ctx;
31
+ private readonly ttlMs;
32
+ analyzeImage?: (images: ImageInput[], prompt: string, options?: GenerateOptions) => Promise<LLMResponse>;
33
+ streamText?: (prompt: string, options?: GenerateOptions) => AsyncGenerator<string, void, unknown>;
34
+ constructor(inner: LLMProvider, cache: ResponseCache, cacheContext: CacheContext);
35
+ /**
36
+ * Generate text with cache-through semantics.
37
+ * On a cache hit the inner provider is never called, saving tokens and latency.
38
+ */
39
+ generateText(prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
40
+ getUsageStats(): ProviderUsageStats;
41
+ resetUsageStats(): void;
42
+ checkHealth(): Promise<{
43
+ healthy: boolean;
44
+ message: string;
45
+ }>;
46
+ }
47
+ export { ResponseCache, TTL } from './response_cache.js';
48
+ export type { CacheEntry } from './response_cache.js';
49
+ //# sourceMappingURL=cached_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cached_provider.d.ts","sourceRoot":"","sources":["../../src/cache/cached_provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,WAAW,EACX,WAAW,EACX,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAC,aAAa,EAAM,MAAM,qBAAqB,CAAC;AAGvD;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAG/B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACzG,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAEtF,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY;IAqBhF;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAyCnF,aAAa,IAAI,kBAAkB;IAInC,eAAe,IAAI,IAAI;IAIjB,WAAW,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;CAGpE;AAGD,OAAO,EAAC,aAAa,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,91 @@
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.TTL = exports.ResponseCache = exports.CachedProvider = void 0;
6
+ const response_cache_js_1 = require("./response_cache.js");
7
+ /**
8
+ * Decorator that adds transparent response caching to any LLMProvider.
9
+ *
10
+ * - `generateText()` checks the cache first and returns a cached response on hit.
11
+ * On a miss it delegates to the inner provider, stores the result, and returns it.
12
+ * - All other methods (analyzeImage, streamText, capabilities, usage stats)
13
+ * delegate directly to the wrapped provider.
14
+ *
15
+ * The TTL is selected based on the agent role: agents whose name contains
16
+ * "generat" use the shorter GENERATION TTL; all others use ANALYSIS.
17
+ */
18
+ class CachedProvider {
19
+ constructor(inner, cache, cacheContext) {
20
+ this.inner = inner;
21
+ this.cache = cache;
22
+ this.ctx = cacheContext;
23
+ this.name = inner.name;
24
+ this.capabilities = inner.capabilities;
25
+ // Pick TTL based on agent role
26
+ this.ttlMs = cacheContext.agent.toLowerCase().includes('generat')
27
+ ? response_cache_js_1.TTL.GENERATION
28
+ : response_cache_js_1.TTL.ANALYSIS;
29
+ // Wire optional methods only when the inner provider supports them
30
+ if (inner.analyzeImage) {
31
+ this.analyzeImage = (images, prompt, options) => inner.analyzeImage(images, prompt, options);
32
+ }
33
+ if (inner.streamText) {
34
+ this.streamText = (prompt, options) => inner.streamText(prompt, options);
35
+ }
36
+ }
37
+ /**
38
+ * Generate text with cache-through semantics.
39
+ * On a cache hit the inner provider is never called, saving tokens and latency.
40
+ */
41
+ async generateText(prompt, options) {
42
+ const { agent, family, fileHashes } = this.ctx;
43
+ const model = this.inner.name;
44
+ // Check cache
45
+ const cached = this.cache.get(agent, family, fileHashes, model);
46
+ if (cached) {
47
+ return {
48
+ text: cached.response,
49
+ usage: {
50
+ inputTokens: cached.usage.inputTokens,
51
+ outputTokens: cached.usage.outputTokens,
52
+ totalTokens: cached.usage.inputTokens + cached.usage.outputTokens,
53
+ cachedTokens: cached.usage.inputTokens,
54
+ },
55
+ cost: 0, // No cost on cache hit
56
+ };
57
+ }
58
+ // Cache miss - call inner provider
59
+ const response = await this.inner.generateText(prompt, options);
60
+ // Store in cache
61
+ const key = response_cache_js_1.ResponseCache.buildKey({ agent, family, fileHashes, model });
62
+ const entry = {
63
+ key,
64
+ family,
65
+ response: response.text,
66
+ usage: {
67
+ inputTokens: response.usage.inputTokens,
68
+ outputTokens: response.usage.outputTokens,
69
+ cost: response.cost,
70
+ },
71
+ createdAt: new Date().toISOString(),
72
+ ttlMs: this.ttlMs,
73
+ };
74
+ this.cache.set(entry);
75
+ return response;
76
+ }
77
+ getUsageStats() {
78
+ return this.inner.getUsageStats();
79
+ }
80
+ resetUsageStats() {
81
+ this.inner.resetUsageStats();
82
+ }
83
+ async checkHealth() {
84
+ return this.inner.checkHealth();
85
+ }
86
+ }
87
+ exports.CachedProvider = CachedProvider;
88
+ // Re-export for convenience
89
+ var response_cache_js_2 = require("./response_cache.js");
90
+ Object.defineProperty(exports, "ResponseCache", { enumerable: true, get: function () { return response_cache_js_2.ResponseCache; } });
91
+ Object.defineProperty(exports, "TTL", { enumerable: true, get: function () { return response_cache_js_2.TTL; } });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * TTL presets for different cache entry types.
3
+ */
4
+ export declare const TTL: {
5
+ /** 24 hours - for analysis results that change infrequently */
6
+ readonly ANALYSIS: number;
7
+ /** 1 hour - for generated content that may need fresher context */
8
+ readonly GENERATION: number;
9
+ };
10
+ /**
11
+ * A single cached LLM response entry stored on disk.
12
+ */
13
+ export interface CacheEntry {
14
+ /** Content-addressed cache key (SHA-256 hex) */
15
+ key: string;
16
+ /** The LLM response text */
17
+ response: string;
18
+ /** Token usage and cost snapshot */
19
+ usage: {
20
+ inputTokens: number;
21
+ outputTokens: number;
22
+ cost: number;
23
+ };
24
+ /** ISO timestamp when the entry was created */
25
+ createdAt: string;
26
+ /** Time-to-live in milliseconds */
27
+ ttlMs: number;
28
+ }
29
+ /**
30
+ * Parameters used to compute a content-addressed cache key.
31
+ */
32
+ export interface CacheKeyParams {
33
+ agent: string;
34
+ family: string;
35
+ fileHashes: string[];
36
+ model: string;
37
+ }
38
+ /**
39
+ * Cross-run LLM response cache backed by JSON files.
40
+ *
41
+ * Stores entries as `{cacheDir}/{sha256}.json` using a content-addressed key
42
+ * derived from (agentRole + familyName + sorted file hashes + model).
43
+ */
44
+ export declare class ResponseCache {
45
+ private readonly cacheDir;
46
+ constructor(workspaceRoot: string);
47
+ /**
48
+ * Build a deterministic SHA-256 cache key from the provided parameters.
49
+ */
50
+ static buildKey(params: CacheKeyParams): string;
51
+ /**
52
+ * Retrieve a cached response if it exists and has not expired.
53
+ * Returns `null` on cache miss or expiry.
54
+ */
55
+ get(agent: string, family: string, fileHashes: string[], model: string): CacheEntry | null;
56
+ /**
57
+ * Write a cache entry to disk.
58
+ * Creates the cache directory if it does not yet exist.
59
+ */
60
+ set(entry: CacheEntry): void;
61
+ /**
62
+ * Remove all cache entries belonging to the given family.
63
+ *
64
+ * Because the cache key is a one-way SHA-256 hash, we scan each file and
65
+ * check its stored `family` field. The directory is scoped to a single
66
+ * workspace so the scan is bounded.
67
+ */
68
+ invalidateFamily(familyName: string): number;
69
+ /**
70
+ * Remove all expired entries from the cache directory.
71
+ * Returns the number of entries deleted.
72
+ */
73
+ prune(): number;
74
+ /**
75
+ * Ensure the cache directory exists on disk.
76
+ */
77
+ private ensureCacheDir;
78
+ }
79
+ //# sourceMappingURL=response_cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response_cache.d.ts","sourceRoot":"","sources":["../../src/cache/response_cache.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,eAAO,MAAM,GAAG;IACZ,+DAA+D;;IAE/D,mEAAmE;;CAE7D,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE;QACH,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,aAAa,EAAE,MAAM;IAIjC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAM/C;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IA0B1F;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAM5B;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAyB5C;;;OAGG;IACH,KAAK,IAAI,MAAM;IAiCf;;OAEG;IACH,OAAO,CAAC,cAAc;CAKzB"}