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,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Discovery Mode
|
|
3
|
+
*
|
|
4
|
+
* Discovers vulnerabilities in methods with no static findings.
|
|
5
|
+
* Uses LLM to analyze for semantic vulnerabilities that static analysis cannot detect:
|
|
6
|
+
* - Sanitization logic bugs (e.g., "style".endsWith(x) vs x.equals("style"))
|
|
7
|
+
* - Shell argument escaping issues
|
|
8
|
+
* - Context-dependent encoding requirements
|
|
9
|
+
*
|
|
10
|
+
* Expected impact: +15-25% on XSS and Command Injection benchmarks.
|
|
11
|
+
*/
|
|
12
|
+
import { getAxLLMClient } from './ax-client.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// CWE-Specific Discovery Prompts
|
|
15
|
+
// ============================================================================
|
|
16
|
+
const CWE_DISCOVERY_PROMPTS = {
|
|
17
|
+
'CWE-078': `COMMAND INJECTION DISCOVERY (CWE-78)
|
|
18
|
+
|
|
19
|
+
Look for these SUBTLE vulnerabilities that static analysis misses:
|
|
20
|
+
|
|
21
|
+
1. SHELL ARGUMENT ESCAPING BUGS:
|
|
22
|
+
- Arguments passed to shell without proper quoting
|
|
23
|
+
- Special characters not escaped: ; | & \` $ ( ) { } < > ! # * ?
|
|
24
|
+
- Arguments with spaces not quoted properly
|
|
25
|
+
|
|
26
|
+
2. SHELL STRING INTERPRETATION:
|
|
27
|
+
- User input in shell strings even with "array" style
|
|
28
|
+
- ProcessBuilder with single command string (not array)
|
|
29
|
+
- Runtime.exec(String) instead of Runtime.exec(String[])
|
|
30
|
+
|
|
31
|
+
3. INDIRECT SHELL EXECUTION:
|
|
32
|
+
- ScriptEngine eval with user input
|
|
33
|
+
- GroovyShell execution
|
|
34
|
+
- Jenkins sh(), bat() pipeline steps
|
|
35
|
+
- Kubernetes/Docker command builders
|
|
36
|
+
|
|
37
|
+
4. SANITIZATION BYPASSES:
|
|
38
|
+
- Incomplete blocklist (missing ; but having |)
|
|
39
|
+
- Case-insensitive bypass
|
|
40
|
+
- Unicode/encoding bypass
|
|
41
|
+
- Double encoding
|
|
42
|
+
|
|
43
|
+
COMMON FALSE NEGATIVES TO FIND:
|
|
44
|
+
- "args" parameter to ProcessBuilder that's actually a shell string
|
|
45
|
+
- "safe" wrappers that don't actually sanitize
|
|
46
|
+
- Validation that checks wrong property (e.g., length instead of content)`,
|
|
47
|
+
'CWE-079': `XSS DISCOVERY (CWE-79)
|
|
48
|
+
|
|
49
|
+
Look for these SUBTLE vulnerabilities that static analysis misses:
|
|
50
|
+
|
|
51
|
+
1. CONTEXT-SPECIFIC ENCODING BUGS:
|
|
52
|
+
- HTML attribute values need attribute encoding, not HTML encoding
|
|
53
|
+
- JavaScript context needs JS encoding, not HTML encoding
|
|
54
|
+
- URL parameters need URL encoding
|
|
55
|
+
- CSS context needs CSS encoding
|
|
56
|
+
|
|
57
|
+
2. INCOMPLETE SANITIZATION:
|
|
58
|
+
- HTML encoding but output in onclick handler
|
|
59
|
+
- Sanitizing < > but not quotes in attributes
|
|
60
|
+
- Strip tags but allows event handlers
|
|
61
|
+
- JSoup.clean() with permissive whitelist
|
|
62
|
+
|
|
63
|
+
3. DOM-BASED XSS:
|
|
64
|
+
- Server-side reflection to client-side sinks
|
|
65
|
+
- Data passed to client without encoding
|
|
66
|
+
- Template literal injection
|
|
67
|
+
|
|
68
|
+
4. BYPASSES:
|
|
69
|
+
- innerHTML with "text" that's actually HTML
|
|
70
|
+
- React dangerouslySetInnerHTML
|
|
71
|
+
- Template engines with raw output mode
|
|
72
|
+
- SVG/MathML vectors
|
|
73
|
+
|
|
74
|
+
COMMON FALSE NEGATIVES TO FIND:
|
|
75
|
+
- Response.getWriter() that outputs to wrong context
|
|
76
|
+
- Encoding for wrong context (HTML-encoding for JS)
|
|
77
|
+
- Partial encoding that misses edge cases`,
|
|
78
|
+
'CWE-022': `PATH TRAVERSAL DISCOVERY (CWE-22)
|
|
79
|
+
|
|
80
|
+
Look for these SUBTLE vulnerabilities that static analysis misses:
|
|
81
|
+
|
|
82
|
+
1. VALIDATION BYPASSES:
|
|
83
|
+
- Path normalized AFTER check, not before
|
|
84
|
+
- startsWith() check with wrong base path
|
|
85
|
+
- Checking for ".." but not URL-encoded forms
|
|
86
|
+
- getCanonicalPath() result not validated
|
|
87
|
+
|
|
88
|
+
2. DOUBLE ENCODING:
|
|
89
|
+
- %252e%252e%252f (double URL-encoded ../)
|
|
90
|
+
- Mixed encoding (..%2f or %2e./)
|
|
91
|
+
- Unicode normalization issues
|
|
92
|
+
|
|
93
|
+
3. SYMLINK ATTACKS:
|
|
94
|
+
- Path validated but follows symlinks outside boundary
|
|
95
|
+
- TOCTOU between validation and use
|
|
96
|
+
|
|
97
|
+
4. NULL BYTE INJECTION:
|
|
98
|
+
- file.txt%00.jpg truncates at null on some systems
|
|
99
|
+
|
|
100
|
+
5. ALTERNATIVE SEPARATORS:
|
|
101
|
+
- Windows accepts both / and \\
|
|
102
|
+
- UNC paths: \\\\server\\share
|
|
103
|
+
|
|
104
|
+
COMMON FALSE NEGATIVES TO FIND:
|
|
105
|
+
- Validation order issues (check then normalize vs normalize then check)
|
|
106
|
+
- Missing validation for certain code paths`,
|
|
107
|
+
'CWE-094': `CODE INJECTION DISCOVERY (CWE-94)
|
|
108
|
+
|
|
109
|
+
Look for these SUBTLE vulnerabilities that static analysis misses:
|
|
110
|
+
|
|
111
|
+
1. DYNAMIC CODE EXECUTION:
|
|
112
|
+
- Expression language evaluation (EL, SpEL, OGNL, MVEL)
|
|
113
|
+
- Template engines with unsafe modes
|
|
114
|
+
- Reflection with user-controlled class/method names
|
|
115
|
+
|
|
116
|
+
2. DESERIALIZATION:
|
|
117
|
+
- ObjectInputStream on untrusted data
|
|
118
|
+
- XMLDecoder, XStream without type filtering
|
|
119
|
+
- JSON with polymorphic type handling
|
|
120
|
+
- YAML with unsafe load (not SafeYAML)
|
|
121
|
+
|
|
122
|
+
3. SCRIPTING ENGINES:
|
|
123
|
+
- ScriptEngine.eval() with user input
|
|
124
|
+
- Nashorn JavaScript execution
|
|
125
|
+
- Groovy shell evaluation
|
|
126
|
+
|
|
127
|
+
4. RUNTIME COMPILATION:
|
|
128
|
+
- JavaCompiler with user-controlled code
|
|
129
|
+
- Dynamic class loading
|
|
130
|
+
|
|
131
|
+
COMMON FALSE NEGATIVES TO FIND:
|
|
132
|
+
- Deserializers that look safe but have gadget chains
|
|
133
|
+
- Expression languages in unexpected places`,
|
|
134
|
+
};
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// Discovery Engine
|
|
137
|
+
// ============================================================================
|
|
138
|
+
export class DiscoveryEngine {
|
|
139
|
+
client;
|
|
140
|
+
verbose;
|
|
141
|
+
constructor(client, config) {
|
|
142
|
+
this.client = client || getAxLLMClient(config);
|
|
143
|
+
this.verbose = false;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Discover vulnerabilities in methods with no static findings
|
|
147
|
+
*/
|
|
148
|
+
async discoverInFile(ir, code, filePath, options = {}) {
|
|
149
|
+
const results = [];
|
|
150
|
+
this.verbose = options.verbose ?? false;
|
|
151
|
+
// Extract methods from IR
|
|
152
|
+
const methods = this.extractMethods(ir, code, options);
|
|
153
|
+
if (this.verbose) {
|
|
154
|
+
console.log(`[Discovery] Analyzing ${methods.length} methods in ${filePath}`);
|
|
155
|
+
}
|
|
156
|
+
// Determine which CWEs to focus on
|
|
157
|
+
const targetCWEs = options.targetCWEs || ['CWE-078', 'CWE-079', 'CWE-022', 'CWE-094'];
|
|
158
|
+
const timeout = options.timeoutPerMethod || 30000;
|
|
159
|
+
// Analyze each method
|
|
160
|
+
for (const method of methods) {
|
|
161
|
+
if (this.verbose) {
|
|
162
|
+
console.log(`[Discovery] Analyzing ${method.className}.${method.methodName}`);
|
|
163
|
+
}
|
|
164
|
+
const startTime = Date.now();
|
|
165
|
+
try {
|
|
166
|
+
const result = await Promise.race([
|
|
167
|
+
this.analyzeMethod(method, targetCWEs, options),
|
|
168
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Discovery timeout')), timeout)),
|
|
169
|
+
]);
|
|
170
|
+
result.discoveryTimeMs = Date.now() - startTime;
|
|
171
|
+
results.push(result);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (this.verbose) {
|
|
175
|
+
console.log(`[Discovery] Failed for ${method.className}.${method.methodName}: ${error}`);
|
|
176
|
+
}
|
|
177
|
+
results.push({
|
|
178
|
+
methodId: `${method.className}.${method.methodName}`,
|
|
179
|
+
vulnerabilityFound: false,
|
|
180
|
+
reasoning: `Discovery failed: ${error}`,
|
|
181
|
+
confidence: 0,
|
|
182
|
+
discoveryTimeMs: Date.now() - startTime,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Analyze a single method for vulnerabilities
|
|
190
|
+
*/
|
|
191
|
+
async analyzeMethod(method, targetCWEs, options) {
|
|
192
|
+
const methodId = `${method.className}.${method.methodName}`;
|
|
193
|
+
const confidenceThreshold = options.confidenceThreshold ?? 0.6;
|
|
194
|
+
// Build the discovery prompt
|
|
195
|
+
const cweGuidance = targetCWEs
|
|
196
|
+
.map(cwe => CWE_DISCOVERY_PROMPTS[cwe] || '')
|
|
197
|
+
.filter(p => p)
|
|
198
|
+
.join('\n\n---\n\n');
|
|
199
|
+
const systemPrompt = `You are a security expert performing deep code analysis to find vulnerabilities that automated tools miss.
|
|
200
|
+
|
|
201
|
+
${cweGuidance}
|
|
202
|
+
|
|
203
|
+
ANALYSIS APPROACH:
|
|
204
|
+
1. Identify all potential sources of untrusted data
|
|
205
|
+
2. Trace data flow manually through the code
|
|
206
|
+
3. Check for ALL the subtle patterns described above
|
|
207
|
+
4. Consider what an attacker could control and how they could exploit it
|
|
208
|
+
|
|
209
|
+
IMPORTANT: Only report vulnerabilities you are confident about. False positives waste time.
|
|
210
|
+
Be specific about the vulnerability type and how it could be exploited.`;
|
|
211
|
+
const userPrompt = `Analyze this Java method for security vulnerabilities:
|
|
212
|
+
|
|
213
|
+
Class: ${method.className}
|
|
214
|
+
Method: ${method.methodName}
|
|
215
|
+
Annotations: ${method.annotations.join(', ') || 'none'}
|
|
216
|
+
Imports: ${method.imports.slice(0, 20).join(', ')}
|
|
217
|
+
|
|
218
|
+
\`\`\`java
|
|
219
|
+
${method.methodCode}
|
|
220
|
+
\`\`\`
|
|
221
|
+
|
|
222
|
+
Does this method contain any security vulnerabilities (${targetCWEs.join(', ')})?
|
|
223
|
+
|
|
224
|
+
Respond in JSON:
|
|
225
|
+
{
|
|
226
|
+
"vulnerabilityFound": true/false,
|
|
227
|
+
"vulnerability": {
|
|
228
|
+
"type": "command_injection|xss|path_traversal|code_injection|...",
|
|
229
|
+
"cwe": "CWE-XXX",
|
|
230
|
+
"severity": "critical|high|medium|low",
|
|
231
|
+
"line": <line number>,
|
|
232
|
+
"code": "vulnerable code snippet",
|
|
233
|
+
"description": "what the vulnerability is",
|
|
234
|
+
"attackVector": "how to exploit it",
|
|
235
|
+
"remediation": "how to fix it",
|
|
236
|
+
"source": {
|
|
237
|
+
"line": <source line>,
|
|
238
|
+
"type": "http_param|http_body|...",
|
|
239
|
+
"variable": "variable name"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"reasoning": "detailed analysis",
|
|
243
|
+
"confidence": 0.0-1.0
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
If no vulnerability found, respond:
|
|
247
|
+
{
|
|
248
|
+
"vulnerabilityFound": false,
|
|
249
|
+
"reasoning": "why this code is safe",
|
|
250
|
+
"confidence": 1.0
|
|
251
|
+
}`;
|
|
252
|
+
try {
|
|
253
|
+
// Make LLM call using the raw chat JSON method
|
|
254
|
+
const response = await this.callLLMForDiscovery(systemPrompt, userPrompt);
|
|
255
|
+
if (!response) {
|
|
256
|
+
return {
|
|
257
|
+
methodId,
|
|
258
|
+
vulnerabilityFound: false,
|
|
259
|
+
reasoning: 'LLM call failed',
|
|
260
|
+
confidence: 0,
|
|
261
|
+
discoveryTimeMs: 0,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Process the response
|
|
265
|
+
const vulnerabilityFound = response.vulnerabilityFound === true;
|
|
266
|
+
const confidence = typeof response.confidence === 'number' ? response.confidence : 0.5;
|
|
267
|
+
// Filter by confidence threshold
|
|
268
|
+
if (vulnerabilityFound && confidence < confidenceThreshold) {
|
|
269
|
+
return {
|
|
270
|
+
methodId,
|
|
271
|
+
vulnerabilityFound: false,
|
|
272
|
+
reasoning: `Potential vulnerability below confidence threshold (${confidence} < ${confidenceThreshold}): ${response.reasoning}`,
|
|
273
|
+
confidence,
|
|
274
|
+
discoveryTimeMs: 0,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const result = {
|
|
278
|
+
methodId,
|
|
279
|
+
vulnerabilityFound,
|
|
280
|
+
reasoning: response.reasoning || '',
|
|
281
|
+
confidence,
|
|
282
|
+
discoveryTimeMs: 0,
|
|
283
|
+
};
|
|
284
|
+
if (vulnerabilityFound && response.vulnerability) {
|
|
285
|
+
result.vulnerability = {
|
|
286
|
+
type: this.normalizeSinkType(response.vulnerability.type),
|
|
287
|
+
cwe: response.vulnerability.cwe || 'CWE-unknown',
|
|
288
|
+
severity: this.normalizeSeverity(response.vulnerability.severity),
|
|
289
|
+
line: response.vulnerability.line || method.startLine,
|
|
290
|
+
code: response.vulnerability.code || '',
|
|
291
|
+
description: response.vulnerability.description || '',
|
|
292
|
+
attackVector: response.vulnerability.attackVector,
|
|
293
|
+
remediation: response.vulnerability.remediation || 'Review and fix the vulnerability',
|
|
294
|
+
source: response.vulnerability.source,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return result;
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
return {
|
|
301
|
+
methodId,
|
|
302
|
+
vulnerabilityFound: false,
|
|
303
|
+
reasoning: `Analysis error: ${error}`,
|
|
304
|
+
confidence: 0,
|
|
305
|
+
discoveryTimeMs: 0,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Call LLM for discovery analysis via AxLLMClient
|
|
311
|
+
* Uses chatJSON for circuit breaker, JSON recovery, retry, and timeout handling
|
|
312
|
+
*/
|
|
313
|
+
async callLLMForDiscovery(systemPrompt, userPrompt) {
|
|
314
|
+
return this.client.chatJSON(systemPrompt, userPrompt, 'verification');
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Extract methods from IR and code
|
|
318
|
+
*/
|
|
319
|
+
extractMethods(ir, code, options) {
|
|
320
|
+
const methods = [];
|
|
321
|
+
const lines = code.split('\n');
|
|
322
|
+
const maxMethods = options.maxMethodsPerFile ?? 50;
|
|
323
|
+
const includeWithFindings = options.includeMethodsWithFindings ?? false;
|
|
324
|
+
// Get lines with findings
|
|
325
|
+
const linesWithFindings = new Set();
|
|
326
|
+
if (!includeWithFindings) {
|
|
327
|
+
for (const source of ir.taint.sources) {
|
|
328
|
+
linesWithFindings.add(source.line);
|
|
329
|
+
}
|
|
330
|
+
for (const sink of ir.taint.sinks) {
|
|
331
|
+
linesWithFindings.add(sink.line);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Extract methods from types
|
|
335
|
+
for (const type of ir.types) {
|
|
336
|
+
if (type.kind !== 'class')
|
|
337
|
+
continue;
|
|
338
|
+
const className = type.name;
|
|
339
|
+
const classAnnotations = type.annotations?.map(a => `@${a}`) || [];
|
|
340
|
+
const imports = ir.imports.map(i => i.imported_name);
|
|
341
|
+
for (const method of type.methods) {
|
|
342
|
+
// Check if method has existing findings
|
|
343
|
+
const hasExistingFindings = !includeWithFindings &&
|
|
344
|
+
method.start_line !== undefined &&
|
|
345
|
+
method.end_line !== undefined &&
|
|
346
|
+
Array.from(linesWithFindings).some(line => line >= method.start_line && line <= method.end_line);
|
|
347
|
+
// Skip methods with existing findings unless configured otherwise
|
|
348
|
+
if (hasExistingFindings && !includeWithFindings) {
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
// Extract method code
|
|
352
|
+
const startLine = method.start_line;
|
|
353
|
+
const endLine = method.end_line ?? startLine + 20;
|
|
354
|
+
const methodCode = lines.slice(startLine - 1, endLine).join('\n');
|
|
355
|
+
// Skip very short methods (likely getters/setters)
|
|
356
|
+
if (methodCode.split('\n').length < 3) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
// Skip common safe patterns
|
|
360
|
+
if (this.isLikelySafeMethod(method.name, methodCode)) {
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
methods.push({
|
|
364
|
+
className,
|
|
365
|
+
methodName: method.name,
|
|
366
|
+
methodCode,
|
|
367
|
+
startLine,
|
|
368
|
+
endLine,
|
|
369
|
+
annotations: [
|
|
370
|
+
...classAnnotations,
|
|
371
|
+
...(method.annotations?.map(a => `@${a}`) || []),
|
|
372
|
+
],
|
|
373
|
+
imports,
|
|
374
|
+
hasExistingFindings,
|
|
375
|
+
});
|
|
376
|
+
if (methods.length >= maxMethods) {
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (methods.length >= maxMethods) {
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return methods;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Check if a method is likely safe (simple getter/setter/constructor)
|
|
388
|
+
*/
|
|
389
|
+
isLikelySafeMethod(methodName, methodCode) {
|
|
390
|
+
const lowerName = methodName.toLowerCase();
|
|
391
|
+
// Skip common safe patterns
|
|
392
|
+
if (lowerName.startsWith('get') && methodCode.includes('return this.')) {
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
if (lowerName.startsWith('set') && !methodCode.includes('exec') && !methodCode.includes('eval')) {
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
if (lowerName === 'tostring' || lowerName === 'hashcode' || lowerName === 'equals') {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Normalize sink type string
|
|
405
|
+
*/
|
|
406
|
+
normalizeSinkType(type) {
|
|
407
|
+
const lower = (type || '').toLowerCase().replace(/[_-]/g, '_');
|
|
408
|
+
const typeMap = {
|
|
409
|
+
'command_injection': 'command_injection',
|
|
410
|
+
'cmd_injection': 'command_injection',
|
|
411
|
+
'os_command': 'command_injection',
|
|
412
|
+
'xss': 'xss',
|
|
413
|
+
'cross_site_scripting': 'xss',
|
|
414
|
+
'path_traversal': 'path_traversal',
|
|
415
|
+
'directory_traversal': 'path_traversal',
|
|
416
|
+
'lfi': 'path_traversal',
|
|
417
|
+
'code_injection': 'code_injection',
|
|
418
|
+
'remote_code_execution': 'code_injection',
|
|
419
|
+
'rce': 'code_injection',
|
|
420
|
+
'sql_injection': 'sql_injection',
|
|
421
|
+
'sqli': 'sql_injection',
|
|
422
|
+
'deserialization': 'deserialization',
|
|
423
|
+
'insecure_deserialization': 'deserialization',
|
|
424
|
+
'xxe': 'xxe',
|
|
425
|
+
'xml_external_entity': 'xxe',
|
|
426
|
+
'ssrf': 'ssrf',
|
|
427
|
+
'server_side_request_forgery': 'ssrf',
|
|
428
|
+
};
|
|
429
|
+
return typeMap[lower] || 'code_injection';
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Normalize severity string
|
|
433
|
+
*/
|
|
434
|
+
normalizeSeverity(severity) {
|
|
435
|
+
const lower = (severity || '').toLowerCase();
|
|
436
|
+
if (lower === 'critical')
|
|
437
|
+
return 'critical';
|
|
438
|
+
if (lower === 'high')
|
|
439
|
+
return 'high';
|
|
440
|
+
if (lower === 'medium' || lower === 'moderate')
|
|
441
|
+
return 'medium';
|
|
442
|
+
return 'low';
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// ============================================================================
|
|
446
|
+
// Convenience Functions
|
|
447
|
+
// ============================================================================
|
|
448
|
+
/**
|
|
449
|
+
* Get a new discovery engine instance
|
|
450
|
+
* Always creates a fresh instance for per-request isolation
|
|
451
|
+
*/
|
|
452
|
+
export function getDiscoveryEngine(config, client) {
|
|
453
|
+
return new DiscoveryEngine(client, config);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Discover vulnerabilities in a file
|
|
457
|
+
*/
|
|
458
|
+
export async function discoverVulnerabilities(ir, code, filePath, options) {
|
|
459
|
+
return getDiscoveryEngine().discoverInFile(ir, code, filePath, options);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Convert discovery results to findings
|
|
463
|
+
*/
|
|
464
|
+
export function discoveryResultsToFindings(results, filePath) {
|
|
465
|
+
const findings = [];
|
|
466
|
+
for (const result of results) {
|
|
467
|
+
if (result.vulnerabilityFound && result.vulnerability) {
|
|
468
|
+
const vuln = result.vulnerability;
|
|
469
|
+
findings.push({
|
|
470
|
+
id: `discovery-${filePath}:${vuln.line}-${vuln.type}`,
|
|
471
|
+
type: vuln.type,
|
|
472
|
+
cwe: vuln.cwe,
|
|
473
|
+
severity: vuln.severity,
|
|
474
|
+
confidence: result.confidence,
|
|
475
|
+
source: vuln.source
|
|
476
|
+
? {
|
|
477
|
+
file: filePath,
|
|
478
|
+
line: vuln.source.line,
|
|
479
|
+
code: vuln.source.variable,
|
|
480
|
+
}
|
|
481
|
+
: {
|
|
482
|
+
file: filePath,
|
|
483
|
+
line: vuln.line,
|
|
484
|
+
code: 'user input',
|
|
485
|
+
},
|
|
486
|
+
sink: {
|
|
487
|
+
file: filePath,
|
|
488
|
+
line: vuln.line,
|
|
489
|
+
code: vuln.code,
|
|
490
|
+
},
|
|
491
|
+
path: [],
|
|
492
|
+
exploitable: vuln.severity === 'critical' || vuln.severity === 'high',
|
|
493
|
+
explanation: `[LLM Discovery] ${vuln.description}\n\nReasoning: ${result.reasoning}`,
|
|
494
|
+
remediation: vuln.remediation,
|
|
495
|
+
verification: {
|
|
496
|
+
graph_path_exists: true,
|
|
497
|
+
llm_verified: true,
|
|
498
|
+
llm_confidence: result.confidence,
|
|
499
|
+
},
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return findings;
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/llm/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Enrichment Engine (Phase 1)
|
|
3
|
+
*
|
|
4
|
+
* Uses LLM to discover:
|
|
5
|
+
* - Taint sources beyond YAML patterns
|
|
6
|
+
* - Taint sinks beyond YAML patterns
|
|
7
|
+
* - Class/method roles (controller, service, repository)
|
|
8
|
+
* - Virtual call resolution
|
|
9
|
+
*
|
|
10
|
+
* Supports language-aware prompts for Java, Python, JavaScript/TypeScript, and Rust.
|
|
11
|
+
*/
|
|
12
|
+
import { type AxLLMClient } from './ax-client.js';
|
|
13
|
+
import type { TypeInfo, MethodInfo, CallInfo, TaintSource, TaintSink, SupportedLanguage } from 'circle-ir';
|
|
14
|
+
export interface RoleClassificationResult {
|
|
15
|
+
role: 'controller' | 'service' | 'repository' | 'utility' | 'entity' | 'unknown';
|
|
16
|
+
confidence: number;
|
|
17
|
+
reasoning: string;
|
|
18
|
+
indicators: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface DiscoveredSource {
|
|
21
|
+
line: number;
|
|
22
|
+
variable: string;
|
|
23
|
+
type: string;
|
|
24
|
+
method?: string;
|
|
25
|
+
confidence: number;
|
|
26
|
+
reasoning: string;
|
|
27
|
+
}
|
|
28
|
+
export interface DiscoveredSink {
|
|
29
|
+
line: number;
|
|
30
|
+
method: string;
|
|
31
|
+
type: string;
|
|
32
|
+
cwe: string;
|
|
33
|
+
argPositions: number[];
|
|
34
|
+
confidence: number;
|
|
35
|
+
reasoning: string;
|
|
36
|
+
}
|
|
37
|
+
export interface VirtualCallResolution {
|
|
38
|
+
callLine: number;
|
|
39
|
+
interfaceType: string;
|
|
40
|
+
resolvedImplementation: string;
|
|
41
|
+
confidence: number;
|
|
42
|
+
reasoning: string;
|
|
43
|
+
}
|
|
44
|
+
export interface EnrichmentResult {
|
|
45
|
+
role?: RoleClassificationResult;
|
|
46
|
+
additionalSources: DiscoveredSource[];
|
|
47
|
+
additionalSinks: DiscoveredSink[];
|
|
48
|
+
virtualCallResolutions: VirtualCallResolution[];
|
|
49
|
+
framework?: {
|
|
50
|
+
name: string;
|
|
51
|
+
version?: string;
|
|
52
|
+
confidence: number;
|
|
53
|
+
};
|
|
54
|
+
enrichedAt: string;
|
|
55
|
+
modelUsed: string;
|
|
56
|
+
}
|
|
57
|
+
export declare class EnrichmentEngine {
|
|
58
|
+
private client;
|
|
59
|
+
private config;
|
|
60
|
+
private language;
|
|
61
|
+
constructor(client?: AxLLMClient, language?: SupportedLanguage);
|
|
62
|
+
/**
|
|
63
|
+
* Set the language for enrichment (affects prompts)
|
|
64
|
+
*/
|
|
65
|
+
setLanguage(language: SupportedLanguage): void;
|
|
66
|
+
/**
|
|
67
|
+
* Get the current language context
|
|
68
|
+
*/
|
|
69
|
+
getLanguageContext(): import("./language-context.js").LanguageContext;
|
|
70
|
+
/**
|
|
71
|
+
* Classify the role of a class
|
|
72
|
+
*/
|
|
73
|
+
classifyRole(className: string, methods: MethodInfo[], annotations: string[], imports: string[]): Promise<RoleClassificationResult | undefined>;
|
|
74
|
+
/**
|
|
75
|
+
* Discover additional taint sources in a method
|
|
76
|
+
*/
|
|
77
|
+
discoverSources(methodCode: string, methodName: string, classRole: string, existingSources: TaintSource[]): Promise<DiscoveredSource[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Discover additional taint sinks in a method
|
|
80
|
+
*/
|
|
81
|
+
discoverSinks(methodCode: string, methodName: string, methodCalls: CallInfo[], existingSinks: TaintSink[]): Promise<DiscoveredSink[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Resolve virtual/interface method calls to implementations
|
|
84
|
+
*/
|
|
85
|
+
resolveVirtualCall(callExpression: string, interfaceType: string, availableImplementations: string[], context: string): Promise<VirtualCallResolution | undefined>;
|
|
86
|
+
/**
|
|
87
|
+
* Enrich a complete type (class/interface)
|
|
88
|
+
*/
|
|
89
|
+
enrichType(type: TypeInfo, sourceCode: string, imports: string[], existingSources: TaintSource[], existingSinks: TaintSink[]): Promise<EnrichmentResult>;
|
|
90
|
+
/**
|
|
91
|
+
* Batch methods for efficient LLM calls
|
|
92
|
+
*/
|
|
93
|
+
private batchMethods;
|
|
94
|
+
/**
|
|
95
|
+
* Extract method code from source
|
|
96
|
+
*/
|
|
97
|
+
private extractMethodCode;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get a new enrichment engine instance for a specific language
|
|
101
|
+
* Always creates a fresh instance for per-request isolation
|
|
102
|
+
*/
|
|
103
|
+
export declare function getEnrichmentEngine(language?: SupportedLanguage, client?: AxLLMClient): EnrichmentEngine;
|
|
104
|
+
/**
|
|
105
|
+
* Enrich a type with LLM-discovered sources/sinks
|
|
106
|
+
*/
|
|
107
|
+
export declare function enrichType(type: TypeInfo, sourceCode: string, imports: string[], existingSources: TaintSource[], existingSinks: TaintSink[], language?: SupportedLanguage): Promise<EnrichmentResult>;
|
|
108
|
+
//# sourceMappingURL=enrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichment.d.ts","sourceRoot":"","sources":["../../src/llm/enrichment.ts"],"names":[],"mappings":"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"}
|