@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,153 @@
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.PrometheusMetrics = void 0;
6
+ const DURATION_BUCKETS = [0.1, 0.5, 1, 2, 5, 10, 30, 60, 120, 300];
7
+ class PrometheusMetrics {
8
+ constructor() {
9
+ this.counters = [];
10
+ this.gauges = [];
11
+ this.histograms = [];
12
+ }
13
+ /**
14
+ * Record an LLM request.
15
+ */
16
+ recordLLMRequest(provider, agent, durationMs, costUSD, tokens) {
17
+ this.incrementCounter('e2e_agents_llm_requests_total', 'Total LLM requests', { provider, agent });
18
+ this.incrementCounter('e2e_agents_llm_tokens_total', 'Total tokens consumed', { provider, agent }, tokens);
19
+ this.incrementCounter('e2e_agents_llm_cost_usd_total', 'Total LLM cost in USD', { provider, agent }, costUSD);
20
+ this.observeHistogram('e2e_agents_llm_request_duration_seconds', 'LLM request duration', { provider, agent }, durationMs / 1000);
21
+ }
22
+ /**
23
+ * Record a crew workflow run.
24
+ */
25
+ recordCrewRun(workflow, families, durationMs, costUSD) {
26
+ this.incrementCounter('e2e_agents_crew_runs_total', 'Total crew workflow runs', { workflow });
27
+ this.incrementCounter('e2e_agents_crew_families_processed_total', 'Total families processed', { workflow }, families);
28
+ this.incrementCounter('e2e_agents_crew_cost_usd_total', 'Total crew cost in USD', { workflow }, costUSD);
29
+ this.observeHistogram('e2e_agents_crew_duration_seconds', 'Crew workflow duration', { workflow }, durationMs / 1000);
30
+ }
31
+ /**
32
+ * Record a budget check event.
33
+ */
34
+ recordBudgetCheck(exceeded, currentUSD, limitUSD) {
35
+ this.incrementCounter('e2e_agents_budget_checks_total', 'Total budget checks', { exceeded: String(exceeded) });
36
+ this.setGauge('e2e_agents_budget_used_usd', 'Current budget usage in USD', {}, currentUSD);
37
+ this.setGauge('e2e_agents_budget_limit_usd', 'Budget limit in USD', {}, limitUSD);
38
+ }
39
+ /**
40
+ * Record a circuit breaker state change.
41
+ */
42
+ recordCircuitBreakerState(state) {
43
+ this.setGauge('e2e_agents_circuit_breaker_state', 'Circuit breaker state (0=closed, 1=open, 2=half-open)', {}, state === 'closed' ? 0 : state === 'open' ? 1 : 2);
44
+ }
45
+ /**
46
+ * Record a cache hit or miss.
47
+ */
48
+ recordCacheResult(hit, agent) {
49
+ this.incrementCounter('e2e_agents_cache_lookups_total', 'Total cache lookups', { result: hit ? 'hit' : 'miss', agent });
50
+ }
51
+ /**
52
+ * Export all metrics in Prometheus text exposition format.
53
+ */
54
+ export() {
55
+ const lines = [];
56
+ const seenHelp = new Set();
57
+ // Export counters
58
+ for (const counter of this.counters) {
59
+ if (!seenHelp.has(counter.name)) {
60
+ lines.push(`# HELP ${counter.name} ${counter.help}`);
61
+ lines.push(`# TYPE ${counter.name} counter`);
62
+ seenHelp.add(counter.name);
63
+ }
64
+ const labelStr = formatLabels(counter.labels);
65
+ lines.push(`${counter.name}${labelStr} ${counter.value}`);
66
+ }
67
+ // Export gauges
68
+ for (const gauge of this.gauges) {
69
+ if (!seenHelp.has(gauge.name)) {
70
+ lines.push(`# HELP ${gauge.name} ${gauge.help}`);
71
+ lines.push(`# TYPE ${gauge.name} gauge`);
72
+ seenHelp.add(gauge.name);
73
+ }
74
+ const labelStr = formatLabels(gauge.labels);
75
+ lines.push(`${gauge.name}${labelStr} ${gauge.value}`);
76
+ }
77
+ // Export histograms
78
+ for (const hist of this.histograms) {
79
+ if (!seenHelp.has(hist.name)) {
80
+ lines.push(`# HELP ${hist.name} ${hist.help}`);
81
+ lines.push(`# TYPE ${hist.name} histogram`);
82
+ seenHelp.add(hist.name);
83
+ }
84
+ const labelStr = formatLabels(hist.labels);
85
+ let cumulative = 0;
86
+ for (const bucket of DURATION_BUCKETS) {
87
+ cumulative += hist.buckets.get(bucket) || 0;
88
+ lines.push(`${hist.name}_bucket${formatLabels({ ...hist.labels, le: String(bucket) })} ${cumulative}`);
89
+ }
90
+ lines.push(`${hist.name}_bucket${formatLabels({ ...hist.labels, le: '+Inf' })} ${hist.count}`);
91
+ lines.push(`${hist.name}_sum${labelStr} ${hist.sum}`);
92
+ lines.push(`${hist.name}_count${labelStr} ${hist.count}`);
93
+ }
94
+ return lines.join('\n') + '\n';
95
+ }
96
+ /**
97
+ * Reset all metrics to zero.
98
+ */
99
+ reset() {
100
+ this.counters = [];
101
+ this.gauges = [];
102
+ this.histograms = [];
103
+ }
104
+ incrementCounter(name, help, labels, value = 1) {
105
+ const existing = this.counters.find((c) => c.name === name && labelsMatch(c.labels, labels));
106
+ if (existing) {
107
+ existing.value += value;
108
+ }
109
+ else {
110
+ this.counters.push({ name, help, labels, value });
111
+ }
112
+ }
113
+ setGauge(name, help, labels, value) {
114
+ const existing = this.gauges.find((c) => c.name === name && labelsMatch(c.labels, labels));
115
+ if (existing) {
116
+ existing.value = value;
117
+ }
118
+ else {
119
+ this.gauges.push({ name, help, labels, value });
120
+ }
121
+ }
122
+ observeHistogram(name, help, labels, value) {
123
+ let existing = this.histograms.find((h) => h.name === name && labelsMatch(h.labels, labels));
124
+ if (!existing) {
125
+ existing = { name, help, labels, sum: 0, count: 0, buckets: new Map() };
126
+ this.histograms.push(existing);
127
+ }
128
+ existing.sum += value;
129
+ existing.count++;
130
+ for (const bucket of DURATION_BUCKETS) {
131
+ if (value <= bucket) {
132
+ existing.buckets.set(bucket, (existing.buckets.get(bucket) || 0) + 1);
133
+ }
134
+ }
135
+ }
136
+ }
137
+ exports.PrometheusMetrics = PrometheusMetrics;
138
+ function escapeLabel(v) {
139
+ return v.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n');
140
+ }
141
+ function formatLabels(labels) {
142
+ const entries = Object.entries(labels);
143
+ if (entries.length === 0)
144
+ return '';
145
+ return `{${entries.map(([k, v]) => `${k}="${escapeLabel(v)}"`).join(',')}}`;
146
+ }
147
+ function labelsMatch(a, b) {
148
+ const keysA = Object.keys(a);
149
+ const keysB = Object.keys(b);
150
+ if (keysA.length !== keysB.length)
151
+ return false;
152
+ return keysA.every((k) => a[k] === b[k]);
153
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Model Router — routes agent tasks to appropriate models based on task complexity.
3
+ *
4
+ * Classification/extraction tasks → cheap model (Haiku)
5
+ * Generation/reasoning tasks → capable model (Sonnet)
6
+ */
7
+ export type TaskComplexity = 'classification' | 'extraction' | 'generation' | 'reasoning';
8
+ export interface ModelRoutingConfig {
9
+ classification?: string;
10
+ extraction?: string;
11
+ generation?: string;
12
+ reasoning?: string;
13
+ }
14
+ export declare class ModelRouter {
15
+ private overrides;
16
+ private providerType;
17
+ constructor(providerType: string, overrides?: ModelRoutingConfig);
18
+ /**
19
+ * Get the recommended model for a given agent role.
20
+ * Returns undefined if no routing recommendation (use provider default).
21
+ */
22
+ getModel(role: string): string | undefined;
23
+ /**
24
+ * Get the task complexity for an agent role.
25
+ */
26
+ getComplexity(role: string): TaskComplexity;
27
+ }
28
+ //# sourceMappingURL=model_router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model_router.d.ts","sourceRoot":"","sources":["../src/model_router.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AA8BD,qBAAa,WAAW;IACpB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,kBAAkB;IAKhE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAgB1C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;CAG9C"}
@@ -0,0 +1,63 @@
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.ModelRouter = void 0;
6
+ const AGENT_COMPLEXITY = {
7
+ 'impact-analyst': 'classification',
8
+ 'coverage-evaluator': 'classification',
9
+ 'cross-impact': 'extraction',
10
+ 'regression-advisor': 'extraction',
11
+ 'strategist': 'classification',
12
+ 'test-designer': 'generation',
13
+ 'generator': 'generation',
14
+ 'executor': 'generation',
15
+ 'healer': 'reasoning',
16
+ 'explorer': 'reasoning',
17
+ };
18
+ const DEFAULT_MODELS = {
19
+ anthropic: {
20
+ classification: 'claude-haiku-4-5-20251001',
21
+ extraction: 'claude-haiku-4-5-20251001',
22
+ generation: 'claude-sonnet-4-5-20250514',
23
+ reasoning: 'claude-sonnet-4-5-20250514',
24
+ },
25
+ openai: {
26
+ classification: 'gpt-4o-mini',
27
+ extraction: 'gpt-4o-mini',
28
+ generation: 'gpt-4o',
29
+ reasoning: 'gpt-4o',
30
+ },
31
+ };
32
+ class ModelRouter {
33
+ constructor(providerType, overrides) {
34
+ this.providerType = providerType;
35
+ this.overrides = overrides || {};
36
+ }
37
+ /**
38
+ * Get the recommended model for a given agent role.
39
+ * Returns undefined if no routing recommendation (use provider default).
40
+ */
41
+ getModel(role) {
42
+ const complexity = AGENT_COMPLEXITY[role];
43
+ if (!complexity)
44
+ return undefined;
45
+ // Check user overrides first
46
+ const override = this.overrides[complexity];
47
+ if (override)
48
+ return override;
49
+ // Check provider defaults
50
+ const defaults = DEFAULT_MODELS[this.providerType];
51
+ if (defaults)
52
+ return defaults[complexity];
53
+ // No recommendation — use provider's default model
54
+ return undefined;
55
+ }
56
+ /**
57
+ * Get the task complexity for an agent role.
58
+ */
59
+ getComplexity(role) {
60
+ return AGENT_COMPLEXITY[role] || 'generation';
61
+ }
62
+ }
63
+ exports.ModelRouter = ModelRouter;
@@ -0,0 +1,65 @@
1
+ import type { GenerateOptions, ImageInput, LLMResponse, OllamaConfig, ProviderCapabilities } from './provider_interface.js';
2
+ import { BaseProvider } from './base_provider.js';
3
+ /**
4
+ * Ollama Provider - Free, local LLM execution
5
+ *
6
+ * Features:
7
+ * - Zero cost (runs locally)
8
+ * - Full privacy (no data leaves your machine)
9
+ * - OpenAI-compatible API
10
+ * - Supports DeepSeek-R1, Llama 4, and other open models
11
+ *
12
+ * Limitations:
13
+ * - No vision support (most models)
14
+ * - Slower inference than cloud APIs (~2-5 sec vs <1 sec)
15
+ * - Requires local installation and model downloads
16
+ *
17
+ * Recommended models:
18
+ * - deepseek-r1:7b - Fast, good quality, low memory (4GB)
19
+ * - deepseek-r1:14b - Better quality, medium memory (8GB)
20
+ * - llama4:13b - High quality, medium memory (8GB)
21
+ * - deepseek-r1:7b-q4 - Quantized for speed, lower quality
22
+ *
23
+ * Setup:
24
+ * 1. Install Ollama: curl -fsSL https://ollama.com/install.sh | sh
25
+ * 2. Pull model: ollama pull deepseek-r1:7b
26
+ * 3. Start: ollama serve (runs on localhost:11434)
27
+ */
28
+ export declare class OllamaProvider extends BaseProvider {
29
+ name: string;
30
+ private client;
31
+ private model;
32
+ capabilities: ProviderCapabilities;
33
+ constructor(config: OllamaConfig);
34
+ generateText(prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
35
+ /**
36
+ * Ollama does not support vision by default
37
+ * This method throws an error to help users understand the limitation
38
+ */
39
+ analyzeImage(images: ImageInput[], prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
40
+ /**
41
+ * Stream text generation for real-time feedback
42
+ */
43
+ streamText(prompt: string, options?: GenerateOptions): AsyncGenerator<string, void, unknown>;
44
+ /**
45
+ * Check if Ollama is running and accessible
46
+ */
47
+ checkHealth(): Promise<{
48
+ healthy: boolean;
49
+ message: string;
50
+ }>;
51
+ /**
52
+ * List available models in Ollama
53
+ */
54
+ listModels(): Promise<string[]>;
55
+ }
56
+ /**
57
+ * Helper function to check if Ollama is installed and suggest setup
58
+ */
59
+ export declare function checkOllamaSetup(): Promise<{
60
+ installed: boolean;
61
+ running: boolean;
62
+ modelAvailable: boolean;
63
+ setupInstructions: string;
64
+ }>;
65
+ //# sourceMappingURL=ollama_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama_provider.d.ts","sourceRoot":"","sources":["../src/ollama_provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAiEhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC5C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IAEtB,YAAY,EAAE,oBAAoB,CAShC;gBAEU,MAAM,EAAE,YAAY;IA8B1B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAmEnF;;;OAGG;IAEG,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzG;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAqDnG;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;IAgBjE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAaxC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC,CAoCD"}
@@ -0,0 +1,309 @@
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.OllamaProvider = void 0;
9
+ exports.checkOllamaSetup = checkOllamaSetup;
10
+ const openai_1 = __importDefault(require("openai"));
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
+ * SECURITY: Validate Ollama base URL and enforce HTTPS for remote connections
17
+ */
18
+ function normalizeOllamaBaseUrl(baseUrl) {
19
+ const raw = baseUrl || 'http://localhost:11434';
20
+ try {
21
+ const parsed = new URL(raw);
22
+ if (!parsed.pathname || parsed.pathname === '/') {
23
+ parsed.pathname = '/v1';
24
+ }
25
+ return parsed.toString().replace(/\/$/, '');
26
+ }
27
+ catch {
28
+ return 'http://localhost:11434/v1';
29
+ }
30
+ }
31
+ function validateOllamaUrl(baseUrl) {
32
+ const url = normalizeOllamaBaseUrl(baseUrl);
33
+ try {
34
+ const parsed = new URL(url);
35
+ // For non-localhost URLs, warn about HTTP risks
36
+ const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '::1';
37
+ if (!isLocalhost && parsed.protocol === 'http:') {
38
+ logger_js_1.logger.warn('Ollama connection over plaintext HTTP to remote server. ' +
39
+ 'Prompts and responses will be transmitted unencrypted. Consider using HTTPS proxy or local Ollama.');
40
+ }
41
+ return { valid: true, url };
42
+ }
43
+ catch {
44
+ return {
45
+ valid: false,
46
+ url: 'http://localhost:11434/v1',
47
+ warning: `Invalid Ollama URL: ${baseUrl}. Using default: http://localhost:11434/v1`,
48
+ };
49
+ }
50
+ }
51
+ /**
52
+ * SECURITY: Validate model name to prevent injection issues
53
+ */
54
+ function validateModelName(model) {
55
+ // Allow alphanumeric, dash, colon, underscore
56
+ // Typical format: deepseek-r1:7b, llama4:13b, etc.
57
+ return /^[a-z0-9_:.\-]+$/i.test(model) && model.length < 256;
58
+ }
59
+ /**
60
+ * SECURITY: Validate timeout value
61
+ */
62
+ function validateTimeout(timeout) {
63
+ if (!timeout)
64
+ return 60000;
65
+ if (timeout < 1000 || timeout > 600000) {
66
+ logger_js_1.logger.warn('Timeout out of valid range (1s-10m). Using 60 second default.');
67
+ return 60000;
68
+ }
69
+ return timeout;
70
+ }
71
+ /**
72
+ * Ollama Provider - Free, local LLM execution
73
+ *
74
+ * Features:
75
+ * - Zero cost (runs locally)
76
+ * - Full privacy (no data leaves your machine)
77
+ * - OpenAI-compatible API
78
+ * - Supports DeepSeek-R1, Llama 4, and other open models
79
+ *
80
+ * Limitations:
81
+ * - No vision support (most models)
82
+ * - Slower inference than cloud APIs (~2-5 sec vs <1 sec)
83
+ * - Requires local installation and model downloads
84
+ *
85
+ * Recommended models:
86
+ * - deepseek-r1:7b - Fast, good quality, low memory (4GB)
87
+ * - deepseek-r1:14b - Better quality, medium memory (8GB)
88
+ * - llama4:13b - High quality, medium memory (8GB)
89
+ * - deepseek-r1:7b-q4 - Quantized for speed, lower quality
90
+ *
91
+ * Setup:
92
+ * 1. Install Ollama: curl -fsSL https://ollama.com/install.sh | sh
93
+ * 2. Pull model: ollama pull deepseek-r1:7b
94
+ * 3. Start: ollama serve (runs on localhost:11434)
95
+ */
96
+ class OllamaProvider extends base_provider_js_1.BaseProvider {
97
+ constructor(config) {
98
+ super();
99
+ this.name = 'ollama';
100
+ this.capabilities = {
101
+ vision: false, // Most Ollama models don't support vision
102
+ streaming: true,
103
+ maxTokens: 8000, // Varies by model
104
+ costPer1MInputTokens: 0, // Free!
105
+ costPer1MOutputTokens: 0, // Free!
106
+ supportsTools: true, // DeepSeek, Llama 4 support function calling
107
+ supportsPromptCaching: false,
108
+ typicalResponseTimeMs: 3000, // ~2-5 seconds on decent hardware
109
+ };
110
+ // SECURITY: Validate and sanitize URL
111
+ const urlValidation = validateOllamaUrl(config.baseUrl);
112
+ if (!urlValidation.valid && urlValidation.warning) {
113
+ logger_js_1.logger.warn(urlValidation.warning);
114
+ }
115
+ // SECURITY: Validate timeout
116
+ const timeout = validateTimeout(config.timeout);
117
+ // Ollama uses OpenAI-compatible API
118
+ this.client = new openai_1.default({
119
+ baseURL: urlValidation.url,
120
+ apiKey: 'ollama', // Ollama doesn't require real API key
121
+ timeout,
122
+ maxRetries: 0, // Don't retry to avoid hanging on connection issues
123
+ });
124
+ const model = config.model || 'deepseek-r1:7b';
125
+ // SECURITY: Validate model name format
126
+ if (!validateModelName(model)) {
127
+ throw new Error('Invalid model name format');
128
+ }
129
+ this.model = model;
130
+ }
131
+ async generateText(prompt, options) {
132
+ this.checkBudget();
133
+ const startTime = Date.now();
134
+ try {
135
+ // SECURITY: Validate prompt length
136
+ if (prompt.length > 10 * 1024 * 1024) {
137
+ throw new Error('Prompt exceeds maximum size (10MB)');
138
+ }
139
+ const messages = [];
140
+ // Add system message if provided
141
+ if (options?.systemPrompt) {
142
+ messages.push({
143
+ role: 'system',
144
+ content: options.systemPrompt,
145
+ });
146
+ }
147
+ // Add user prompt
148
+ messages.push({
149
+ role: 'user',
150
+ content: prompt,
151
+ });
152
+ const response = await (0, provider_utils_js_1.withTimeout)(this.client.chat.completions.create({
153
+ model: this.model,
154
+ messages,
155
+ max_tokens: options?.maxTokens,
156
+ temperature: options?.temperature,
157
+ top_p: options?.topP,
158
+ stop: options?.stopSequences,
159
+ }), options?.timeout, 'generateText');
160
+ const responseTime = Date.now() - startTime;
161
+ const text = response.choices[0]?.message?.content || '';
162
+ const usage = {
163
+ inputTokens: response.usage?.prompt_tokens || 0,
164
+ outputTokens: response.usage?.completion_tokens || 0,
165
+ totalTokens: response.usage?.total_tokens || 0,
166
+ };
167
+ // Update stats
168
+ this.updateStats(usage, responseTime, 0); // Cost is always 0 for Ollama
169
+ return {
170
+ text,
171
+ usage,
172
+ cost: 0, // Free!
173
+ metadata: {
174
+ model: this.model,
175
+ responseTimeMs: responseTime,
176
+ finishReason: response.choices[0]?.finish_reason,
177
+ },
178
+ };
179
+ }
180
+ catch (error) {
181
+ this.stats.failedRequests++;
182
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'generateText'), this.name, undefined, error);
183
+ }
184
+ }
185
+ /**
186
+ * Ollama does not support vision by default
187
+ * This method throws an error to help users understand the limitation
188
+ */
189
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
190
+ async analyzeImage(images, prompt, options) {
191
+ throw new provider_interface_js_1.UnsupportedCapabilityError(this.name, 'vision');
192
+ }
193
+ /**
194
+ * Stream text generation for real-time feedback
195
+ */
196
+ async *streamText(prompt, options) {
197
+ try {
198
+ // SECURITY: Validate prompt length
199
+ if (prompt.length > 10 * 1024 * 1024) {
200
+ throw new Error('Prompt exceeds maximum size (10MB)');
201
+ }
202
+ const messages = [];
203
+ if (options?.systemPrompt) {
204
+ messages.push({
205
+ role: 'system',
206
+ content: options.systemPrompt,
207
+ });
208
+ }
209
+ messages.push({
210
+ role: 'user',
211
+ content: prompt,
212
+ });
213
+ const stream = await (0, provider_utils_js_1.withTimeout)(this.client.chat.completions.create({
214
+ model: this.model,
215
+ messages,
216
+ max_tokens: options?.maxTokens,
217
+ temperature: options?.temperature,
218
+ top_p: options?.topP,
219
+ stop: options?.stopSequences,
220
+ stream: true,
221
+ }), options?.timeout, 'streamText');
222
+ for await (const chunk of stream) {
223
+ const content = chunk.choices[0]?.delta?.content;
224
+ if (content) {
225
+ yield content;
226
+ }
227
+ }
228
+ // Note: Streaming doesn't provide detailed usage stats
229
+ // We increment request count but can't track exact tokens
230
+ this.stats.requestCount++;
231
+ this.stats.lastUpdated = new Date();
232
+ }
233
+ catch (error) {
234
+ this.stats.failedRequests++;
235
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'streamText'), this.name, undefined, error);
236
+ }
237
+ }
238
+ /**
239
+ * Check if Ollama is running and accessible
240
+ */
241
+ async checkHealth() {
242
+ try {
243
+ // Try a simple request
244
+ await (0, provider_utils_js_1.withTimeout)(this.client.models.list(), 5000, 'health check');
245
+ return {
246
+ healthy: true,
247
+ message: `Ollama is running with model: ${this.model}`,
248
+ };
249
+ }
250
+ catch (error) {
251
+ return {
252
+ healthy: false,
253
+ message: `Ollama not accessible: ${(0, provider_utils_js_1.sanitizeErrorMessage)(error, 'health check')}`,
254
+ };
255
+ }
256
+ }
257
+ /**
258
+ * List available models in Ollama
259
+ */
260
+ async listModels() {
261
+ try {
262
+ const response = await (0, provider_utils_js_1.withTimeout)(this.client.models.list(), 5000, 'listModels');
263
+ return response.data.map((model) => model.id);
264
+ }
265
+ catch (error) {
266
+ throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'listModels'), this.name, undefined, error);
267
+ }
268
+ }
269
+ }
270
+ exports.OllamaProvider = OllamaProvider;
271
+ /**
272
+ * Helper function to check if Ollama is installed and suggest setup
273
+ */
274
+ async function checkOllamaSetup() {
275
+ const provider = new OllamaProvider({});
276
+ try {
277
+ const health = await provider.checkHealth();
278
+ const models = await provider.listModels();
279
+ return {
280
+ installed: true,
281
+ running: health.healthy,
282
+ modelAvailable: models.length > 0,
283
+ setupInstructions: health.healthy ? 'Ollama is ready to use!' : 'Run: ollama serve',
284
+ };
285
+ }
286
+ catch {
287
+ return {
288
+ installed: false,
289
+ running: false,
290
+ modelAvailable: false,
291
+ setupInstructions: `
292
+ Ollama is not installed. To set up:
293
+
294
+ 1. Install Ollama:
295
+ curl -fsSL https://ollama.com/install.sh | sh
296
+
297
+ 2. Pull a model (choose one):
298
+ ollama pull deepseek-r1:7b # Recommended: Fast, 4GB RAM
299
+ ollama pull deepseek-r1:14b # Better quality, 8GB RAM
300
+ ollama pull llama4:13b # Alternative, 8GB RAM
301
+
302
+ 3. Start Ollama:
303
+ ollama serve
304
+
305
+ For more info: https://ollama.com
306
+ `.trim(),
307
+ };
308
+ }
309
+ }
@@ -0,0 +1,23 @@
1
+ import type { GenerateOptions, ImageInput, LLMResponse, OpenAIConfig, ProviderCapabilities } from './provider_interface.js';
2
+ import { BaseProvider } from './base_provider.js';
3
+ export declare class OpenAIProvider extends BaseProvider {
4
+ name: string;
5
+ private client;
6
+ private model;
7
+ capabilities: ProviderCapabilities;
8
+ constructor(config: OpenAIConfig);
9
+ generateText(prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
10
+ analyzeImage(images: ImageInput[], prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
11
+ streamText(prompt: string, options?: GenerateOptions): AsyncGenerator<string, void, unknown>;
12
+ private extractUsage;
13
+ private extractStatusCode;
14
+ checkHealth(): Promise<{
15
+ healthy: boolean;
16
+ message: string;
17
+ }>;
18
+ }
19
+ export declare function checkOpenAISetup(apiKey: string): Promise<{
20
+ valid: boolean;
21
+ message: string;
22
+ }>;
23
+ //# sourceMappingURL=openai_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai_provider.d.ts","sourceRoot":"","sources":["../src/openai_provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAehD,qBAAa,cAAe,SAAQ,YAAY;IAC5C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IAEtB,YAAY,EAAE,oBAAoB,CAAC;gBAEvB,MAAM,EAAE,YAAY;IAyC1B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IA4D7E,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAgGlG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IA8CnG,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,iBAAiB;IAWnB,WAAW,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;CAuBpE;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC,CAsBD"}