circle-ir-ai 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +105 -0
- package/LICENSE +15 -0
- package/README.md +336 -0
- package/dist/action-queue/aggregator.d.ts +40 -0
- package/dist/action-queue/aggregator.d.ts.map +1 -0
- package/dist/action-queue/aggregator.js +375 -0
- package/dist/action-queue/aggregator.js.map +1 -0
- package/dist/action-queue/index.d.ts +14 -0
- package/dist/action-queue/index.d.ts.map +1 -0
- package/dist/action-queue/index.js +17 -0
- package/dist/action-queue/index.js.map +1 -0
- package/dist/action-queue/queue.d.ts +74 -0
- package/dist/action-queue/queue.d.ts.map +1 -0
- package/dist/action-queue/queue.js +433 -0
- package/dist/action-queue/queue.js.map +1 -0
- package/dist/action-queue/types.d.ts +162 -0
- package/dist/action-queue/types.d.ts.map +1 -0
- package/dist/action-queue/types.js +44 -0
- package/dist/action-queue/types.js.map +1 -0
- package/dist/agents/enrichment-agent.d.ts +16 -0
- package/dist/agents/enrichment-agent.d.ts.map +1 -0
- package/dist/agents/enrichment-agent.js +102 -0
- package/dist/agents/enrichment-agent.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +15 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mastra/agents.d.ts +373 -0
- package/dist/agents/mastra/agents.d.ts.map +1 -0
- package/dist/agents/mastra/agents.js +347 -0
- package/dist/agents/mastra/agents.js.map +1 -0
- package/dist/agents/mastra/index.d.ts +12 -0
- package/dist/agents/mastra/index.d.ts.map +1 -0
- package/dist/agents/mastra/index.js +17 -0
- package/dist/agents/mastra/index.js.map +1 -0
- package/dist/agents/mastra/instance.d.ts +383 -0
- package/dist/agents/mastra/instance.d.ts.map +1 -0
- package/dist/agents/mastra/instance.js +37 -0
- package/dist/agents/mastra/instance.js.map +1 -0
- package/dist/agents/mastra/steps.d.ts +300 -0
- package/dist/agents/mastra/steps.d.ts.map +1 -0
- package/dist/agents/mastra/steps.js +468 -0
- package/dist/agents/mastra/steps.js.map +1 -0
- package/dist/agents/mastra/swarm.d.ts +106 -0
- package/dist/agents/mastra/swarm.d.ts.map +1 -0
- package/dist/agents/mastra/swarm.js +501 -0
- package/dist/agents/mastra/swarm.js.map +1 -0
- package/dist/agents/mastra/workflow.d.ts +81 -0
- package/dist/agents/mastra/workflow.d.ts.map +1 -0
- package/dist/agents/mastra/workflow.js +460 -0
- package/dist/agents/mastra/workflow.js.map +1 -0
- package/dist/agents/multi/agents/security.d.ts +29 -0
- package/dist/agents/multi/agents/security.d.ts.map +1 -0
- package/dist/agents/multi/agents/security.js +830 -0
- package/dist/agents/multi/agents/security.js.map +1 -0
- package/dist/agents/multi/extractor.d.ts +21 -0
- package/dist/agents/multi/extractor.d.ts.map +1 -0
- package/dist/agents/multi/extractor.js +483 -0
- package/dist/agents/multi/extractor.js.map +1 -0
- package/dist/agents/multi/index.d.ts +32 -0
- package/dist/agents/multi/index.d.ts.map +1 -0
- package/dist/agents/multi/index.js +34 -0
- package/dist/agents/multi/index.js.map +1 -0
- package/dist/agents/multi/runner.d.ts +79 -0
- package/dist/agents/multi/runner.d.ts.map +1 -0
- package/dist/agents/multi/runner.js +323 -0
- package/dist/agents/multi/runner.js.map +1 -0
- package/dist/agents/security-agent.d.ts +16 -0
- package/dist/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/security-agent.js +299 -0
- package/dist/agents/security-agent.js.map +1 -0
- package/dist/agents/types.d.ts +373 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +14 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/verification-agent.d.ts +23 -0
- package/dist/agents/verification-agent.d.ts.map +1 -0
- package/dist/agents/verification-agent.js +217 -0
- package/dist/agents/verification-agent.js.map +1 -0
- package/dist/agents/workflow.d.ts +30 -0
- package/dist/agents/workflow.d.ts.map +1 -0
- package/dist/agents/workflow.js +79 -0
- package/dist/agents/workflow.js.map +1 -0
- package/dist/analysis/enriched.d.ts +16 -0
- package/dist/analysis/enriched.d.ts.map +1 -0
- package/dist/analysis/enriched.js +297 -0
- package/dist/analysis/enriched.js.map +1 -0
- package/dist/analysis/llm-correlated-predicates.d.ts +80 -0
- package/dist/analysis/llm-correlated-predicates.d.ts.map +1 -0
- package/dist/analysis/llm-correlated-predicates.js +255 -0
- package/dist/analysis/llm-correlated-predicates.js.map +1 -0
- package/dist/analysis/llm-cross-file-taint.d.ts +86 -0
- package/dist/analysis/llm-cross-file-taint.d.ts.map +1 -0
- package/dist/analysis/llm-cross-file-taint.js +264 -0
- package/dist/analysis/llm-cross-file-taint.js.map +1 -0
- package/dist/analysis/pattern-discovery.d.ts +79 -0
- package/dist/analysis/pattern-discovery.d.ts.map +1 -0
- package/dist/analysis/pattern-discovery.js +447 -0
- package/dist/analysis/pattern-discovery.js.map +1 -0
- package/dist/cache/file-cache.d.ts +89 -0
- package/dist/cache/file-cache.d.ts.map +1 -0
- package/dist/cache/file-cache.js +208 -0
- package/dist/cache/file-cache.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cli/args.d.ts +52 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +422 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/colors.d.ts +31 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +80 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/analyze-skill.d.ts +33 -0
- package/dist/cli/commands/analyze-skill.d.ts.map +1 -0
- package/dist/cli/commands/analyze-skill.js +217 -0
- package/dist/cli/commands/analyze-skill.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +18 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +30 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/benchmark-runner.d.ts +42 -0
- package/dist/cli/commands/benchmark-runner.d.ts.map +1 -0
- package/dist/cli/commands/benchmark-runner.js +18 -0
- package/dist/cli/commands/benchmark-runner.js.map +1 -0
- package/dist/cli/commands/benchmark.d.ts +11 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +90 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/dead-code.d.ts +11 -0
- package/dist/cli/commands/dead-code.d.ts.map +1 -0
- package/dist/cli/commands/dead-code.js +65 -0
- package/dist/cli/commands/dead-code.js.map +1 -0
- package/dist/cli/commands/generate-spec.d.ts +11 -0
- package/dist/cli/commands/generate-spec.d.ts.map +1 -0
- package/dist/cli/commands/generate-spec.js +67 -0
- package/dist/cli/commands/generate-spec.js.map +1 -0
- package/dist/cli/commands/health.d.ts +11 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +67 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/project.d.ts +21 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +92 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +11 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +68 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/secrets.d.ts +11 -0
- package/dist/cli/commands/secrets.d.ts.map +1 -0
- package/dist/cli/commands/secrets.js +71 -0
- package/dist/cli/commands/secrets.js.map +1 -0
- package/dist/cli/commands/swarm.d.ts +20 -0
- package/dist/cli/commands/swarm.d.ts.map +1 -0
- package/dist/cli/commands/swarm.js +174 -0
- package/dist/cli/commands/swarm.js.map +1 -0
- package/dist/cli/config.d.ts +103 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +307 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/discovery.d.ts +31 -0
- package/dist/cli/discovery.d.ts.map +1 -0
- package/dist/cli/discovery.js +212 -0
- package/dist/cli/discovery.js.map +1 -0
- package/dist/cli/formatters/index.d.ts +15 -0
- package/dist/cli/formatters/index.d.ts.map +1 -0
- package/dist/cli/formatters/index.js +51 -0
- package/dist/cli/formatters/index.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +11 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +12 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/project-json.d.ts +11 -0
- package/dist/cli/formatters/project-json.d.ts.map +1 -0
- package/dist/cli/formatters/project-json.js +12 -0
- package/dist/cli/formatters/project-json.js.map +1 -0
- package/dist/cli/formatters/project-sarif.d.ts +11 -0
- package/dist/cli/formatters/project-sarif.d.ts.map +1 -0
- package/dist/cli/formatters/project-sarif.js +127 -0
- package/dist/cli/formatters/project-sarif.js.map +1 -0
- package/dist/cli/formatters/project-summary.d.ts +11 -0
- package/dist/cli/formatters/project-summary.d.ts.map +1 -0
- package/dist/cli/formatters/project-summary.js +202 -0
- package/dist/cli/formatters/project-summary.js.map +1 -0
- package/dist/cli/formatters/sarif-shared.d.ts +101 -0
- package/dist/cli/formatters/sarif-shared.d.ts.map +1 -0
- package/dist/cli/formatters/sarif-shared.js +57 -0
- package/dist/cli/formatters/sarif-shared.js.map +1 -0
- package/dist/cli/formatters/sarif.d.ts +12 -0
- package/dist/cli/formatters/sarif.d.ts.map +1 -0
- package/dist/cli/formatters/sarif.js +92 -0
- package/dist/cli/formatters/sarif.js.map +1 -0
- package/dist/cli/formatters/summary.d.ts +11 -0
- package/dist/cli/formatters/summary.d.ts.map +1 -0
- package/dist/cli/formatters/summary.js +240 -0
- package/dist/cli/formatters/summary.js.map +1 -0
- package/dist/cli/formatters/two-phase-summary.d.ts +11 -0
- package/dist/cli/formatters/two-phase-summary.d.ts.map +1 -0
- package/dist/cli/formatters/two-phase-summary.js +188 -0
- package/dist/cli/formatters/two-phase-summary.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +555 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/clustering.d.ts +60 -0
- package/dist/components/clustering.d.ts.map +1 -0
- package/dist/components/clustering.js +129 -0
- package/dist/components/clustering.js.map +1 -0
- package/dist/components/enrichment.d.ts +45 -0
- package/dist/components/enrichment.d.ts.map +1 -0
- package/dist/components/enrichment.js +193 -0
- package/dist/components/enrichment.js.map +1 -0
- package/dist/components/index.d.ts +29 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +56 -0
- package/dist/components/index.js.map +1 -0
- package/dist/dead-code/detector.d.ts +200 -0
- package/dist/dead-code/detector.d.ts.map +1 -0
- package/dist/dead-code/detector.js +1003 -0
- package/dist/dead-code/detector.js.map +1 -0
- package/dist/dead-code/index.d.ts +7 -0
- package/dist/dead-code/index.d.ts.map +1 -0
- package/dist/dead-code/index.js +7 -0
- package/dist/dead-code/index.js.map +1 -0
- package/dist/extractors/index.d.ts +15 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +14 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/natural-language.d.ts +46 -0
- package/dist/extractors/natural-language.d.ts.map +1 -0
- package/dist/extractors/natural-language.js +228 -0
- package/dist/extractors/natural-language.js.map +1 -0
- package/dist/extractors/tree-sitter.d.ts +33 -0
- package/dist/extractors/tree-sitter.d.ts.map +1 -0
- package/dist/extractors/tree-sitter.js +69 -0
- package/dist/extractors/tree-sitter.js.map +1 -0
- package/dist/extractors/types.d.ts +62 -0
- package/dist/extractors/types.d.ts.map +1 -0
- package/dist/extractors/types.js +54 -0
- package/dist/extractors/types.js.map +1 -0
- package/dist/health-score/calculator.d.ts +123 -0
- package/dist/health-score/calculator.d.ts.map +1 -0
- package/dist/health-score/calculator.js +444 -0
- package/dist/health-score/calculator.js.map +1 -0
- package/dist/health-score/index.d.ts +12 -0
- package/dist/health-score/index.d.ts.map +1 -0
- package/dist/health-score/index.js +14 -0
- package/dist/health-score/index.js.map +1 -0
- package/dist/health-score/metrics.d.ts +142 -0
- package/dist/health-score/metrics.d.ts.map +1 -0
- package/dist/health-score/metrics.js +332 -0
- package/dist/health-score/metrics.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/ax-client.d.ts +477 -0
- package/dist/llm/ax-client.d.ts.map +1 -0
- package/dist/llm/ax-client.js +1641 -0
- package/dist/llm/ax-client.js.map +1 -0
- package/dist/llm/config.d.ts +58 -0
- package/dist/llm/config.d.ts.map +1 -0
- package/dist/llm/config.js +97 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/discovery.d.ts +123 -0
- package/dist/llm/discovery.d.ts.map +1 -0
- package/dist/llm/discovery.js +505 -0
- package/dist/llm/discovery.js.map +1 -0
- package/dist/llm/enrichment.d.ts +108 -0
- package/dist/llm/enrichment.d.ts.map +1 -0
- package/dist/llm/enrichment.js +312 -0
- package/dist/llm/enrichment.js.map +1 -0
- package/dist/llm/index.d.ts +13 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +22 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/language-context.d.ts +64 -0
- package/dist/llm/language-context.d.ts.map +1 -0
- package/dist/llm/language-context.js +492 -0
- package/dist/llm/language-context.js.map +1 -0
- package/dist/llm/pattern-verification.d.ts +39 -0
- package/dist/llm/pattern-verification.d.ts.map +1 -0
- package/dist/llm/pattern-verification.js +127 -0
- package/dist/llm/pattern-verification.js.map +1 -0
- package/dist/llm/prompt-security.d.ts +120 -0
- package/dist/llm/prompt-security.d.ts.map +1 -0
- package/dist/llm/prompt-security.js +301 -0
- package/dist/llm/prompt-security.js.map +1 -0
- package/dist/llm/prompts/index.d.ts +31 -0
- package/dist/llm/prompts/index.d.ts.map +1 -0
- package/dist/llm/prompts/index.js +92 -0
- package/dist/llm/prompts/index.js.map +1 -0
- package/dist/llm/prompts/rust.d.ts +30 -0
- package/dist/llm/prompts/rust.d.ts.map +1 -0
- package/dist/llm/prompts/rust.js +121 -0
- package/dist/llm/prompts/rust.js.map +1 -0
- package/dist/llm/schemas.d.ts +892 -0
- package/dist/llm/schemas.d.ts.map +1 -0
- package/dist/llm/schemas.js +258 -0
- package/dist/llm/schemas.js.map +1 -0
- package/dist/llm/verification.d.ts +127 -0
- package/dist/llm/verification.d.ts.map +1 -0
- package/dist/llm/verification.js +394 -0
- package/dist/llm/verification.js.map +1 -0
- package/dist/project/analyzer.d.ts +30 -0
- package/dist/project/analyzer.d.ts.map +1 -0
- package/dist/project/analyzer.js +358 -0
- package/dist/project/analyzer.js.map +1 -0
- package/dist/project/call-graph.d.ts +22 -0
- package/dist/project/call-graph.d.ts.map +1 -0
- package/dist/project/call-graph.js +246 -0
- package/dist/project/call-graph.js.map +1 -0
- package/dist/project/index.d.ts +18 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +20 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/taint-paths.d.ts +22 -0
- package/dist/project/taint-paths.d.ts.map +1 -0
- package/dist/project/taint-paths.js +265 -0
- package/dist/project/taint-paths.js.map +1 -0
- package/dist/project/two-phase-analyzer.d.ts +143 -0
- package/dist/project/two-phase-analyzer.d.ts.map +1 -0
- package/dist/project/two-phase-analyzer.js +646 -0
- package/dist/project/two-phase-analyzer.js.map +1 -0
- package/dist/project/type-hierarchy.d.ts +28 -0
- package/dist/project/type-hierarchy.d.ts.map +1 -0
- package/dist/project/type-hierarchy.js +218 -0
- package/dist/project/type-hierarchy.js.map +1 -0
- package/dist/secret-scan/index.d.ts +12 -0
- package/dist/secret-scan/index.d.ts.map +1 -0
- package/dist/secret-scan/index.js +14 -0
- package/dist/secret-scan/index.js.map +1 -0
- package/dist/secret-scan/patterns.d.ts +38 -0
- package/dist/secret-scan/patterns.d.ts.map +1 -0
- package/dist/secret-scan/patterns.js +473 -0
- package/dist/secret-scan/patterns.js.map +1 -0
- package/dist/secret-scan/scanner.d.ts +162 -0
- package/dist/secret-scan/scanner.d.ts.map +1 -0
- package/dist/secret-scan/scanner.js +511 -0
- package/dist/secret-scan/scanner.js.map +1 -0
- package/dist/security-scan/index.d.ts +12 -0
- package/dist/security-scan/index.d.ts.map +1 -0
- package/dist/security-scan/index.js +15 -0
- package/dist/security-scan/index.js.map +1 -0
- package/dist/security-scan/owasp-mapping.d.ts +29 -0
- package/dist/security-scan/owasp-mapping.d.ts.map +1 -0
- package/dist/security-scan/owasp-mapping.js +246 -0
- package/dist/security-scan/owasp-mapping.js.map +1 -0
- package/dist/security-scan/scanner.d.ts +204 -0
- package/dist/security-scan/scanner.d.ts.map +1 -0
- package/dist/security-scan/scanner.js +693 -0
- package/dist/security-scan/scanner.js.map +1 -0
- package/dist/security-scan/trend-tracker.d.ts +150 -0
- package/dist/security-scan/trend-tracker.d.ts.map +1 -0
- package/dist/security-scan/trend-tracker.js +299 -0
- package/dist/security-scan/trend-tracker.js.map +1 -0
- package/dist/skills/bundle-loader.d.ts +26 -0
- package/dist/skills/bundle-loader.d.ts.map +1 -0
- package/dist/skills/bundle-loader.js +284 -0
- package/dist/skills/bundle-loader.js.map +1 -0
- package/dist/skills/capability-mismatch.d.ts +21 -0
- package/dist/skills/capability-mismatch.d.ts.map +1 -0
- package/dist/skills/capability-mismatch.js +188 -0
- package/dist/skills/capability-mismatch.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +9 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-analyzer.d.ts +16 -0
- package/dist/skills/skill-analyzer.d.ts.map +1 -0
- package/dist/skills/skill-analyzer.js +361 -0
- package/dist/skills/skill-analyzer.js.map +1 -0
- package/dist/skills/types.d.ts +195 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +7 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/specifica/conflict-resolver.d.ts +23 -0
- package/dist/specifica/conflict-resolver.d.ts.map +1 -0
- package/dist/specifica/conflict-resolver.js +129 -0
- package/dist/specifica/conflict-resolver.js.map +1 -0
- package/dist/specifica/evidence-aggregator.d.ts +33 -0
- package/dist/specifica/evidence-aggregator.d.ts.map +1 -0
- package/dist/specifica/evidence-aggregator.js +236 -0
- package/dist/specifica/evidence-aggregator.js.map +1 -0
- package/dist/specifica/evidence-extractor.d.ts +13 -0
- package/dist/specifica/evidence-extractor.d.ts.map +1 -0
- package/dist/specifica/evidence-extractor.js +431 -0
- package/dist/specifica/evidence-extractor.js.map +1 -0
- package/dist/specifica/feature-clustering.d.ts +19 -0
- package/dist/specifica/feature-clustering.d.ts.map +1 -0
- package/dist/specifica/feature-clustering.js +231 -0
- package/dist/specifica/feature-clustering.js.map +1 -0
- package/dist/specifica/generator.d.ts +16 -0
- package/dist/specifica/generator.d.ts.map +1 -0
- package/dist/specifica/generator.js +277 -0
- package/dist/specifica/generator.js.map +1 -0
- package/dist/specifica/index.d.ts +15 -0
- package/dist/specifica/index.d.ts.map +1 -0
- package/dist/specifica/index.js +18 -0
- package/dist/specifica/index.js.map +1 -0
- package/dist/specifica/prompts.d.ts +21 -0
- package/dist/specifica/prompts.d.ts.map +1 -0
- package/dist/specifica/prompts.js +196 -0
- package/dist/specifica/prompts.js.map +1 -0
- package/dist/specifica/spec-generator.d.ts +22 -0
- package/dist/specifica/spec-generator.d.ts.map +1 -0
- package/dist/specifica/spec-generator.js +229 -0
- package/dist/specifica/spec-generator.js.map +1 -0
- package/dist/specifica/types.d.ts +213 -0
- package/dist/specifica/types.d.ts.map +1 -0
- package/dist/specifica/types.js +7 -0
- package/dist/specifica/types.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-Level Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes multiple files as a project, building:
|
|
5
|
+
* - Type hierarchy (class inheritance, interface implementations)
|
|
6
|
+
* - Cross-file call graph
|
|
7
|
+
* - Multi-file taint paths
|
|
8
|
+
*/
|
|
9
|
+
import { analyze, initAnalyzer, isAnalyzerInitialized, createWithJdkTypes, SymbolTable, CrossFileResolver, } from 'circle-ir';
|
|
10
|
+
import { buildTypeHierarchy } from './type-hierarchy.js';
|
|
11
|
+
import { buildCrossFileCalls } from './call-graph.js';
|
|
12
|
+
import { findTaintPaths } from './taint-paths.js';
|
|
13
|
+
import { analyzeProjectTaint, } from '../analysis/llm-cross-file-taint.js';
|
|
14
|
+
// Simple logger
|
|
15
|
+
const logger = {
|
|
16
|
+
info: (msg, data) => {
|
|
17
|
+
if (process.env.DEBUG)
|
|
18
|
+
console.log(`[INFO] ${msg}`, data || '');
|
|
19
|
+
},
|
|
20
|
+
warn: (msg, data) => {
|
|
21
|
+
console.warn(`[WARN] ${msg}`, data || '');
|
|
22
|
+
},
|
|
23
|
+
error: (msg, data) => {
|
|
24
|
+
console.error(`[ERROR] ${msg}`, data || '');
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
// Helper to calculate severity
|
|
28
|
+
function calculateSeverity(input) {
|
|
29
|
+
const criticalSinks = ['sql_injection', 'command_injection', 'code_injection', 'deserialization'];
|
|
30
|
+
const highSinks = ['xss', 'path_traversal', 'xxe', 'ssrf', 'ldap_injection'];
|
|
31
|
+
if (criticalSinks.some(s => input.sinkType.includes(s))) {
|
|
32
|
+
return input.pathExists ? 'critical' : 'high';
|
|
33
|
+
}
|
|
34
|
+
if (highSinks.some(s => input.sinkType.includes(s))) {
|
|
35
|
+
return input.pathExists ? 'high' : 'medium';
|
|
36
|
+
}
|
|
37
|
+
return input.pathExists ? 'medium' : 'low';
|
|
38
|
+
}
|
|
39
|
+
// Helper to get remediation advice
|
|
40
|
+
function getRemediation(sinkType) {
|
|
41
|
+
const remediations = {
|
|
42
|
+
sql_injection: 'Use parameterized queries or prepared statements',
|
|
43
|
+
command_injection: 'Avoid shell execution; use array-based APIs with validated input',
|
|
44
|
+
xss: 'Encode output using context-appropriate encoding (HTML, JavaScript, URL)',
|
|
45
|
+
path_traversal: 'Validate and canonicalize paths; use allowlists',
|
|
46
|
+
xxe: 'Disable external entity processing in XML parsers',
|
|
47
|
+
ssrf: 'Validate URLs against allowlist; block internal network access',
|
|
48
|
+
deserialization: 'Avoid deserializing untrusted data; use allowlists',
|
|
49
|
+
ldap_injection: 'Use parameterized LDAP queries; escape special characters',
|
|
50
|
+
};
|
|
51
|
+
for (const [key, value] of Object.entries(remediations)) {
|
|
52
|
+
if (sinkType.includes(key))
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
return 'Validate and sanitize all user input before use';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Analyze a project consisting of multiple files.
|
|
59
|
+
*/
|
|
60
|
+
export async function analyzeProject(files, options = {}) {
|
|
61
|
+
// Ensure analyzer is initialized
|
|
62
|
+
if (!isAnalyzerInitialized()) {
|
|
63
|
+
await initAnalyzer();
|
|
64
|
+
}
|
|
65
|
+
const startTime = Date.now();
|
|
66
|
+
// Initialize cross-file resolution infrastructure
|
|
67
|
+
const typeResolver = createWithJdkTypes();
|
|
68
|
+
const symbolTable = new SymbolTable();
|
|
69
|
+
const crossFileResolver = new CrossFileResolver(symbolTable, typeResolver);
|
|
70
|
+
// Analyze each file individually
|
|
71
|
+
const fileAnalyses = [];
|
|
72
|
+
let totalLoc = 0;
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const language = detectLanguage(file.path);
|
|
75
|
+
const analysis = await analyze(file.content, file.path, language);
|
|
76
|
+
fileAnalyses.push({
|
|
77
|
+
file: file.path,
|
|
78
|
+
analysis,
|
|
79
|
+
});
|
|
80
|
+
totalLoc += analysis.meta.loc;
|
|
81
|
+
// Register with cross-file resolver for enhanced resolution
|
|
82
|
+
crossFileResolver.addFile(file.path, analysis);
|
|
83
|
+
}
|
|
84
|
+
// Build type hierarchy from all files (uses legacy approach + resolver)
|
|
85
|
+
const typeHierarchy = buildTypeHierarchy(fileAnalyses);
|
|
86
|
+
// Merge type hierarchy from resolver (has JDK types pre-populated)
|
|
87
|
+
for (const type of typeResolver.getAllTypes()) {
|
|
88
|
+
if (type.kind === 'class' || type.kind === 'enum') {
|
|
89
|
+
if (!typeHierarchy.classes[type.fqn]) {
|
|
90
|
+
typeHierarchy.classes[type.fqn] = {
|
|
91
|
+
file: type.file,
|
|
92
|
+
extends: type.extends || null,
|
|
93
|
+
implements: type.implements,
|
|
94
|
+
subclasses: typeResolver.getDirectSubtypes(type.fqn),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (type.kind === 'interface') {
|
|
99
|
+
if (!typeHierarchy.interfaces[type.fqn]) {
|
|
100
|
+
typeHierarchy.interfaces[type.fqn] = {
|
|
101
|
+
file: type.file,
|
|
102
|
+
extends: type.extendsInterfaces,
|
|
103
|
+
implementations: typeResolver.getDirectImplementations(type.fqn),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Build cross-file call graph (enhanced with resolver)
|
|
109
|
+
const crossFileCalls = buildCrossFileCalls(fileAnalyses, typeHierarchy);
|
|
110
|
+
// Find taint paths across files
|
|
111
|
+
let taintPaths = findTaintPaths(fileAnalyses, crossFileCalls);
|
|
112
|
+
// Apply LLM-based cross-file taint analysis if enabled
|
|
113
|
+
let llmCrossFileTaintResult;
|
|
114
|
+
if (options.enableLLMCrossFileTaint) {
|
|
115
|
+
try {
|
|
116
|
+
// Build file map for LLM analysis
|
|
117
|
+
const fileMap = new Map();
|
|
118
|
+
for (let i = 0; i < files.length; i++) {
|
|
119
|
+
fileMap.set(files[i].path, {
|
|
120
|
+
code: files[i].content,
|
|
121
|
+
ir: fileAnalyses[i].analysis,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
llmCrossFileTaintResult = await analyzeProjectTaint(fileMap);
|
|
125
|
+
logger.info('LLM cross-file taint analysis applied', {
|
|
126
|
+
flowsFound: llmCrossFileTaintResult.flows.length,
|
|
127
|
+
filePairsAnalyzed: llmCrossFileTaintResult.reasoning,
|
|
128
|
+
});
|
|
129
|
+
// Enhance taint paths with LLM-discovered flows
|
|
130
|
+
for (const flow of llmCrossFileTaintResult.flows) {
|
|
131
|
+
// Check if this flow already exists in taintPaths
|
|
132
|
+
const exists = taintPaths.some(p => p.source.file === flow.sourceFile &&
|
|
133
|
+
p.sink.file === flow.targetFile &&
|
|
134
|
+
Math.abs(p.source.line - flow.sourceLine) < 5);
|
|
135
|
+
if (!exists && flow.confidence > 0.7) {
|
|
136
|
+
// Add as a new taint path
|
|
137
|
+
taintPaths.push({
|
|
138
|
+
id: `llm-cross-${flow.sourceFile}-${flow.sourceLine}-${flow.targetFile}`,
|
|
139
|
+
source: {
|
|
140
|
+
file: flow.sourceFile,
|
|
141
|
+
line: flow.sourceLine,
|
|
142
|
+
type: 'cross_file_import',
|
|
143
|
+
code: `imported ${flow.sourceSymbol}`,
|
|
144
|
+
},
|
|
145
|
+
sink: {
|
|
146
|
+
file: flow.targetFile,
|
|
147
|
+
line: flow.targetLine || 0,
|
|
148
|
+
type: 'cross_file_sink',
|
|
149
|
+
cwe: 'CWE-unknown',
|
|
150
|
+
code: `uses ${flow.targetSymbol}`,
|
|
151
|
+
},
|
|
152
|
+
hops: [{
|
|
153
|
+
file: flow.targetFile,
|
|
154
|
+
method: 'unknown',
|
|
155
|
+
line: flow.targetLine || 0,
|
|
156
|
+
code: `${flow.targetSymbol} from ${flow.sourceFile}`,
|
|
157
|
+
variable: flow.targetSymbol,
|
|
158
|
+
}],
|
|
159
|
+
path_exists: true,
|
|
160
|
+
sanitizers_in_path: [],
|
|
161
|
+
confidence: flow.confidence,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
logger.warn('LLM cross-file taint analysis failed', {
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Aggregate findings from all files and cross-file analysis
|
|
173
|
+
const findings = aggregateFindings(fileAnalyses, taintPaths);
|
|
174
|
+
// Build project metadata
|
|
175
|
+
const meta = {
|
|
176
|
+
name: options.name ?? extractProjectName(files),
|
|
177
|
+
root: options.root ?? extractRoot(files),
|
|
178
|
+
language: options.language ?? detectPrimaryLanguage(files),
|
|
179
|
+
framework: options.framework,
|
|
180
|
+
framework_version: options.frameworkVersion,
|
|
181
|
+
build_tool: options.buildTool,
|
|
182
|
+
total_files: files.length,
|
|
183
|
+
total_loc: totalLoc,
|
|
184
|
+
analyzed_at: new Date().toISOString(),
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
meta,
|
|
188
|
+
files: fileAnalyses,
|
|
189
|
+
type_hierarchy: typeHierarchy,
|
|
190
|
+
cross_file_calls: crossFileCalls,
|
|
191
|
+
taint_paths: taintPaths,
|
|
192
|
+
findings,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Detect language from file extension.
|
|
197
|
+
*/
|
|
198
|
+
function detectLanguage(filePath) {
|
|
199
|
+
if (filePath.endsWith('.java')) {
|
|
200
|
+
return 'java';
|
|
201
|
+
}
|
|
202
|
+
if (filePath.endsWith('.c') || filePath.endsWith('.h')) {
|
|
203
|
+
return 'c';
|
|
204
|
+
}
|
|
205
|
+
if (filePath.endsWith('.cpp') || filePath.endsWith('.cc') ||
|
|
206
|
+
filePath.endsWith('.cxx') || filePath.endsWith('.hpp')) {
|
|
207
|
+
return 'cpp';
|
|
208
|
+
}
|
|
209
|
+
if (filePath.endsWith('.js') || filePath.endsWith('.jsx') ||
|
|
210
|
+
filePath.endsWith('.mjs') || filePath.endsWith('.cjs')) {
|
|
211
|
+
return 'javascript';
|
|
212
|
+
}
|
|
213
|
+
if (filePath.endsWith('.ts') || filePath.endsWith('.tsx') ||
|
|
214
|
+
filePath.endsWith('.mts') || filePath.endsWith('.cts')) {
|
|
215
|
+
return 'typescript';
|
|
216
|
+
}
|
|
217
|
+
if (filePath.endsWith('.py')) {
|
|
218
|
+
return 'python';
|
|
219
|
+
}
|
|
220
|
+
return 'java'; // Default
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Detect primary language of the project.
|
|
224
|
+
*/
|
|
225
|
+
function detectPrimaryLanguage(files) {
|
|
226
|
+
const counts = { java: 0, c: 0, cpp: 0, javascript: 0, typescript: 0, python: 0, rust: 0 };
|
|
227
|
+
for (const file of files) {
|
|
228
|
+
const lang = detectLanguage(file.path);
|
|
229
|
+
counts[lang]++;
|
|
230
|
+
}
|
|
231
|
+
let maxLang = 'java';
|
|
232
|
+
let maxCount = 0;
|
|
233
|
+
for (const [lang, count] of Object.entries(counts)) {
|
|
234
|
+
if (count > maxCount) {
|
|
235
|
+
maxCount = count;
|
|
236
|
+
maxLang = lang;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return maxLang;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Extract project name from file paths.
|
|
243
|
+
*/
|
|
244
|
+
function extractProjectName(files) {
|
|
245
|
+
if (files.length === 0) {
|
|
246
|
+
return 'unknown';
|
|
247
|
+
}
|
|
248
|
+
// Try to find common parent directory
|
|
249
|
+
const paths = files.map(f => f.path.split('/'));
|
|
250
|
+
if (paths.length === 0 || paths[0].length === 0) {
|
|
251
|
+
return 'unknown';
|
|
252
|
+
}
|
|
253
|
+
// Find common prefix
|
|
254
|
+
let commonPrefix = [];
|
|
255
|
+
for (let i = 0; i < paths[0].length; i++) {
|
|
256
|
+
const segment = paths[0][i];
|
|
257
|
+
if (paths.every(p => p[i] === segment)) {
|
|
258
|
+
commonPrefix.push(segment);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Return last segment of common prefix
|
|
265
|
+
if (commonPrefix.length > 0) {
|
|
266
|
+
return commonPrefix[commonPrefix.length - 1];
|
|
267
|
+
}
|
|
268
|
+
return 'unknown';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extract root directory from file paths.
|
|
272
|
+
*/
|
|
273
|
+
function extractRoot(files) {
|
|
274
|
+
if (files.length === 0) {
|
|
275
|
+
return '/';
|
|
276
|
+
}
|
|
277
|
+
const paths = files.map(f => f.path.split('/'));
|
|
278
|
+
if (paths.length === 0) {
|
|
279
|
+
return '/';
|
|
280
|
+
}
|
|
281
|
+
// Find common prefix
|
|
282
|
+
const commonPrefix = [];
|
|
283
|
+
for (let i = 0; i < paths[0].length - 1; i++) { // -1 to exclude filename
|
|
284
|
+
const segment = paths[0][i];
|
|
285
|
+
if (paths.every(p => p[i] === segment)) {
|
|
286
|
+
commonPrefix.push(segment);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return commonPrefix.join('/') || '/';
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Aggregate findings from file analyses and cross-file taint paths.
|
|
296
|
+
*/
|
|
297
|
+
function aggregateFindings(fileAnalyses, taintPaths) {
|
|
298
|
+
const findings = [];
|
|
299
|
+
const seenIds = new Set();
|
|
300
|
+
// Collect findings from individual files
|
|
301
|
+
// (Currently findings are generated per-file, but we may want to dedupe)
|
|
302
|
+
// Generate findings from cross-file taint paths
|
|
303
|
+
for (const path of taintPaths) {
|
|
304
|
+
if (path.path_exists && path.sanitizers_in_path.length === 0) {
|
|
305
|
+
const id = `cross-file-${path.source.file}:${path.source.line}-${path.sink.file}:${path.sink.line}`;
|
|
306
|
+
if (!seenIds.has(id)) {
|
|
307
|
+
seenIds.add(id);
|
|
308
|
+
findings.push({
|
|
309
|
+
id,
|
|
310
|
+
type: path.sink.type,
|
|
311
|
+
cwe: path.sink.cwe,
|
|
312
|
+
severity: calculateSeverity({
|
|
313
|
+
sourceType: path.source.type,
|
|
314
|
+
sinkType: path.sink.type,
|
|
315
|
+
pathExists: path.path_exists,
|
|
316
|
+
confidence: path.confidence,
|
|
317
|
+
}),
|
|
318
|
+
confidence: path.confidence,
|
|
319
|
+
source: {
|
|
320
|
+
file: path.source.file,
|
|
321
|
+
line: path.source.line,
|
|
322
|
+
code: path.source.code,
|
|
323
|
+
},
|
|
324
|
+
sink: {
|
|
325
|
+
file: path.sink.file,
|
|
326
|
+
line: path.sink.line,
|
|
327
|
+
code: path.sink.code,
|
|
328
|
+
},
|
|
329
|
+
path: path.hops,
|
|
330
|
+
exploitable: path.path_exists && path.confidence > 0.7,
|
|
331
|
+
explanation: generateExplanation(path),
|
|
332
|
+
remediation: getRemediation(path.sink.type),
|
|
333
|
+
verification: {
|
|
334
|
+
graph_path_exists: path.path_exists,
|
|
335
|
+
llm_verified: false,
|
|
336
|
+
llm_confidence: 0,
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Sort by severity
|
|
343
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
344
|
+
findings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
345
|
+
return findings;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Generate explanation for a taint path.
|
|
349
|
+
*/
|
|
350
|
+
function generateExplanation(path) {
|
|
351
|
+
const sourceDesc = `User-controlled data from ${path.source.type} at ${path.source.file}:${path.source.line}`;
|
|
352
|
+
const sinkDesc = `reaches a ${path.sink.type} sink at ${path.sink.file}:${path.sink.line}`;
|
|
353
|
+
const hopDesc = path.hops.length > 0
|
|
354
|
+
? ` through ${path.hops.length} intermediate step(s)`
|
|
355
|
+
: ' directly';
|
|
356
|
+
return `${sourceDesc}${hopDesc} and ${sinkDesc}. ${path.sink.cwe}`;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/project/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GAQlB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,mBAAmB,GAEpB,MAAM,qCAAqC,CAAC;AAE7C,gBAAgB;AAChB,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE;QACpD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE;QACpD,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE;QACrD,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC;AAEF,+BAA+B;AAC/B,SAAS,iBAAiB,CAAC,KAK1B;IACC,MAAM,aAAa,GAAG,CAAC,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IAClG,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE7E,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAChD,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,mCAAmC;AACnC,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,YAAY,GAA2B;QAC3C,aAAa,EAAE,kDAAkD;QACjE,iBAAiB,EAAE,kEAAkE;QACrF,GAAG,EAAE,0EAA0E;QAC/E,cAAc,EAAE,iDAAiD;QACjE,GAAG,EAAE,mDAAmD;QACxD,IAAI,EAAE,gEAAgE;QACtE,eAAe,EAAE,oDAAoD;QACrE,cAAc,EAAE,2DAA2D;KAC5E,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,iDAAiD,CAAC;AAC3D,CAAC;AAoBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAkB,EAClB,UAA0B,EAAE;IAE5B,iCAAiC;IACjC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;QAC7B,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,kDAAkD;IAClD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE3E,iCAAiC;IACjC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClE,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;SACT,CAAC,CAAC;QACH,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAE9B,4DAA4D;QAC5D,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,wEAAwE;IACxE,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAEvD,mEAAmE;IACnE,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;oBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,UAAU,EAAE,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;iBACrD,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;oBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,iBAAiB;oBAC/B,eAAe,EAAE,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;iBACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,cAAc,GAAG,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAExE,gCAAgC;IAChC,IAAI,UAAU,GAAG,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAE9D,uDAAuD;IACvD,IAAI,uBAAyD,CAAC;IAC9D,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;oBACtB,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ;iBAC7B,CAAC,CAAC;YACL,CAAC;YAED,uBAAuB,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;gBACnD,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,MAAM;gBAChD,iBAAiB,EAAE,uBAAuB,CAAC,SAAS;aACrD,CAAC,CAAC;YAEH,gDAAgD;YAChD,KAAK,MAAM,IAAI,IAAI,uBAAuB,CAAC,KAAK,EAAE,CAAC;gBACjD,kDAAkD;gBAClD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACjC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU;oBACjC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU;oBAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAC9C,CAAC;gBAEF,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;oBACrC,0BAA0B;oBAC1B,UAAU,CAAC,IAAI,CAAC;wBACd,EAAE,EAAE,aAAa,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;wBACxE,MAAM,EAAE;4BACN,IAAI,EAAE,IAAI,CAAC,UAAU;4BACrB,IAAI,EAAE,IAAI,CAAC,UAAU;4BACrB,IAAI,EAAE,mBAA0B;4BAChC,IAAI,EAAE,YAAY,IAAI,CAAC,YAAY,EAAE;yBACtC;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,IAAI,CAAC,UAAU;4BACrB,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;4BAC1B,IAAI,EAAE,iBAAwB;4BAC9B,GAAG,EAAE,aAAa;4BAClB,IAAI,EAAE,QAAQ,IAAI,CAAC,YAAY,EAAE;yBAClC;wBACD,IAAI,EAAE,CAAC;gCACL,IAAI,EAAE,IAAI,CAAC,UAAU;gCACrB,MAAM,EAAE,SAAS;gCACjB,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;gCAC1B,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC,UAAU,EAAE;gCACpD,QAAQ,EAAE,IAAI,CAAC,YAAY;6BAC5B,CAAC;wBACF,WAAW,EAAE,IAAI;wBACjB,kBAAkB,EAAE,EAAE;wBACtB,UAAU,EAAE,IAAI,CAAC,UAAU;qBAC5B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAClD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAE7D,yBAAyB;IACzB,MAAM,IAAI,GAAgB;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC,KAAK,CAAC;QAC1D,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,iBAAiB,EAAE,OAAO,CAAC,gBAAgB;QAC3C,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,YAAY;QACnB,cAAc,EAAE,aAAa;QAC7B,gBAAgB,EAAE,cAAc;QAChC,WAAW,EAAE,UAAU;QACvB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,UAAU;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,KAAkB;IAC/C,MAAM,MAAM,GAAsC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAE9H,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,GAAsB,MAAM,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,GAAG,IAAyB,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAkB;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qBAAqB;IACrB,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;YACvC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAkB;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,yBAAyB;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;YACvC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,YAA4B,EAC5B,UAAuB;IAEvB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,yCAAyC;IACzC,yEAAyE;IAEzE,gDAAgD;IAChD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,GAAG,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEpG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAEhB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE;oBACF,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;oBACpB,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;oBAClB,QAAQ,EAAE,iBAAiB,CAAC;wBAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;wBACxB,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;qBAC5B,CAAC;oBACF,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE;wBACN,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;qBACvB;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;wBACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;wBACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;qBACrB;oBACD,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,GAAG,GAAG;oBACtD,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC;oBACtC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC3C,YAAY,EAAE;wBACZ,iBAAiB,EAAE,IAAI,CAAC,WAAW;wBACnC,YAAY,EAAE,KAAK;wBACnB,cAAc,EAAE,CAAC;qBAClB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAGD;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAe;IAC1C,MAAM,UAAU,GAAG,6BAA6B,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9G,MAAM,QAAQ,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,uBAAuB;QACrD,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO,GAAG,UAAU,GAAG,OAAO,QAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-File Call Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Links method calls across files by matching:
|
|
5
|
+
* - Imports to exported symbols
|
|
6
|
+
* - Field types to their class definitions
|
|
7
|
+
* - Method calls to their target implementations
|
|
8
|
+
*/
|
|
9
|
+
import type { FileAnalysis, TypeHierarchy, CrossFileCall } from 'circle-ir';
|
|
10
|
+
/**
|
|
11
|
+
* Build cross-file call graph from analyzed files.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildCrossFileCalls(files: FileAnalysis[], typeHierarchy: TypeHierarchy): CrossFileCall[];
|
|
14
|
+
/**
|
|
15
|
+
* Find all callers of a method across the project.
|
|
16
|
+
*/
|
|
17
|
+
export declare function findCallers(targetFile: string, targetMethod: string, crossFileCalls: CrossFileCall[]): CrossFileCall[];
|
|
18
|
+
/**
|
|
19
|
+
* Find all callees from a method across the project.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findCallees(sourceFile: string, sourceMethod: string, crossFileCalls: CrossFileCall[]): CrossFileCall[];
|
|
22
|
+
//# sourceMappingURL=call-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph.d.ts","sourceRoot":"","sources":["../../src/project/call-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EAOd,MAAM,WAAW,CAAC;AAcnB;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,EACrB,aAAa,EAAE,aAAa,GAC3B,aAAa,EAAE,CAkDjB;AA6OD;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,aAAa,EAAE,GAC9B,aAAa,EAAE,CAKjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,aAAa,EAAE,GAC9B,aAAa,EAAE,CAKjB"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-File Call Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Links method calls across files by matching:
|
|
5
|
+
* - Imports to exported symbols
|
|
6
|
+
* - Field types to their class definitions
|
|
7
|
+
* - Method calls to their target implementations
|
|
8
|
+
*/
|
|
9
|
+
import { findAllImplementations } from './type-hierarchy.js';
|
|
10
|
+
/**
|
|
11
|
+
* Build cross-file call graph from analyzed files.
|
|
12
|
+
*/
|
|
13
|
+
export function buildCrossFileCalls(files, typeHierarchy) {
|
|
14
|
+
const crossFileCalls = [];
|
|
15
|
+
const symbolTable = buildSymbolTable(files);
|
|
16
|
+
let callId = 0;
|
|
17
|
+
for (const fileAnalysis of files) {
|
|
18
|
+
const file = fileAnalysis.file;
|
|
19
|
+
const analysis = fileAnalysis.analysis;
|
|
20
|
+
// Get imports for this file to resolve external types
|
|
21
|
+
const imports = analysis.imports;
|
|
22
|
+
const importedTypes = buildImportMap(imports);
|
|
23
|
+
// Get fields and their types for this file
|
|
24
|
+
const fieldTypes = buildFieldTypeMap(analysis.types);
|
|
25
|
+
// Analyze each call
|
|
26
|
+
for (const call of analysis.calls) {
|
|
27
|
+
const targetInfo = resolveCallTarget(call, file, fieldTypes, importedTypes, symbolTable, typeHierarchy);
|
|
28
|
+
if (targetInfo && targetInfo.file !== file) {
|
|
29
|
+
// This is a cross-file call
|
|
30
|
+
crossFileCalls.push({
|
|
31
|
+
id: `call-${++callId}`,
|
|
32
|
+
from: {
|
|
33
|
+
file,
|
|
34
|
+
method: call.in_method ?? 'unknown',
|
|
35
|
+
line: call.location.line,
|
|
36
|
+
},
|
|
37
|
+
to: {
|
|
38
|
+
file: targetInfo.file,
|
|
39
|
+
method: targetInfo.method,
|
|
40
|
+
line: targetInfo.line,
|
|
41
|
+
},
|
|
42
|
+
args_mapping: buildArgMapping(call, targetInfo.params),
|
|
43
|
+
resolved: true,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return crossFileCalls;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build a symbol table for fast lookups.
|
|
52
|
+
*/
|
|
53
|
+
function buildSymbolTable(files) {
|
|
54
|
+
const typeToFile = new Map();
|
|
55
|
+
const fileExports = new Map();
|
|
56
|
+
const fileImports = new Map();
|
|
57
|
+
const typeMethods = new Map();
|
|
58
|
+
for (const fileAnalysis of files) {
|
|
59
|
+
const file = fileAnalysis.file;
|
|
60
|
+
const analysis = fileAnalysis.analysis;
|
|
61
|
+
// Store exports
|
|
62
|
+
fileExports.set(file, analysis.exports);
|
|
63
|
+
// Store imports
|
|
64
|
+
fileImports.set(file, analysis.imports);
|
|
65
|
+
// Store types and their methods
|
|
66
|
+
for (const type of analysis.types) {
|
|
67
|
+
const qualifiedName = type.package
|
|
68
|
+
? `${type.package}.${type.name}`
|
|
69
|
+
: type.name;
|
|
70
|
+
typeToFile.set(qualifiedName, file);
|
|
71
|
+
typeToFile.set(type.name, file); // Also store simple name
|
|
72
|
+
typeMethods.set(qualifiedName, type.methods);
|
|
73
|
+
typeMethods.set(type.name, type.methods);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { typeToFile, fileExports, fileImports, typeMethods };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build a map of import names to their packages.
|
|
80
|
+
*/
|
|
81
|
+
function buildImportMap(imports) {
|
|
82
|
+
const importMap = new Map();
|
|
83
|
+
for (const imp of imports) {
|
|
84
|
+
if (!imp.is_wildcard) {
|
|
85
|
+
importMap.set(imp.imported_name, imp.from_package ?? '');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return importMap;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build a map of field names to their types.
|
|
92
|
+
*/
|
|
93
|
+
function buildFieldTypeMap(types) {
|
|
94
|
+
const fieldTypes = new Map();
|
|
95
|
+
for (const type of types) {
|
|
96
|
+
for (const field of type.fields) {
|
|
97
|
+
if (field.type) {
|
|
98
|
+
fieldTypes.set(field.name, field.type);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return fieldTypes;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve a call to its target method.
|
|
106
|
+
*/
|
|
107
|
+
function resolveCallTarget(call, currentFile, fieldTypes, importedTypes, symbolTable, typeHierarchy) {
|
|
108
|
+
// If no receiver, it's a local call or static import
|
|
109
|
+
if (!call.receiver) {
|
|
110
|
+
return null; // Local calls within the same file
|
|
111
|
+
}
|
|
112
|
+
// Try to determine the type of the receiver
|
|
113
|
+
const receiverType = inferReceiverType(call.receiver, fieldTypes, importedTypes);
|
|
114
|
+
if (!receiverType) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
// Find the file containing this type
|
|
118
|
+
const targetFile = symbolTable.typeToFile.get(receiverType);
|
|
119
|
+
if (!targetFile) {
|
|
120
|
+
return null; // External type (not in project)
|
|
121
|
+
}
|
|
122
|
+
// Find the method in the target type
|
|
123
|
+
const methods = symbolTable.typeMethods.get(receiverType);
|
|
124
|
+
if (!methods) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const targetMethod = methods.find(m => m.name === call.method_name);
|
|
128
|
+
if (!targetMethod) {
|
|
129
|
+
// Try interface implementations
|
|
130
|
+
const ifaceInfo = typeHierarchy.interfaces[receiverType];
|
|
131
|
+
if (ifaceInfo) {
|
|
132
|
+
// Find implementations and their methods
|
|
133
|
+
const implementations = findAllImplementations(receiverType, typeHierarchy);
|
|
134
|
+
for (const impl of implementations) {
|
|
135
|
+
const implMethods = symbolTable.typeMethods.get(impl);
|
|
136
|
+
const implFile = symbolTable.typeToFile.get(impl);
|
|
137
|
+
if (implMethods && implFile) {
|
|
138
|
+
const implMethod = implMethods.find(m => m.name === call.method_name);
|
|
139
|
+
if (implMethod) {
|
|
140
|
+
return {
|
|
141
|
+
file: implFile,
|
|
142
|
+
method: call.method_name, // Use simple method name for path finding compatibility
|
|
143
|
+
line: implMethod.start_line,
|
|
144
|
+
params: implMethod.parameters,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
file: targetFile,
|
|
154
|
+
method: call.method_name, // Use simple method name for path finding compatibility
|
|
155
|
+
line: targetMethod.start_line,
|
|
156
|
+
params: targetMethod.parameters,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Infer the type of a receiver expression.
|
|
161
|
+
*/
|
|
162
|
+
function inferReceiverType(receiver, fieldTypes, importedTypes) {
|
|
163
|
+
// Check if receiver is a known field
|
|
164
|
+
const fieldType = fieldTypes.get(receiver);
|
|
165
|
+
if (fieldType) {
|
|
166
|
+
// Remove generics
|
|
167
|
+
return fieldType.split('<')[0].trim();
|
|
168
|
+
}
|
|
169
|
+
// Check if receiver looks like a class name (static call)
|
|
170
|
+
if (receiver[0] === receiver[0].toUpperCase()) {
|
|
171
|
+
// Could be a static call like ClassName.method()
|
|
172
|
+
// Check if it's an imported type
|
|
173
|
+
const pkg = importedTypes.get(receiver);
|
|
174
|
+
if (pkg) {
|
|
175
|
+
return pkg ? `${pkg}.${receiver}` : receiver;
|
|
176
|
+
}
|
|
177
|
+
return receiver;
|
|
178
|
+
}
|
|
179
|
+
// Common naming conventions
|
|
180
|
+
const commonMappings = {
|
|
181
|
+
userService: ['UserService'],
|
|
182
|
+
orderService: ['OrderService'],
|
|
183
|
+
userRepository: ['UserRepository'],
|
|
184
|
+
orderRepository: ['OrderRepository'],
|
|
185
|
+
entityManager: ['EntityManager'],
|
|
186
|
+
jdbcTemplate: ['JdbcTemplate'],
|
|
187
|
+
};
|
|
188
|
+
const possibleTypes = commonMappings[receiver];
|
|
189
|
+
if (possibleTypes && possibleTypes.length > 0) {
|
|
190
|
+
return possibleTypes[0];
|
|
191
|
+
}
|
|
192
|
+
// Try to infer from suffix patterns
|
|
193
|
+
if (receiver.endsWith('Service')) {
|
|
194
|
+
return receiver.charAt(0).toUpperCase() + receiver.slice(1);
|
|
195
|
+
}
|
|
196
|
+
if (receiver.endsWith('Repository')) {
|
|
197
|
+
return receiver.charAt(0).toUpperCase() + receiver.slice(1);
|
|
198
|
+
}
|
|
199
|
+
if (receiver.endsWith('Controller')) {
|
|
200
|
+
return receiver.charAt(0).toUpperCase() + receiver.slice(1);
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Build argument mapping between caller and callee.
|
|
206
|
+
*/
|
|
207
|
+
function buildArgMapping(call, calleeParams) {
|
|
208
|
+
const mappings = [];
|
|
209
|
+
for (let i = 0; i < call.arguments.length && i < calleeParams.length; i++) {
|
|
210
|
+
mappings.push({
|
|
211
|
+
caller_arg: i,
|
|
212
|
+
callee_param: i,
|
|
213
|
+
// Assume taint propagates for non-primitive types
|
|
214
|
+
taint_propagates: !isPrimitiveType(calleeParams[i].type),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return mappings;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if a type is a primitive type.
|
|
221
|
+
*/
|
|
222
|
+
function isPrimitiveType(type) {
|
|
223
|
+
if (!type) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
const primitives = [
|
|
227
|
+
'int', 'long', 'short', 'byte', 'float', 'double', 'boolean', 'char',
|
|
228
|
+
'Integer', 'Long', 'Short', 'Byte', 'Float', 'Double', 'Boolean', 'Character',
|
|
229
|
+
];
|
|
230
|
+
return primitives.includes(type);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Find all callers of a method across the project.
|
|
234
|
+
*/
|
|
235
|
+
export function findCallers(targetFile, targetMethod, crossFileCalls) {
|
|
236
|
+
return crossFileCalls.filter(call => call.to.file === targetFile &&
|
|
237
|
+
call.to.method.includes(targetMethod));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Find all callees from a method across the project.
|
|
241
|
+
*/
|
|
242
|
+
export function findCallees(sourceFile, sourceMethod, crossFileCalls) {
|
|
243
|
+
return crossFileCalls.filter(call => call.from.file === sourceFile &&
|
|
244
|
+
call.from.method === sourceMethod);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=call-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-graph.js","sourceRoot":"","sources":["../../src/project/call-graph.ts"],"names":[],"mappings":"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"}
|