@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,1067 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Knowledge Graph Service
|
|
3
|
-
* Builds and queries knowledge graph for code relationships
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Result, ok, err } from '../../../shared/types';
|
|
7
|
-
import { TypeScriptParser } from '../../../shared/parsers';
|
|
8
|
-
import { FileReader } from '../../../shared/io';
|
|
9
|
-
import { NomicEmbedder } from '../../../shared/embeddings';
|
|
10
|
-
import { MemoryBackend } from '../../../kernel/interfaces';
|
|
11
|
-
import {
|
|
12
|
-
IndexRequest,
|
|
13
|
-
IndexResult,
|
|
14
|
-
IndexError,
|
|
15
|
-
KGQueryRequest,
|
|
16
|
-
KGQueryResult,
|
|
17
|
-
KGNode,
|
|
18
|
-
KGEdge,
|
|
19
|
-
DependencyRequest,
|
|
20
|
-
DependencyMap,
|
|
21
|
-
DependencyNode,
|
|
22
|
-
DependencyEdge,
|
|
23
|
-
DependencyMetrics,
|
|
24
|
-
} from '../interfaces';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Interface for the knowledge graph service
|
|
28
|
-
*/
|
|
29
|
-
export interface IKnowledgeGraphService {
|
|
30
|
-
/** Index files into the knowledge graph */
|
|
31
|
-
index(request: IndexRequest): Promise<Result<IndexResult, Error>>;
|
|
32
|
-
|
|
33
|
-
/** Query the knowledge graph */
|
|
34
|
-
query(request: KGQueryRequest): Promise<Result<KGQueryResult, Error>>;
|
|
35
|
-
|
|
36
|
-
/** Map dependencies for files */
|
|
37
|
-
mapDependencies(request: DependencyRequest): Promise<Result<DependencyMap, Error>>;
|
|
38
|
-
|
|
39
|
-
/** Get a node by ID */
|
|
40
|
-
getNode(nodeId: string): Promise<KGNode | undefined>;
|
|
41
|
-
|
|
42
|
-
/** Get edges for a node */
|
|
43
|
-
getEdges(nodeId: string, direction: 'incoming' | 'outgoing' | 'both'): Promise<KGEdge[]>;
|
|
44
|
-
|
|
45
|
-
/** Clear the knowledge graph */
|
|
46
|
-
clear(): Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Configuration for the knowledge graph service
|
|
51
|
-
*/
|
|
52
|
-
export interface KnowledgeGraphConfig {
|
|
53
|
-
maxNodes: number;
|
|
54
|
-
maxEdgesPerNode: number;
|
|
55
|
-
namespace: string;
|
|
56
|
-
enableVectorEmbeddings: boolean;
|
|
57
|
-
embeddingDimension: number;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const DEFAULT_CONFIG: KnowledgeGraphConfig = {
|
|
61
|
-
maxNodes: 100000,
|
|
62
|
-
maxEdgesPerNode: 500,
|
|
63
|
-
namespace: 'code-intelligence:kg',
|
|
64
|
-
enableVectorEmbeddings: true,
|
|
65
|
-
embeddingDimension: 384,
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Knowledge Graph Service Implementation
|
|
70
|
-
* Builds and manages the code knowledge graph with relationships
|
|
71
|
-
*/
|
|
72
|
-
export class KnowledgeGraphService implements IKnowledgeGraphService {
|
|
73
|
-
private readonly config: KnowledgeGraphConfig;
|
|
74
|
-
private readonly nodeCache: Map<string, KGNode> = new Map();
|
|
75
|
-
private readonly edgeIndex: Map<string, KGEdge[]> = new Map();
|
|
76
|
-
private readonly tsParser: TypeScriptParser;
|
|
77
|
-
private readonly fileReader: FileReader;
|
|
78
|
-
private readonly embedder: NomicEmbedder;
|
|
79
|
-
|
|
80
|
-
constructor(
|
|
81
|
-
private readonly memory: MemoryBackend,
|
|
82
|
-
config: Partial<KnowledgeGraphConfig> = {}
|
|
83
|
-
) {
|
|
84
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
85
|
-
this.tsParser = new TypeScriptParser();
|
|
86
|
-
this.fileReader = new FileReader();
|
|
87
|
-
this.embedder = new NomicEmbedder({
|
|
88
|
-
enableFallback: true,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Index files into the knowledge graph
|
|
94
|
-
*/
|
|
95
|
-
async index(request: IndexRequest): Promise<Result<IndexResult, Error>> {
|
|
96
|
-
const startTime = Date.now();
|
|
97
|
-
const errors: IndexError[] = [];
|
|
98
|
-
let nodesCreated = 0;
|
|
99
|
-
let edgesCreated = 0;
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
const { paths, incremental = false, includeTests = true, languages } = request;
|
|
103
|
-
|
|
104
|
-
// Clear existing graph if not incremental
|
|
105
|
-
if (!incremental) {
|
|
106
|
-
await this.clear();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
for (const path of paths) {
|
|
110
|
-
try {
|
|
111
|
-
// Filter by language if specified
|
|
112
|
-
if (languages && languages.length > 0) {
|
|
113
|
-
const ext = this.getFileExtension(path);
|
|
114
|
-
if (!this.matchesLanguage(ext, languages)) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Skip test files if not included
|
|
120
|
-
if (!includeTests && this.isTestFile(path)) {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Index the file
|
|
125
|
-
const result = await this.indexFile(path);
|
|
126
|
-
nodesCreated += result.nodes;
|
|
127
|
-
edgesCreated += result.edges;
|
|
128
|
-
} catch (fileError) {
|
|
129
|
-
errors.push({
|
|
130
|
-
file: path,
|
|
131
|
-
error: fileError instanceof Error ? fileError.message : String(fileError),
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const duration = Date.now() - startTime;
|
|
137
|
-
|
|
138
|
-
// Store indexing metadata
|
|
139
|
-
await this.storeIndexMetadata({
|
|
140
|
-
filesIndexed: paths.length - errors.length,
|
|
141
|
-
nodesCreated,
|
|
142
|
-
edgesCreated,
|
|
143
|
-
duration,
|
|
144
|
-
indexedAt: new Date().toISOString(),
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
return ok({
|
|
148
|
-
filesIndexed: paths.length - errors.length,
|
|
149
|
-
nodesCreated,
|
|
150
|
-
edgesCreated,
|
|
151
|
-
duration,
|
|
152
|
-
errors,
|
|
153
|
-
});
|
|
154
|
-
} catch (error) {
|
|
155
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Query the knowledge graph
|
|
161
|
-
*/
|
|
162
|
-
async query(request: KGQueryRequest): Promise<Result<KGQueryResult, Error>> {
|
|
163
|
-
try {
|
|
164
|
-
const { query: queryStr, type, limit = 100 } = request;
|
|
165
|
-
|
|
166
|
-
if (type === 'cypher') {
|
|
167
|
-
return this.executeCypherQuery(queryStr, limit);
|
|
168
|
-
} else {
|
|
169
|
-
return this.executeNaturalLanguageQuery(queryStr, limit);
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Map dependencies for given files
|
|
178
|
-
*/
|
|
179
|
-
async mapDependencies(request: DependencyRequest): Promise<Result<DependencyMap, Error>> {
|
|
180
|
-
try {
|
|
181
|
-
const { files, direction, depth = 3 } = request;
|
|
182
|
-
const nodes: DependencyNode[] = [];
|
|
183
|
-
const edges: DependencyEdge[] = [];
|
|
184
|
-
const visited = new Set<string>();
|
|
185
|
-
const cycles: string[][] = [];
|
|
186
|
-
|
|
187
|
-
// Process each file
|
|
188
|
-
for (const file of files) {
|
|
189
|
-
await this.traverseDependencies(
|
|
190
|
-
file,
|
|
191
|
-
direction,
|
|
192
|
-
depth,
|
|
193
|
-
visited,
|
|
194
|
-
nodes,
|
|
195
|
-
edges,
|
|
196
|
-
[],
|
|
197
|
-
cycles
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Calculate metrics
|
|
202
|
-
const metrics = this.calculateDependencyMetrics(nodes, edges);
|
|
203
|
-
|
|
204
|
-
return ok({
|
|
205
|
-
nodes,
|
|
206
|
-
edges,
|
|
207
|
-
cycles,
|
|
208
|
-
metrics,
|
|
209
|
-
});
|
|
210
|
-
} catch (error) {
|
|
211
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Get a node by ID
|
|
217
|
-
*/
|
|
218
|
-
async getNode(nodeId: string): Promise<KGNode | undefined> {
|
|
219
|
-
// Check cache first
|
|
220
|
-
if (this.nodeCache.has(nodeId)) {
|
|
221
|
-
return this.nodeCache.get(nodeId);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Load from memory
|
|
225
|
-
const key = `${this.config.namespace}:node:${nodeId}`;
|
|
226
|
-
const node = await this.memory.get<KGNode>(key);
|
|
227
|
-
|
|
228
|
-
if (node) {
|
|
229
|
-
this.nodeCache.set(nodeId, node);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return node;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Get edges for a node
|
|
237
|
-
*/
|
|
238
|
-
async getEdges(
|
|
239
|
-
nodeId: string,
|
|
240
|
-
direction: 'incoming' | 'outgoing' | 'both'
|
|
241
|
-
): Promise<KGEdge[]> {
|
|
242
|
-
const edges: KGEdge[] = [];
|
|
243
|
-
|
|
244
|
-
// Check index first
|
|
245
|
-
const cachedEdges = this.edgeIndex.get(nodeId);
|
|
246
|
-
if (cachedEdges) {
|
|
247
|
-
return this.filterEdgesByDirection(cachedEdges, nodeId, direction);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Load from memory
|
|
251
|
-
const pattern = `${this.config.namespace}:edge:*`;
|
|
252
|
-
const keys = await this.memory.search(pattern, this.config.maxEdgesPerNode * 2);
|
|
253
|
-
|
|
254
|
-
for (const key of keys) {
|
|
255
|
-
const edge = await this.memory.get<KGEdge>(key);
|
|
256
|
-
if (edge) {
|
|
257
|
-
const matches =
|
|
258
|
-
(direction !== 'outgoing' && edge.target === nodeId) ||
|
|
259
|
-
(direction !== 'incoming' && edge.source === nodeId);
|
|
260
|
-
|
|
261
|
-
if (matches) {
|
|
262
|
-
edges.push(edge);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return edges;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Clear the knowledge graph
|
|
272
|
-
*/
|
|
273
|
-
async clear(): Promise<void> {
|
|
274
|
-
// Clear caches
|
|
275
|
-
this.nodeCache.clear();
|
|
276
|
-
this.edgeIndex.clear();
|
|
277
|
-
|
|
278
|
-
// Clear persisted data
|
|
279
|
-
const nodePattern = `${this.config.namespace}:node:*`;
|
|
280
|
-
const edgePattern = `${this.config.namespace}:edge:*`;
|
|
281
|
-
|
|
282
|
-
const nodeKeys = await this.memory.search(nodePattern, this.config.maxNodes);
|
|
283
|
-
const edgeKeys = await this.memory.search(edgePattern, this.config.maxNodes * 10);
|
|
284
|
-
|
|
285
|
-
for (const key of [...nodeKeys, ...edgeKeys]) {
|
|
286
|
-
await this.memory.delete(key);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// ============================================================================
|
|
291
|
-
// Private Helper Methods
|
|
292
|
-
// ============================================================================
|
|
293
|
-
|
|
294
|
-
private async indexFile(
|
|
295
|
-
filePath: string
|
|
296
|
-
): Promise<{ nodes: number; edges: number }> {
|
|
297
|
-
let nodesCreated = 0;
|
|
298
|
-
let edgesCreated = 0;
|
|
299
|
-
|
|
300
|
-
// Create file node
|
|
301
|
-
const fileNode = await this.createFileNode(filePath);
|
|
302
|
-
nodesCreated++;
|
|
303
|
-
|
|
304
|
-
// Parse file to extract entities using TypeScript AST parser
|
|
305
|
-
const entities = await this.extractEntities(filePath);
|
|
306
|
-
|
|
307
|
-
for (const entity of entities) {
|
|
308
|
-
// Create entity node
|
|
309
|
-
const entityNode = await this.createEntityNode(entity, filePath);
|
|
310
|
-
nodesCreated++;
|
|
311
|
-
|
|
312
|
-
// Create edge from file to entity
|
|
313
|
-
await this.createEdge(fileNode.id, entityNode.id, 'contains');
|
|
314
|
-
edgesCreated++;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Extract imports/dependencies
|
|
318
|
-
const imports = await this.extractImports(filePath);
|
|
319
|
-
|
|
320
|
-
for (const importPath of imports) {
|
|
321
|
-
// Create dependency edge
|
|
322
|
-
const targetNodeId = this.pathToNodeId(importPath);
|
|
323
|
-
await this.createEdge(fileNode.id, targetNodeId, 'import');
|
|
324
|
-
edgesCreated++;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return { nodes: nodesCreated, edges: edgesCreated };
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
private async createFileNode(filePath: string): Promise<KGNode> {
|
|
331
|
-
const nodeId = this.pathToNodeId(filePath);
|
|
332
|
-
const node: KGNode = {
|
|
333
|
-
id: nodeId,
|
|
334
|
-
label: 'File',
|
|
335
|
-
properties: {
|
|
336
|
-
path: filePath,
|
|
337
|
-
name: this.getFileName(filePath),
|
|
338
|
-
extension: this.getFileExtension(filePath),
|
|
339
|
-
type: this.getFileType(filePath),
|
|
340
|
-
},
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
await this.storeNode(node);
|
|
344
|
-
return node;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
private async createEntityNode(
|
|
348
|
-
entity: ExtractedEntity,
|
|
349
|
-
filePath: string
|
|
350
|
-
): Promise<KGNode> {
|
|
351
|
-
const nodeId = `${this.pathToNodeId(filePath)}:${entity.type}:${entity.name}`;
|
|
352
|
-
const node: KGNode = {
|
|
353
|
-
id: nodeId,
|
|
354
|
-
label: entity.type,
|
|
355
|
-
properties: {
|
|
356
|
-
name: entity.name,
|
|
357
|
-
file: filePath,
|
|
358
|
-
line: entity.line,
|
|
359
|
-
visibility: entity.visibility,
|
|
360
|
-
async: entity.isAsync,
|
|
361
|
-
},
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
await this.storeNode(node);
|
|
365
|
-
|
|
366
|
-
// Store vector embedding for semantic search
|
|
367
|
-
if (this.config.enableVectorEmbeddings) {
|
|
368
|
-
const embedding = await this.generateEmbedding(entity);
|
|
369
|
-
await this.memory.storeVector(`${this.config.namespace}:node:${nodeId}`, embedding, {
|
|
370
|
-
nodeId,
|
|
371
|
-
type: entity.type,
|
|
372
|
-
name: entity.name,
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
return node;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
private async createEdge(
|
|
380
|
-
sourceId: string,
|
|
381
|
-
targetId: string,
|
|
382
|
-
type: DependencyEdge['type'] | 'contains'
|
|
383
|
-
): Promise<KGEdge> {
|
|
384
|
-
const edgeId = `${sourceId}--${type}-->${targetId}`;
|
|
385
|
-
const edge: KGEdge = {
|
|
386
|
-
source: sourceId,
|
|
387
|
-
target: targetId,
|
|
388
|
-
type,
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
// Store edge
|
|
392
|
-
await this.memory.set(`${this.config.namespace}:edge:${edgeId}`, edge, {
|
|
393
|
-
namespace: this.config.namespace,
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
// Update edge index
|
|
397
|
-
const sourceEdges = this.edgeIndex.get(sourceId) || [];
|
|
398
|
-
sourceEdges.push(edge);
|
|
399
|
-
this.edgeIndex.set(sourceId, sourceEdges);
|
|
400
|
-
|
|
401
|
-
return edge;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
private async storeNode(node: KGNode): Promise<void> {
|
|
405
|
-
await this.memory.set(`${this.config.namespace}:node:${node.id}`, node, {
|
|
406
|
-
namespace: this.config.namespace,
|
|
407
|
-
});
|
|
408
|
-
this.nodeCache.set(node.id, node);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
private async extractEntities(filePath: string): Promise<ExtractedEntity[]> {
|
|
412
|
-
const extension = this.getFileExtension(filePath);
|
|
413
|
-
const entities: ExtractedEntity[] = [];
|
|
414
|
-
|
|
415
|
-
// Use TypeScript parser for TS/JS files
|
|
416
|
-
if (['ts', 'tsx', 'js', 'jsx'].includes(extension)) {
|
|
417
|
-
const fileResult = await this.fileReader.readFile(filePath);
|
|
418
|
-
|
|
419
|
-
if (fileResult.success) {
|
|
420
|
-
const fileName = this.getFileName(filePath);
|
|
421
|
-
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
422
|
-
|
|
423
|
-
// Extract functions
|
|
424
|
-
const functions = this.tsParser.extractFunctions(ast);
|
|
425
|
-
for (const func of functions) {
|
|
426
|
-
entities.push({
|
|
427
|
-
type: 'function',
|
|
428
|
-
name: func.name,
|
|
429
|
-
line: func.startLine,
|
|
430
|
-
visibility: 'public',
|
|
431
|
-
isAsync: func.isAsync,
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// Extract classes
|
|
436
|
-
const classes = this.tsParser.extractClasses(ast);
|
|
437
|
-
for (const cls of classes) {
|
|
438
|
-
entities.push({
|
|
439
|
-
type: 'class',
|
|
440
|
-
name: cls.name,
|
|
441
|
-
line: cls.startLine,
|
|
442
|
-
visibility: 'public',
|
|
443
|
-
isAsync: false,
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
// Add class methods as entities
|
|
447
|
-
for (const method of cls.methods) {
|
|
448
|
-
entities.push({
|
|
449
|
-
type: 'function',
|
|
450
|
-
name: `${cls.name}.${method.name}`,
|
|
451
|
-
line: method.startLine,
|
|
452
|
-
visibility: method.visibility,
|
|
453
|
-
isAsync: method.isAsync,
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// Extract interfaces
|
|
459
|
-
const interfaces = this.tsParser.extractInterfaces(ast);
|
|
460
|
-
for (const iface of interfaces) {
|
|
461
|
-
entities.push({
|
|
462
|
-
type: 'interface',
|
|
463
|
-
name: iface.name,
|
|
464
|
-
line: iface.startLine,
|
|
465
|
-
visibility: 'public',
|
|
466
|
-
isAsync: false,
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// If no entities found, create a module entity for the file
|
|
471
|
-
if (entities.length === 0) {
|
|
472
|
-
entities.push({
|
|
473
|
-
type: 'module',
|
|
474
|
-
name: fileName.replace(/\.[^.]+$/, ''),
|
|
475
|
-
line: 1,
|
|
476
|
-
visibility: 'public',
|
|
477
|
-
isAsync: false,
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
} else {
|
|
481
|
-
// Fallback: create a module entity for the file itself
|
|
482
|
-
entities.push({
|
|
483
|
-
type: 'module',
|
|
484
|
-
name: this.getFileName(filePath).replace(/\.[^.]+$/, ''),
|
|
485
|
-
line: 1,
|
|
486
|
-
visibility: 'public',
|
|
487
|
-
isAsync: false,
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
} else if (extension === 'py') {
|
|
491
|
-
// Python files: regex-based parsing for classes, functions, imports
|
|
492
|
-
const fileResult = await this.fileReader.readFile(filePath);
|
|
493
|
-
|
|
494
|
-
if (fileResult.success) {
|
|
495
|
-
const content = fileResult.value;
|
|
496
|
-
const lines = content.split('\n');
|
|
497
|
-
|
|
498
|
-
// Extract class definitions: class ClassName(Base): or class ClassName:
|
|
499
|
-
const classPattern = /^class\s+(\w+)\s*(?:\([^)]*\))?\s*:/;
|
|
500
|
-
// Extract function definitions: def function_name(...): or async def function_name(...):
|
|
501
|
-
const funcPattern = /^(async\s+)?def\s+(\w+)\s*\(/;
|
|
502
|
-
|
|
503
|
-
let currentClass: string | null = null;
|
|
504
|
-
let currentIndent = 0;
|
|
505
|
-
|
|
506
|
-
for (let i = 0; i < lines.length; i++) {
|
|
507
|
-
const line = lines[i];
|
|
508
|
-
const lineNum = i + 1;
|
|
509
|
-
const trimmedLine = line.trimStart();
|
|
510
|
-
const indent = line.length - trimmedLine.length;
|
|
511
|
-
|
|
512
|
-
// Track class scope for methods
|
|
513
|
-
if (currentClass && indent <= currentIndent) {
|
|
514
|
-
currentClass = null;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// Match class definitions
|
|
518
|
-
const classMatch = trimmedLine.match(classPattern);
|
|
519
|
-
if (classMatch) {
|
|
520
|
-
const className = classMatch[1];
|
|
521
|
-
entities.push({
|
|
522
|
-
type: 'class',
|
|
523
|
-
name: className,
|
|
524
|
-
line: lineNum,
|
|
525
|
-
visibility: className.startsWith('_') ? 'private' : 'public',
|
|
526
|
-
isAsync: false,
|
|
527
|
-
});
|
|
528
|
-
currentClass = className;
|
|
529
|
-
currentIndent = indent;
|
|
530
|
-
continue;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// Match function/method definitions
|
|
534
|
-
const funcMatch = trimmedLine.match(funcPattern);
|
|
535
|
-
if (funcMatch) {
|
|
536
|
-
const isAsync = !!funcMatch[1];
|
|
537
|
-
const funcName = funcMatch[2];
|
|
538
|
-
const isMethod = currentClass !== null && indent > currentIndent;
|
|
539
|
-
|
|
540
|
-
// Determine visibility
|
|
541
|
-
let visibility: 'public' | 'private' | 'protected' = 'public';
|
|
542
|
-
if (funcName.startsWith('__') && !funcName.endsWith('__')) {
|
|
543
|
-
visibility = 'private'; // Name-mangled private
|
|
544
|
-
} else if (funcName.startsWith('_')) {
|
|
545
|
-
visibility = 'protected'; // Convention private
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
entities.push({
|
|
549
|
-
type: 'function',
|
|
550
|
-
name: isMethod ? `${currentClass}.${funcName}` : funcName,
|
|
551
|
-
line: lineNum,
|
|
552
|
-
visibility,
|
|
553
|
-
isAsync,
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// If no entities found, create a module entity for the file
|
|
559
|
-
if (entities.length === 0) {
|
|
560
|
-
entities.push({
|
|
561
|
-
type: 'module',
|
|
562
|
-
name: this.getFileName(filePath).replace('.py', ''),
|
|
563
|
-
line: 1,
|
|
564
|
-
visibility: 'public',
|
|
565
|
-
isAsync: false,
|
|
566
|
-
});
|
|
567
|
-
}
|
|
568
|
-
} else {
|
|
569
|
-
// Fallback: create a module entity for the file itself
|
|
570
|
-
entities.push({
|
|
571
|
-
type: 'module',
|
|
572
|
-
name: this.getFileName(filePath).replace('.py', ''),
|
|
573
|
-
line: 1,
|
|
574
|
-
visibility: 'public',
|
|
575
|
-
isAsync: false,
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
return entities;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
private async extractImports(filePath: string): Promise<string[]> {
|
|
584
|
-
const extension = this.getFileExtension(filePath);
|
|
585
|
-
const importPaths: string[] = [];
|
|
586
|
-
|
|
587
|
-
// Use TypeScript parser for TS/JS files
|
|
588
|
-
if (['ts', 'tsx', 'js', 'jsx'].includes(extension)) {
|
|
589
|
-
const fileResult = await this.fileReader.readFile(filePath);
|
|
590
|
-
|
|
591
|
-
if (fileResult.success) {
|
|
592
|
-
const fileName = this.getFileName(filePath);
|
|
593
|
-
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
594
|
-
const imports = this.tsParser.extractImports(ast);
|
|
595
|
-
|
|
596
|
-
// Extract import sources (module property in new API)
|
|
597
|
-
for (const importInfo of imports) {
|
|
598
|
-
// Only include relative imports and package imports
|
|
599
|
-
// Skip node built-ins for now
|
|
600
|
-
if (!importInfo.module.startsWith('node:')) {
|
|
601
|
-
importPaths.push(importInfo.module);
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
return importPaths;
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
private async executeCypherQuery(
|
|
611
|
-
query: string,
|
|
612
|
-
limit: number
|
|
613
|
-
): Promise<Result<KGQueryResult, Error>> {
|
|
614
|
-
// Cypher query parser supporting:
|
|
615
|
-
// - MATCH (n:Label) - node patterns
|
|
616
|
-
// - MATCH (n:Label)-[r:REL_TYPE]->(m:Label) - relationship patterns
|
|
617
|
-
// - WHERE n.property = 'value' - property filters
|
|
618
|
-
// - RETURN n, r, m - result selection (implicit: all matched)
|
|
619
|
-
|
|
620
|
-
const nodes: KGNode[] = [];
|
|
621
|
-
const edges: KGEdge[] = [];
|
|
622
|
-
const nodeAliases: Map<string, KGNode[]> = new Map();
|
|
623
|
-
|
|
624
|
-
// Parse relationship pattern: MATCH (a:Label1)-[r:RelType]->(b:Label2)
|
|
625
|
-
const relationshipPattern =
|
|
626
|
-
/MATCH\s+\((\w+):(\w+)\)\s*-\[(\w+)?:?(\w+)?\]\s*->\s*\((\w+):(\w+)\)/i.exec(query);
|
|
627
|
-
|
|
628
|
-
if (relationshipPattern) {
|
|
629
|
-
const [, sourceAlias, sourceLabel, , relType, targetAlias, targetLabel] =
|
|
630
|
-
relationshipPattern;
|
|
631
|
-
|
|
632
|
-
// Find source nodes
|
|
633
|
-
const sourceNodes = await this.findNodesByLabel(sourceLabel, limit * 2);
|
|
634
|
-
nodeAliases.set(sourceAlias, sourceNodes);
|
|
635
|
-
|
|
636
|
-
// For each source node, find relationships and target nodes
|
|
637
|
-
for (const sourceNode of sourceNodes.slice(0, limit)) {
|
|
638
|
-
const nodeEdges = await this.getEdges(sourceNode.id, 'outgoing');
|
|
639
|
-
|
|
640
|
-
for (const edge of nodeEdges) {
|
|
641
|
-
// Filter by relationship type if specified
|
|
642
|
-
if (relType && edge.type !== relType) continue;
|
|
643
|
-
|
|
644
|
-
const targetNode = await this.getNode(edge.target);
|
|
645
|
-
if (targetNode && targetNode.label === targetLabel) {
|
|
646
|
-
if (!nodes.some((n) => n.id === sourceNode.id)) {
|
|
647
|
-
nodes.push(sourceNode);
|
|
648
|
-
}
|
|
649
|
-
if (!nodes.some((n) => n.id === targetNode.id)) {
|
|
650
|
-
nodes.push(targetNode);
|
|
651
|
-
}
|
|
652
|
-
// Use source+target+type as unique edge identifier
|
|
653
|
-
if (!edges.some((e) => e.source === edge.source && e.target === edge.target && e.type === edge.type)) {
|
|
654
|
-
edges.push(edge);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
if (targetAlias) {
|
|
661
|
-
nodeAliases.set(
|
|
662
|
-
targetAlias,
|
|
663
|
-
nodes.filter((n) => n.label === targetLabel)
|
|
664
|
-
);
|
|
665
|
-
}
|
|
666
|
-
} else {
|
|
667
|
-
// Parse simple node pattern: MATCH (n:Label)
|
|
668
|
-
const matchPattern = /MATCH\s+\((\w+):(\w+)\)/i.exec(query);
|
|
669
|
-
if (matchPattern) {
|
|
670
|
-
const [, alias, label] = matchPattern;
|
|
671
|
-
const matchedNodes = await this.findNodesByLabel(label, limit);
|
|
672
|
-
nodeAliases.set(alias, matchedNodes);
|
|
673
|
-
nodes.push(...matchedNodes);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// Parse WHERE clause for property filtering
|
|
678
|
-
const wherePattern = /WHERE\s+(\w+)\.(\w+)\s*=\s*['"]?([^'")\s]+)['"]?/i.exec(query);
|
|
679
|
-
if (wherePattern) {
|
|
680
|
-
const [, alias, property, value] = wherePattern;
|
|
681
|
-
const aliasNodes = nodeAliases.get(alias) || nodes;
|
|
682
|
-
|
|
683
|
-
// Filter nodes by property value
|
|
684
|
-
const filteredNodes = aliasNodes.filter((node) => {
|
|
685
|
-
const propValue = node.properties[property];
|
|
686
|
-
return propValue !== undefined && String(propValue) === value;
|
|
687
|
-
});
|
|
688
|
-
|
|
689
|
-
// Replace nodes with filtered set
|
|
690
|
-
nodes.length = 0;
|
|
691
|
-
nodes.push(...filteredNodes.slice(0, limit));
|
|
692
|
-
|
|
693
|
-
// Also filter edges to only include those connecting filtered nodes
|
|
694
|
-
const nodeIds = new Set(nodes.map((n) => n.id));
|
|
695
|
-
const filteredEdges = edges.filter(
|
|
696
|
-
(e) => nodeIds.has(e.source) && nodeIds.has(e.target)
|
|
697
|
-
);
|
|
698
|
-
edges.length = 0;
|
|
699
|
-
edges.push(...filteredEdges);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
return ok({
|
|
703
|
-
nodes: nodes.slice(0, limit),
|
|
704
|
-
edges,
|
|
705
|
-
metadata: {
|
|
706
|
-
query,
|
|
707
|
-
type: 'cypher',
|
|
708
|
-
resultCount: nodes.length,
|
|
709
|
-
edgeCount: edges.length,
|
|
710
|
-
},
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
/**
|
|
715
|
-
* Find nodes by their label
|
|
716
|
-
*/
|
|
717
|
-
private async findNodesByLabel(label: string, limit: number): Promise<KGNode[]> {
|
|
718
|
-
const nodes: KGNode[] = [];
|
|
719
|
-
const pattern = `${this.config.namespace}:node:*`;
|
|
720
|
-
const keys = await this.memory.search(pattern, limit * 2);
|
|
721
|
-
|
|
722
|
-
for (const key of keys) {
|
|
723
|
-
const node = await this.memory.get<KGNode>(key);
|
|
724
|
-
if (node && node.label === label) {
|
|
725
|
-
nodes.push(node);
|
|
726
|
-
if (nodes.length >= limit) break;
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
return nodes;
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
private async executeNaturalLanguageQuery(
|
|
734
|
-
query: string,
|
|
735
|
-
limit: number
|
|
736
|
-
): Promise<Result<KGQueryResult, Error>> {
|
|
737
|
-
// Use vector search for natural language queries
|
|
738
|
-
if (this.config.enableVectorEmbeddings) {
|
|
739
|
-
const queryEmbedding = await this.generateQueryEmbedding(query);
|
|
740
|
-
const results = await this.memory.vectorSearch(queryEmbedding, limit);
|
|
741
|
-
|
|
742
|
-
const nodes: KGNode[] = [];
|
|
743
|
-
for (const result of results) {
|
|
744
|
-
const nodeId = (result.metadata as { nodeId: string })?.nodeId;
|
|
745
|
-
if (nodeId) {
|
|
746
|
-
const node = await this.getNode(nodeId);
|
|
747
|
-
if (node) {
|
|
748
|
-
nodes.push(node);
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
return ok({
|
|
754
|
-
nodes,
|
|
755
|
-
edges: [],
|
|
756
|
-
metadata: {
|
|
757
|
-
query,
|
|
758
|
-
type: 'natural-language',
|
|
759
|
-
resultCount: nodes.length,
|
|
760
|
-
searchScores: results.map((r) => r.score),
|
|
761
|
-
},
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
// Fallback to keyword matching
|
|
766
|
-
const keywords = query.toLowerCase().split(/\s+/);
|
|
767
|
-
const pattern = `${this.config.namespace}:node:*`;
|
|
768
|
-
const keys = await this.memory.search(pattern, limit * 3);
|
|
769
|
-
|
|
770
|
-
const nodes: KGNode[] = [];
|
|
771
|
-
for (const key of keys) {
|
|
772
|
-
const node = await this.memory.get<KGNode>(key);
|
|
773
|
-
if (node) {
|
|
774
|
-
const nodeText = JSON.stringify(node.properties).toLowerCase();
|
|
775
|
-
if (keywords.some((kw) => nodeText.includes(kw))) {
|
|
776
|
-
nodes.push(node);
|
|
777
|
-
if (nodes.length >= limit) break;
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
return ok({
|
|
783
|
-
nodes,
|
|
784
|
-
edges: [],
|
|
785
|
-
metadata: {
|
|
786
|
-
query,
|
|
787
|
-
type: 'keyword',
|
|
788
|
-
resultCount: nodes.length,
|
|
789
|
-
},
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
private async traverseDependencies(
|
|
794
|
-
file: string,
|
|
795
|
-
direction: 'incoming' | 'outgoing' | 'both',
|
|
796
|
-
depth: number,
|
|
797
|
-
visited: Set<string>,
|
|
798
|
-
nodes: DependencyNode[],
|
|
799
|
-
edges: DependencyEdge[],
|
|
800
|
-
path: string[],
|
|
801
|
-
cycles: string[][]
|
|
802
|
-
): Promise<void> {
|
|
803
|
-
if (depth <= 0 || visited.has(file)) {
|
|
804
|
-
// Check for cycle
|
|
805
|
-
const cycleStart = path.indexOf(file);
|
|
806
|
-
if (cycleStart >= 0) {
|
|
807
|
-
cycles.push([...path.slice(cycleStart), file]);
|
|
808
|
-
}
|
|
809
|
-
return;
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
visited.add(file);
|
|
813
|
-
path.push(file);
|
|
814
|
-
|
|
815
|
-
const nodeId = this.pathToNodeId(file);
|
|
816
|
-
const fileEdges = await this.getEdges(nodeId, direction);
|
|
817
|
-
|
|
818
|
-
// Create dependency node
|
|
819
|
-
const inDegree = fileEdges.filter((e) => e.target === nodeId).length;
|
|
820
|
-
const outDegree = fileEdges.filter((e) => e.source === nodeId).length;
|
|
821
|
-
|
|
822
|
-
nodes.push({
|
|
823
|
-
id: nodeId,
|
|
824
|
-
path: file,
|
|
825
|
-
type: 'file',
|
|
826
|
-
inDegree,
|
|
827
|
-
outDegree,
|
|
828
|
-
});
|
|
829
|
-
|
|
830
|
-
// Process edges
|
|
831
|
-
for (const edge of fileEdges) {
|
|
832
|
-
const depEdge: DependencyEdge = {
|
|
833
|
-
source: edge.source,
|
|
834
|
-
target: edge.target,
|
|
835
|
-
type: edge.type as DependencyEdge['type'],
|
|
836
|
-
};
|
|
837
|
-
|
|
838
|
-
if (!edges.some((e) => e.source === depEdge.source && e.target === depEdge.target)) {
|
|
839
|
-
edges.push(depEdge);
|
|
840
|
-
}
|
|
841
|
-
|
|
842
|
-
// Recursively traverse
|
|
843
|
-
const nextFile =
|
|
844
|
-
edge.source === nodeId
|
|
845
|
-
? this.nodeIdToPath(edge.target)
|
|
846
|
-
: this.nodeIdToPath(edge.source);
|
|
847
|
-
|
|
848
|
-
if (nextFile) {
|
|
849
|
-
await this.traverseDependencies(
|
|
850
|
-
nextFile,
|
|
851
|
-
direction,
|
|
852
|
-
depth - 1,
|
|
853
|
-
visited,
|
|
854
|
-
nodes,
|
|
855
|
-
edges,
|
|
856
|
-
path,
|
|
857
|
-
cycles
|
|
858
|
-
);
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
path.pop();
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
private calculateDependencyMetrics(
|
|
866
|
-
nodes: DependencyNode[],
|
|
867
|
-
edges: DependencyEdge[]
|
|
868
|
-
): DependencyMetrics {
|
|
869
|
-
const totalNodes = nodes.length;
|
|
870
|
-
const totalEdges = edges.length;
|
|
871
|
-
const avgDegree =
|
|
872
|
-
totalNodes > 0
|
|
873
|
-
? nodes.reduce((sum, n) => sum + n.inDegree + n.outDegree, 0) / totalNodes
|
|
874
|
-
: 0;
|
|
875
|
-
|
|
876
|
-
// Calculate max depth using BFS
|
|
877
|
-
let maxDepth = 0;
|
|
878
|
-
if (nodes.length > 0) {
|
|
879
|
-
const adjList = new Map<string, string[]>();
|
|
880
|
-
for (const edge of edges) {
|
|
881
|
-
const sources = adjList.get(edge.source) || [];
|
|
882
|
-
sources.push(edge.target);
|
|
883
|
-
adjList.set(edge.source, sources);
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
const depths = new Map<string, number>();
|
|
887
|
-
for (const node of nodes) {
|
|
888
|
-
if (!depths.has(node.id)) {
|
|
889
|
-
this.bfsDepth(node.id, adjList, depths);
|
|
890
|
-
}
|
|
891
|
-
maxDepth = Math.max(maxDepth, depths.get(node.id) || 0);
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
// Simple cyclomatic complexity estimate
|
|
896
|
-
const cyclomaticComplexity = totalEdges - totalNodes + 2;
|
|
897
|
-
|
|
898
|
-
return {
|
|
899
|
-
totalNodes,
|
|
900
|
-
totalEdges,
|
|
901
|
-
avgDegree: Math.round(avgDegree * 100) / 100,
|
|
902
|
-
maxDepth,
|
|
903
|
-
cyclomaticComplexity: Math.max(1, cyclomaticComplexity),
|
|
904
|
-
};
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
private bfsDepth(
|
|
908
|
-
startId: string,
|
|
909
|
-
adjList: Map<string, string[]>,
|
|
910
|
-
depths: Map<string, number>
|
|
911
|
-
): void {
|
|
912
|
-
const queue: Array<{ id: string; depth: number }> = [{ id: startId, depth: 0 }];
|
|
913
|
-
|
|
914
|
-
while (queue.length > 0) {
|
|
915
|
-
const current = queue.shift()!;
|
|
916
|
-
const existingDepth = depths.get(current.id) ?? -1;
|
|
917
|
-
|
|
918
|
-
if (current.depth > existingDepth) {
|
|
919
|
-
depths.set(current.id, current.depth);
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
const neighbors = adjList.get(current.id) || [];
|
|
923
|
-
for (const neighbor of neighbors) {
|
|
924
|
-
if (!depths.has(neighbor) || (depths.get(neighbor) ?? 0) < current.depth + 1) {
|
|
925
|
-
queue.push({ id: neighbor, depth: current.depth + 1 });
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
private filterEdgesByDirection(
|
|
932
|
-
edges: KGEdge[],
|
|
933
|
-
nodeId: string,
|
|
934
|
-
direction: 'incoming' | 'outgoing' | 'both'
|
|
935
|
-
): KGEdge[] {
|
|
936
|
-
return edges.filter((edge) => {
|
|
937
|
-
if (direction === 'incoming') return edge.target === nodeId;
|
|
938
|
-
if (direction === 'outgoing') return edge.source === nodeId;
|
|
939
|
-
return true;
|
|
940
|
-
});
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
private async storeIndexMetadata(metadata: Record<string, unknown>): Promise<void> {
|
|
944
|
-
await this.memory.set(`${this.config.namespace}:metadata:index`, metadata, {
|
|
945
|
-
namespace: this.config.namespace,
|
|
946
|
-
persist: true,
|
|
947
|
-
});
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
private async generateEmbedding(entity: ExtractedEntity): Promise<number[]> {
|
|
951
|
-
// Create rich text representation of the entity for semantic embedding
|
|
952
|
-
const text = `${entity.type} ${entity.name} ${entity.visibility}${entity.isAsync ? ' async' : ''}`;
|
|
953
|
-
|
|
954
|
-
try {
|
|
955
|
-
// Use NomicEmbedder for real semantic embeddings (returns number[] directly)
|
|
956
|
-
const embedding = await this.embedder.embed(text);
|
|
957
|
-
return embedding;
|
|
958
|
-
} catch {
|
|
959
|
-
// Fall back to simple embedding if Ollama is unavailable
|
|
960
|
-
return this.fallbackEmbedding(text);
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
private async generateQueryEmbedding(query: string): Promise<number[]> {
|
|
965
|
-
try {
|
|
966
|
-
// Use NomicEmbedder for real semantic embeddings (returns number[] directly)
|
|
967
|
-
const embedding = await this.embedder.embed(query);
|
|
968
|
-
return embedding;
|
|
969
|
-
} catch {
|
|
970
|
-
// Fall back to simple embedding if Ollama is unavailable
|
|
971
|
-
return this.fallbackEmbedding(query);
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
private fallbackEmbedding(text: string): number[] {
|
|
976
|
-
// Fallback pseudo-embedding when Ollama is unavailable
|
|
977
|
-
const embedding = new Array(this.config.embeddingDimension).fill(0);
|
|
978
|
-
const words = text.toLowerCase().split(/\s+/);
|
|
979
|
-
|
|
980
|
-
for (let i = 0; i < words.length; i++) {
|
|
981
|
-
const word = words[i];
|
|
982
|
-
for (let j = 0; j < word.length && j < embedding.length; j++) {
|
|
983
|
-
embedding[(i + j) % embedding.length] += word.charCodeAt(j) / 1000;
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
|
|
988
|
-
return embedding.map((v) => v / magnitude);
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
private pathToNodeId(path: string): string {
|
|
992
|
-
return path.replace(/[/\\]/g, ':').replace(/\./g, '_');
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
private nodeIdToPath(nodeId: string): string | null {
|
|
996
|
-
// Reverse the nodeId transformation
|
|
997
|
-
const path = nodeId.replace(/:/g, '/').replace(/_(?=[^_]*$)/, '.');
|
|
998
|
-
return path.includes('/') ? path : null;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
private getFileName(path: string): string {
|
|
1002
|
-
return path.split(/[/\\]/).pop() || path;
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
private getFileExtension(path: string): string {
|
|
1006
|
-
const name = this.getFileName(path);
|
|
1007
|
-
const parts = name.split('.');
|
|
1008
|
-
return parts.length > 1 ? parts.pop()! : '';
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
private getFileType(path: string): string {
|
|
1012
|
-
const ext = this.getFileExtension(path);
|
|
1013
|
-
const typeMap: Record<string, string> = {
|
|
1014
|
-
ts: 'typescript',
|
|
1015
|
-
tsx: 'typescript-react',
|
|
1016
|
-
js: 'javascript',
|
|
1017
|
-
jsx: 'javascript-react',
|
|
1018
|
-
py: 'python',
|
|
1019
|
-
go: 'go',
|
|
1020
|
-
java: 'java',
|
|
1021
|
-
rs: 'rust',
|
|
1022
|
-
rb: 'ruby',
|
|
1023
|
-
cs: 'csharp',
|
|
1024
|
-
};
|
|
1025
|
-
return typeMap[ext] || 'unknown';
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
private matchesLanguage(ext: string, languages: string[]): boolean {
|
|
1029
|
-
const langMap: Record<string, string[]> = {
|
|
1030
|
-
typescript: ['ts', 'tsx'],
|
|
1031
|
-
javascript: ['js', 'jsx'],
|
|
1032
|
-
python: ['py'],
|
|
1033
|
-
go: ['go'],
|
|
1034
|
-
java: ['java'],
|
|
1035
|
-
rust: ['rs'],
|
|
1036
|
-
};
|
|
1037
|
-
|
|
1038
|
-
return languages.some((lang) => {
|
|
1039
|
-
const exts = langMap[lang.toLowerCase()] || [lang];
|
|
1040
|
-
return exts.includes(ext);
|
|
1041
|
-
});
|
|
1042
|
-
}
|
|
1043
|
-
|
|
1044
|
-
private isTestFile(path: string): boolean {
|
|
1045
|
-
const testPatterns = [
|
|
1046
|
-
/\.test\.[tj]sx?$/,
|
|
1047
|
-
/\.spec\.[tj]sx?$/,
|
|
1048
|
-
/_test\.[tj]sx?$/,
|
|
1049
|
-
/test_.*\.py$/,
|
|
1050
|
-
/.*_test\.py$/,
|
|
1051
|
-
/.*_test\.go$/,
|
|
1052
|
-
];
|
|
1053
|
-
|
|
1054
|
-
return testPatterns.some((pattern) => pattern.test(path));
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
/**
|
|
1059
|
-
* Extracted entity from source code
|
|
1060
|
-
*/
|
|
1061
|
-
interface ExtractedEntity {
|
|
1062
|
-
type: 'class' | 'function' | 'interface' | 'type' | 'variable' | 'module';
|
|
1063
|
-
name: string;
|
|
1064
|
-
line: number;
|
|
1065
|
-
visibility: 'public' | 'private' | 'protected';
|
|
1066
|
-
isAsync: boolean;
|
|
1067
|
-
}
|