@agentic-qe/v3 3.0.0-alpha.6 → 3.0.0-alpha.7
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/assets/agents/v3/subagents/v3-qe-code-reviewer.md +339 -0
- package/assets/agents/v3/subagents/v3-qe-integration-reviewer.md +344 -0
- package/assets/agents/v3/subagents/v3-qe-performance-reviewer.md +351 -0
- package/assets/agents/v3/subagents/v3-qe-security-reviewer.md +374 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-green.md +334 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-red.md +329 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-refactor.md +361 -0
- package/assets/agents/v3/v3-qe-accessibility-auditor.md +266 -0
- package/assets/agents/v3/v3-qe-bdd-generator.md +279 -0
- package/assets/agents/v3/v3-qe-chaos-engineer.md +265 -0
- package/assets/agents/v3/v3-qe-code-complexity.md +298 -0
- package/assets/agents/v3/v3-qe-code-intelligence.md +262 -0
- package/assets/agents/v3/v3-qe-contract-validator.md +267 -0
- package/assets/agents/v3/v3-qe-coverage-specialist.md +227 -0
- package/assets/agents/v3/v3-qe-defect-predictor.md +251 -0
- package/assets/agents/v3/v3-qe-dependency-mapper.md +277 -0
- package/assets/agents/v3/v3-qe-deployment-advisor.md +275 -0
- package/assets/agents/v3/v3-qe-flaky-hunter.md +248 -0
- package/assets/agents/v3/v3-qe-fleet-commander.md +293 -0
- package/assets/agents/v3/v3-qe-gap-detector.md +260 -0
- package/assets/agents/v3/v3-qe-graphql-tester.md +308 -0
- package/assets/agents/v3/v3-qe-impact-analyzer.md +299 -0
- package/assets/agents/v3/v3-qe-integration-tester.md +238 -0
- package/assets/agents/v3/v3-qe-kg-builder.md +273 -0
- package/assets/agents/v3/v3-qe-learning-coordinator.md +226 -0
- package/assets/agents/v3/v3-qe-load-tester.md +280 -0
- package/assets/agents/v3/v3-qe-metrics-optimizer.md +300 -0
- package/assets/agents/v3/v3-qe-mutation-tester.md +301 -0
- package/assets/agents/v3/v3-qe-parallel-executor.md +240 -0
- package/assets/agents/v3/v3-qe-pattern-learner.md +271 -0
- package/assets/agents/v3/v3-qe-performance-tester.md +262 -0
- package/assets/agents/v3/v3-qe-property-tester.md +247 -0
- package/assets/agents/v3/v3-qe-quality-gate.md +218 -0
- package/assets/agents/v3/v3-qe-queen-coordinator.md +214 -0
- package/assets/agents/v3/v3-qe-qx-partner.md +313 -0
- package/assets/agents/v3/v3-qe-regression-analyzer.md +322 -0
- package/assets/agents/v3/v3-qe-requirements-validator.md +360 -0
- package/assets/agents/v3/v3-qe-responsive-tester.md +311 -0
- package/assets/agents/v3/v3-qe-retry-handler.md +256 -0
- package/assets/agents/v3/v3-qe-risk-assessor.md +273 -0
- package/assets/agents/v3/v3-qe-root-cause-analyzer.md +286 -0
- package/assets/agents/v3/v3-qe-security-auditor.md +299 -0
- package/assets/agents/v3/v3-qe-security-scanner.md +235 -0
- package/assets/agents/v3/v3-qe-tdd-specialist.md +239 -0
- package/assets/agents/v3/v3-qe-test-architect.md +233 -0
- package/assets/agents/v3/v3-qe-transfer-specialist.md +295 -0
- package/assets/agents/v3/v3-qe-visual-tester.md +232 -0
- package/assets/skills/accessibility-testing/SKILL.md +216 -0
- package/assets/skills/agentdb-advanced/SKILL.md +550 -0
- package/assets/skills/agentdb-learning/SKILL.md +545 -0
- package/assets/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/assets/skills/agentdb-optimization/SKILL.md +509 -0
- package/assets/skills/agentdb-vector-search/SKILL.md +339 -0
- package/assets/skills/agentic-jujutsu/SKILL.md +645 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +335 -0
- package/assets/skills/api-testing-patterns/SKILL.md +294 -0
- package/assets/skills/aqe-v2-v3-migration/skill.md +322 -0
- package/assets/skills/brutal-honesty-review/README.md +218 -0
- package/assets/skills/brutal-honesty-review/SKILL.md +235 -0
- package/assets/skills/brutal-honesty-review/resources/assessment-rubrics.md +295 -0
- package/assets/skills/brutal-honesty-review/resources/review-template.md +102 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-code.sh +179 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-tests.sh +223 -0
- package/assets/skills/bug-reporting-excellence/SKILL.md +225 -0
- package/assets/skills/chaos-engineering-resilience/SKILL.md +158 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/README.md +304 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/SKILL.md +315 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/microservice-pipeline.md +239 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/mobile-pipeline.md +375 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/monolith-pipeline.md +268 -0
- package/assets/skills/code-review-quality/SKILL.md +227 -0
- package/assets/skills/compatibility-testing/SKILL.md +205 -0
- package/assets/skills/compliance-testing/SKILL.md +225 -0
- package/assets/skills/consultancy-practices/SKILL.md +202 -0
- package/assets/skills/context-driven-testing/SKILL.md +196 -0
- package/assets/skills/contract-testing/SKILL.md +222 -0
- package/assets/skills/database-testing/SKILL.md +244 -0
- package/assets/skills/exploratory-testing-advanced/SKILL.md +201 -0
- package/assets/skills/flow-nexus-neural/SKILL.md +738 -0
- package/assets/skills/flow-nexus-platform/SKILL.md +1157 -0
- package/assets/skills/flow-nexus-swarm/SKILL.md +610 -0
- package/assets/skills/github-code-review/SKILL.md +1140 -0
- package/assets/skills/github-multi-repo/SKILL.md +874 -0
- package/assets/skills/github-project-management/SKILL.md +1277 -0
- package/assets/skills/github-release-management/SKILL.md +1081 -0
- package/assets/skills/github-workflow-automation/SKILL.md +1065 -0
- package/assets/skills/hive-mind-advanced/SKILL.md +712 -0
- package/assets/skills/holistic-testing-pact/SKILL.md +171 -0
- package/assets/skills/hooks-automation/SKILL.md +1201 -0
- package/assets/skills/localization-testing/SKILL.md +221 -0
- package/assets/skills/mobile-testing/SKILL.md +219 -0
- package/assets/skills/mutation-testing/SKILL.md +229 -0
- package/assets/skills/n8n-expression-testing/SKILL.md +434 -0
- package/assets/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
- package/assets/skills/n8n-security-testing/SKILL.md +599 -0
- package/assets/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
- package/assets/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
- package/assets/skills/pair-programming/SKILL.md +1202 -0
- package/assets/skills/performance-analysis/SKILL.md +563 -0
- package/assets/skills/performance-testing/SKILL.md +310 -0
- package/assets/skills/quality-metrics/SKILL.md +225 -0
- package/assets/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/assets/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/assets/skills/refactoring-patterns/SKILL.md +205 -0
- package/assets/skills/regression-testing/SKILL.md +227 -0
- package/assets/skills/risk-based-testing/SKILL.md +206 -0
- package/assets/skills/security-testing/SKILL.md +306 -0
- package/assets/skills/sherlock-review/SKILL.md +250 -0
- package/assets/skills/shift-left-testing/SKILL.md +225 -0
- package/assets/skills/shift-right-testing/SKILL.md +227 -0
- package/assets/skills/six-thinking-hats/README.md +190 -0
- package/assets/skills/six-thinking-hats/SKILL.md +280 -0
- package/assets/skills/six-thinking-hats/resources/examples/api-testing-example.md +345 -0
- package/assets/skills/six-thinking-hats/resources/templates/solo-session-template.md +167 -0
- package/assets/skills/six-thinking-hats/resources/templates/team-session-template.md +336 -0
- package/assets/skills/skill-builder/SKILL.md +910 -0
- package/assets/skills/sparc-methodology/SKILL.md +1115 -0
- package/assets/skills/stream-chain/SKILL.md +563 -0
- package/assets/skills/swarm-advanced/SKILL.md +973 -0
- package/assets/skills/swarm-orchestration/SKILL.md +179 -0
- package/assets/skills/tdd-london-chicago/SKILL.md +244 -0
- package/assets/skills/technical-writing/SKILL.md +178 -0
- package/assets/skills/test-automation-strategy/SKILL.md +230 -0
- package/assets/skills/test-data-management/SKILL.md +270 -0
- package/assets/skills/test-design-techniques/SKILL.md +244 -0
- package/assets/skills/test-environment-management/SKILL.md +243 -0
- package/assets/skills/test-reporting-analytics/SKILL.md +214 -0
- package/assets/skills/testability-scoring/README.md +71 -0
- package/assets/skills/testability-scoring/SKILL.md +346 -0
- package/assets/skills/testability-scoring/resources/templates/config.template.js +84 -0
- package/assets/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
- package/assets/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
- package/assets/skills/testability-scoring/scripts/run-assessment.sh +70 -0
- package/assets/skills/v3-qe-chaos-resilience/SKILL.md +238 -0
- package/assets/skills/v3-qe-code-intelligence/SKILL.md +209 -0
- package/assets/skills/v3-qe-contract-testing/SKILL.md +218 -0
- package/assets/skills/v3-qe-coverage-analysis/SKILL.md +187 -0
- package/assets/skills/v3-qe-defect-intelligence/SKILL.md +205 -0
- package/assets/skills/v3-qe-learning-optimization/SKILL.md +238 -0
- package/assets/skills/v3-qe-quality-assessment/SKILL.md +213 -0
- package/assets/skills/v3-qe-requirements-validation/SKILL.md +248 -0
- package/assets/skills/v3-qe-test-execution/SKILL.md +182 -0
- package/assets/skills/v3-qe-test-generation/SKILL.md +141 -0
- package/assets/skills/v3-qe-visual-accessibility/SKILL.md +242 -0
- package/assets/skills/verification-quality/SKILL.md +649 -0
- package/assets/skills/visual-testing-advanced/SKILL.md +219 -0
- package/assets/skills/xp-practices/SKILL.md +229 -0
- package/dist/cli/bundle.js +8 -8
- package/dist/init/agents-installer.js +4 -4
- package/dist/init/agents-installer.js.map +1 -1
- package/dist/init/skills-installer.js +4 -4
- package/dist/init/skills-installer.js.map +1 -1
- package/package.json +7 -1
- package/docs/analysis/V3-INIT-REQUIREMENTS-ANALYSIS.md +0 -352
- package/implementation/README.md +0 -90
- package/implementation/adrs/ADR-030-coherence-gated-quality-gates.md +0 -312
- package/implementation/adrs/ADR-031-strange-loop-self-awareness.md +0 -484
- package/implementation/adrs/ADR-032-time-crystal-scheduling.md +0 -530
- package/implementation/adrs/ADR-033-early-exit-testing.md +0 -634
- package/implementation/adrs/ADR-034-neural-topology-optimizer.md +0 -589
- package/implementation/adrs/ADR-035-causal-discovery.md +0 -610
- package/implementation/adrs/ADR-036-result-persistence.md +0 -326
- package/implementation/adrs/ADR-037-v3-qe-agent-naming.md +0 -105
- package/implementation/adrs/ADR-038-v3-qe-memory-unification.md +0 -154
- package/implementation/adrs/ADR-039-v3-qe-mcp-optimization.md +0 -179
- package/implementation/adrs/ADR-040-v3-qe-agentic-flow-integration.md +0 -240
- package/implementation/adrs/ADR-041-v3-qe-cli-enhancement.md +0 -296
- package/implementation/adrs/ADR-042-v3-qe-token-tracking-integration.md +0 -517
- package/implementation/adrs/v3-adrs.md +0 -2783
- package/implementation/planning/AQE-V3-MASTER-PLAN.md +0 -815
- package/security-scan-report-2026-01-11.md +0 -410
- package/security-verification-report-2026-01-11.md +0 -278
- package/src/benchmarks/performance-benchmarks.ts +0 -646
- package/src/benchmarks/run-benchmarks.ts +0 -324
- package/src/causal-discovery/causal-graph.ts +0 -450
- package/src/causal-discovery/discovery-engine.ts +0 -438
- package/src/causal-discovery/index.ts +0 -117
- package/src/causal-discovery/types.ts +0 -456
- package/src/causal-discovery/weight-matrix.ts +0 -453
- package/src/cli/commands/qe-tools.ts +0 -634
- package/src/cli/index.ts +0 -1976
- package/src/compatibility/agent-mapper.ts +0 -291
- package/src/compatibility/cli-adapter.ts +0 -277
- package/src/compatibility/config-migrator.ts +0 -334
- package/src/compatibility/index.ts +0 -112
- package/src/compatibility/mcp-adapter.ts +0 -248
- package/src/compatibility/types.ts +0 -156
- package/src/coordination/claims/claim-repository.ts +0 -636
- package/src/coordination/claims/claim-service.ts +0 -675
- package/src/coordination/claims/handoff-manager.ts +0 -535
- package/src/coordination/claims/index.ts +0 -276
- package/src/coordination/claims/interfaces.ts +0 -687
- package/src/coordination/claims/work-stealing.ts +0 -436
- package/src/coordination/cross-domain-router.ts +0 -492
- package/src/coordination/index.ts +0 -127
- package/src/coordination/interfaces.ts +0 -691
- package/src/coordination/protocol-executor.ts +0 -760
- package/src/coordination/protocols/code-intelligence-index.ts +0 -855
- package/src/coordination/protocols/defect-investigation.ts +0 -1184
- package/src/coordination/protocols/index.ts +0 -11
- package/src/coordination/protocols/learning-consolidation.ts +0 -1181
- package/src/coordination/protocols/morning-sync.ts +0 -1055
- package/src/coordination/protocols/quality-gate.ts +0 -1566
- package/src/coordination/protocols/security-audit.ts +0 -1587
- package/src/coordination/queen-coordinator.ts +0 -1176
- package/src/coordination/result-saver.ts +0 -780
- package/src/coordination/task-executor.ts +0 -1146
- package/src/coordination/workflow-orchestrator.ts +0 -1917
- package/src/domains/chaos-resilience/coordinator.ts +0 -1032
- package/src/domains/chaos-resilience/index.ts +0 -143
- package/src/domains/chaos-resilience/interfaces.ts +0 -659
- package/src/domains/chaos-resilience/plugin.ts +0 -691
- package/src/domains/chaos-resilience/services/chaos-engineer.ts +0 -1097
- package/src/domains/chaos-resilience/services/index.ts +0 -19
- package/src/domains/chaos-resilience/services/load-tester.ts +0 -799
- package/src/domains/chaos-resilience/services/performance-profiler.ts +0 -792
- package/src/domains/code-intelligence/coordinator.ts +0 -631
- package/src/domains/code-intelligence/index.ts +0 -86
- package/src/domains/code-intelligence/interfaces.ts +0 -162
- package/src/domains/code-intelligence/plugin.ts +0 -451
- package/src/domains/code-intelligence/services/impact-analyzer.ts +0 -567
- package/src/domains/code-intelligence/services/index.ts +0 -26
- package/src/domains/code-intelligence/services/knowledge-graph.ts +0 -1067
- package/src/domains/code-intelligence/services/semantic-analyzer.ts +0 -901
- package/src/domains/contract-testing/coordinator.ts +0 -1038
- package/src/domains/contract-testing/index.ts +0 -122
- package/src/domains/contract-testing/interfaces.ts +0 -458
- package/src/domains/contract-testing/plugin.ts +0 -746
- package/src/domains/contract-testing/services/api-compatibility.ts +0 -748
- package/src/domains/contract-testing/services/contract-validator.ts +0 -1700
- package/src/domains/contract-testing/services/index.ts +0 -19
- package/src/domains/contract-testing/services/schema-validator.ts +0 -1102
- package/src/domains/coverage-analysis/coordinator.ts +0 -485
- package/src/domains/coverage-analysis/index.ts +0 -114
- package/src/domains/coverage-analysis/interfaces.ts +0 -142
- package/src/domains/coverage-analysis/plugin.ts +0 -172
- package/src/domains/coverage-analysis/services/coverage-analyzer.ts +0 -449
- package/src/domains/coverage-analysis/services/coverage-embedder.ts +0 -733
- package/src/domains/coverage-analysis/services/coverage-parser.ts +0 -753
- package/src/domains/coverage-analysis/services/gap-detector.ts +0 -592
- package/src/domains/coverage-analysis/services/hnsw-index.ts +0 -728
- package/src/domains/coverage-analysis/services/index.ts +0 -61
- package/src/domains/coverage-analysis/services/risk-scorer.ts +0 -540
- package/src/domains/coverage-analysis/services/sublinear-analyzer.ts +0 -747
- package/src/domains/defect-intelligence/coordinator.ts +0 -635
- package/src/domains/defect-intelligence/index.ts +0 -83
- package/src/domains/defect-intelligence/interfaces.ts +0 -152
- package/src/domains/defect-intelligence/plugin.ts +0 -483
- package/src/domains/defect-intelligence/services/causal-root-cause-analyzer.ts +0 -494
- package/src/domains/defect-intelligence/services/defect-predictor.ts +0 -852
- package/src/domains/defect-intelligence/services/index.ts +0 -37
- package/src/domains/defect-intelligence/services/pattern-learner.ts +0 -738
- package/src/domains/defect-intelligence/services/root-cause-analyzer.ts +0 -637
- package/src/domains/domain-interface.ts +0 -77
- package/src/domains/index.ts +0 -23
- package/src/domains/learning-optimization/coordinator.ts +0 -1215
- package/src/domains/learning-optimization/index.ts +0 -127
- package/src/domains/learning-optimization/interfaces.ts +0 -570
- package/src/domains/learning-optimization/plugin.ts +0 -851
- package/src/domains/learning-optimization/services/index.ts +0 -29
- package/src/domains/learning-optimization/services/learning-coordinator.ts +0 -972
- package/src/domains/learning-optimization/services/metrics-optimizer.ts +0 -915
- package/src/domains/learning-optimization/services/production-intel.ts +0 -971
- package/src/domains/learning-optimization/services/transfer-specialist.ts +0 -723
- package/src/domains/quality-assessment/coherence/gate-controller.ts +0 -549
- package/src/domains/quality-assessment/coherence/index.ts +0 -211
- package/src/domains/quality-assessment/coherence/lambda-calculator.ts +0 -384
- package/src/domains/quality-assessment/coherence/partition-detector.ts +0 -469
- package/src/domains/quality-assessment/coherence/types.ts +0 -384
- package/src/domains/quality-assessment/coordinator.ts +0 -605
- package/src/domains/quality-assessment/index.ts +0 -97
- package/src/domains/quality-assessment/interfaces.ts +0 -152
- package/src/domains/quality-assessment/plugin.ts +0 -496
- package/src/domains/quality-assessment/services/coherence-gate.ts +0 -358
- package/src/domains/quality-assessment/services/deployment-advisor.ts +0 -571
- package/src/domains/quality-assessment/services/index.ts +0 -34
- package/src/domains/quality-assessment/services/quality-analyzer.ts +0 -670
- package/src/domains/quality-assessment/services/quality-gate.ts +0 -384
- package/src/domains/requirements-validation/coordinator.ts +0 -812
- package/src/domains/requirements-validation/index.ts +0 -92
- package/src/domains/requirements-validation/interfaces.ts +0 -303
- package/src/domains/requirements-validation/plugin.ts +0 -576
- package/src/domains/requirements-validation/services/bdd-scenario-writer.ts +0 -676
- package/src/domains/requirements-validation/services/index.ts +0 -20
- package/src/domains/requirements-validation/services/requirements-validator.ts +0 -559
- package/src/domains/requirements-validation/services/testability-scorer.ts +0 -639
- package/src/domains/security-compliance/coordinator.ts +0 -757
- package/src/domains/security-compliance/index.ts +0 -120
- package/src/domains/security-compliance/interfaces.ts +0 -434
- package/src/domains/security-compliance/plugin.ts +0 -509
- package/src/domains/security-compliance/services/compliance-validator.ts +0 -1226
- package/src/domains/security-compliance/services/index.ts +0 -31
- package/src/domains/security-compliance/services/security-auditor.ts +0 -2227
- package/src/domains/security-compliance/services/security-scanner.ts +0 -2354
- package/src/domains/security-compliance/services/semgrep-integration.ts +0 -289
- package/src/domains/test-execution/coordinator.ts +0 -426
- package/src/domains/test-execution/index.ts +0 -76
- package/src/domains/test-execution/interfaces.ts +0 -119
- package/src/domains/test-execution/plugin.ts +0 -208
- package/src/domains/test-execution/services/flaky-detector.ts +0 -1240
- package/src/domains/test-execution/services/index.ts +0 -8
- package/src/domains/test-execution/services/retry-handler.ts +0 -820
- package/src/domains/test-execution/services/test-executor.ts +0 -885
- package/src/domains/test-generation/coordinator.ts +0 -656
- package/src/domains/test-generation/index.ts +0 -77
- package/src/domains/test-generation/interfaces.ts +0 -118
- package/src/domains/test-generation/plugin.ts +0 -397
- package/src/domains/test-generation/services/index.ts +0 -23
- package/src/domains/test-generation/services/pattern-matcher.ts +0 -1725
- package/src/domains/test-generation/services/test-generator.ts +0 -2750
- package/src/domains/visual-accessibility/coordinator.ts +0 -860
- package/src/domains/visual-accessibility/index.ts +0 -116
- package/src/domains/visual-accessibility/interfaces.ts +0 -435
- package/src/domains/visual-accessibility/plugin.ts +0 -568
- package/src/domains/visual-accessibility/services/accessibility-tester.ts +0 -982
- package/src/domains/visual-accessibility/services/axe-core-audit.ts +0 -630
- package/src/domains/visual-accessibility/services/index.ts +0 -28
- package/src/domains/visual-accessibility/services/responsive-tester.ts +0 -934
- package/src/domains/visual-accessibility/services/visual-tester.ts +0 -458
- package/src/early-exit/early-exit-controller.ts +0 -490
- package/src/early-exit/early-exit-decision.ts +0 -391
- package/src/early-exit/index.ts +0 -115
- package/src/early-exit/quality-signal.ts +0 -389
- package/src/early-exit/speculative-executor.ts +0 -505
- package/src/early-exit/types.ts +0 -407
- package/src/feedback/coverage-learner.ts +0 -456
- package/src/feedback/feedback-loop.ts +0 -426
- package/src/feedback/index.ts +0 -72
- package/src/feedback/pattern-promotion.ts +0 -373
- package/src/feedback/quality-score-calculator.ts +0 -334
- package/src/feedback/test-outcome-tracker.ts +0 -450
- package/src/feedback/types.ts +0 -497
- package/src/index.ts +0 -224
- package/src/init/agents-installer.ts +0 -536
- package/src/init/index.ts +0 -80
- package/src/init/init-wizard.ts +0 -1061
- package/src/init/project-analyzer.ts +0 -696
- package/src/init/self-configurator.ts +0 -488
- package/src/init/skills-installer.ts +0 -467
- package/src/init/types.ts +0 -432
- package/src/integrations/ruvector/ast-complexity.ts +0 -470
- package/src/integrations/ruvector/coverage-router.ts +0 -594
- package/src/integrations/ruvector/diff-risk-classifier.ts +0 -759
- package/src/integrations/ruvector/fallback.ts +0 -942
- package/src/integrations/ruvector/graph-boundaries.ts +0 -809
- package/src/integrations/ruvector/index.ts +0 -363
- package/src/integrations/ruvector/interfaces.ts +0 -609
- package/src/integrations/ruvector/q-learning-router.ts +0 -550
- package/src/kernel/agent-coordinator.ts +0 -165
- package/src/kernel/agentdb-backend.ts +0 -504
- package/src/kernel/event-bus.ts +0 -129
- package/src/kernel/hybrid-backend.ts +0 -538
- package/src/kernel/index.ts +0 -28
- package/src/kernel/interfaces.ts +0 -257
- package/src/kernel/kernel.ts +0 -285
- package/src/kernel/memory-backend.ts +0 -169
- package/src/kernel/memory-factory.ts +0 -293
- package/src/kernel/plugin-loader.ts +0 -179
- package/src/learning/index.ts +0 -219
- package/src/learning/pattern-store.ts +0 -990
- package/src/learning/qe-guidance.ts +0 -832
- package/src/learning/qe-hooks.ts +0 -644
- package/src/learning/qe-patterns.ts +0 -449
- package/src/learning/qe-reasoning-bank.ts +0 -951
- package/src/learning/real-embeddings.ts +0 -277
- package/src/learning/real-qe-reasoning-bank.ts +0 -833
- package/src/learning/sqlite-persistence.ts +0 -554
- package/src/mcp/entry.ts +0 -59
- package/src/mcp/handlers/agent-handlers.ts +0 -285
- package/src/mcp/handlers/core-handlers.ts +0 -317
- package/src/mcp/handlers/domain-handlers.ts +0 -1444
- package/src/mcp/handlers/index.ts +0 -57
- package/src/mcp/handlers/memory-handlers.ts +0 -338
- package/src/mcp/handlers/task-handlers.ts +0 -363
- package/src/mcp/index.ts +0 -30
- package/src/mcp/metrics/index.ts +0 -14
- package/src/mcp/metrics/metrics-collector.ts +0 -503
- package/src/mcp/protocol-server.ts +0 -752
- package/src/mcp/security/cve-prevention.ts +0 -742
- package/src/mcp/security/index.ts +0 -356
- package/src/mcp/security/oauth21-provider.ts +0 -821
- package/src/mcp/security/rate-limiter.ts +0 -615
- package/src/mcp/security/sampling-server.ts +0 -662
- package/src/mcp/security/schema-validator.ts +0 -855
- package/src/mcp/server.ts +0 -657
- package/src/mcp/tool-registry.ts +0 -391
- package/src/mcp/tools/base.ts +0 -399
- package/src/mcp/tools/chaos-resilience/inject.ts +0 -699
- package/src/mcp/tools/code-intelligence/analyze.ts +0 -745
- package/src/mcp/tools/contract-testing/validate.ts +0 -708
- package/src/mcp/tools/coverage-analysis/index.ts +0 -770
- package/src/mcp/tools/defect-intelligence/predict.ts +0 -466
- package/src/mcp/tools/index.ts +0 -214
- package/src/mcp/tools/learning-optimization/optimize.ts +0 -772
- package/src/mcp/tools/quality-assessment/evaluate.ts +0 -385
- package/src/mcp/tools/registry.ts +0 -248
- package/src/mcp/tools/requirements-validation/validate.ts +0 -394
- package/src/mcp/tools/security-compliance/scan.ts +0 -365
- package/src/mcp/tools/test-execution/execute.ts +0 -291
- package/src/mcp/tools/test-generation/generate.ts +0 -544
- package/src/mcp/tools/visual-accessibility/index.ts +0 -791
- package/src/mcp/transport/index.ts +0 -31
- package/src/mcp/transport/stdio.ts +0 -318
- package/src/mcp/types.ts +0 -543
- package/src/neural-optimizer/index.ts +0 -111
- package/src/neural-optimizer/replay-buffer.ts +0 -455
- package/src/neural-optimizer/swarm-topology.ts +0 -508
- package/src/neural-optimizer/topology-optimizer.ts +0 -828
- package/src/neural-optimizer/types.ts +0 -481
- package/src/neural-optimizer/value-network.ts +0 -351
- package/src/optimization/auto-tuner.ts +0 -817
- package/src/optimization/index.ts +0 -77
- package/src/optimization/metric-collectors.ts +0 -474
- package/src/optimization/qe-workers.ts +0 -704
- package/src/optimization/tuning-algorithm.ts +0 -401
- package/src/optimization/types.ts +0 -314
- package/src/routing/index.ts +0 -51
- package/src/routing/qe-agent-registry.ts +0 -963
- package/src/routing/qe-task-router.ts +0 -564
- package/src/routing/routing-feedback.ts +0 -365
- package/src/routing/types.ts +0 -406
- package/src/shared/embeddings/embedding-cache.ts +0 -157
- package/src/shared/embeddings/index.ts +0 -50
- package/src/shared/embeddings/nomic-embedder.ts +0 -404
- package/src/shared/embeddings/ollama-client.ts +0 -195
- package/src/shared/embeddings/types.ts +0 -147
- package/src/shared/entities/agent.ts +0 -141
- package/src/shared/entities/base-entity.ts +0 -79
- package/src/shared/entities/index.ts +0 -6
- package/src/shared/events/domain-events.ts +0 -259
- package/src/shared/events/index.ts +0 -5
- package/src/shared/git/git-analyzer.ts +0 -656
- package/src/shared/git/index.ts +0 -11
- package/src/shared/http/http-client.ts +0 -420
- package/src/shared/http/index.ts +0 -13
- package/src/shared/index.ts +0 -41
- package/src/shared/io/file-reader.ts +0 -525
- package/src/shared/io/index.ts +0 -25
- package/src/shared/llm/cache.ts +0 -473
- package/src/shared/llm/circuit-breaker.ts +0 -369
- package/src/shared/llm/cost-tracker.ts +0 -460
- package/src/shared/llm/index.ts +0 -140
- package/src/shared/llm/interfaces.ts +0 -629
- package/src/shared/llm/provider-manager.ts +0 -685
- package/src/shared/llm/providers/claude.ts +0 -524
- package/src/shared/llm/providers/index.ts +0 -8
- package/src/shared/llm/providers/ollama.ts +0 -575
- package/src/shared/llm/providers/openai.ts +0 -609
- package/src/shared/metrics/code-metrics.ts +0 -520
- package/src/shared/metrics/index.ts +0 -23
- package/src/shared/metrics/system-metrics.ts +0 -353
- package/src/shared/parsers/index.ts +0 -6
- package/src/shared/parsers/typescript-parser.ts +0 -841
- package/src/shared/security/compliance-patterns.ts +0 -666
- package/src/shared/security/index.ts +0 -30
- package/src/shared/security/osv-client.ts +0 -468
- package/src/shared/types/index.ts +0 -150
- package/src/shared/value-objects/index.ts +0 -273
- package/src/strange-loop/healing-controller.ts +0 -833
- package/src/strange-loop/index.ts +0 -104
- package/src/strange-loop/self-model.ts +0 -494
- package/src/strange-loop/strange-loop.ts +0 -446
- package/src/strange-loop/swarm-observer.ts +0 -448
- package/src/strange-loop/topology-analyzer.ts +0 -565
- package/src/strange-loop/types.ts +0 -640
- package/src/time-crystal/default-phases.ts +0 -520
- package/src/time-crystal/index.ts +0 -164
- package/src/time-crystal/oscillator.ts +0 -425
- package/src/time-crystal/phase-executor.ts +0 -521
- package/src/time-crystal/scheduler.ts +0 -1025
- package/src/time-crystal/test-runner.ts +0 -787
- package/src/time-crystal/types.ts +0 -421
- package/src/workers/base-worker.ts +0 -304
- package/src/workers/daemon.ts +0 -264
- package/src/workers/index.ts +0 -119
- package/src/workers/interfaces.ts +0 -393
- package/src/workers/worker-manager.ts +0 -424
- package/src/workers/workers/compliance-checker.ts +0 -445
- package/src/workers/workers/coverage-tracker.ts +0 -344
- package/src/workers/workers/defect-predictor.ts +0 -375
- package/src/workers/workers/flaky-detector.ts +0 -390
- package/src/workers/workers/index.ts +0 -17
- package/src/workers/workers/learning-consolidation.ts +0 -442
- package/src/workers/workers/performance-baseline.ts +0 -434
- package/src/workers/workers/quality-gate.ts +0 -419
- package/src/workers/workers/regression-monitor.ts +0 -357
- package/src/workers/workers/security-scan.ts +0 -349
- package/src/workers/workers/test-health.ts +0 -359
- package/tests/integration/code-intelligence/knowledge-graph-real.test.ts +0 -540
- package/tests/integration/coordination/cross-domain-router.test.ts +0 -403
- package/tests/integration/coordination/protocol-executor.test.ts +0 -454
- package/tests/integration/coordination/workflow-orchestrator.test.ts +0 -418
- package/tests/integration/feedback/feedback-loop-integration.test.ts +0 -560
- package/tests/integration/migration/v2-to-v3-migration.test.ts +0 -471
- package/tests/integration/parsers/typescript-parser.test.ts +0 -463
- package/tests/integration/security/vulnerability-detection.test.ts +0 -628
- package/tests/integration/test-execution/coordinator.test.ts +0 -410
- package/tests/integration/test-generation/coordinator.test.ts +0 -361
- package/tests/mocks/index.ts +0 -228
- package/tests/time-crystal/default-phases.test.ts +0 -476
- package/tests/time-crystal/oscillator.test.ts +0 -541
- package/tests/time-crystal/phase-executor.test.ts +0 -653
- package/tests/time-crystal/scheduler.test.ts +0 -626
- package/tests/time-crystal/test-runner.test.ts +0 -594
- package/tests/unit/causal-discovery/causal-graph.test.ts +0 -504
- package/tests/unit/causal-discovery/causal-root-cause-analyzer.test.ts +0 -347
- package/tests/unit/causal-discovery/discovery-engine.test.ts +0 -435
- package/tests/unit/causal-discovery/weight-matrix.test.ts +0 -328
- package/tests/unit/cli/cli.test.ts +0 -341
- package/tests/unit/cli/commands.test.ts +0 -414
- package/tests/unit/cli/init-command.test.ts +0 -274
- package/tests/unit/cli/migrate-command.test.ts +0 -396
- package/tests/unit/coordination/claims/claim-service.test.ts +0 -949
- package/tests/unit/coordination/claims/handoff-manager.test.ts +0 -773
- package/tests/unit/coordination/claims/work-stealing.test.ts +0 -492
- package/tests/unit/coordination/queen-coordinator.test.ts +0 -966
- package/tests/unit/coordination/result-saver.test.ts +0 -653
- package/tests/unit/coordination/task-executor.test.ts +0 -810
- package/tests/unit/domains/chaos-resilience/chaos-engineer.test.ts +0 -484
- package/tests/unit/domains/chaos-resilience/load-tester.test.ts +0 -559
- package/tests/unit/domains/chaos-resilience/performance-profiler.test.ts +0 -490
- package/tests/unit/domains/code-intelligence/impact-analyzer.test.ts +0 -560
- package/tests/unit/domains/code-intelligence/knowledge-graph.test.ts +0 -460
- package/tests/unit/domains/code-intelligence/semantic-analyzer.test.ts +0 -584
- package/tests/unit/domains/contract-testing/api-compatibility.test.ts +0 -483
- package/tests/unit/domains/contract-testing/contract-validator.test.ts +0 -370
- package/tests/unit/domains/contract-testing/schema-validator.test.ts +0 -610
- package/tests/unit/domains/coverage-analysis/coverage-embedder.test.ts +0 -298
- package/tests/unit/domains/coverage-analysis/hnsw-index.test.ts +0 -292
- package/tests/unit/domains/coverage-analysis/sublinear-analyzer.test.ts +0 -506
- package/tests/unit/domains/defect-intelligence/defect-predictor.test.ts +0 -370
- package/tests/unit/domains/defect-intelligence/pattern-learner.test.ts +0 -546
- package/tests/unit/domains/defect-intelligence/root-cause-analyzer.test.ts +0 -534
- package/tests/unit/domains/learning-optimization/learning-coordinator.test.ts +0 -541
- package/tests/unit/domains/learning-optimization/metrics-optimizer.test.ts +0 -552
- package/tests/unit/domains/learning-optimization/production-intel.test.ts +0 -589
- package/tests/unit/domains/learning-optimization/transfer-specialist.test.ts +0 -453
- package/tests/unit/domains/quality-assessment/coherence-gate.test.ts +0 -1006
- package/tests/unit/domains/quality-assessment/deployment-advisor.test.ts +0 -515
- package/tests/unit/domains/quality-assessment/quality-analyzer.test.ts +0 -401
- package/tests/unit/domains/quality-assessment/quality-gate.test.ts +0 -324
- package/tests/unit/domains/requirements-validation/bdd-scenario-writer.test.ts +0 -479
- package/tests/unit/domains/requirements-validation/requirements-validator.test.ts +0 -452
- package/tests/unit/domains/requirements-validation/testability-scorer.test.ts +0 -505
- package/tests/unit/domains/security-compliance/compliance-validator.test.ts +0 -500
- package/tests/unit/domains/security-compliance/security-auditor.test.ts +0 -498
- package/tests/unit/domains/security-compliance/security-scanner.test.ts +0 -412
- package/tests/unit/domains/visual-accessibility/accessibility-tester.test.ts +0 -432
- package/tests/unit/domains/visual-accessibility/responsive-tester.test.ts +0 -506
- package/tests/unit/domains/visual-accessibility/visual-tester.test.ts +0 -412
- package/tests/unit/early-exit/early-exit-controller.test.ts +0 -548
- package/tests/unit/early-exit/early-exit-decision.test.ts +0 -617
- package/tests/unit/early-exit/index.test.ts +0 -254
- package/tests/unit/early-exit/quality-signal.test.ts +0 -589
- package/tests/unit/early-exit/speculative-executor.test.ts +0 -453
- package/tests/unit/feedback/coverage-learner.test.ts +0 -288
- package/tests/unit/feedback/feedback-loop.test.ts +0 -458
- package/tests/unit/feedback/pattern-promotion.test.ts +0 -390
- package/tests/unit/feedback/quality-score-calculator.test.ts +0 -364
- package/tests/unit/feedback/test-outcome-tracker.test.ts +0 -243
- package/tests/unit/init/init-wizard.test.ts +0 -881
- package/tests/unit/init/project-analyzer.test.ts +0 -807
- package/tests/unit/init/self-configurator.test.ts +0 -493
- package/tests/unit/integrations/ruvector/ast-complexity.test.ts +0 -240
- package/tests/unit/integrations/ruvector/coverage-router.test.ts +0 -366
- package/tests/unit/integrations/ruvector/diff-risk-classifier.test.ts +0 -340
- package/tests/unit/integrations/ruvector/graph-boundaries.test.ts +0 -355
- package/tests/unit/integrations/ruvector/q-learning-router.test.ts +0 -314
- package/tests/unit/kernel/agent-coordinator.test.ts +0 -220
- package/tests/unit/kernel/event-bus.test.ts +0 -197
- package/tests/unit/learning/qe-reasoning-bank.test.ts +0 -666
- package/tests/unit/learning/real-qe-reasoning-bank.benchmark.test.ts +0 -415
- package/tests/unit/mcp/mcp-server.test.ts +0 -544
- package/tests/unit/mcp/metrics/metrics-collector.test.ts +0 -340
- package/tests/unit/mcp/security/cve-prevention.test.ts +0 -512
- package/tests/unit/mcp/security/oauth21-provider.test.ts +0 -624
- package/tests/unit/mcp/security/rate-limiter.test.ts +0 -410
- package/tests/unit/mcp/security/sampling-server.test.ts +0 -420
- package/tests/unit/mcp/security/schema-validator.test.ts +0 -494
- package/tests/unit/mcp/tools/base.test.ts +0 -336
- package/tests/unit/mcp/tools/domain-tools.test.ts +0 -759
- package/tests/unit/mcp/tools/registry.test.ts +0 -240
- package/tests/unit/neural-optimizer/replay-buffer.test.ts +0 -403
- package/tests/unit/neural-optimizer/swarm-topology.test.ts +0 -473
- package/tests/unit/neural-optimizer/topology-optimizer.test.ts +0 -595
- package/tests/unit/neural-optimizer/value-network.test.ts +0 -343
- package/tests/unit/optimization/auto-tuner.test.ts +0 -506
- package/tests/unit/optimization/metric-collectors.test.ts +0 -352
- package/tests/unit/optimization/qe-workers.test.ts +0 -407
- package/tests/unit/optimization/tuning-algorithm.test.ts +0 -467
- package/tests/unit/routing/qe-agent-registry.test.ts +0 -229
- package/tests/unit/routing/qe-task-router.test.ts +0 -390
- package/tests/unit/routing/routing-feedback.test.ts +0 -339
- package/tests/unit/shared/embeddings/nomic-embedder.test.ts +0 -419
- package/tests/unit/shared/http/http-client.test.ts +0 -719
- package/tests/unit/shared/io/file-reader.test.ts +0 -511
- package/tests/unit/shared/llm/cache.test.ts +0 -391
- package/tests/unit/shared/llm/circuit-breaker.test.ts +0 -293
- package/tests/unit/shared/llm/cost-tracker.test.ts +0 -431
- package/tests/unit/shared/llm/provider-manager.test.ts +0 -550
- package/tests/unit/shared/llm/providers.test.ts +0 -532
- package/tests/unit/shared/parsers/typescript-parser.test.ts +0 -693
- package/tests/unit/shared/value-objects.test.ts +0 -184
- package/tests/unit/strange-loop/strange-loop.test.ts +0 -1170
- package/tests/unit/workers/base-worker.test.ts +0 -341
- package/tests/unit/workers/daemon.test.ts +0 -291
- package/tests/unit/workers/worker-manager.test.ts +0 -284
- package/tsconfig.json +0 -32
- package/vitest.config.ts +0 -27
|
@@ -1,792 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Performance Profiler Service
|
|
3
|
-
* Implements IResilienceTestingService for recovery, failover, and resilience testing
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
-
import { Result, ok, err } from '../../../shared/types';
|
|
8
|
-
import { HttpClient, createHttpClient } from '../../../shared/http';
|
|
9
|
-
import { MemoryBackend } from '../../../kernel/interfaces';
|
|
10
|
-
import {
|
|
11
|
-
FaultType,
|
|
12
|
-
RecoveryTestResult,
|
|
13
|
-
RecoveryEvent,
|
|
14
|
-
FailoverTestResult,
|
|
15
|
-
FailoverStep,
|
|
16
|
-
CircuitBreakerTestOptions,
|
|
17
|
-
CircuitBreakerTestResult,
|
|
18
|
-
RateLimitTestResult,
|
|
19
|
-
RateLimitResponse,
|
|
20
|
-
IResilienceTestingService,
|
|
21
|
-
} from '../interfaces';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Configuration for the performance profiler service
|
|
25
|
-
*/
|
|
26
|
-
export interface PerformanceProfilerConfig {
|
|
27
|
-
defaultTimeout: number;
|
|
28
|
-
healthCheckInterval: number;
|
|
29
|
-
maxRetries: number;
|
|
30
|
-
recoveryCheckDelay: number;
|
|
31
|
-
/**
|
|
32
|
-
* When true, simulated health checks will randomly fail (5% failure rate).
|
|
33
|
-
* When false (default), simulated health checks always succeed.
|
|
34
|
-
* Only affects non-HTTP service URLs in simulation mode.
|
|
35
|
-
*/
|
|
36
|
-
simulateRandomFailures: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const DEFAULT_CONFIG: PerformanceProfilerConfig = {
|
|
40
|
-
defaultTimeout: 60000, // 60 seconds
|
|
41
|
-
healthCheckInterval: 1000, // 1 second
|
|
42
|
-
maxRetries: 3,
|
|
43
|
-
recoveryCheckDelay: 500, // 500ms between recovery checks
|
|
44
|
-
simulateRandomFailures: false, // Deterministic by default
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Performance Profiler Service Implementation
|
|
49
|
-
* Tests system resilience, recovery, failover, circuit breakers, and rate limiting
|
|
50
|
-
*/
|
|
51
|
-
export class PerformanceProfilerService implements IResilienceTestingService {
|
|
52
|
-
private readonly config: PerformanceProfilerConfig;
|
|
53
|
-
private readonly httpClient: HttpClient;
|
|
54
|
-
|
|
55
|
-
constructor(
|
|
56
|
-
private readonly memory: MemoryBackend,
|
|
57
|
-
config: Partial<PerformanceProfilerConfig> = {}
|
|
58
|
-
) {
|
|
59
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
60
|
-
this.httpClient = createHttpClient();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Test service recovery after fault injection
|
|
65
|
-
*/
|
|
66
|
-
async testRecovery(
|
|
67
|
-
service: string,
|
|
68
|
-
faultType: FaultType,
|
|
69
|
-
expectedRecoveryTime: number
|
|
70
|
-
): Promise<Result<RecoveryTestResult>> {
|
|
71
|
-
const testId = uuidv4();
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const timeline: RecoveryEvent[] = [];
|
|
75
|
-
|
|
76
|
-
// Phase 1: Verify initial health
|
|
77
|
-
const initialHealth = await this.checkServiceHealth(service);
|
|
78
|
-
timeline.push({
|
|
79
|
-
timestamp: new Date(),
|
|
80
|
-
event: 'Initial health check',
|
|
81
|
-
status: initialHealth ? 'healthy' : 'unhealthy',
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
if (!initialHealth) {
|
|
85
|
-
return ok({
|
|
86
|
-
service,
|
|
87
|
-
faultType,
|
|
88
|
-
recoveryTime: 0,
|
|
89
|
-
expectedRecoveryTime,
|
|
90
|
-
passed: false,
|
|
91
|
-
timeline,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Phase 2: Inject fault
|
|
96
|
-
timeline.push({
|
|
97
|
-
timestamp: new Date(),
|
|
98
|
-
event: `Injecting fault: ${faultType}`,
|
|
99
|
-
status: 'degraded',
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
await this.injectFault(service, faultType);
|
|
103
|
-
|
|
104
|
-
// Phase 3: Verify service is affected
|
|
105
|
-
const postFaultHealth = await this.checkServiceHealth(service);
|
|
106
|
-
timeline.push({
|
|
107
|
-
timestamp: new Date(),
|
|
108
|
-
event: 'Post-fault health check',
|
|
109
|
-
status: postFaultHealth ? 'healthy' : 'unhealthy',
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// Phase 4: Remove fault and measure recovery time
|
|
113
|
-
timeline.push({
|
|
114
|
-
timestamp: new Date(),
|
|
115
|
-
event: 'Removing fault',
|
|
116
|
-
status: 'degraded',
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
await this.removeFault(service, faultType);
|
|
120
|
-
const faultRemovedTime = Date.now();
|
|
121
|
-
|
|
122
|
-
// Phase 5: Monitor recovery
|
|
123
|
-
let recoveryTime = 0;
|
|
124
|
-
let recovered = false;
|
|
125
|
-
const timeout = expectedRecoveryTime * 2; // Give 2x expected time
|
|
126
|
-
|
|
127
|
-
while (Date.now() - faultRemovedTime < timeout) {
|
|
128
|
-
const health = await this.checkServiceHealth(service);
|
|
129
|
-
|
|
130
|
-
if (health) {
|
|
131
|
-
recoveryTime = Date.now() - faultRemovedTime;
|
|
132
|
-
recovered = true;
|
|
133
|
-
timeline.push({
|
|
134
|
-
timestamp: new Date(),
|
|
135
|
-
event: 'Service recovered',
|
|
136
|
-
status: 'healthy',
|
|
137
|
-
});
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
timeline.push({
|
|
142
|
-
timestamp: new Date(),
|
|
143
|
-
event: 'Recovery check - still degraded',
|
|
144
|
-
status: 'degraded',
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
await this.sleep(this.config.recoveryCheckDelay);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (!recovered) {
|
|
151
|
-
timeline.push({
|
|
152
|
-
timestamp: new Date(),
|
|
153
|
-
event: 'Recovery timeout exceeded',
|
|
154
|
-
status: 'unhealthy',
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const result: RecoveryTestResult = {
|
|
159
|
-
service,
|
|
160
|
-
faultType,
|
|
161
|
-
recoveryTime,
|
|
162
|
-
expectedRecoveryTime,
|
|
163
|
-
passed: recovered && recoveryTime <= expectedRecoveryTime,
|
|
164
|
-
timeline,
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
// Store result
|
|
168
|
-
await this.storeTestResult('recovery', testId, result);
|
|
169
|
-
|
|
170
|
-
return ok(result);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Test failover between primary and secondary services
|
|
178
|
-
*/
|
|
179
|
-
async testFailover(
|
|
180
|
-
primaryService: string,
|
|
181
|
-
secondaryService: string
|
|
182
|
-
): Promise<Result<FailoverTestResult>> {
|
|
183
|
-
const testId = uuidv4();
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
const steps: FailoverStep[] = [];
|
|
187
|
-
let stepOrder = 1;
|
|
188
|
-
|
|
189
|
-
// Step 1: Verify both services are healthy
|
|
190
|
-
const [primaryHealth, secondaryHealth] = await Promise.all([
|
|
191
|
-
this.checkServiceHealth(primaryService),
|
|
192
|
-
this.checkServiceHealth(secondaryService),
|
|
193
|
-
]);
|
|
194
|
-
|
|
195
|
-
steps.push({
|
|
196
|
-
order: stepOrder++,
|
|
197
|
-
action: 'Verify primary service health',
|
|
198
|
-
duration: 0,
|
|
199
|
-
success: primaryHealth,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
steps.push({
|
|
203
|
-
order: stepOrder++,
|
|
204
|
-
action: 'Verify secondary service health',
|
|
205
|
-
duration: 0,
|
|
206
|
-
success: secondaryHealth,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
if (!primaryHealth || !secondaryHealth) {
|
|
210
|
-
return ok({
|
|
211
|
-
primaryService,
|
|
212
|
-
secondaryService,
|
|
213
|
-
failoverTime: 0,
|
|
214
|
-
dataLoss: true,
|
|
215
|
-
passed: false,
|
|
216
|
-
steps,
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Step 2: Capture data state from primary
|
|
221
|
-
const preFailoverData = await this.captureServiceState(primaryService);
|
|
222
|
-
steps.push({
|
|
223
|
-
order: stepOrder++,
|
|
224
|
-
action: 'Capture primary service state',
|
|
225
|
-
duration: 0,
|
|
226
|
-
success: true,
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
// Step 3: Trigger failover by failing primary
|
|
230
|
-
const failoverStartTime = Date.now();
|
|
231
|
-
await this.injectFault(primaryService, 'process-kill');
|
|
232
|
-
steps.push({
|
|
233
|
-
order: stepOrder++,
|
|
234
|
-
action: 'Trigger primary service failure',
|
|
235
|
-
duration: Date.now() - failoverStartTime,
|
|
236
|
-
success: true,
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
// Step 4: Wait for failover to complete
|
|
240
|
-
const failoverDetectionStart = Date.now();
|
|
241
|
-
let failoverDetected = false;
|
|
242
|
-
let failoverTime = 0;
|
|
243
|
-
|
|
244
|
-
while (Date.now() - failoverDetectionStart < this.config.defaultTimeout) {
|
|
245
|
-
const secondaryActive = await this.checkServiceIsActive(secondaryService);
|
|
246
|
-
if (secondaryActive) {
|
|
247
|
-
failoverTime = Date.now() - failoverStartTime;
|
|
248
|
-
failoverDetected = true;
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
await this.sleep(this.config.healthCheckInterval);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
steps.push({
|
|
255
|
-
order: stepOrder++,
|
|
256
|
-
action: 'Detect failover completion',
|
|
257
|
-
duration: failoverTime,
|
|
258
|
-
success: failoverDetected,
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
// Step 5: Verify data integrity on secondary
|
|
262
|
-
const postFailoverData = await this.captureServiceState(secondaryService);
|
|
263
|
-
const dataLoss = !this.compareServiceStates(preFailoverData, postFailoverData);
|
|
264
|
-
|
|
265
|
-
steps.push({
|
|
266
|
-
order: stepOrder++,
|
|
267
|
-
action: 'Verify data integrity on secondary',
|
|
268
|
-
duration: 0,
|
|
269
|
-
success: !dataLoss,
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
// Step 6: Restore primary (optional cleanup)
|
|
273
|
-
await this.removeFault(primaryService, 'process-kill');
|
|
274
|
-
steps.push({
|
|
275
|
-
order: stepOrder++,
|
|
276
|
-
action: 'Restore primary service',
|
|
277
|
-
duration: 0,
|
|
278
|
-
success: true,
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
const result: FailoverTestResult = {
|
|
282
|
-
primaryService,
|
|
283
|
-
secondaryService,
|
|
284
|
-
failoverTime,
|
|
285
|
-
dataLoss,
|
|
286
|
-
passed: failoverDetected && !dataLoss,
|
|
287
|
-
steps,
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
await this.storeTestResult('failover', testId, result);
|
|
291
|
-
|
|
292
|
-
return ok(result);
|
|
293
|
-
} catch (error) {
|
|
294
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Test circuit breaker behavior
|
|
300
|
-
*/
|
|
301
|
-
async testCircuitBreaker(
|
|
302
|
-
service: string,
|
|
303
|
-
options?: CircuitBreakerTestOptions
|
|
304
|
-
): Promise<Result<CircuitBreakerTestResult>> {
|
|
305
|
-
const testId = uuidv4();
|
|
306
|
-
|
|
307
|
-
try {
|
|
308
|
-
const errorThreshold = options?.errorThreshold ?? 5;
|
|
309
|
-
const timeout = options?.timeout ?? this.config.defaultTimeout;
|
|
310
|
-
const halfOpenRequests = options?.halfOpenRequests ?? 3;
|
|
311
|
-
|
|
312
|
-
// Phase 1: Verify circuit is initially closed
|
|
313
|
-
const initialState = await this.getCircuitState(service);
|
|
314
|
-
if (initialState !== 'closed') {
|
|
315
|
-
// Reset circuit before testing
|
|
316
|
-
await this.resetCircuit(service);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Phase 2: Generate errors to open the circuit
|
|
320
|
-
let errorsToOpen = 0;
|
|
321
|
-
let circuitOpened = false;
|
|
322
|
-
|
|
323
|
-
for (let i = 0; i < errorThreshold * 2; i++) {
|
|
324
|
-
await this.generateError(service);
|
|
325
|
-
errorsToOpen++;
|
|
326
|
-
|
|
327
|
-
const state = await this.getCircuitState(service);
|
|
328
|
-
if (state === 'open') {
|
|
329
|
-
circuitOpened = true;
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Phase 3: Wait for circuit to move to half-open
|
|
335
|
-
let halfOpenDetected = false;
|
|
336
|
-
const halfOpenWaitStart = Date.now();
|
|
337
|
-
|
|
338
|
-
while (Date.now() - halfOpenWaitStart < timeout) {
|
|
339
|
-
const state = await this.getCircuitState(service);
|
|
340
|
-
if (state === 'half-open') {
|
|
341
|
-
halfOpenDetected = true;
|
|
342
|
-
break;
|
|
343
|
-
}
|
|
344
|
-
await this.sleep(this.config.healthCheckInterval);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// Phase 4: Test half-open behavior
|
|
348
|
-
let halfOpenBehavior: 'correct' | 'incorrect' = 'correct';
|
|
349
|
-
|
|
350
|
-
if (halfOpenDetected) {
|
|
351
|
-
// Send successful requests to test half-open
|
|
352
|
-
let successCount = 0;
|
|
353
|
-
for (let i = 0; i < halfOpenRequests; i++) {
|
|
354
|
-
const success = await this.sendSuccessfulRequest(service);
|
|
355
|
-
if (success) successCount++;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Circuit should close after successful half-open requests
|
|
359
|
-
const finalState = await this.getCircuitState(service);
|
|
360
|
-
if (finalState !== 'closed' && successCount === halfOpenRequests) {
|
|
361
|
-
halfOpenBehavior = 'incorrect';
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// Phase 5: Verify circuit can close after recovery
|
|
366
|
-
let closedAfterRecovery = false;
|
|
367
|
-
const recoveryStart = Date.now();
|
|
368
|
-
|
|
369
|
-
while (Date.now() - recoveryStart < timeout) {
|
|
370
|
-
const state = await this.getCircuitState(service);
|
|
371
|
-
if (state === 'closed') {
|
|
372
|
-
closedAfterRecovery = true;
|
|
373
|
-
break;
|
|
374
|
-
}
|
|
375
|
-
// Send successful requests to help recovery
|
|
376
|
-
await this.sendSuccessfulRequest(service);
|
|
377
|
-
await this.sleep(this.config.healthCheckInterval);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const result: CircuitBreakerTestResult = {
|
|
381
|
-
service,
|
|
382
|
-
opened: circuitOpened,
|
|
383
|
-
openedAfterErrors: errorsToOpen,
|
|
384
|
-
closedAfterRecovery,
|
|
385
|
-
halfOpenBehavior,
|
|
386
|
-
passed: circuitOpened && closedAfterRecovery && halfOpenBehavior === 'correct',
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
await this.storeTestResult('circuit-breaker', testId, result);
|
|
390
|
-
|
|
391
|
-
return ok(result);
|
|
392
|
-
} catch (error) {
|
|
393
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Test rate limiting behavior
|
|
399
|
-
*/
|
|
400
|
-
async testRateLimiting(
|
|
401
|
-
service: string,
|
|
402
|
-
expectedLimit: number
|
|
403
|
-
): Promise<Result<RateLimitTestResult>> {
|
|
404
|
-
const testId = uuidv4();
|
|
405
|
-
|
|
406
|
-
try {
|
|
407
|
-
// Phase 1: Send requests at increasing rate until rate limited
|
|
408
|
-
let actualLimit = 0;
|
|
409
|
-
let responseWhenLimited: RateLimitResponse = {
|
|
410
|
-
statusCode: 429,
|
|
411
|
-
retryAfter: undefined,
|
|
412
|
-
body: undefined,
|
|
413
|
-
};
|
|
414
|
-
|
|
415
|
-
// Start with small batches and increase
|
|
416
|
-
const batchSizes = [1, 5, 10, 25, 50, 100, 200];
|
|
417
|
-
let totalRequestsSent = 0;
|
|
418
|
-
let rateLimitHit = false;
|
|
419
|
-
|
|
420
|
-
for (const batchSize of batchSizes) {
|
|
421
|
-
if (rateLimitHit) break;
|
|
422
|
-
|
|
423
|
-
const results = await this.sendRequestBatch(service, batchSize);
|
|
424
|
-
totalRequestsSent += batchSize;
|
|
425
|
-
|
|
426
|
-
for (const result of results) {
|
|
427
|
-
if (result.statusCode === 429) {
|
|
428
|
-
rateLimitHit = true;
|
|
429
|
-
actualLimit = totalRequestsSent - (batchSize - results.indexOf(result));
|
|
430
|
-
responseWhenLimited = result;
|
|
431
|
-
break;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// If no rate limit hit, the actual limit is higher than our max test
|
|
437
|
-
if (!rateLimitHit) {
|
|
438
|
-
actualLimit = totalRequestsSent;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// Phase 2: Verify rate limit is close to expected
|
|
442
|
-
const tolerance = expectedLimit * 0.2; // 20% tolerance
|
|
443
|
-
const withinTolerance =
|
|
444
|
-
Math.abs(actualLimit - expectedLimit) <= tolerance || !rateLimitHit;
|
|
445
|
-
|
|
446
|
-
const result: RateLimitTestResult = {
|
|
447
|
-
service,
|
|
448
|
-
expectedLimit,
|
|
449
|
-
actualLimit,
|
|
450
|
-
passed: rateLimitHit && withinTolerance,
|
|
451
|
-
responseWhenLimited,
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
await this.storeTestResult('rate-limit', testId, result);
|
|
455
|
-
|
|
456
|
-
return ok(result);
|
|
457
|
-
} catch (error) {
|
|
458
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// ============================================================================
|
|
463
|
-
// Private Helper Methods
|
|
464
|
-
// ============================================================================
|
|
465
|
-
|
|
466
|
-
private async checkServiceHealth(service: string): Promise<boolean> {
|
|
467
|
-
// Skip real HTTP for test URLs or non-HTTP URLs
|
|
468
|
-
if (!this.isRealServiceUrl(service)) {
|
|
469
|
-
return this.simulateHealthCheck();
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// Real implementation: perform actual health check via HTTP
|
|
473
|
-
try {
|
|
474
|
-
const isHealthy = await this.httpClient.healthCheck(service);
|
|
475
|
-
return isHealthy;
|
|
476
|
-
} catch {
|
|
477
|
-
// If HTTP check fails, fallback to simulated check
|
|
478
|
-
return this.simulateHealthCheck();
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
private isRealServiceUrl(service: string): boolean {
|
|
483
|
-
// Only perform real HTTP for valid HTTP/HTTPS URLs
|
|
484
|
-
return service.startsWith('http://') || service.startsWith('https://');
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
private simulateHealthCheck(): boolean {
|
|
488
|
-
// Deterministic by default - only use random failures when explicitly configured
|
|
489
|
-
if (this.config.simulateRandomFailures) {
|
|
490
|
-
return Math.random() > 0.05; // 95% success rate
|
|
491
|
-
}
|
|
492
|
-
return true; // Always healthy in deterministic mode
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
private async checkServiceIsActive(service: string): Promise<boolean> {
|
|
496
|
-
// Skip real HTTP for non-HTTP URLs
|
|
497
|
-
if (!this.isRealServiceUrl(service)) {
|
|
498
|
-
return this.simulateServiceActive();
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
// Real implementation: check if service responds to requests
|
|
502
|
-
try {
|
|
503
|
-
const result = await this.httpClient.get(service, {
|
|
504
|
-
timeout: 5000,
|
|
505
|
-
retries: 1,
|
|
506
|
-
});
|
|
507
|
-
return result.success && result.value.ok;
|
|
508
|
-
} catch {
|
|
509
|
-
return this.simulateServiceActive();
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
private simulateServiceActive(): boolean {
|
|
514
|
-
// Deterministic by default - only use random failures when explicitly configured
|
|
515
|
-
if (this.config.simulateRandomFailures) {
|
|
516
|
-
return Math.random() > 0.1; // 90% success rate
|
|
517
|
-
}
|
|
518
|
-
return true; // Always active in deterministic mode
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
private async injectFault(service: string, faultType: FaultType): Promise<void> {
|
|
522
|
-
// Only call real chaos API for valid HTTP URLs
|
|
523
|
-
if (this.isRealServiceUrl(service)) {
|
|
524
|
-
try {
|
|
525
|
-
const faultEndpoint = `${service}/_chaos/inject`;
|
|
526
|
-
await this.httpClient.post(faultEndpoint, { faultType }, { timeout: 5000, retries: 0 });
|
|
527
|
-
return;
|
|
528
|
-
} catch {
|
|
529
|
-
// Fall through to simulation
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
// Simulation mode
|
|
533
|
-
console.log(`Injecting fault ${faultType} into service: ${service}`);
|
|
534
|
-
await this.sleep(100);
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
private async removeFault(service: string, faultType: FaultType): Promise<void> {
|
|
538
|
-
// Only call real chaos API for valid HTTP URLs
|
|
539
|
-
if (this.isRealServiceUrl(service)) {
|
|
540
|
-
try {
|
|
541
|
-
const faultEndpoint = `${service}/_chaos/remove`;
|
|
542
|
-
await this.httpClient.post(faultEndpoint, { faultType }, { timeout: 5000, retries: 0 });
|
|
543
|
-
return;
|
|
544
|
-
} catch {
|
|
545
|
-
// Fall through to simulation
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
// Simulation mode
|
|
549
|
-
console.log(`Removing fault ${faultType} from service: ${service}`);
|
|
550
|
-
await this.sleep(50);
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
private async captureServiceState(service: string): Promise<ServiceState> {
|
|
554
|
-
// Try to capture real service state via HTTP
|
|
555
|
-
if (this.isRealServiceUrl(service)) {
|
|
556
|
-
try {
|
|
557
|
-
const stateEndpoint = `${service}/_state`;
|
|
558
|
-
const result = await this.httpClient.get(stateEndpoint, {
|
|
559
|
-
timeout: 5000,
|
|
560
|
-
retries: 1,
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
if (result.success && result.value.ok) {
|
|
564
|
-
const text = await result.value.text();
|
|
565
|
-
// Calculate checksum from response content
|
|
566
|
-
const checksum = this.calculateChecksum(text);
|
|
567
|
-
// Try to parse record count from response
|
|
568
|
-
const records = this.parseRecordCount(text);
|
|
569
|
-
|
|
570
|
-
return {
|
|
571
|
-
checksum,
|
|
572
|
-
timestamp: new Date(),
|
|
573
|
-
records,
|
|
574
|
-
};
|
|
575
|
-
}
|
|
576
|
-
} catch {
|
|
577
|
-
// Fall through to default state capture
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// Default state capture: use memory snapshot
|
|
582
|
-
const memoryState = await this.captureMemoryState(service);
|
|
583
|
-
return memoryState;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
private calculateChecksum(content: string): string {
|
|
587
|
-
// Simple hash function for state comparison
|
|
588
|
-
let hash = 0;
|
|
589
|
-
for (let i = 0; i < content.length; i++) {
|
|
590
|
-
const char = content.charCodeAt(i);
|
|
591
|
-
hash = ((hash << 5) - hash) + char;
|
|
592
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
593
|
-
}
|
|
594
|
-
return `chk_${Math.abs(hash).toString(16)}`;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
private parseRecordCount(content: string): number {
|
|
598
|
-
try {
|
|
599
|
-
const json = JSON.parse(content);
|
|
600
|
-
// Look for common record count fields
|
|
601
|
-
return json.records ?? json.count ?? json.total ?? json.length ?? 0;
|
|
602
|
-
} catch {
|
|
603
|
-
// If not JSON, count lines or return 0
|
|
604
|
-
return content.split('\n').filter((l) => l.trim()).length;
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
private async captureMemoryState(service: string): Promise<ServiceState> {
|
|
609
|
-
// Capture state from memory backend
|
|
610
|
-
const stateKey = `resilience:state:${this.hashServiceName(service)}`;
|
|
611
|
-
const existingState = await this.memory.get<ServiceState>(stateKey);
|
|
612
|
-
|
|
613
|
-
if (existingState) {
|
|
614
|
-
return existingState;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
// Create initial state marker
|
|
618
|
-
const initialState: ServiceState = {
|
|
619
|
-
checksum: `init_${uuidv4().slice(0, 8)}`,
|
|
620
|
-
timestamp: new Date(),
|
|
621
|
-
records: 0,
|
|
622
|
-
};
|
|
623
|
-
|
|
624
|
-
await this.memory.set(stateKey, initialState, {
|
|
625
|
-
namespace: 'chaos-resilience',
|
|
626
|
-
});
|
|
627
|
-
|
|
628
|
-
return initialState;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
private hashServiceName(service: string): string {
|
|
632
|
-
let hash = 0;
|
|
633
|
-
for (const char of service) {
|
|
634
|
-
hash = ((hash << 5) - hash) + char.charCodeAt(0);
|
|
635
|
-
hash = hash & hash;
|
|
636
|
-
}
|
|
637
|
-
return Math.abs(hash).toString(16);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
private compareServiceStates(state1: ServiceState, state2: ServiceState): boolean {
|
|
641
|
-
// Compare states to detect data loss or corruption
|
|
642
|
-
// Check both checksum and record count for comprehensive comparison
|
|
643
|
-
const checksumMatch = state1.checksum === state2.checksum;
|
|
644
|
-
const recordsMatch = state1.records === state2.records;
|
|
645
|
-
|
|
646
|
-
// States are equal if both checksum and records match
|
|
647
|
-
// or if we have the same number of records (allowing for minor state changes)
|
|
648
|
-
return checksumMatch || recordsMatch;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
private async getCircuitState(
|
|
652
|
-
service: string
|
|
653
|
-
): Promise<'closed' | 'open' | 'half-open'> {
|
|
654
|
-
// Real implementation: use HttpClient's circuit breaker state
|
|
655
|
-
try {
|
|
656
|
-
const state = this.httpClient.getCircuitState(service);
|
|
657
|
-
return state.state;
|
|
658
|
-
} catch {
|
|
659
|
-
// Deterministic fallback - return 'closed' (default healthy state)
|
|
660
|
-
return 'closed';
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
private async resetCircuit(service: string): Promise<void> {
|
|
665
|
-
// Real implementation: reset HttpClient's circuit breaker
|
|
666
|
-
try {
|
|
667
|
-
this.httpClient.resetCircuit(service);
|
|
668
|
-
} catch {
|
|
669
|
-
console.log(`Resetting circuit breaker for: ${service}`);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
private async generateError(service: string): Promise<void> {
|
|
674
|
-
// Only call real chaos API for valid HTTP URLs
|
|
675
|
-
if (this.isRealServiceUrl(service)) {
|
|
676
|
-
try {
|
|
677
|
-
const errorEndpoint = `${service}/_chaos/error`;
|
|
678
|
-
await this.httpClient.post(errorEndpoint, {}, { timeout: 5000, retries: 0 });
|
|
679
|
-
return;
|
|
680
|
-
} catch {
|
|
681
|
-
// Fall through to simulation
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
console.log(`Generating error for: ${service}`);
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
private async sendSuccessfulRequest(service: string): Promise<boolean> {
|
|
688
|
-
// Skip real HTTP for non-HTTP URLs - return success deterministically
|
|
689
|
-
if (!this.isRealServiceUrl(service)) {
|
|
690
|
-
return true; // Deterministic: always succeed in simulation mode
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
// Real implementation: send actual HTTP request
|
|
694
|
-
try {
|
|
695
|
-
const result = await this.httpClient.get(service, {
|
|
696
|
-
timeout: 5000,
|
|
697
|
-
retries: 1,
|
|
698
|
-
});
|
|
699
|
-
return result.success && result.value.ok;
|
|
700
|
-
} catch {
|
|
701
|
-
return true; // Deterministic fallback
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
private async sendRequestBatch(
|
|
706
|
-
service: string,
|
|
707
|
-
count: number
|
|
708
|
-
): Promise<RateLimitResponse[]> {
|
|
709
|
-
const results: RateLimitResponse[] = [];
|
|
710
|
-
|
|
711
|
-
// Use simulation for non-HTTP URLs
|
|
712
|
-
if (!this.isRealServiceUrl(service)) {
|
|
713
|
-
return this.simulateRequestBatch(count);
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Real implementation: send actual batch of requests
|
|
717
|
-
for (let i = 0; i < count; i++) {
|
|
718
|
-
try {
|
|
719
|
-
const result = await this.httpClient.get(service, {
|
|
720
|
-
timeout: 2000,
|
|
721
|
-
retries: 0,
|
|
722
|
-
circuitBreaker: false,
|
|
723
|
-
});
|
|
724
|
-
|
|
725
|
-
if (result.success) {
|
|
726
|
-
const response = result.value;
|
|
727
|
-
const retryAfterHeader = response.headers.get('Retry-After');
|
|
728
|
-
|
|
729
|
-
results.push({
|
|
730
|
-
statusCode: response.status,
|
|
731
|
-
retryAfter: retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined,
|
|
732
|
-
});
|
|
733
|
-
} else {
|
|
734
|
-
results.push({
|
|
735
|
-
statusCode: 500,
|
|
736
|
-
body: { error: result.error.message },
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
} catch {
|
|
740
|
-
// On error, simulate remaining responses
|
|
741
|
-
return [...results, ...this.simulateRequestBatch(count - i)];
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
return results;
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
private simulateRequestBatch(count: number): RateLimitResponse[] {
|
|
748
|
-
const results: RateLimitResponse[] = [];
|
|
749
|
-
// Deterministic rate limit threshold - simulate 75 requests before rate limiting
|
|
750
|
-
const rateLimitThreshold = 75;
|
|
751
|
-
|
|
752
|
-
for (let i = 0; i < count; i++) {
|
|
753
|
-
if (i >= rateLimitThreshold) {
|
|
754
|
-
results.push({
|
|
755
|
-
statusCode: 429,
|
|
756
|
-
retryAfter: 60,
|
|
757
|
-
body: { error: 'Rate limit exceeded' },
|
|
758
|
-
});
|
|
759
|
-
} else {
|
|
760
|
-
results.push({
|
|
761
|
-
statusCode: 200,
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
return results;
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
private async storeTestResult(
|
|
769
|
-
type: string,
|
|
770
|
-
testId: string,
|
|
771
|
-
result: unknown
|
|
772
|
-
): Promise<void> {
|
|
773
|
-
await this.memory.set(
|
|
774
|
-
`resilience:${type}:${testId}`,
|
|
775
|
-
result,
|
|
776
|
-
{ namespace: 'chaos-resilience', persist: true }
|
|
777
|
-
);
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
private sleep(ms: number): Promise<void> {
|
|
781
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
/**
|
|
786
|
-
* Internal types
|
|
787
|
-
*/
|
|
788
|
-
interface ServiceState {
|
|
789
|
-
checksum: string;
|
|
790
|
-
timestamp: Date;
|
|
791
|
-
records: number;
|
|
792
|
-
}
|