@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,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Crew Protocol — core interfaces for inter-agent communication and execution.
|
|
3
|
+
*/
|
|
4
|
+
import type { ProviderUsageStats } from '../provider_interface.js';
|
|
5
|
+
import type { AgentRole } from './types.js';
|
|
6
|
+
import type { CrewContext } from './context.js';
|
|
7
|
+
export interface AgentMessage {
|
|
8
|
+
id: string;
|
|
9
|
+
from: AgentRole;
|
|
10
|
+
to: AgentRole | 'broadcast';
|
|
11
|
+
type: 'task' | 'result' | 'escalation' | 'finding';
|
|
12
|
+
payload: unknown;
|
|
13
|
+
correlationId: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentTask {
|
|
17
|
+
role: AgentRole;
|
|
18
|
+
action: string;
|
|
19
|
+
input: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface AgentResult {
|
|
22
|
+
role: AgentRole;
|
|
23
|
+
status: 'success' | 'partial' | 'failed';
|
|
24
|
+
output: unknown;
|
|
25
|
+
usage?: ProviderUsageStats;
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface Agent {
|
|
29
|
+
role: AgentRole;
|
|
30
|
+
execute(task: AgentTask, ctx: CrewContext): Promise<AgentResult>;
|
|
31
|
+
onMessage?(msg: AgentMessage): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* AgentPlugin — interface for external agent plugins loaded from config.
|
|
35
|
+
*
|
|
36
|
+
* Plugins register into crew workflow phases alongside built-in agents.
|
|
37
|
+
* The CrewContext interface is a public API contract once plugins exist:
|
|
38
|
+
* field additions are non-breaking, field removals or type changes are breaking.
|
|
39
|
+
*/
|
|
40
|
+
export interface AgentPlugin extends Agent {
|
|
41
|
+
/** Which workflow phase to run in (e.g., 'strategize', 'understand') */
|
|
42
|
+
phase: string;
|
|
43
|
+
/** Run after these agents complete (dependency ordering) */
|
|
44
|
+
runAfter?: AgentRole[];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/crew/protocol.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,GAAG,WAAW,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,SAAS,CAAC,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACtC,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LLMProvider } from '../provider_interface.js';
|
|
2
|
+
import type { BudgetLedger } from '../budget_ledger.js';
|
|
3
|
+
import type { AgentRole } from './types.js';
|
|
4
|
+
export interface CrewProviderOptions {
|
|
5
|
+
providerOverride?: string;
|
|
6
|
+
budgetUSD?: number;
|
|
7
|
+
agentRole?: AgentRole;
|
|
8
|
+
modelRoutingProviderType?: string;
|
|
9
|
+
modelRoutingOverrides?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function getCrewProvider(providerOverride?: string, budgetUSD?: number, opts?: {
|
|
12
|
+
agentRole?: AgentRole;
|
|
13
|
+
modelRoutingProviderType?: string;
|
|
14
|
+
modelRoutingOverrides?: Record<string, string>;
|
|
15
|
+
budgetLedger?: BudgetLedger;
|
|
16
|
+
}): Promise<LLMProvider>;
|
|
17
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/crew/provider.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAG1D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AAED,wBAAsB,eAAe,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IACxF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B,GAAG,OAAO,CAAC,WAAW,CAAC,CA0BvB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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.getCrewProvider = getCrewProvider;
|
|
6
|
+
/**
|
|
7
|
+
* Shared provider creation for crew agents — ensures consistent provider
|
|
8
|
+
* instantiation and prevents usage stats fragmentation.
|
|
9
|
+
*/
|
|
10
|
+
const provider_factory_js_1 = require("../provider_factory.js");
|
|
11
|
+
const base_provider_js_1 = require("../base_provider.js");
|
|
12
|
+
const model_router_js_1 = require("../model_router.js");
|
|
13
|
+
async function getCrewProvider(providerOverride, budgetUSD, opts) {
|
|
14
|
+
let effectiveOverride = providerOverride;
|
|
15
|
+
// Apply model routing if configured and agent role is provided
|
|
16
|
+
if (opts?.agentRole && opts?.modelRoutingProviderType) {
|
|
17
|
+
const router = new model_router_js_1.ModelRouter(opts.modelRoutingProviderType, opts.modelRoutingOverrides);
|
|
18
|
+
const model = router.getModel(opts.agentRole);
|
|
19
|
+
if (model) {
|
|
20
|
+
// Override uses provider:model format (e.g., "anthropic:claude-haiku-4-5-20251001")
|
|
21
|
+
effectiveOverride = `${opts.modelRoutingProviderType}:${model}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const provider = effectiveOverride
|
|
25
|
+
? await provider_factory_js_1.LLMProviderFactory.createFromString(effectiveOverride)
|
|
26
|
+
: await provider_factory_js_1.LLMProviderFactory.createFromEnv();
|
|
27
|
+
if (provider instanceof base_provider_js_1.BaseProvider) {
|
|
28
|
+
if (opts?.budgetLedger) {
|
|
29
|
+
provider.setBudgetLedger(opts.budgetLedger);
|
|
30
|
+
}
|
|
31
|
+
else if (budgetUSD !== undefined) {
|
|
32
|
+
provider.setBudget(budgetUSD);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return provider;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/crew/sanitize.ts"],"names":[],"mappings":"AAqBA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAExD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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.sanitizeForPrompt = sanitizeForPrompt;
|
|
6
|
+
exports.sanitizeArray = sanitizeArray;
|
|
7
|
+
/**
|
|
8
|
+
* Sanitize strings before interpolating into LLM prompts.
|
|
9
|
+
* Strips common prompt injection patterns while preserving useful content.
|
|
10
|
+
*/
|
|
11
|
+
const INJECTION_PATTERNS = [
|
|
12
|
+
/ignore\s+(all\s+)?previous\s+instructions/gi,
|
|
13
|
+
/disregard\s+(all\s+)?(above|prior|previous)/gi,
|
|
14
|
+
/system\s*:\s*/gi,
|
|
15
|
+
/\[INST\]/gi,
|
|
16
|
+
/<<SYS>>/gi,
|
|
17
|
+
/<\|im_start\|>/gi,
|
|
18
|
+
/\bHuman\s*:\s*/gi,
|
|
19
|
+
/\bAssistant\s*:\s*/gi,
|
|
20
|
+
];
|
|
21
|
+
const MAX_FIELD_LENGTH = 2000;
|
|
22
|
+
function sanitizeForPrompt(value) {
|
|
23
|
+
let sanitized = value.slice(0, MAX_FIELD_LENGTH);
|
|
24
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
25
|
+
sanitized = sanitized.replace(pattern, '[filtered]');
|
|
26
|
+
}
|
|
27
|
+
return sanitized;
|
|
28
|
+
}
|
|
29
|
+
function sanitizeArray(values) {
|
|
30
|
+
return values.map((v) => sanitizeForPrompt(v));
|
|
31
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crew data types — structured test design, cross-impact analysis, and findings.
|
|
3
|
+
*/
|
|
4
|
+
export type TestCaseType = 'happy-path' | 'edge-case' | 'boundary' | 'negative' | 'state-transition' | 'race-condition' | 'permission' | 'accessibility' | 'performance';
|
|
5
|
+
export interface TestCase {
|
|
6
|
+
name: string;
|
|
7
|
+
type: TestCaseType;
|
|
8
|
+
preconditions: string[];
|
|
9
|
+
steps: string[];
|
|
10
|
+
expectedOutcome: string;
|
|
11
|
+
priority: 'P0' | 'P1' | 'P2';
|
|
12
|
+
rationale: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TestDesign {
|
|
15
|
+
flowId: string;
|
|
16
|
+
flowName: string;
|
|
17
|
+
testCases: TestCase[];
|
|
18
|
+
}
|
|
19
|
+
export interface CrossImpact {
|
|
20
|
+
sourceFamily: string;
|
|
21
|
+
affectedFamily: string;
|
|
22
|
+
sharedDependency: string;
|
|
23
|
+
riskLevel: 'high' | 'medium' | 'low';
|
|
24
|
+
evidence: string;
|
|
25
|
+
}
|
|
26
|
+
export interface Finding {
|
|
27
|
+
id: string;
|
|
28
|
+
type: 'bug' | 'gap' | 'risk' | 'flaky';
|
|
29
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
30
|
+
source: AgentRole;
|
|
31
|
+
summary: string;
|
|
32
|
+
details: string;
|
|
33
|
+
relatedFlows: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface RegressionRisk {
|
|
36
|
+
familyId: string;
|
|
37
|
+
filePattern: string;
|
|
38
|
+
riskScore: number;
|
|
39
|
+
reason: string;
|
|
40
|
+
historicalFailures: number;
|
|
41
|
+
}
|
|
42
|
+
export interface StrategyEntry {
|
|
43
|
+
flowId: string;
|
|
44
|
+
flowName: string;
|
|
45
|
+
priority: 'P0' | 'P1' | 'P2';
|
|
46
|
+
approach: 'full-test' | 'smoke-test' | 'skip' | 'manual-review';
|
|
47
|
+
rationale: string;
|
|
48
|
+
testCategories: TestCaseType[];
|
|
49
|
+
crossImpactRisk: 'high' | 'medium' | 'low' | 'none';
|
|
50
|
+
}
|
|
51
|
+
export type AgentRole = 'strategist' | 'test-designer' | 'cross-impact' | 'regression-advisor' | 'impact-analyst' | 'coverage-evaluator' | 'generator' | 'executor' | 'healer' | 'explorer';
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/crew/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,MAAM,MAAM,YAAY,GAClB,YAAY,GACZ,WAAW,GACX,UAAU,GACV,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,aAAa,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACvC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,eAAe,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACvD;AAED,MAAM,MAAM,SAAS,GACf,YAAY,GACZ,eAAe,GACf,cAAc,GACd,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Predefined workflow definitions — playbooks that compose agents into phases.
|
|
3
|
+
*
|
|
4
|
+
* Data flow through full-qa workflow:
|
|
5
|
+
*
|
|
6
|
+
* preprocess (built-in)
|
|
7
|
+
* → populates: familyGroups, routeFamilies, manifest, apiSurface, specIndex, context
|
|
8
|
+
*
|
|
9
|
+
* understand (parallel):
|
|
10
|
+
* impact-analyst → writes: impactedFlows
|
|
11
|
+
* cross-impact → writes: crossImpacts
|
|
12
|
+
* regression-advisor → writes: regressionRisks
|
|
13
|
+
*
|
|
14
|
+
* strategize (sequential):
|
|
15
|
+
* strategist → reads: impactedFlows, crossImpacts, regressionRisks
|
|
16
|
+
* → writes: strategyEntries
|
|
17
|
+
* test-designer → reads: strategyEntries, impactedFlows, crossImpacts, apiSurface, specIndex
|
|
18
|
+
* → writes: testDesigns
|
|
19
|
+
*
|
|
20
|
+
* execute (parallel):
|
|
21
|
+
* generator → reads: impactedFlows, testDesigns, apiSurface
|
|
22
|
+
* → writes: generatedSpecs
|
|
23
|
+
*
|
|
24
|
+
* validate (sequential):
|
|
25
|
+
* executor → reads: generatedSpecs, impactedFlows
|
|
26
|
+
* healer → reads: generatedSpecs, impactedFlows
|
|
27
|
+
*/
|
|
28
|
+
import type { AgentRole } from './types.js';
|
|
29
|
+
export type WorkflowPhase = {
|
|
30
|
+
name: string;
|
|
31
|
+
handler: 'built-in';
|
|
32
|
+
parallel?: never;
|
|
33
|
+
sequential?: never;
|
|
34
|
+
} | {
|
|
35
|
+
name: string;
|
|
36
|
+
handler?: never;
|
|
37
|
+
parallel: AgentRole[];
|
|
38
|
+
sequential?: never;
|
|
39
|
+
} | {
|
|
40
|
+
name: string;
|
|
41
|
+
handler?: never;
|
|
42
|
+
parallel?: never;
|
|
43
|
+
sequential: AgentRole[];
|
|
44
|
+
};
|
|
45
|
+
export interface WorkflowDef {
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
phases: WorkflowPhase[];
|
|
49
|
+
}
|
|
50
|
+
export type WorkflowName = 'full-qa' | 'quick-check' | 'design-only';
|
|
51
|
+
export declare const WORKFLOWS: Record<WorkflowName, WorkflowDef>;
|
|
52
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/crew/workflows.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAE1C,MAAM,MAAM,aAAa,GACnB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAC,GACzE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAC,GAC1E;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAC,CAAC;AAEjF,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;AAErE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CA8BvD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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.WORKFLOWS = void 0;
|
|
6
|
+
exports.WORKFLOWS = {
|
|
7
|
+
'full-qa': {
|
|
8
|
+
name: 'full-qa',
|
|
9
|
+
description: 'Full multi-agent QA analysis: understand → strategize → execute → validate',
|
|
10
|
+
phases: [
|
|
11
|
+
{ name: 'preprocess', handler: 'built-in' },
|
|
12
|
+
{ name: 'understand', parallel: ['impact-analyst', 'cross-impact', 'regression-advisor'] },
|
|
13
|
+
{ name: 'strategize', sequential: ['strategist', 'test-designer'] },
|
|
14
|
+
{ name: 'execute', parallel: ['generator'] },
|
|
15
|
+
{ name: 'validate', sequential: ['executor', 'healer'] },
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
'quick-check': {
|
|
19
|
+
name: 'quick-check',
|
|
20
|
+
description: 'Quick impact analysis with strategy recommendations',
|
|
21
|
+
phases: [
|
|
22
|
+
{ name: 'preprocess', handler: 'built-in' },
|
|
23
|
+
{ name: 'understand', parallel: ['impact-analyst'] },
|
|
24
|
+
{ name: 'strategize', sequential: ['strategist'] },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
'design-only': {
|
|
28
|
+
name: 'design-only',
|
|
29
|
+
description: 'Impact analysis through test design — no generation or execution',
|
|
30
|
+
phases: [
|
|
31
|
+
{ name: 'preprocess', handler: 'built-in' },
|
|
32
|
+
{ name: 'understand', parallel: ['impact-analyst', 'cross-impact'] },
|
|
33
|
+
{ name: 'strategize', sequential: ['strategist', 'test-designer'] },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CustomConfig, GenerateOptions, ImageInput, LLMResponse, ProviderCapabilities } from './provider_interface.js';
|
|
2
|
+
import { BaseProvider } from './base_provider.js';
|
|
3
|
+
export declare class CustomProvider extends BaseProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
private config;
|
|
6
|
+
capabilities: ProviderCapabilities;
|
|
7
|
+
constructor(config: CustomConfig);
|
|
8
|
+
generateText(prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
|
|
9
|
+
analyzeImage(images: ImageInput[], prompt: string, options?: GenerateOptions): Promise<LLMResponse>;
|
|
10
|
+
private dispatchRequest;
|
|
11
|
+
private requestOpenAI;
|
|
12
|
+
private requestAnthropic;
|
|
13
|
+
private requestCustom;
|
|
14
|
+
streamText(): AsyncGenerator<string, void, unknown>;
|
|
15
|
+
checkHealth(): Promise<{
|
|
16
|
+
healthy: boolean;
|
|
17
|
+
message: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=custom_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom_provider.d.ts","sourceRoot":"","sources":["../src/custom_provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,oBAAoB,EACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AA6DhD,qBAAa,cAAe,SAAQ,YAAY;IAC5C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAe;IAE7B,YAAY,EAAE,oBAAoB,CAAC;gBAEvB,MAAM,EAAE,YAAY;IAyB1B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAmC7E,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;YAyC3F,eAAe;YAiBf,aAAa;YA8Eb,gBAAgB;YA6EhB,aAAa;IAqBpB,UAAU,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAKpD,WAAW,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;CAOpE"}
|
|
@@ -0,0 +1,277 @@
|
|
|
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.CustomProvider = void 0;
|
|
6
|
+
const provider_interface_js_1 = require("./provider_interface.js");
|
|
7
|
+
const provider_utils_js_1 = require("./provider_utils.js");
|
|
8
|
+
const base_provider_js_1 = require("./base_provider.js");
|
|
9
|
+
const logger_js_1 = require("./logger.js");
|
|
10
|
+
function normalizeUrl(baseUrl, pathSuffix) {
|
|
11
|
+
const trimmed = baseUrl.replace(/\/+$/, '');
|
|
12
|
+
if (trimmed.endsWith(pathSuffix)) {
|
|
13
|
+
return trimmed;
|
|
14
|
+
}
|
|
15
|
+
return `${trimmed}${pathSuffix}`;
|
|
16
|
+
}
|
|
17
|
+
async function postJson(url, headers, body, timeoutMs, context) {
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: {
|
|
24
|
+
'content-type': 'application/json',
|
|
25
|
+
...headers,
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`HTTP ${response.status}`);
|
|
32
|
+
}
|
|
33
|
+
return (await response.json());
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
37
|
+
throw new Error(`Request timeout (${context})`);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
if (timer) {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
class CustomProvider extends base_provider_js_1.BaseProvider {
|
|
48
|
+
constructor(config) {
|
|
49
|
+
super();
|
|
50
|
+
this.name = 'custom';
|
|
51
|
+
const validation = (0, provider_utils_js_1.validateAndSanitizeUrl)(config.baseUrl);
|
|
52
|
+
if (!validation.valid) {
|
|
53
|
+
throw new Error(`Invalid base URL: ${validation.warning}`);
|
|
54
|
+
}
|
|
55
|
+
if (validation.warning) {
|
|
56
|
+
logger_js_1.logger.warn(`HTTPS required for remote URLs: ${validation.warning}`);
|
|
57
|
+
}
|
|
58
|
+
this.config = config;
|
|
59
|
+
this.capabilities = {
|
|
60
|
+
vision: config.requestFormat !== 'custom',
|
|
61
|
+
streaming: false,
|
|
62
|
+
maxTokens: 0,
|
|
63
|
+
costPer1MInputTokens: 0,
|
|
64
|
+
costPer1MOutputTokens: 0,
|
|
65
|
+
supportsTools: false,
|
|
66
|
+
supportsPromptCaching: false,
|
|
67
|
+
typicalResponseTimeMs: 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async generateText(prompt, options) {
|
|
71
|
+
this.checkBudget();
|
|
72
|
+
const startTime = Date.now();
|
|
73
|
+
try {
|
|
74
|
+
if (prompt.length > 10 * 1024 * 1024) {
|
|
75
|
+
throw new Error('Prompt exceeds maximum size (10MB)');
|
|
76
|
+
}
|
|
77
|
+
const response = await this.dispatchRequest(prompt, options);
|
|
78
|
+
const responseTime = Date.now() - startTime;
|
|
79
|
+
const text = response.text;
|
|
80
|
+
const usage = response.usage;
|
|
81
|
+
const cost = response.cost;
|
|
82
|
+
this.updateStats(usage, responseTime, cost);
|
|
83
|
+
return {
|
|
84
|
+
text,
|
|
85
|
+
usage,
|
|
86
|
+
cost,
|
|
87
|
+
metadata: response.metadata,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.stats.failedRequests++;
|
|
92
|
+
throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'generateText'), this.name, undefined, error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async analyzeImage(images, prompt, options) {
|
|
96
|
+
if (this.config.requestFormat === 'custom') {
|
|
97
|
+
throw new provider_interface_js_1.UnsupportedCapabilityError(this.name, 'vision');
|
|
98
|
+
}
|
|
99
|
+
const startTime = Date.now();
|
|
100
|
+
try {
|
|
101
|
+
if (images.length === 0 || images.length > 20) {
|
|
102
|
+
throw new Error('Image count must be between 1 and 20');
|
|
103
|
+
}
|
|
104
|
+
if (prompt.length > 10 * 1024 * 1024) {
|
|
105
|
+
throw new Error('Prompt exceeds maximum size (10MB)');
|
|
106
|
+
}
|
|
107
|
+
const response = await this.dispatchRequest(prompt, options, images);
|
|
108
|
+
const responseTime = Date.now() - startTime;
|
|
109
|
+
const text = response.text;
|
|
110
|
+
const usage = response.usage;
|
|
111
|
+
const cost = response.cost;
|
|
112
|
+
this.updateStats(usage, responseTime, cost);
|
|
113
|
+
return {
|
|
114
|
+
text,
|
|
115
|
+
usage,
|
|
116
|
+
cost,
|
|
117
|
+
metadata: response.metadata,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
this.stats.failedRequests++;
|
|
122
|
+
throw new provider_interface_js_1.LLMProviderError((0, provider_utils_js_1.sanitizeErrorMessage)(error, 'analyzeImage'), this.name, undefined, error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async dispatchRequest(prompt, options, images) {
|
|
126
|
+
switch (this.config.requestFormat) {
|
|
127
|
+
case 'openai':
|
|
128
|
+
return this.requestOpenAI(prompt, options, images);
|
|
129
|
+
case 'anthropic':
|
|
130
|
+
return this.requestAnthropic(prompt, options, images);
|
|
131
|
+
case 'custom':
|
|
132
|
+
return this.requestCustom(prompt, options);
|
|
133
|
+
default:
|
|
134
|
+
throw new Error(`Unsupported request format: ${this.config.requestFormat}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async requestOpenAI(prompt, options, images) {
|
|
138
|
+
const url = normalizeUrl(this.config.baseUrl, '/chat/completions');
|
|
139
|
+
const messages = [];
|
|
140
|
+
if (options?.systemPrompt) {
|
|
141
|
+
messages.push({ role: 'system', content: options.systemPrompt });
|
|
142
|
+
}
|
|
143
|
+
if (images && images.length > 0) {
|
|
144
|
+
const content = [
|
|
145
|
+
{ type: 'text', text: prompt },
|
|
146
|
+
];
|
|
147
|
+
for (const image of images) {
|
|
148
|
+
const mediaType = (image.mimeType || image.mediaType || 'image/png');
|
|
149
|
+
if (!['image/png', 'image/jpeg', 'image/webp'].includes(mediaType)) {
|
|
150
|
+
throw new Error(`Unsupported image type: ${mediaType}`);
|
|
151
|
+
}
|
|
152
|
+
const data = image.data || image.base64 || '';
|
|
153
|
+
if (data.length > 20 * 1024 * 1024) {
|
|
154
|
+
throw new Error('Image data exceeds maximum size (20MB)');
|
|
155
|
+
}
|
|
156
|
+
content.push({
|
|
157
|
+
type: 'image_url',
|
|
158
|
+
image_url: { url: `data:${mediaType};base64,${data}` },
|
|
159
|
+
});
|
|
160
|
+
if (image.description) {
|
|
161
|
+
content.push({ type: 'text', text: `[Image: ${image.description}]` });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
messages.push({ role: 'user', content });
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
messages.push({ role: 'user', content: prompt });
|
|
168
|
+
}
|
|
169
|
+
const body = {
|
|
170
|
+
model: this.config.model,
|
|
171
|
+
messages,
|
|
172
|
+
max_tokens: options?.maxTokens,
|
|
173
|
+
temperature: options?.temperature,
|
|
174
|
+
top_p: options?.topP,
|
|
175
|
+
stop: options?.stopSequences,
|
|
176
|
+
};
|
|
177
|
+
const response = await postJson(url, this.config.auth, body, options?.timeout, 'openai');
|
|
178
|
+
const text = response.choices?.[0]?.message?.content || '';
|
|
179
|
+
const usage = {
|
|
180
|
+
inputTokens: response.usage?.prompt_tokens || 0,
|
|
181
|
+
outputTokens: response.usage?.completion_tokens || 0,
|
|
182
|
+
totalTokens: response.usage?.total_tokens || 0,
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
text,
|
|
186
|
+
usage,
|
|
187
|
+
cost: 0,
|
|
188
|
+
metadata: {
|
|
189
|
+
finishReason: response.choices?.[0]?.finish_reason,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async requestAnthropic(prompt, options, images) {
|
|
194
|
+
const url = normalizeUrl(this.config.baseUrl, '/messages');
|
|
195
|
+
const content = [
|
|
196
|
+
{ type: 'text', text: prompt },
|
|
197
|
+
];
|
|
198
|
+
if (images && images.length > 0) {
|
|
199
|
+
for (const image of images) {
|
|
200
|
+
const mediaType = (image.mimeType || image.mediaType || 'image/png');
|
|
201
|
+
if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(mediaType)) {
|
|
202
|
+
throw new Error(`Unsupported image type: ${mediaType}`);
|
|
203
|
+
}
|
|
204
|
+
const data = image.data || image.base64 || '';
|
|
205
|
+
if (data.length > 20 * 1024 * 1024) {
|
|
206
|
+
throw new Error('Image data exceeds maximum size (20MB)');
|
|
207
|
+
}
|
|
208
|
+
content.push({
|
|
209
|
+
type: 'image',
|
|
210
|
+
source: {
|
|
211
|
+
type: 'base64',
|
|
212
|
+
media_type: mediaType,
|
|
213
|
+
data,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
if (image.description) {
|
|
217
|
+
content.push({ type: 'text', text: `[Image: ${image.description}]` });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const body = {
|
|
222
|
+
model: this.config.model,
|
|
223
|
+
max_tokens: options?.maxTokens || 4000,
|
|
224
|
+
temperature: options?.temperature,
|
|
225
|
+
top_p: options?.topP,
|
|
226
|
+
stop_sequences: options?.stopSequences,
|
|
227
|
+
system: options?.systemPrompt,
|
|
228
|
+
messages: [
|
|
229
|
+
{
|
|
230
|
+
role: 'user',
|
|
231
|
+
content,
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
};
|
|
235
|
+
const response = await postJson(url, this.config.auth, body, options?.timeout, 'anthropic');
|
|
236
|
+
const text = (response.content || []).map((block) => block.text).join('\n');
|
|
237
|
+
const usage = {
|
|
238
|
+
inputTokens: response.usage?.input_tokens || 0,
|
|
239
|
+
outputTokens: response.usage?.output_tokens || 0,
|
|
240
|
+
totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
|
|
241
|
+
};
|
|
242
|
+
return {
|
|
243
|
+
text,
|
|
244
|
+
usage,
|
|
245
|
+
cost: 0,
|
|
246
|
+
metadata: {
|
|
247
|
+
stopReason: response.stop_reason,
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
async requestCustom(prompt, options) {
|
|
252
|
+
if (!this.config.transformRequest || !this.config.transformResponse) {
|
|
253
|
+
throw new Error('Custom providers require transformRequest and transformResponse');
|
|
254
|
+
}
|
|
255
|
+
const body = this.config.transformRequest(prompt, options);
|
|
256
|
+
const response = await postJson(this.config.baseUrl, this.config.auth, body, options?.timeout, 'custom');
|
|
257
|
+
const transformed = this.config.transformResponse(response);
|
|
258
|
+
return {
|
|
259
|
+
text: transformed.text,
|
|
260
|
+
usage: transformed.usage,
|
|
261
|
+
cost: transformed.cost,
|
|
262
|
+
metadata: transformed.metadata,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// CustomProvider doesn't support streaming
|
|
266
|
+
async *streamText() {
|
|
267
|
+
throw new Error('Streaming not supported for custom providers');
|
|
268
|
+
}
|
|
269
|
+
// CustomProvider doesn't have built-in health checks
|
|
270
|
+
async checkHealth() {
|
|
271
|
+
return {
|
|
272
|
+
healthy: true,
|
|
273
|
+
message: 'Custom provider configured',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
exports.CustomProvider = CustomProvider;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LLMProvider } from '../provider_interface.js';
|
|
2
|
+
import type { ImpactResult, SpecWithScenarios } from './impact_engine.js';
|
|
3
|
+
import type { FeaturePriority } from '../knowledge/route_families.js';
|
|
4
|
+
export interface EnrichedFeature {
|
|
5
|
+
familyId: string;
|
|
6
|
+
featureId?: string;
|
|
7
|
+
priority: FeaturePriority;
|
|
8
|
+
changedFiles: string[];
|
|
9
|
+
coverageStatus: string;
|
|
10
|
+
playwrightSpecs: string[];
|
|
11
|
+
cypressSpecs: string[];
|
|
12
|
+
userFlows: string[];
|
|
13
|
+
aiReasons: string[];
|
|
14
|
+
aiMissingScenarios: string[];
|
|
15
|
+
aiCoveredBy: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface AIEnrichmentResult {
|
|
18
|
+
enrichedFeatures: EnrichedFeature[];
|
|
19
|
+
unboundFileInsights: Array<{
|
|
20
|
+
file: string;
|
|
21
|
+
likelyFeature: string;
|
|
22
|
+
reason: string;
|
|
23
|
+
}>;
|
|
24
|
+
warnings: string[];
|
|
25
|
+
providerName: string;
|
|
26
|
+
tokenUsage: {
|
|
27
|
+
input: number;
|
|
28
|
+
output: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface AIEnrichmentOptions {
|
|
32
|
+
deterministicImpact: ImpactResult;
|
|
33
|
+
diffs: Map<string, string>;
|
|
34
|
+
provider: LLMProvider;
|
|
35
|
+
specList: string[];
|
|
36
|
+
specDetails?: SpecWithScenarios[];
|
|
37
|
+
manifestSummary?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Enriches a deterministic impact result with AI-generated reasons,
|
|
41
|
+
* missing test scenarios, and coverage insights.
|
|
42
|
+
*/
|
|
43
|
+
export declare function enrichImpactWithAI(options: AIEnrichmentOptions): Promise<AIEnrichmentResult>;
|
|
44
|
+
//# sourceMappingURL=ai_enrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai_enrichment.d.ts","sourceRoot":"","sources":["../../src/engine/ai_enrichment.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAC,YAAY,EAAmB,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACzF,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAGpE,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IAC/B,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,mBAAmB,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAClF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAChC,mBAAmB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAoLD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkIlG"}
|