@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.
- package/LICENSE +168 -0
- package/README.md +520 -0
- package/dist/adapters/cypress.d.ts +10 -0
- package/dist/adapters/cypress.d.ts.map +1 -0
- package/dist/adapters/cypress.js +86 -0
- package/dist/adapters/framework_adapter.d.ts +41 -0
- package/dist/adapters/framework_adapter.d.ts.map +1 -0
- package/dist/adapters/framework_adapter.js +152 -0
- package/dist/adapters/playwright.d.ts +10 -0
- package/dist/adapters/playwright.d.ts.map +1 -0
- package/dist/adapters/playwright.js +86 -0
- package/dist/adapters/pytest.d.ts +10 -0
- package/dist/adapters/pytest.d.ts.map +1 -0
- package/dist/adapters/pytest.js +96 -0
- package/dist/adapters/supertest.d.ts +12 -0
- package/dist/adapters/supertest.d.ts.map +1 -0
- package/dist/adapters/supertest.js +85 -0
- package/dist/agent/api_catalog.d.ts +11 -0
- package/dist/agent/api_catalog.d.ts.map +1 -0
- package/dist/agent/api_catalog.js +210 -0
- package/dist/agent/config.d.ts +193 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +875 -0
- package/dist/agent/feedback.d.ts +91 -0
- package/dist/agent/feedback.d.ts.map +1 -0
- package/dist/agent/feedback.js +323 -0
- package/dist/agent/git.d.ts +19 -0
- package/dist/agent/git.d.ts.map +1 -0
- package/dist/agent/git.js +257 -0
- package/dist/agent/handoff.d.ts +22 -0
- package/dist/agent/handoff.d.ts.map +1 -0
- package/dist/agent/handoff.js +180 -0
- package/dist/agent/llm_agents_flow.d.ts +15 -0
- package/dist/agent/llm_agents_flow.d.ts.map +1 -0
- package/dist/agent/llm_agents_flow.js +434 -0
- package/dist/agent/native_flow.d.ts +6 -0
- package/dist/agent/native_flow.d.ts.map +1 -0
- package/dist/agent/native_flow.js +179 -0
- package/dist/agent/pipeline.d.ts +7 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +260 -0
- package/dist/agent/pipeline_types.d.ts +54 -0
- package/dist/agent/pipeline_types.d.ts.map +1 -0
- package/dist/agent/pipeline_types.js +4 -0
- package/dist/agent/pipeline_utils.d.ts +12 -0
- package/dist/agent/pipeline_utils.d.ts.map +1 -0
- package/dist/agent/pipeline_utils.js +156 -0
- package/dist/agent/plan.d.ts +170 -0
- package/dist/agent/plan.d.ts.map +1 -0
- package/dist/agent/plan.js +86 -0
- package/dist/agent/playwright_report.d.ts +8 -0
- package/dist/agent/playwright_report.d.ts.map +1 -0
- package/dist/agent/playwright_report.js +126 -0
- package/dist/agent/process_runner.d.ts +10 -0
- package/dist/agent/process_runner.d.ts.map +1 -0
- package/dist/agent/process_runner.js +92 -0
- package/dist/agent/spec_generator.d.ts +5 -0
- package/dist/agent/spec_generator.d.ts.map +1 -0
- package/dist/agent/spec_generator.js +253 -0
- package/dist/agent/test_path.d.ts +2 -0
- package/dist/agent/test_path.d.ts.map +1 -0
- package/dist/agent/test_path.js +23 -0
- package/dist/agent/traceability_capture.d.ts +18 -0
- package/dist/agent/traceability_capture.d.ts.map +1 -0
- package/dist/agent/traceability_capture.js +313 -0
- package/dist/agent/traceability_ingest.d.ts +21 -0
- package/dist/agent/traceability_ingest.d.ts.map +1 -0
- package/dist/agent/traceability_ingest.js +237 -0
- package/dist/agent/types.d.ts +42 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +4 -0
- package/dist/agent/utils.d.ts +13 -0
- package/dist/agent/utils.d.ts.map +1 -0
- package/dist/agent/utils.js +152 -0
- package/dist/agent/validation_runner.d.ts +5 -0
- package/dist/agent/validation_runner.d.ts.map +1 -0
- package/dist/agent/validation_runner.js +77 -0
- package/dist/agentic/fix_loop.d.ts +26 -0
- package/dist/agentic/fix_loop.d.ts.map +1 -0
- package/dist/agentic/fix_loop.js +96 -0
- package/dist/agentic/playwright_runner.d.ts +43 -0
- package/dist/agentic/playwright_runner.d.ts.map +1 -0
- package/dist/agentic/playwright_runner.js +165 -0
- package/dist/agentic/runner.d.ts +27 -0
- package/dist/agentic/runner.d.ts.map +1 -0
- package/dist/agentic/runner.js +210 -0
- package/dist/agentic/types.d.ts +62 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +4 -0
- package/dist/agents/coverage-evaluator.d.ts +8 -0
- package/dist/agents/coverage-evaluator.d.ts.map +1 -0
- package/dist/agents/coverage-evaluator.js +41 -0
- package/dist/agents/cross-impact.d.ts +13 -0
- package/dist/agents/cross-impact.d.ts.map +1 -0
- package/dist/agents/cross-impact.js +140 -0
- package/dist/agents/executor.d.ts +8 -0
- package/dist/agents/executor.d.ts.map +1 -0
- package/dist/agents/executor.js +75 -0
- package/dist/agents/explorer.d.ts +12 -0
- package/dist/agents/explorer.d.ts.map +1 -0
- package/dist/agents/explorer.js +43 -0
- package/dist/agents/generator.d.ts +8 -0
- package/dist/agents/generator.d.ts.map +1 -0
- package/dist/agents/generator.js +77 -0
- package/dist/agents/healer.d.ts +8 -0
- package/dist/agents/healer.d.ts.map +1 -0
- package/dist/agents/healer.js +31 -0
- package/dist/agents/impact-analyst.d.ts +8 -0
- package/dist/agents/impact-analyst.d.ts.map +1 -0
- package/dist/agents/impact-analyst.js +38 -0
- package/dist/agents/regression-advisor.d.ts +8 -0
- package/dist/agents/regression-advisor.d.ts.map +1 -0
- package/dist/agents/regression-advisor.js +116 -0
- package/dist/agents/strategist.d.ts +9 -0
- package/dist/agents/strategist.d.ts.map +1 -0
- package/dist/agents/strategist.js +92 -0
- package/dist/agents/test-designer.d.ts +8 -0
- package/dist/agents/test-designer.d.ts.map +1 -0
- package/dist/agents/test-designer.js +111 -0
- package/dist/anthropic_provider.d.ts +65 -0
- package/dist/anthropic_provider.d.ts.map +1 -0
- package/dist/anthropic_provider.js +334 -0
- package/dist/api.d.ts +48 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +151 -0
- package/dist/base_provider.d.ts +109 -0
- package/dist/base_provider.d.ts.map +1 -0
- package/dist/base_provider.js +203 -0
- package/dist/budget_ledger.d.ts +28 -0
- package/dist/budget_ledger.d.ts.map +1 -0
- package/dist/budget_ledger.js +62 -0
- package/dist/cache/cached_provider.d.ts +49 -0
- package/dist/cache/cached_provider.d.ts.map +1 -0
- package/dist/cache/cached_provider.js +91 -0
- package/dist/cache/response_cache.d.ts +79 -0
- package/dist/cache/response_cache.d.ts.map +1 -0
- package/dist/cache/response_cache.js +177 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +77 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.d.ts.map +1 -0
- package/dist/cli/commands/bootstrap.js +109 -0
- package/dist/cli/commands/cost_report.d.ts +3 -0
- package/dist/cli/commands/cost_report.d.ts.map +1 -0
- package/dist/cli/commands/cost_report.js +115 -0
- package/dist/cli/commands/crew.d.ts +3 -0
- package/dist/cli/commands/crew.d.ts.map +1 -0
- package/dist/cli/commands/crew.js +255 -0
- package/dist/cli/commands/feedback.d.ts +3 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -0
- package/dist/cli/commands/feedback.js +39 -0
- package/dist/cli/commands/finalize.d.ts +3 -0
- package/dist/cli/commands/finalize.d.ts.map +1 -0
- package/dist/cli/commands/finalize.js +41 -0
- package/dist/cli/commands/gate.d.ts +3 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +89 -0
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +108 -0
- package/dist/cli/commands/heal.d.ts +3 -0
- package/dist/cli/commands/heal.d.ts.map +1 -0
- package/dist/cli/commands/heal.js +60 -0
- package/dist/cli/commands/impact.d.ts +4 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +33 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +169 -0
- package/dist/cli/commands/llm_health.d.ts +2 -0
- package/dist/cli/commands/llm_health.d.ts.map +1 -0
- package/dist/cli/commands/llm_health.js +22 -0
- package/dist/cli/commands/plan.d.ts +4 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +120 -0
- package/dist/cli/commands/plan_crew.d.ts +17 -0
- package/dist/cli/commands/plan_crew.d.ts.map +1 -0
- package/dist/cli/commands/plan_crew.js +316 -0
- package/dist/cli/commands/traceability.d.ts +4 -0
- package/dist/cli/commands/traceability.d.ts.map +1 -0
- package/dist/cli/commands/traceability.js +77 -0
- package/dist/cli/commands/train.d.ts +3 -0
- package/dist/cli/commands/train.d.ts.map +1 -0
- package/dist/cli/commands/train.js +391 -0
- package/dist/cli/defaults.d.ts +35 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +172 -0
- package/dist/cli/errors.d.ts +27 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +57 -0
- package/dist/cli/parse_args.d.ts +6 -0
- package/dist/cli/parse_args.d.ts.map +1 -0
- package/dist/cli/parse_args.js +257 -0
- package/dist/cli/types.d.ts +87 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +4 -0
- package/dist/cli/usage.d.ts +2 -0
- package/dist/cli/usage.d.ts.map +1 -0
- package/dist/cli/usage.js +109 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +194 -0
- package/dist/crew/context.d.ts +55 -0
- package/dist/crew/context.d.ts.map +1 -0
- package/dist/crew/context.js +36 -0
- package/dist/crew/orchestrator.d.ts +50 -0
- package/dist/crew/orchestrator.d.ts.map +1 -0
- package/dist/crew/orchestrator.js +329 -0
- package/dist/crew/protocol.d.ts +46 -0
- package/dist/crew/protocol.d.ts.map +1 -0
- package/dist/crew/protocol.js +4 -0
- package/dist/crew/provider.d.ts +17 -0
- package/dist/crew/provider.d.ts.map +1 -0
- package/dist/crew/provider.js +36 -0
- package/dist/crew/sanitize.d.ts +3 -0
- package/dist/crew/sanitize.d.ts.map +1 -0
- package/dist/crew/sanitize.js +31 -0
- package/dist/crew/types.d.ts +52 -0
- package/dist/crew/types.d.ts.map +1 -0
- package/dist/crew/types.js +4 -0
- package/dist/crew/workflows.d.ts +52 -0
- package/dist/crew/workflows.d.ts.map +1 -0
- package/dist/crew/workflows.js +36 -0
- package/dist/custom_provider.d.ts +20 -0
- package/dist/custom_provider.d.ts.map +1 -0
- package/dist/custom_provider.js +277 -0
- package/dist/engine/ai_enrichment.d.ts +44 -0
- package/dist/engine/ai_enrichment.d.ts.map +1 -0
- package/dist/engine/ai_enrichment.js +267 -0
- package/dist/engine/diff_loader.d.ts +11 -0
- package/dist/engine/diff_loader.d.ts.map +1 -0
- package/dist/engine/diff_loader.js +63 -0
- package/dist/engine/impact_engine.d.ts +72 -0
- package/dist/engine/impact_engine.d.ts.map +1 -0
- package/dist/engine/impact_engine.js +298 -0
- package/dist/engine/plan_builder.d.ts +11 -0
- package/dist/engine/plan_builder.d.ts.map +1 -0
- package/dist/engine/plan_builder.js +599 -0
- package/dist/esm/adapters/cypress.js +49 -0
- package/dist/esm/adapters/framework_adapter.js +114 -0
- package/dist/esm/adapters/playwright.js +49 -0
- package/dist/esm/adapters/pytest.js +59 -0
- package/dist/esm/adapters/supertest.js +48 -0
- package/dist/esm/agent/api_catalog.js +199 -0
- package/dist/esm/agent/config.js +872 -0
- package/dist/esm/agent/feedback.js +317 -0
- package/dist/esm/agent/git.js +252 -0
- package/dist/esm/agent/handoff.js +177 -0
- package/dist/esm/agent/llm_agents_flow.js +421 -0
- package/dist/esm/agent/native_flow.js +175 -0
- package/dist/esm/agent/pipeline.js +256 -0
- package/dist/esm/agent/pipeline_types.js +3 -0
- package/dist/esm/agent/pipeline_utils.js +146 -0
- package/dist/esm/agent/plan.js +83 -0
- package/dist/esm/agent/playwright_report.js +123 -0
- package/dist/esm/agent/process_runner.js +83 -0
- package/dist/esm/agent/spec_generator.js +249 -0
- package/dist/esm/agent/test_path.js +20 -0
- package/dist/esm/agent/traceability_capture.js +310 -0
- package/dist/esm/agent/traceability_ingest.js +234 -0
- package/dist/esm/agent/types.js +3 -0
- package/dist/esm/agent/utils.js +138 -0
- package/dist/esm/agent/validation_runner.js +73 -0
- package/dist/esm/agentic/fix_loop.js +91 -0
- package/dist/esm/agentic/playwright_runner.js +161 -0
- package/dist/esm/agentic/runner.js +207 -0
- package/dist/esm/agentic/types.js +3 -0
- package/dist/esm/agents/coverage-evaluator.js +37 -0
- package/dist/esm/agents/cross-impact.js +136 -0
- package/dist/esm/agents/executor.js +71 -0
- package/dist/esm/agents/explorer.js +39 -0
- package/dist/esm/agents/generator.js +73 -0
- package/dist/esm/agents/healer.js +27 -0
- package/dist/esm/agents/impact-analyst.js +34 -0
- package/dist/esm/agents/regression-advisor.js +112 -0
- package/dist/esm/agents/strategist.js +88 -0
- package/dist/esm/agents/test-designer.js +107 -0
- package/dist/esm/anthropic_provider.js +326 -0
- package/dist/esm/api.js +143 -0
- package/dist/esm/base_provider.js +198 -0
- package/dist/esm/budget_ledger.js +58 -0
- package/dist/esm/cache/cached_provider.js +85 -0
- package/dist/esm/cache/response_cache.js +140 -0
- package/dist/esm/cli/commands/analyze.js +74 -0
- package/dist/esm/cli/commands/bootstrap.js +106 -0
- package/dist/esm/cli/commands/cost_report.js +112 -0
- package/dist/esm/cli/commands/crew.js +252 -0
- package/dist/esm/cli/commands/feedback.js +36 -0
- package/dist/esm/cli/commands/finalize.js +38 -0
- package/dist/esm/cli/commands/gate.js +86 -0
- package/dist/esm/cli/commands/generate.js +105 -0
- package/dist/esm/cli/commands/heal.js +57 -0
- package/dist/esm/cli/commands/impact.js +30 -0
- package/dist/esm/cli/commands/init.js +133 -0
- package/dist/esm/cli/commands/llm_health.js +19 -0
- package/dist/esm/cli/commands/plan.js +117 -0
- package/dist/esm/cli/commands/plan_crew.js +309 -0
- package/dist/esm/cli/commands/traceability.js +73 -0
- package/dist/esm/cli/commands/train.js +355 -0
- package/dist/esm/cli/defaults.js +165 -0
- package/dist/esm/cli/errors.js +52 -0
- package/dist/esm/cli/parse_args.js +251 -0
- package/dist/esm/cli/types.js +3 -0
- package/dist/esm/cli/usage.js +106 -0
- package/dist/esm/cli.js +192 -0
- package/dist/esm/crew/context.js +32 -0
- package/dist/esm/crew/orchestrator.js +325 -0
- package/dist/esm/crew/protocol.js +3 -0
- package/dist/esm/crew/provider.js +33 -0
- package/dist/esm/crew/sanitize.js +27 -0
- package/dist/esm/crew/types.js +3 -0
- package/dist/esm/crew/workflows.js +33 -0
- package/dist/esm/custom_provider.js +273 -0
- package/dist/esm/engine/ai_enrichment.js +264 -0
- package/dist/esm/engine/diff_loader.js +59 -0
- package/dist/esm/engine/impact_engine.js +291 -0
- package/dist/esm/engine/plan_builder.js +593 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/knowledge/api_surface.js +408 -0
- package/dist/esm/knowledge/cluster_utils.js +60 -0
- package/dist/esm/knowledge/context_loader.js +85 -0
- package/dist/esm/knowledge/failure_history.js +121 -0
- package/dist/esm/knowledge/kg_bridge.js +381 -0
- package/dist/esm/knowledge/kg_types.js +3 -0
- package/dist/esm/knowledge/route_families.js +393 -0
- package/dist/esm/knowledge/spec_index.js +122 -0
- package/dist/esm/logger.js +115 -0
- package/dist/esm/mcp-server.js +621 -0
- package/dist/esm/metrics/prometheus.js +149 -0
- package/dist/esm/model_router.js +59 -0
- package/dist/esm/ollama_provider.js +301 -0
- package/dist/esm/openai_provider.js +243 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/pipeline/orchestrator.js +228 -0
- package/dist/esm/pipeline/spec_verifier.js +75 -0
- package/dist/esm/pipeline/stage0_preprocess.js +102 -0
- package/dist/esm/pipeline/stage1_impact.js +140 -0
- package/dist/esm/pipeline/stage2_coverage.js +153 -0
- package/dist/esm/pipeline/stage3_generation.js +284 -0
- package/dist/esm/pipeline/stage4_heal.js +288 -0
- package/dist/esm/progress.js +112 -0
- package/dist/esm/prompts/coverage.js +57 -0
- package/dist/esm/prompts/cross-impact.js +53 -0
- package/dist/esm/prompts/generation.js +297 -0
- package/dist/esm/prompts/generation_profile.js +147 -0
- package/dist/esm/prompts/heal.js +91 -0
- package/dist/esm/prompts/impact.js +63 -0
- package/dist/esm/prompts/json_extract.js +36 -0
- package/dist/esm/prompts/strategist.js +61 -0
- package/dist/esm/prompts/test-designer.js +92 -0
- package/dist/esm/provider_factory.js +366 -0
- package/dist/esm/provider_interface.js +23 -0
- package/dist/esm/provider_utils.js +96 -0
- package/dist/esm/qa-agent/cli.js +205 -0
- package/dist/esm/qa-agent/orchestrator.js +120 -0
- package/dist/esm/qa-agent/phase1/runner.js +139 -0
- package/dist/esm/qa-agent/phase1/scope.js +126 -0
- package/dist/esm/qa-agent/phase2/agent_browser.js +95 -0
- package/dist/esm/qa-agent/phase2/agent_loop.js +351 -0
- package/dist/esm/qa-agent/phase2/exploration_state.js +97 -0
- package/dist/esm/qa-agent/phase2/tools.js +386 -0
- package/dist/esm/qa-agent/phase2/vision.js +75 -0
- package/dist/esm/qa-agent/phase3/feedback.js +34 -0
- package/dist/esm/qa-agent/phase3/reporter.js +145 -0
- package/dist/esm/qa-agent/phase3/spec_generator.js +62 -0
- package/dist/esm/qa-agent/phase3/verdict.js +66 -0
- package/dist/esm/qa-agent/safe_env.js +23 -0
- package/dist/esm/qa-agent/types.js +3 -0
- package/dist/esm/reporters/junit.js +86 -0
- package/dist/esm/reporters/reporter.js +3 -0
- package/dist/esm/reporters/sarif.js +132 -0
- package/dist/esm/resilience/circuit_breaker.js +78 -0
- package/dist/esm/resilience/retry.js +56 -0
- package/dist/esm/sanitize.js +66 -0
- package/dist/esm/training/enricher.js +345 -0
- package/dist/esm/training/kg_scanner.js +115 -0
- package/dist/esm/training/merger.js +204 -0
- package/dist/esm/training/scanner.js +923 -0
- package/dist/esm/training/types.js +6 -0
- package/dist/esm/training/validator.js +254 -0
- package/dist/esm/validation/guardrails.js +101 -0
- package/dist/esm/validation/output_schema.js +80 -0
- package/dist/esm/version.js +33 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/knowledge/api_surface.d.ts +37 -0
- package/dist/knowledge/api_surface.d.ts.map +1 -0
- package/dist/knowledge/api_surface.js +418 -0
- package/dist/knowledge/cluster_utils.d.ts +28 -0
- package/dist/knowledge/cluster_utils.d.ts.map +1 -0
- package/dist/knowledge/cluster_utils.js +67 -0
- package/dist/knowledge/context_loader.d.ts +13 -0
- package/dist/knowledge/context_loader.d.ts.map +1 -0
- package/dist/knowledge/context_loader.js +90 -0
- package/dist/knowledge/failure_history.d.ts +39 -0
- package/dist/knowledge/failure_history.d.ts.map +1 -0
- package/dist/knowledge/failure_history.js +128 -0
- package/dist/knowledge/kg_bridge.d.ts +31 -0
- package/dist/knowledge/kg_bridge.d.ts.map +1 -0
- package/dist/knowledge/kg_bridge.js +388 -0
- package/dist/knowledge/kg_types.d.ts +75 -0
- package/dist/knowledge/kg_types.d.ts.map +1 -0
- package/dist/knowledge/kg_types.js +4 -0
- package/dist/knowledge/route_families.d.ts +98 -0
- package/dist/knowledge/route_families.d.ts.map +1 -0
- package/dist/knowledge/route_families.js +410 -0
- package/dist/knowledge/spec_index.d.ts +18 -0
- package/dist/knowledge/spec_index.d.ts.map +1 -0
- package/dist/knowledge/spec_index.js +128 -0
- package/dist/logger.d.ts +31 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +119 -0
- package/dist/mcp-server.d.ts +68 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +629 -0
- package/dist/metrics/prometheus.d.ts +37 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +153 -0
- package/dist/model_router.d.ts +28 -0
- package/dist/model_router.d.ts.map +1 -0
- package/dist/model_router.js +63 -0
- package/dist/ollama_provider.d.ts +65 -0
- package/dist/ollama_provider.d.ts.map +1 -0
- package/dist/ollama_provider.js +309 -0
- package/dist/openai_provider.d.ts +23 -0
- package/dist/openai_provider.d.ts.map +1 -0
- package/dist/openai_provider.js +251 -0
- package/dist/pipeline/orchestrator.d.ts +33 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +231 -0
- package/dist/pipeline/spec_verifier.d.ts +20 -0
- package/dist/pipeline/spec_verifier.d.ts.map +1 -0
- package/dist/pipeline/spec_verifier.js +79 -0
- package/dist/pipeline/stage0_preprocess.d.ts +31 -0
- package/dist/pipeline/stage0_preprocess.d.ts.map +1 -0
- package/dist/pipeline/stage0_preprocess.js +105 -0
- package/dist/pipeline/stage1_impact.d.ts +19 -0
- package/dist/pipeline/stage1_impact.d.ts.map +1 -0
- package/dist/pipeline/stage1_impact.js +143 -0
- package/dist/pipeline/stage2_coverage.d.ts +19 -0
- package/dist/pipeline/stage2_coverage.d.ts.map +1 -0
- package/dist/pipeline/stage2_coverage.js +156 -0
- package/dist/pipeline/stage3_generation.d.ts +43 -0
- package/dist/pipeline/stage3_generation.d.ts.map +1 -0
- package/dist/pipeline/stage3_generation.js +287 -0
- package/dist/pipeline/stage4_heal.d.ts +62 -0
- package/dist/pipeline/stage4_heal.d.ts.map +1 -0
- package/dist/pipeline/stage4_heal.js +294 -0
- package/dist/progress.d.ts +22 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +116 -0
- package/dist/prompts/coverage.d.ts +39 -0
- package/dist/prompts/coverage.d.ts.map +1 -0
- package/dist/prompts/coverage.js +61 -0
- package/dist/prompts/cross-impact.d.ts +23 -0
- package/dist/prompts/cross-impact.d.ts.map +1 -0
- package/dist/prompts/cross-impact.js +57 -0
- package/dist/prompts/generation.d.ts +25 -0
- package/dist/prompts/generation.d.ts.map +1 -0
- package/dist/prompts/generation.js +302 -0
- package/dist/prompts/generation_profile.d.ts +29 -0
- package/dist/prompts/generation_profile.d.ts.map +1 -0
- package/dist/prompts/generation_profile.js +151 -0
- package/dist/prompts/heal.d.ts +23 -0
- package/dist/prompts/heal.d.ts.map +1 -0
- package/dist/prompts/heal.js +95 -0
- package/dist/prompts/impact.d.ts +31 -0
- package/dist/prompts/impact.d.ts.map +1 -0
- package/dist/prompts/impact.js +67 -0
- package/dist/prompts/json_extract.d.ts +14 -0
- package/dist/prompts/json_extract.d.ts.map +1 -0
- package/dist/prompts/json_extract.js +39 -0
- package/dist/prompts/strategist.d.ts +25 -0
- package/dist/prompts/strategist.d.ts.map +1 -0
- package/dist/prompts/strategist.js +65 -0
- package/dist/prompts/test-designer.d.ts +35 -0
- package/dist/prompts/test-designer.d.ts.map +1 -0
- package/dist/prompts/test-designer.js +96 -0
- package/dist/provider_factory.d.ts +104 -0
- package/dist/provider_factory.d.ts.map +1 -0
- package/dist/provider_factory.js +371 -0
- package/dist/provider_interface.d.ts +365 -0
- package/dist/provider_interface.d.ts.map +1 -0
- package/dist/provider_interface.js +28 -0
- package/dist/provider_utils.d.ts +39 -0
- package/dist/provider_utils.d.ts.map +1 -0
- package/dist/provider_utils.js +103 -0
- package/dist/qa-agent/cli.d.ts +3 -0
- package/dist/qa-agent/cli.d.ts.map +1 -0
- package/dist/qa-agent/cli.js +207 -0
- package/dist/qa-agent/orchestrator.d.ts +3 -0
- package/dist/qa-agent/orchestrator.d.ts.map +1 -0
- package/dist/qa-agent/orchestrator.js +123 -0
- package/dist/qa-agent/phase1/runner.d.ts +3 -0
- package/dist/qa-agent/phase1/runner.d.ts.map +1 -0
- package/dist/qa-agent/phase1/runner.js +142 -0
- package/dist/qa-agent/phase1/scope.d.ts +6 -0
- package/dist/qa-agent/phase1/scope.d.ts.map +1 -0
- package/dist/qa-agent/phase1/scope.js +129 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts +35 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_browser.js +99 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts +3 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_loop.js +357 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts +12 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts.map +1 -0
- package/dist/qa-agent/phase2/exploration_state.js +109 -0
- package/dist/qa-agent/phase2/tools.d.ts +28 -0
- package/dist/qa-agent/phase2/tools.d.ts.map +1 -0
- package/dist/qa-agent/phase2/tools.js +390 -0
- package/dist/qa-agent/phase2/vision.d.ts +3 -0
- package/dist/qa-agent/phase2/vision.d.ts.map +1 -0
- package/dist/qa-agent/phase2/vision.js +78 -0
- package/dist/qa-agent/phase3/feedback.d.ts +3 -0
- package/dist/qa-agent/phase3/feedback.d.ts.map +1 -0
- package/dist/qa-agent/phase3/feedback.js +37 -0
- package/dist/qa-agent/phase3/reporter.d.ts +3 -0
- package/dist/qa-agent/phase3/reporter.d.ts.map +1 -0
- package/dist/qa-agent/phase3/reporter.js +148 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts +3 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts.map +1 -0
- package/dist/qa-agent/phase3/spec_generator.js +65 -0
- package/dist/qa-agent/phase3/verdict.d.ts +3 -0
- package/dist/qa-agent/phase3/verdict.d.ts.map +1 -0
- package/dist/qa-agent/phase3/verdict.js +69 -0
- package/dist/qa-agent/safe_env.d.ts +3 -0
- package/dist/qa-agent/safe_env.d.ts.map +1 -0
- package/dist/qa-agent/safe_env.js +26 -0
- package/dist/qa-agent/types.d.ts +130 -0
- package/dist/qa-agent/types.d.ts.map +1 -0
- package/dist/qa-agent/types.js +4 -0
- package/dist/reporters/junit.d.ts +6 -0
- package/dist/reporters/junit.d.ts.map +1 -0
- package/dist/reporters/junit.js +89 -0
- package/dist/reporters/reporter.d.ts +42 -0
- package/dist/reporters/reporter.d.ts.map +1 -0
- package/dist/reporters/reporter.js +4 -0
- package/dist/reporters/sarif.d.ts +7 -0
- package/dist/reporters/sarif.d.ts.map +1 -0
- package/dist/reporters/sarif.js +135 -0
- package/dist/resilience/circuit_breaker.d.ts +36 -0
- package/dist/resilience/circuit_breaker.d.ts.map +1 -0
- package/dist/resilience/circuit_breaker.js +82 -0
- package/dist/resilience/retry.d.ts +11 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +59 -0
- package/dist/sanitize.d.ts +15 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +71 -0
- package/dist/training/enricher.d.ts +17 -0
- package/dist/training/enricher.d.ts.map +1 -0
- package/dist/training/enricher.js +350 -0
- package/dist/training/kg_scanner.d.ts +13 -0
- package/dist/training/kg_scanner.d.ts.map +1 -0
- package/dist/training/kg_scanner.js +118 -0
- package/dist/training/merger.d.ts +15 -0
- package/dist/training/merger.d.ts.map +1 -0
- package/dist/training/merger.js +208 -0
- package/dist/training/scanner.d.ts +36 -0
- package/dist/training/scanner.d.ts.map +1 -0
- package/dist/training/scanner.js +932 -0
- package/dist/training/types.d.ts +117 -0
- package/dist/training/types.d.ts.map +1 -0
- package/dist/training/types.js +9 -0
- package/dist/training/validator.d.ts +21 -0
- package/dist/training/validator.d.ts.map +1 -0
- package/dist/training/validator.js +262 -0
- package/dist/validation/guardrails.d.ts +31 -0
- package/dist/validation/guardrails.d.ts.map +1 -0
- package/dist/validation/guardrails.js +112 -0
- package/dist/validation/output_schema.d.ts +67 -0
- package/dist/validation/output_schema.d.ts.map +1 -0
- package/dist/validation/output_schema.js +84 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +36 -0
- package/package.json +126 -0
- package/schemas/flow-decision.schema.json +83 -0
- package/schemas/gap.schema.json +18 -0
- package/schemas/impact.schema.json +455 -0
- package/schemas/plan.schema.json +491 -0
- package/schemas/route-families.schema.json +137 -0
- package/schemas/subsystem-risk-map.schema.json +62 -0
- 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"}
|