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