@oculum/scanner 1.0.12 → 1.0.13
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/dist/detect/ai-code/agent-tools.d.ts +22 -0
- package/dist/detect/ai-code/agent-tools.d.ts.map +1 -0
- package/dist/detect/ai-code/agent-tools.js +1509 -0
- package/dist/detect/ai-code/agent-tools.js.map +1 -0
- package/dist/detect/ai-code/byok-patterns.d.ts +15 -0
- package/dist/detect/ai-code/byok-patterns.d.ts.map +1 -0
- package/dist/detect/ai-code/byok-patterns.js +313 -0
- package/dist/detect/ai-code/byok-patterns.js.map +1 -0
- package/dist/detect/ai-code/endpoint-protection.d.ts +38 -0
- package/dist/detect/ai-code/endpoint-protection.d.ts.map +1 -0
- package/dist/detect/ai-code/endpoint-protection.js +349 -0
- package/dist/detect/ai-code/endpoint-protection.js.map +1 -0
- package/dist/detect/ai-code/execution-sinks.d.ts +21 -0
- package/dist/detect/ai-code/execution-sinks.d.ts.map +1 -0
- package/dist/detect/ai-code/execution-sinks.js +1158 -0
- package/dist/detect/ai-code/execution-sinks.js.map +1 -0
- package/dist/detect/ai-code/fingerprinting.d.ts +10 -0
- package/dist/detect/ai-code/fingerprinting.d.ts.map +1 -0
- package/dist/detect/ai-code/fingerprinting.js +665 -0
- package/dist/detect/ai-code/fingerprinting.js.map +1 -0
- package/dist/detect/ai-code/index.d.ts +12 -0
- package/dist/detect/ai-code/index.d.ts.map +1 -0
- package/dist/detect/ai-code/index.js +26 -0
- package/dist/detect/ai-code/index.js.map +1 -0
- package/dist/detect/ai-code/mcp-security.d.ts +20 -0
- package/dist/detect/ai-code/mcp-security.d.ts.map +1 -0
- package/dist/detect/ai-code/mcp-security.js +880 -0
- package/dist/detect/ai-code/mcp-security.js.map +1 -0
- package/dist/detect/ai-code/model-supply-chain.d.ts +23 -0
- package/dist/detect/ai-code/model-supply-chain.d.ts.map +1 -0
- package/dist/detect/ai-code/model-supply-chain.js +447 -0
- package/dist/detect/ai-code/model-supply-chain.js.map +1 -0
- package/dist/detect/ai-code/package-hallucination.d.ts +22 -0
- package/dist/detect/ai-code/package-hallucination.d.ts.map +1 -0
- package/dist/detect/ai-code/package-hallucination.js +841 -0
- package/dist/detect/ai-code/package-hallucination.js.map +1 -0
- package/dist/detect/ai-code/prompt-hygiene.d.ts +22 -0
- package/dist/detect/ai-code/prompt-hygiene.d.ts.map +1 -0
- package/dist/detect/ai-code/prompt-hygiene.js +1177 -0
- package/dist/detect/ai-code/prompt-hygiene.js.map +1 -0
- package/dist/detect/ai-code/rag-safety.d.ts +24 -0
- package/dist/detect/ai-code/rag-safety.d.ts.map +1 -0
- package/dist/detect/ai-code/rag-safety.js +913 -0
- package/dist/detect/ai-code/rag-safety.js.map +1 -0
- package/dist/detect/ai-code/schema-validation.d.ts +28 -0
- package/dist/detect/ai-code/schema-validation.d.ts.map +1 -0
- package/dist/detect/ai-code/schema-validation.js +378 -0
- package/dist/detect/ai-code/schema-validation.js.map +1 -0
- package/dist/detect/config/agent-skill-injection.d.ts +27 -0
- package/dist/detect/config/agent-skill-injection.d.ts.map +1 -0
- package/dist/detect/config/agent-skill-injection.js +472 -0
- package/dist/detect/config/agent-skill-injection.js.map +1 -0
- package/dist/detect/config/comments.d.ts +11 -0
- package/dist/detect/config/comments.d.ts.map +1 -0
- package/dist/detect/config/comments.js +206 -0
- package/dist/detect/config/comments.js.map +1 -0
- package/dist/detect/config/file-flags.d.ts +10 -0
- package/dist/detect/config/file-flags.d.ts.map +1 -0
- package/dist/detect/config/file-flags.js +124 -0
- package/dist/detect/config/file-flags.js.map +1 -0
- package/dist/detect/config/index.d.ts +7 -0
- package/dist/detect/config/index.d.ts.map +1 -0
- package/dist/detect/config/index.js +17 -0
- package/dist/detect/config/index.js.map +1 -0
- package/dist/detect/config/osv-check.d.ts +75 -0
- package/dist/detect/config/osv-check.d.ts.map +1 -0
- package/dist/detect/config/osv-check.js +309 -0
- package/dist/detect/config/osv-check.js.map +1 -0
- package/dist/detect/config/package-check.d.ts +63 -0
- package/dist/detect/config/package-check.d.ts.map +1 -0
- package/dist/detect/config/package-check.js +509 -0
- package/dist/detect/config/package-check.js.map +1 -0
- package/dist/detect/config/urls.d.ts +11 -0
- package/dist/detect/config/urls.d.ts.map +1 -0
- package/dist/detect/config/urls.js +450 -0
- package/dist/detect/config/urls.js.map +1 -0
- package/dist/detect/index.d.ts +37 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +77 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/detect/secrets/config-audit.d.ts +11 -0
- package/dist/detect/secrets/config-audit.d.ts.map +1 -0
- package/dist/detect/secrets/config-audit.js +315 -0
- package/dist/detect/secrets/config-audit.js.map +1 -0
- package/dist/detect/secrets/config-mcp-audit.d.ts +23 -0
- package/dist/detect/secrets/config-mcp-audit.d.ts.map +1 -0
- package/dist/detect/secrets/config-mcp-audit.js +243 -0
- package/dist/detect/secrets/config-mcp-audit.js.map +1 -0
- package/dist/detect/secrets/entropy.d.ts +11 -0
- package/dist/detect/secrets/entropy.d.ts.map +1 -0
- package/dist/detect/secrets/entropy.js +751 -0
- package/dist/detect/secrets/entropy.js.map +1 -0
- package/dist/detect/secrets/index.d.ts +36 -0
- package/dist/detect/secrets/index.d.ts.map +1 -0
- package/dist/detect/secrets/index.js +174 -0
- package/dist/detect/secrets/index.js.map +1 -0
- package/dist/detect/secrets/patterns.d.ts +11 -0
- package/dist/detect/secrets/patterns.d.ts.map +1 -0
- package/dist/detect/secrets/patterns.js +518 -0
- package/dist/detect/secrets/patterns.js.map +1 -0
- package/dist/detect/secrets/weak-crypto.d.ts +10 -0
- package/dist/detect/secrets/weak-crypto.d.ts.map +1 -0
- package/dist/detect/secrets/weak-crypto.js +432 -0
- package/dist/detect/secrets/weak-crypto.js.map +1 -0
- package/dist/detect/structural/auth-patterns.d.ts +22 -0
- package/dist/detect/structural/auth-patterns.d.ts.map +1 -0
- package/dist/detect/structural/auth-patterns.js +533 -0
- package/dist/detect/structural/auth-patterns.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/child-process.d.ts +16 -0
- package/dist/detect/structural/dangerous-functions/child-process.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/child-process.js +74 -0
- package/dist/detect/structural/dangerous-functions/child-process.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.d.ts +34 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.js +230 -0
- package/dist/detect/structural/dangerous-functions/dom-xss.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/index.d.ts +16 -0
- package/dist/detect/structural/dangerous-functions/index.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/index.js +1193 -0
- package/dist/detect/structural/dangerous-functions/index.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/json-parse.d.ts +31 -0
- package/dist/detect/structural/dangerous-functions/json-parse.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/json-parse.js +326 -0
- package/dist/detect/structural/dangerous-functions/json-parse.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/math-random.d.ts +111 -0
- package/dist/detect/structural/dangerous-functions/math-random.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/math-random.js +684 -0
- package/dist/detect/structural/dangerous-functions/math-random.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/patterns.d.ts +21 -0
- package/dist/detect/structural/dangerous-functions/patterns.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/patterns.js +163 -0
- package/dist/detect/structural/dangerous-functions/patterns.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/request-validation.d.ts +13 -0
- package/dist/detect/structural/dangerous-functions/request-validation.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/request-validation.js +126 -0
- package/dist/detect/structural/dangerous-functions/request-validation.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts +24 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.js +70 -0
- package/dist/detect/structural/dangerous-functions/utils/control-flow.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts +31 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.js +147 -0
- package/dist/detect/structural/dangerous-functions/utils/helpers.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/index.d.ts +9 -0
- package/dist/detect/structural/dangerous-functions/utils/index.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/index.js +23 -0
- package/dist/detect/structural/dangerous-functions/utils/index.js.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts +22 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.js +102 -0
- package/dist/detect/structural/dangerous-functions/utils/schema-validation.js.map +1 -0
- package/dist/detect/structural/data-exposure.d.ts +19 -0
- package/dist/detect/structural/data-exposure.d.ts.map +1 -0
- package/dist/detect/structural/data-exposure.js +262 -0
- package/dist/detect/structural/data-exposure.js.map +1 -0
- package/dist/detect/structural/framework-checks.d.ts +10 -0
- package/dist/detect/structural/framework-checks.d.ts.map +1 -0
- package/dist/detect/structural/framework-checks.js +389 -0
- package/dist/detect/structural/framework-checks.js.map +1 -0
- package/dist/detect/structural/index.d.ts +71 -0
- package/dist/detect/structural/index.d.ts.map +1 -0
- package/dist/detect/structural/index.js +510 -0
- package/dist/detect/structural/index.js.map +1 -0
- package/dist/detect/structural/log-injection.d.ts +18 -0
- package/dist/detect/structural/log-injection.d.ts.map +1 -0
- package/dist/detect/structural/log-injection.js +217 -0
- package/dist/detect/structural/log-injection.js.map +1 -0
- package/dist/detect/structural/logic-gates.d.ts +10 -0
- package/dist/detect/structural/logic-gates.d.ts.map +1 -0
- package/dist/detect/structural/logic-gates.js +227 -0
- package/dist/detect/structural/logic-gates.js.map +1 -0
- package/dist/detect/structural/risky-imports.d.ts +10 -0
- package/dist/detect/structural/risky-imports.d.ts.map +1 -0
- package/dist/detect/structural/risky-imports.js +168 -0
- package/dist/detect/structural/risky-imports.js.map +1 -0
- package/dist/detect/structural/security-headers.d.ts +18 -0
- package/dist/detect/structural/security-headers.d.ts.map +1 -0
- package/dist/detect/structural/security-headers.js +196 -0
- package/dist/detect/structural/security-headers.js.map +1 -0
- package/dist/detect/structural/ssrf-detection.d.ts +18 -0
- package/dist/detect/structural/ssrf-detection.d.ts.map +1 -0
- package/dist/detect/structural/ssrf-detection.js +263 -0
- package/dist/detect/structural/ssrf-detection.js.map +1 -0
- package/dist/detect/structural/variables.d.ts +11 -0
- package/dist/detect/structural/variables.d.ts.map +1 -0
- package/dist/detect/structural/variables.js +159 -0
- package/dist/detect/structural/variables.js.map +1 -0
- package/dist/detect/structural/xxe-detection.d.ts +18 -0
- package/dist/detect/structural/xxe-detection.d.ts.map +1 -0
- package/dist/detect/structural/xxe-detection.js +245 -0
- package/dist/detect/structural/xxe-detection.js.map +1 -0
- package/dist/index.d.ts +17 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -1034
- package/dist/index.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +1 -8
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +4 -0
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +50 -1
- package/dist/layer2/index.js.map +1 -1
- package/dist/layer2/log-injection.d.ts +18 -0
- package/dist/layer2/log-injection.d.ts.map +1 -0
- package/dist/layer2/log-injection.js +214 -0
- package/dist/layer2/log-injection.js.map +1 -0
- package/dist/layer2/security-headers.d.ts +18 -0
- package/dist/layer2/security-headers.d.ts.map +1 -0
- package/dist/layer2/security-headers.js +187 -0
- package/dist/layer2/security-headers.js.map +1 -0
- package/dist/layer2/ssrf-detection.d.ts +18 -0
- package/dist/layer2/ssrf-detection.d.ts.map +1 -0
- package/dist/layer2/ssrf-detection.js +252 -0
- package/dist/layer2/ssrf-detection.js.map +1 -0
- package/dist/layer2/xxe-detection.d.ts +18 -0
- package/dist/layer2/xxe-detection.d.ts.map +1 -0
- package/dist/layer2/xxe-detection.js +242 -0
- package/dist/layer2/xxe-detection.js.map +1 -0
- package/dist/layer3/anthropic/prompts/index.d.ts +1 -1
- package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -1
- package/dist/layer3/anthropic/prompts/index.js +3 -1
- package/dist/layer3/anthropic/prompts/index.js.map +1 -1
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts +19 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.js +156 -0
- package/dist/layer3/anthropic/prompts/modules/ai-patterns.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts +9 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.js +25 -0
- package/dist/layer3/anthropic/prompts/modules/auth-access.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/common.d.ts +11 -0
- package/dist/layer3/anthropic/prompts/modules/common.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/common.js +152 -0
- package/dist/layer3/anthropic/prompts/modules/common.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/index.d.ts +54 -0
- package/dist/layer3/anthropic/prompts/modules/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/index.js +185 -0
- package/dist/layer3/anthropic/prompts/modules/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.js +84 -0
- package/dist/layer3/anthropic/prompts/modules/owasp-classic.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js +68 -0
- package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.js +22 -0
- package/dist/layer3/anthropic/prompts/modules/xss-prompt.js.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts +9 -3
- package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -1
- package/dist/layer3/anthropic/prompts/validation.js +14 -410
- package/dist/layer3/anthropic/prompts/validation.js.map +1 -1
- package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -1
- package/dist/layer3/anthropic/providers/anthropic.js +6 -3
- package/dist/layer3/anthropic/providers/anthropic.js.map +1 -1
- package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -1
- package/dist/layer3/anthropic/providers/openai.js +6 -3
- package/dist/layer3/anthropic/providers/openai.js.map +1 -1
- package/dist/layer3/anthropic/request-builder.d.ts +11 -4
- package/dist/layer3/anthropic/request-builder.d.ts.map +1 -1
- package/dist/layer3/anthropic/request-builder.js +32 -16
- package/dist/layer3/anthropic/request-builder.js.map +1 -1
- package/dist/layer3/anthropic/utils/context-extractor.d.ts +55 -0
- package/dist/layer3/anthropic/utils/context-extractor.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/context-extractor.js +161 -0
- package/dist/layer3/anthropic/utils/context-extractor.js.map +1 -0
- package/dist/layer3/anthropic/utils/index.d.ts +2 -0
- package/dist/layer3/anthropic/utils/index.d.ts.map +1 -1
- package/dist/layer3/anthropic/utils/index.js +4 -1
- package/dist/layer3/anthropic/utils/index.js.map +1 -1
- package/dist/model/auth-helper-detector.d.ts +56 -0
- package/dist/model/auth-helper-detector.d.ts.map +1 -0
- package/dist/model/auth-helper-detector.js +360 -0
- package/dist/model/auth-helper-detector.js.map +1 -0
- package/dist/model/cross-file-taint.d.ts +40 -0
- package/dist/model/cross-file-taint.d.ts.map +1 -0
- package/dist/model/cross-file-taint.js +290 -0
- package/dist/model/cross-file-taint.js.map +1 -0
- package/dist/model/framework-models/django.d.ts +9 -0
- package/dist/model/framework-models/django.d.ts.map +1 -0
- package/dist/model/framework-models/django.js +82 -0
- package/dist/model/framework-models/django.js.map +1 -0
- package/dist/model/framework-models/express.d.ts +9 -0
- package/dist/model/framework-models/express.d.ts.map +1 -0
- package/dist/model/framework-models/express.js +52 -0
- package/dist/model/framework-models/express.js.map +1 -0
- package/dist/model/framework-models/index.d.ts +20 -0
- package/dist/model/framework-models/index.d.ts.map +1 -0
- package/dist/model/framework-models/index.js +102 -0
- package/dist/model/framework-models/index.js.map +1 -0
- package/dist/model/framework-models/nextjs.d.ts +9 -0
- package/dist/model/framework-models/nextjs.d.ts.map +1 -0
- package/dist/model/framework-models/nextjs.js +71 -0
- package/dist/model/framework-models/nextjs.js.map +1 -0
- package/dist/model/framework-models/prisma.d.ts +10 -0
- package/dist/model/framework-models/prisma.d.ts.map +1 -0
- package/dist/model/framework-models/prisma.js +54 -0
- package/dist/model/framework-models/prisma.js.map +1 -0
- package/dist/model/framework-models/react.d.ts +9 -0
- package/dist/model/framework-models/react.d.ts.map +1 -0
- package/dist/model/framework-models/react.js +67 -0
- package/dist/model/framework-models/react.js.map +1 -0
- package/dist/model/framework-models/sequelize.d.ts +9 -0
- package/dist/model/framework-models/sequelize.d.ts.map +1 -0
- package/dist/model/framework-models/sequelize.js +62 -0
- package/dist/model/framework-models/sequelize.js.map +1 -0
- package/dist/model/framework-models/types.d.ts +43 -0
- package/dist/model/framework-models/types.d.ts.map +1 -0
- package/dist/model/framework-models/types.js +10 -0
- package/dist/model/framework-models/types.js.map +1 -0
- package/dist/model/function-classifier.d.ts +32 -0
- package/dist/model/function-classifier.d.ts.map +1 -0
- package/dist/model/function-classifier.js +143 -0
- package/dist/model/function-classifier.js.map +1 -0
- package/dist/model/import-resolver.d.ts +45 -0
- package/dist/model/import-resolver.d.ts.map +1 -0
- package/dist/model/import-resolver.js +410 -0
- package/dist/model/import-resolver.js.map +1 -0
- package/dist/model/imported-auth-detector.d.ts +38 -0
- package/dist/model/imported-auth-detector.d.ts.map +1 -0
- package/dist/model/imported-auth-detector.js +199 -0
- package/dist/model/imported-auth-detector.js.map +1 -0
- package/dist/model/index.d.ts +63 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +272 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/middleware-detector.d.ts +55 -0
- package/dist/model/middleware-detector.d.ts.map +1 -0
- package/dist/model/middleware-detector.js +382 -0
- package/dist/model/middleware-detector.js.map +1 -0
- package/dist/model/module-graph.d.ts +46 -0
- package/dist/model/module-graph.d.ts.map +1 -0
- package/dist/model/module-graph.js +187 -0
- package/dist/model/module-graph.js.map +1 -0
- package/dist/model/oauth-flow-detector.d.ts +41 -0
- package/dist/model/oauth-flow-detector.d.ts.map +1 -0
- package/dist/model/oauth-flow-detector.js +202 -0
- package/dist/model/oauth-flow-detector.js.map +1 -0
- package/dist/model/project-context.d.ts +119 -0
- package/dist/model/project-context.d.ts.map +1 -0
- package/dist/model/project-context.js +534 -0
- package/dist/model/project-context.js.map +1 -0
- package/dist/model/route-auth-resolver.d.ts +27 -0
- package/dist/model/route-auth-resolver.d.ts.map +1 -0
- package/dist/model/route-auth-resolver.js +182 -0
- package/dist/model/route-auth-resolver.js.map +1 -0
- package/dist/model/route-discovery/express.d.ts +25 -0
- package/dist/model/route-discovery/express.d.ts.map +1 -0
- package/dist/model/route-discovery/express.js +225 -0
- package/dist/model/route-discovery/express.js.map +1 -0
- package/dist/model/route-discovery/index.d.ts +21 -0
- package/dist/model/route-discovery/index.d.ts.map +1 -0
- package/dist/model/route-discovery/index.js +67 -0
- package/dist/model/route-discovery/index.js.map +1 -0
- package/dist/model/route-discovery/nextjs.d.ts +16 -0
- package/dist/model/route-discovery/nextjs.d.ts.map +1 -0
- package/dist/model/route-discovery/nextjs.js +179 -0
- package/dist/model/route-discovery/nextjs.js.map +1 -0
- package/dist/model/route-discovery/python.d.ts +16 -0
- package/dist/model/route-discovery/python.d.ts.map +1 -0
- package/dist/model/route-discovery/python.js +181 -0
- package/dist/model/route-discovery/python.js.map +1 -0
- package/dist/model/route-discovery/types.d.ts +36 -0
- package/dist/model/route-discovery/types.d.ts.map +1 -0
- package/dist/model/route-discovery/types.js +16 -0
- package/dist/model/route-discovery/types.js.map +1 -0
- package/dist/model/route-discovery/utils.d.ts +18 -0
- package/dist/model/route-discovery/utils.d.ts.map +1 -0
- package/dist/model/route-discovery/utils.js +55 -0
- package/dist/model/route-discovery/utils.js.map +1 -0
- package/dist/model/route-hierarchy.d.ts +50 -0
- package/dist/model/route-hierarchy.d.ts.map +1 -0
- package/dist/model/route-hierarchy.js +226 -0
- package/dist/model/route-hierarchy.js.map +1 -0
- package/dist/model/sanitiser-detection.d.ts +27 -0
- package/dist/model/sanitiser-detection.d.ts.map +1 -0
- package/dist/model/sanitiser-detection.js +224 -0
- package/dist/model/sanitiser-detection.js.map +1 -0
- package/dist/model/sink-matcher.d.ts +17 -0
- package/dist/model/sink-matcher.d.ts.map +1 -0
- package/dist/model/sink-matcher.js +141 -0
- package/dist/model/sink-matcher.js.map +1 -0
- package/dist/model/sink-patterns.d.ts +19 -0
- package/dist/model/sink-patterns.d.ts.map +1 -0
- package/dist/model/sink-patterns.js +88 -0
- package/dist/model/sink-patterns.js.map +1 -0
- package/dist/model/source-discovery.d.ts +15 -0
- package/dist/model/source-discovery.d.ts.map +1 -0
- package/dist/model/source-discovery.js +170 -0
- package/dist/model/source-discovery.js.map +1 -0
- package/dist/model/taint-tracker.d.ts +21 -0
- package/dist/model/taint-tracker.d.ts.map +1 -0
- package/dist/model/taint-tracker.js +281 -0
- package/dist/model/taint-tracker.js.map +1 -0
- package/dist/model/taint-types.d.ts +74 -0
- package/dist/model/taint-types.d.ts.map +1 -0
- package/dist/model/taint-types.js +9 -0
- package/dist/model/taint-types.js.map +1 -0
- package/dist/model/trpc-analyzer.d.ts +78 -0
- package/dist/model/trpc-analyzer.d.ts.map +1 -0
- package/dist/model/trpc-analyzer.js +297 -0
- package/dist/model/trpc-analyzer.js.map +1 -0
- package/dist/parse/file-classifier.d.ts +228 -0
- package/dist/parse/file-classifier.d.ts.map +1 -0
- package/dist/parse/file-classifier.js +933 -0
- package/dist/parse/file-classifier.js.map +1 -0
- package/dist/parse/path-exclusions.d.ts +55 -0
- package/dist/parse/path-exclusions.d.ts.map +1 -0
- package/dist/parse/path-exclusions.js +224 -0
- package/dist/parse/path-exclusions.js.map +1 -0
- package/dist/pipeline/config.d.ts +39 -0
- package/dist/pipeline/config.d.ts.map +1 -0
- package/dist/pipeline/config.js +46 -0
- package/dist/pipeline/config.js.map +1 -0
- package/dist/pipeline/index.d.ts +34 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +377 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/modes/incremental.d.ts +66 -0
- package/dist/pipeline/modes/incremental.d.ts.map +1 -0
- package/dist/pipeline/modes/incremental.js +200 -0
- package/dist/pipeline/modes/incremental.js.map +1 -0
- package/dist/postprocess/aggregation.d.ts +14 -0
- package/dist/postprocess/aggregation.d.ts.map +1 -0
- package/dist/postprocess/aggregation.js +63 -0
- package/dist/postprocess/aggregation.js.map +1 -0
- package/dist/postprocess/contradictions.d.ts +18 -0
- package/dist/postprocess/contradictions.d.ts.map +1 -0
- package/dist/postprocess/contradictions.js +99 -0
- package/dist/postprocess/contradictions.js.map +1 -0
- package/dist/postprocess/dedup.d.ts +13 -0
- package/dist/postprocess/dedup.d.ts.map +1 -0
- package/dist/postprocess/dedup.js +58 -0
- package/dist/postprocess/dedup.js.map +1 -0
- package/dist/postprocess/filtering/context-adjustments.d.ts +23 -0
- package/dist/postprocess/filtering/context-adjustments.d.ts.map +1 -0
- package/dist/postprocess/filtering/context-adjustments.js +100 -0
- package/dist/postprocess/filtering/context-adjustments.js.map +1 -0
- package/dist/postprocess/filtering/index.d.ts +3 -0
- package/dist/postprocess/filtering/index.d.ts.map +1 -0
- package/dist/postprocess/filtering/index.js +8 -0
- package/dist/postprocess/filtering/index.js.map +1 -0
- package/dist/postprocess/filtering/pipeline.d.ts +48 -0
- package/dist/postprocess/filtering/pipeline.d.ts.map +1 -0
- package/dist/postprocess/filtering/pipeline.js +76 -0
- package/dist/postprocess/filtering/pipeline.js.map +1 -0
- package/dist/postprocess/index.d.ts +41 -0
- package/dist/postprocess/index.d.ts.map +1 -0
- package/dist/postprocess/index.js +85 -0
- package/dist/postprocess/index.js.map +1 -0
- package/dist/postprocess/suppression/config-loader.d.ts +74 -0
- package/dist/postprocess/suppression/config-loader.d.ts.map +1 -0
- package/dist/postprocess/suppression/config-loader.js +424 -0
- package/dist/postprocess/suppression/config-loader.js.map +1 -0
- package/dist/postprocess/suppression/hash.d.ts +48 -0
- package/dist/postprocess/suppression/hash.d.ts.map +1 -0
- package/dist/postprocess/suppression/hash.js +88 -0
- package/dist/postprocess/suppression/hash.js.map +1 -0
- package/dist/postprocess/suppression/index.d.ts +11 -0
- package/dist/postprocess/suppression/index.d.ts.map +1 -0
- package/dist/postprocess/suppression/index.js +39 -0
- package/dist/postprocess/suppression/index.js.map +1 -0
- package/dist/postprocess/suppression/inline-parser.d.ts +39 -0
- package/dist/postprocess/suppression/inline-parser.d.ts.map +1 -0
- package/dist/postprocess/suppression/inline-parser.js +218 -0
- package/dist/postprocess/suppression/inline-parser.js.map +1 -0
- package/dist/postprocess/suppression/manager.d.ts +94 -0
- package/dist/postprocess/suppression/manager.d.ts.map +1 -0
- package/dist/postprocess/suppression/manager.js +292 -0
- package/dist/postprocess/suppression/manager.js.map +1 -0
- package/dist/postprocess/suppression/types.d.ts +151 -0
- package/dist/postprocess/suppression/types.d.ts.map +1 -0
- package/dist/postprocess/suppression/types.js +28 -0
- package/dist/postprocess/suppression/types.js.map +1 -0
- package/dist/postprocess/validation-cap.d.ts +17 -0
- package/dist/postprocess/validation-cap.d.ts.map +1 -0
- package/dist/postprocess/validation-cap.js +64 -0
- package/dist/postprocess/validation-cap.js.map +1 -0
- package/dist/report/build-result.d.ts +33 -0
- package/dist/report/build-result.d.ts.map +1 -0
- package/dist/report/build-result.js +59 -0
- package/dist/report/build-result.js.map +1 -0
- package/dist/report/enrichment.d.ts +19 -0
- package/dist/report/enrichment.d.ts.map +1 -0
- package/dist/report/enrichment.js +44 -0
- package/dist/report/enrichment.js.map +1 -0
- package/dist/report/formatters/ai-context.d.ts +23 -0
- package/dist/report/formatters/ai-context.d.ts.map +1 -0
- package/dist/report/formatters/ai-context.js +238 -0
- package/dist/report/formatters/ai-context.js.map +1 -0
- package/dist/report/formatters/cli-terminal.d.ts +65 -0
- package/dist/report/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/report/formatters/cli-terminal.js +735 -0
- package/dist/report/formatters/cli-terminal.js.map +1 -0
- package/dist/report/formatters/github-comment.d.ts +41 -0
- package/dist/report/formatters/github-comment.d.ts.map +1 -0
- package/dist/report/formatters/github-comment.js +370 -0
- package/dist/report/formatters/github-comment.js.map +1 -0
- package/dist/report/formatters/grouping.d.ts +52 -0
- package/dist/report/formatters/grouping.d.ts.map +1 -0
- package/dist/report/formatters/grouping.js +152 -0
- package/dist/report/formatters/grouping.js.map +1 -0
- package/dist/report/formatters/ide/claude-code.d.ts +17 -0
- package/dist/report/formatters/ide/claude-code.d.ts.map +1 -0
- package/dist/report/formatters/ide/claude-code.js +94 -0
- package/dist/report/formatters/ide/claude-code.js.map +1 -0
- package/dist/report/formatters/ide/cursor.d.ts +13 -0
- package/dist/report/formatters/ide/cursor.d.ts.map +1 -0
- package/dist/report/formatters/ide/cursor.js +125 -0
- package/dist/report/formatters/ide/cursor.js.map +1 -0
- package/dist/report/formatters/ide/index.d.ts +62 -0
- package/dist/report/formatters/ide/index.d.ts.map +1 -0
- package/dist/report/formatters/ide/index.js +184 -0
- package/dist/report/formatters/ide/index.js.map +1 -0
- package/dist/report/formatters/ide/windsurf.d.ts +13 -0
- package/dist/report/formatters/ide/windsurf.d.ts.map +1 -0
- package/dist/report/formatters/ide/windsurf.js +117 -0
- package/dist/report/formatters/ide/windsurf.js.map +1 -0
- package/dist/report/formatters/index.d.ts +11 -0
- package/dist/report/formatters/index.d.ts.map +1 -0
- package/dist/report/formatters/index.js +54 -0
- package/dist/report/formatters/index.js.map +1 -0
- package/dist/report/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/report/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/report/formatters/vscode-diagnostic.js +151 -0
- package/dist/report/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/report/summary.d.ts +27 -0
- package/dist/report/summary.d.ts.map +1 -0
- package/dist/report/summary.js +57 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/rules/metadata.d.ts.map +1 -1
- package/dist/rules/metadata.js +66 -0
- package/dist/rules/metadata.js.map +1 -1
- package/dist/score/adjustments.d.ts +22 -0
- package/dist/score/adjustments.d.ts.map +1 -0
- package/dist/score/adjustments.js +373 -0
- package/dist/score/adjustments.js.map +1 -0
- package/dist/score/auto-dismiss.d.ts +28 -0
- package/dist/score/auto-dismiss.d.ts.map +1 -0
- package/dist/score/auto-dismiss.js +200 -0
- package/dist/score/auto-dismiss.js.map +1 -0
- package/dist/score/confidence.d.ts +19 -0
- package/dist/score/confidence.d.ts.map +1 -0
- package/dist/score/confidence.js +52 -0
- package/dist/score/confidence.js.map +1 -0
- package/dist/score/index.d.ts +61 -0
- package/dist/score/index.d.ts.map +1 -0
- package/dist/score/index.js +250 -0
- package/dist/score/index.js.map +1 -0
- package/dist/score/types.d.ts +160 -0
- package/dist/score/types.d.ts.map +1 -0
- package/dist/score/types.js +14 -0
- package/dist/score/types.js.map +1 -0
- package/dist/shared/ai-context/index.d.ts +6 -0
- package/dist/shared/ai-context/index.d.ts.map +1 -0
- package/dist/shared/ai-context/index.js +13 -0
- package/dist/shared/ai-context/index.js.map +1 -0
- package/dist/shared/ai-context/manager.d.ts +67 -0
- package/dist/shared/ai-context/manager.d.ts.map +1 -0
- package/dist/shared/ai-context/manager.js +104 -0
- package/dist/shared/ai-context/manager.js.map +1 -0
- package/dist/shared/baseline/diff.d.ts +32 -0
- package/dist/shared/baseline/diff.d.ts.map +1 -0
- package/dist/shared/baseline/diff.js +119 -0
- package/dist/shared/baseline/diff.js.map +1 -0
- package/dist/shared/baseline/index.d.ts +9 -0
- package/dist/shared/baseline/index.d.ts.map +1 -0
- package/dist/shared/baseline/index.js +19 -0
- package/dist/shared/baseline/index.js.map +1 -0
- package/dist/shared/baseline/manager.d.ts +67 -0
- package/dist/shared/baseline/manager.d.ts.map +1 -0
- package/dist/shared/baseline/manager.js +180 -0
- package/dist/shared/baseline/manager.js.map +1 -0
- package/dist/shared/baseline/types.d.ts +91 -0
- package/dist/shared/baseline/types.d.ts.map +1 -0
- package/dist/shared/baseline/types.js +12 -0
- package/dist/shared/baseline/types.js.map +1 -0
- package/dist/shared/category-filter.d.ts +125 -0
- package/dist/shared/category-filter.d.ts.map +1 -0
- package/dist/shared/category-filter.js +360 -0
- package/dist/shared/category-filter.js.map +1 -0
- package/dist/shared/code-analysis.d.ts +39 -0
- package/dist/shared/code-analysis.d.ts.map +1 -0
- package/dist/shared/code-analysis.js +159 -0
- package/dist/shared/code-analysis.js.map +1 -0
- package/dist/shared/comment-analyzer.d.ts +38 -0
- package/dist/shared/comment-analyzer.d.ts.map +1 -0
- package/dist/shared/comment-analyzer.js +218 -0
- package/dist/shared/comment-analyzer.js.map +1 -0
- package/dist/shared/diff-detector.d.ts +53 -0
- package/dist/shared/diff-detector.d.ts.map +1 -0
- package/dist/shared/diff-detector.js +104 -0
- package/dist/shared/diff-detector.js.map +1 -0
- package/dist/shared/diff-parser.d.ts +80 -0
- package/dist/shared/diff-parser.d.ts.map +1 -0
- package/dist/shared/diff-parser.js +202 -0
- package/dist/shared/diff-parser.js.map +1 -0
- package/dist/shared/environment-context.d.ts +76 -0
- package/dist/shared/environment-context.d.ts.map +1 -0
- package/dist/shared/environment-context.js +271 -0
- package/dist/shared/environment-context.js.map +1 -0
- package/dist/shared/intent-detector.d.ts +66 -0
- package/dist/shared/intent-detector.d.ts.map +1 -0
- package/dist/shared/intent-detector.js +282 -0
- package/dist/shared/intent-detector.js.map +1 -0
- package/dist/shared/parsed-file.d.ts +51 -0
- package/dist/shared/parsed-file.d.ts.map +1 -0
- package/dist/shared/parsed-file.js +95 -0
- package/dist/shared/parsed-file.js.map +1 -0
- package/dist/shared/registry-clients.d.ts +93 -0
- package/dist/shared/registry-clients.d.ts.map +1 -0
- package/dist/shared/registry-clients.js +273 -0
- package/dist/shared/registry-clients.js.map +1 -0
- package/dist/shared/rules/framework-fixes.d.ts +48 -0
- package/dist/shared/rules/framework-fixes.d.ts.map +1 -0
- package/dist/shared/rules/framework-fixes.js +439 -0
- package/dist/shared/rules/framework-fixes.js.map +1 -0
- package/dist/shared/rules/index.d.ts +8 -0
- package/dist/shared/rules/index.d.ts.map +1 -0
- package/dist/shared/rules/index.js +18 -0
- package/dist/shared/rules/index.js.map +1 -0
- package/dist/shared/rules/metadata.d.ts +43 -0
- package/dist/shared/rules/metadata.d.ts.map +1 -0
- package/dist/shared/rules/metadata.js +819 -0
- package/dist/shared/rules/metadata.js.map +1 -0
- package/dist/shared/schema-semantics.d.ts +45 -0
- package/dist/shared/schema-semantics.d.ts.map +1 -0
- package/dist/shared/schema-semantics.js +193 -0
- package/dist/shared/schema-semantics.js.map +1 -0
- package/dist/shared/types.d.ts +337 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +126 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tiers.d.ts +2 -2
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +10 -0
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate/clients.d.ts +44 -0
- package/dist/validate/clients.d.ts.map +1 -0
- package/dist/validate/clients.js +81 -0
- package/dist/validate/clients.js.map +1 -0
- package/dist/validate/index.d.ts +41 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +141 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/prompts/index.d.ts +8 -0
- package/dist/validate/prompts/index.d.ts.map +1 -0
- package/dist/validate/prompts/index.js +16 -0
- package/dist/validate/prompts/index.js.map +1 -0
- package/dist/validate/prompts/modules/ai-patterns.d.ts +19 -0
- package/dist/validate/prompts/modules/ai-patterns.d.ts.map +1 -0
- package/dist/validate/prompts/modules/ai-patterns.js +156 -0
- package/dist/validate/prompts/modules/ai-patterns.js.map +1 -0
- package/dist/validate/prompts/modules/auth-access.d.ts +9 -0
- package/dist/validate/prompts/modules/auth-access.d.ts.map +1 -0
- package/dist/validate/prompts/modules/auth-access.js +25 -0
- package/dist/validate/prompts/modules/auth-access.js.map +1 -0
- package/dist/validate/prompts/modules/common.d.ts +11 -0
- package/dist/validate/prompts/modules/common.d.ts.map +1 -0
- package/dist/validate/prompts/modules/common.js +186 -0
- package/dist/validate/prompts/modules/common.js.map +1 -0
- package/dist/validate/prompts/modules/index.d.ts +54 -0
- package/dist/validate/prompts/modules/index.d.ts.map +1 -0
- package/dist/validate/prompts/modules/index.js +186 -0
- package/dist/validate/prompts/modules/index.js.map +1 -0
- package/dist/validate/prompts/modules/owasp-classic.d.ts +8 -0
- package/dist/validate/prompts/modules/owasp-classic.d.ts.map +1 -0
- package/dist/validate/prompts/modules/owasp-classic.js +84 -0
- package/dist/validate/prompts/modules/owasp-classic.js.map +1 -0
- package/dist/validate/prompts/modules/secrets-crypto.d.ts +8 -0
- package/dist/validate/prompts/modules/secrets-crypto.d.ts.map +1 -0
- package/dist/validate/prompts/modules/secrets-crypto.js +68 -0
- package/dist/validate/prompts/modules/secrets-crypto.js.map +1 -0
- package/dist/validate/prompts/modules/xss-prompt.d.ts +8 -0
- package/dist/validate/prompts/modules/xss-prompt.d.ts.map +1 -0
- package/dist/validate/prompts/modules/xss-prompt.js +22 -0
- package/dist/validate/prompts/modules/xss-prompt.js.map +1 -0
- package/dist/validate/prompts/semantic-analysis.d.ts +15 -0
- package/dist/validate/prompts/semantic-analysis.d.ts.map +1 -0
- package/dist/validate/prompts/semantic-analysis.js +169 -0
- package/dist/validate/prompts/semantic-analysis.js.map +1 -0
- package/dist/validate/prompts/validation.d.ts +18 -0
- package/dist/validate/prompts/validation.d.ts.map +1 -0
- package/dist/validate/prompts/validation.js +25 -0
- package/dist/validate/prompts/validation.js.map +1 -0
- package/dist/validate/providers/anthropic.d.ts +17 -0
- package/dist/validate/providers/anthropic.d.ts.map +1 -0
- package/dist/validate/providers/anthropic.js +260 -0
- package/dist/validate/providers/anthropic.js.map +1 -0
- package/dist/validate/providers/index.d.ts +8 -0
- package/dist/validate/providers/index.d.ts.map +1 -0
- package/dist/validate/providers/index.js +13 -0
- package/dist/validate/providers/index.js.map +1 -0
- package/dist/validate/providers/openai.d.ts +14 -0
- package/dist/validate/providers/openai.d.ts.map +1 -0
- package/dist/validate/providers/openai.js +336 -0
- package/dist/validate/providers/openai.js.map +1 -0
- package/dist/validate/request-builder.d.ts +61 -0
- package/dist/validate/request-builder.d.ts.map +1 -0
- package/dist/validate/request-builder.js +346 -0
- package/dist/validate/request-builder.js.map +1 -0
- package/dist/validate/types.d.ts +88 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +38 -0
- package/dist/validate/types.js.map +1 -0
- package/dist/validate/utils/context-extractor.d.ts +55 -0
- package/dist/validate/utils/context-extractor.d.ts.map +1 -0
- package/dist/validate/utils/context-extractor.js +161 -0
- package/dist/validate/utils/context-extractor.js.map +1 -0
- package/dist/validate/utils/index.d.ts +11 -0
- package/dist/validate/utils/index.d.ts.map +1 -0
- package/dist/validate/utils/index.js +27 -0
- package/dist/validate/utils/index.js.map +1 -0
- package/dist/validate/utils/path-helpers.d.ts +21 -0
- package/dist/validate/utils/path-helpers.d.ts.map +1 -0
- package/dist/validate/utils/path-helpers.js +69 -0
- package/dist/validate/utils/path-helpers.js.map +1 -0
- package/dist/validate/utils/response-parser.d.ts +40 -0
- package/dist/validate/utils/response-parser.d.ts.map +1 -0
- package/dist/validate/utils/response-parser.js +286 -0
- package/dist/validate/utils/response-parser.js.map +1 -0
- package/dist/validate/utils/retry.d.ts +15 -0
- package/dist/validate/utils/retry.d.ts.map +1 -0
- package/dist/validate/utils/retry.js +62 -0
- package/dist/validate/utils/retry.js.map +1 -0
- package/package.json +8 -7
- package/src/__tests__/benchmark/fixtures/layer1/agent-skill-injection.ts +204 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +3 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +15 -0
- package/src/__tests__/benchmark/fixtures/layer2/log-injection.ts +147 -0
- package/src/__tests__/benchmark/fixtures/layer2/security-headers.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/ssrf-detection.ts +210 -0
- package/src/__tests__/benchmark/fixtures/layer2/xxe-detection.ts +195 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +3 -3
- package/src/__tests__/benchmark/run-real-world-test.ts +4 -4
- package/src/__tests__/benchmark/types.ts +1 -1
- package/src/__tests__/benchmark/utils/test-runner.ts +3 -3
- package/src/__tests__/category-filter.test.ts +2 -2
- package/src/__tests__/context-engine/cross-file-taint.test.ts +284 -0
- package/src/__tests__/context-engine/framework-models.test.ts +457 -0
- package/src/__tests__/context-engine/function-classifier.test.ts +146 -0
- package/src/__tests__/context-engine/import-resolver.test.ts +328 -0
- package/src/__tests__/context-engine/integration.test.ts +320 -0
- package/src/__tests__/context-engine/module-graph.test.ts +159 -0
- package/src/__tests__/context-engine/route-discovery/auth-resolver.test.ts +353 -0
- package/src/__tests__/context-engine/route-discovery/express.test.ts +150 -0
- package/src/__tests__/context-engine/route-discovery/nextjs.test.ts +138 -0
- package/src/__tests__/context-engine/route-discovery/python.test.ts +95 -0
- package/src/__tests__/context-engine/sanitiser-detection.test.ts +187 -0
- package/src/__tests__/context-engine/sink-matcher.test.ts +251 -0
- package/src/__tests__/context-engine/source-discovery.test.ts +186 -0
- package/src/__tests__/context-engine/taint-tracker.test.ts +182 -0
- package/src/__tests__/regression/agent-skill-benign.test.ts +174 -0
- package/src/__tests__/regression/known-false-positives.test.ts +312 -4
- package/src/__tests__/score/adjustments.test.ts +385 -0
- package/src/__tests__/score/confidence.test.ts +283 -0
- package/src/__tests__/score/framework-scoring.test.ts +275 -0
- package/src/__tests__/score/route-scoring.test.ts +156 -0
- package/src/__tests__/score/scoring-integration.test.ts +165 -0
- package/src/__tests__/score/taint-adjustments.test.ts +244 -0
- package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +37 -49
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +52 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +3 -3
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +2 -2
- package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +1 -1
- package/src/__tests__/snapshots/scan-depth.test.ts +3 -3
- package/src/__tests__/validate/route-annotations.test.ts +138 -0
- package/src/__tests__/validation/analyze-results.ts +1 -1
- package/src/__tests__/validation/extract-for-triage.ts +1 -1
- package/src/__tests__/validation/fp-deep-analysis.ts +1 -1
- package/src/{layer2/ai-agent-tools.ts → detect/ai-code/agent-tools.ts} +23 -3
- package/src/{layer2 → detect/ai-code}/byok-patterns.ts +17 -5
- package/src/{layer2/ai-endpoint-protection.ts → detect/ai-code/endpoint-protection.ts} +8 -4
- package/src/{layer2/ai-execution-sinks.ts → detect/ai-code/execution-sinks.ts} +8 -4
- package/src/{layer2/ai-fingerprinting.ts → detect/ai-code/fingerprinting.ts} +20 -4
- package/src/detect/ai-code/index.ts +11 -0
- package/src/{layer2/ai-mcp-security.ts → detect/ai-code/mcp-security.ts} +7 -3
- package/src/{layer2 → detect/ai-code}/model-supply-chain.ts +7 -3
- package/src/{layer2/ai-package-hallucination.ts → detect/ai-code/package-hallucination.ts} +18 -3
- package/src/{layer2/ai-prompt-hygiene.ts → detect/ai-code/prompt-hygiene.ts} +25 -3
- package/src/{layer2/ai-rag-safety.ts → detect/ai-code/rag-safety.ts} +7 -3
- package/src/{layer2/ai-schema-validation.ts → detect/ai-code/schema-validation.ts} +7 -3
- package/src/detect/config/agent-skill-injection.ts +551 -0
- package/src/{layer1 → detect/config}/comments.ts +6 -2
- package/src/{layer1 → detect/config}/file-flags.ts +9 -3
- package/src/detect/config/index.ts +6 -0
- package/src/{layer3 → detect/config}/osv-check.ts +3 -2
- package/src/{layer3 → detect/config}/package-check.ts +3 -2
- package/src/{layer1 → detect/config}/urls.ts +12 -5
- package/src/detect/index.ts +131 -0
- package/src/{layer1 → detect/secrets}/config-audit.ts +7 -2
- package/src/{layer1 → detect/secrets}/config-mcp-audit.ts +8 -3
- package/src/{layer1 → detect/secrets}/entropy.ts +23 -11
- package/src/{layer1 → detect/secrets}/index.ts +31 -30
- package/src/{layer1 → detect/secrets}/patterns.ts +10 -3
- package/src/{layer1 → detect/secrets}/weak-crypto.ts +7 -2
- package/src/{layer2/auth-antipatterns.ts → detect/structural/auth-patterns.ts} +23 -11
- package/src/{layer2 → detect/structural}/dangerous-functions/dom-xss.ts +1 -1
- package/src/{layer2 → detect/structural}/dangerous-functions/index.ts +47 -24
- package/src/{layer2 → detect/structural}/dangerous-functions/json-parse.ts +10 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/math-random.ts +2 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/patterns.ts +1 -1
- package/src/{layer2 → detect/structural}/dangerous-functions/request-validation.ts +10 -2
- package/src/{layer2 → detect/structural}/dangerous-functions/utils/control-flow.ts +2 -2
- package/src/{layer2 → detect/structural}/data-exposure.ts +11 -3
- package/src/{layer2 → detect/structural}/framework-checks.ts +10 -11
- package/src/{layer2 → detect/structural}/index.ts +80 -77
- package/src/detect/structural/log-injection.ts +254 -0
- package/src/{layer2 → detect/structural}/logic-gates.ts +13 -5
- package/src/{layer2 → detect/structural}/risky-imports.ts +7 -3
- package/src/detect/structural/security-headers.ts +231 -0
- package/src/detect/structural/ssrf-detection.ts +300 -0
- package/src/{layer2 → detect/structural}/variables.ts +7 -3
- package/src/detect/structural/xxe-detection.ts +295 -0
- package/src/index.ts +39 -1291
- package/src/{utils → model}/auth-helper-detector.ts +1 -1
- package/src/model/cross-file-taint.ts +374 -0
- package/src/model/framework-models/django.ts +82 -0
- package/src/model/framework-models/express.ts +54 -0
- package/src/model/framework-models/index.ts +116 -0
- package/src/model/framework-models/nextjs.ts +69 -0
- package/src/model/framework-models/prisma.ts +57 -0
- package/src/model/framework-models/react.ts +63 -0
- package/src/model/framework-models/sequelize.ts +63 -0
- package/src/model/framework-models/types.ts +46 -0
- package/src/model/function-classifier.ts +184 -0
- package/src/model/import-resolver.ts +453 -0
- package/src/{utils → model}/imported-auth-detector.ts +21 -85
- package/src/model/index.ts +353 -0
- package/src/{utils → model}/middleware-detector.ts +156 -17
- package/src/model/module-graph.ts +254 -0
- package/src/{utils → model}/oauth-flow-detector.ts +1 -1
- package/src/{utils/project-context-builder.ts → model/project-context.ts} +1 -1
- package/src/model/route-auth-resolver.ts +216 -0
- package/src/model/route-discovery/express.ts +251 -0
- package/src/model/route-discovery/index.ts +83 -0
- package/src/model/route-discovery/nextjs.ts +216 -0
- package/src/model/route-discovery/python.ts +214 -0
- package/src/model/route-discovery/types.ts +48 -0
- package/src/model/route-discovery/utils.ts +54 -0
- package/src/model/sanitiser-detection.ts +268 -0
- package/src/model/sink-matcher.ts +178 -0
- package/src/model/sink-patterns.ts +109 -0
- package/src/model/source-discovery.ts +209 -0
- package/src/model/taint-tracker.ts +333 -0
- package/src/model/taint-types.ts +149 -0
- package/src/{utils → model}/trpc-analyzer.ts +1 -1
- package/src/{utils/context-helpers.ts → parse/file-classifier.ts} +54 -0
- package/src/{utils → parse}/path-exclusions.ts +1 -1
- package/src/pipeline/config.ts +81 -0
- package/src/pipeline/index.ts +437 -0
- package/src/{modes → pipeline/modes}/incremental.ts +5 -5
- package/src/postprocess/aggregation.ts +74 -0
- package/src/postprocess/contradictions.ts +128 -0
- package/src/postprocess/dedup.ts +62 -0
- package/src/{filtering → postprocess/filtering}/__tests__/pipeline.test.ts +1 -1
- package/src/{filtering → postprocess/filtering}/context-adjustments.ts +2 -2
- package/src/{filtering → postprocess/filtering}/pipeline.ts +2 -2
- package/src/postprocess/index.ts +118 -0
- package/src/{suppression → postprocess/suppression}/config-loader.ts +1 -1
- package/src/{suppression → postprocess/suppression}/hash.ts +1 -1
- package/src/{suppression → postprocess/suppression}/inline-parser.ts +1 -1
- package/src/{suppression → postprocess/suppression}/manager.ts +1 -1
- package/src/{suppression → postprocess/suppression}/types.ts +2 -2
- package/src/postprocess/validation-cap.ts +66 -0
- package/src/report/build-result.ts +94 -0
- package/src/report/enrichment.ts +52 -0
- package/src/{formatters → report/formatters}/ai-context.ts +1 -1
- package/src/{formatters → report/formatters}/cli-terminal.ts +11 -11
- package/src/{formatters → report/formatters}/github-comment.ts +1 -1
- package/src/{formatters → report/formatters}/grouping.ts +8 -8
- package/src/{formatters → report/formatters}/ide/claude-code.ts +1 -1
- package/src/{formatters → report/formatters}/ide/cursor.ts +1 -1
- package/src/{formatters → report/formatters}/ide/windsurf.ts +1 -1
- package/src/{formatters → report/formatters}/vscode-diagnostic.ts +1 -1
- package/src/report/summary.ts +70 -0
- package/src/score/adjustments.ts +387 -0
- package/src/{layer3/anthropic → score}/auto-dismiss.ts +15 -14
- package/src/score/confidence.ts +66 -0
- package/src/score/index.ts +316 -0
- package/src/score/types.ts +187 -0
- package/src/{baseline → shared/baseline}/__tests__/diff.test.ts +2 -2
- package/src/{baseline → shared/baseline}/diff.ts +1 -1
- package/src/{baseline → shared/baseline}/manager.ts +1 -1
- package/src/{category-filter.ts → shared/category-filter.ts} +1 -1
- package/src/{utils → shared}/code-analysis.ts +1 -1
- package/src/{rules → shared/rules}/__tests__/metadata.test.ts +7 -0
- package/src/{rules → shared/rules}/framework-fixes.ts +1 -1
- package/src/{rules → shared/rules}/metadata.ts +94 -0
- package/src/{types.ts → shared/types.ts} +22 -5
- package/src/tiers.ts +18 -1
- package/src/validate/__tests__/context-extractor.test.ts +191 -0
- package/src/validate/__tests__/prompt-assembly.test.ts +233 -0
- package/src/validate/__tests__/request-builder.test.ts +347 -0
- package/src/{layer3/anthropic → validate}/index.ts +8 -7
- package/src/{layer3/anthropic → validate}/prompts/index.ts +2 -0
- package/src/validate/prompts/modules/ai-patterns.ts +153 -0
- package/src/validate/prompts/modules/auth-access.ts +22 -0
- package/src/validate/prompts/modules/common.ts +183 -0
- package/src/validate/prompts/modules/index.ts +204 -0
- package/src/validate/prompts/modules/owasp-classic.ts +81 -0
- package/src/validate/prompts/modules/secrets-crypto.ts +65 -0
- package/src/validate/prompts/modules/xss-prompt.ts +19 -0
- package/src/validate/prompts/validation.ts +20 -0
- package/src/{layer3/anthropic → validate}/providers/anthropic.ts +28 -27
- package/src/validate/providers/index.ts +8 -0
- package/src/{layer3/anthropic → validate}/providers/openai.ts +30 -25
- package/src/validate/request-builder.ts +448 -0
- package/src/{layer3/anthropic → validate}/types.ts +1 -1
- package/src/validate/utils/context-extractor.ts +220 -0
- package/src/{layer3/anthropic → validate}/utils/index.ts +10 -0
- package/src/{layer3/anthropic → validate}/utils/response-parser.ts +2 -1
- package/src/layer3/anthropic/prompts/validation.ts +0 -419
- package/src/layer3/anthropic/providers/index.ts +0 -8
- package/src/layer3/anthropic/request-builder.ts +0 -150
- package/src/layer3/index.ts +0 -168
- /package/src/{layer3 → detect/config}/__tests__/osv-check.test.ts +0 -0
- /package/src/{layer2 → detect/structural}/__tests__/math-random-enhanced.test.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/child-process.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/utils/helpers.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/utils/index.ts +0 -0
- /package/src/{layer2 → detect/structural}/dangerous-functions/utils/schema-validation.ts +0 -0
- /package/src/{utils → model}/route-hierarchy.ts +0 -0
- /package/src/{filtering → postprocess/filtering}/index.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/config-loader.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/hash.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/inline-parser.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/__tests__/manager.test.ts +0 -0
- /package/src/{suppression → postprocess/suppression}/index.ts +0 -0
- /package/src/{formatters → report/formatters}/__tests__/ai-context.test.ts +0 -0
- /package/src/{formatters → report/formatters}/ide/__tests__/ide.test.ts +0 -0
- /package/src/{formatters → report/formatters}/ide/index.ts +0 -0
- /package/src/{formatters → report/formatters}/index.ts +0 -0
- /package/src/{utils → shared}/__tests__/code-analysis.test.ts +0 -0
- /package/src/{utils → shared}/__tests__/parsed-file.test.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/__tests__/manager.test.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/index.ts +0 -0
- /package/src/{ai-context → shared/ai-context}/manager.ts +0 -0
- /package/src/{baseline → shared/baseline}/__tests__/manager.test.ts +0 -0
- /package/src/{baseline → shared/baseline}/index.ts +0 -0
- /package/src/{baseline → shared/baseline}/types.ts +0 -0
- /package/src/{utils → shared}/comment-analyzer.ts +0 -0
- /package/src/{utils → shared}/diff-detector.ts +0 -0
- /package/src/{utils → shared}/diff-parser.ts +0 -0
- /package/src/{utils → shared}/environment-context.ts +0 -0
- /package/src/{utils → shared}/intent-detector.ts +0 -0
- /package/src/{utils → shared}/parsed-file.ts +0 -0
- /package/src/{utils → shared}/registry-clients.ts +0 -0
- /package/src/{rules → shared/rules}/__tests__/framework-fixes.test.ts +0 -0
- /package/src/{rules → shared/rules}/index.ts +0 -0
- /package/src/{utils → shared}/schema-semantics.ts +0 -0
- /package/src/{layer3/anthropic → validate}/clients.ts +0 -0
- /package/src/{layer3/anthropic → validate}/prompts/semantic-analysis.ts +0 -0
- /package/src/{layer3/anthropic → validate}/utils/path-helpers.ts +0 -0
- /package/src/{layer3/anthropic → validate}/utils/retry.ts +0 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the modified request builder with context extraction support.
|
|
3
|
+
*
|
|
4
|
+
* Verifies:
|
|
5
|
+
* - Scoped mode extracts relevant regions for large files
|
|
6
|
+
* - Scoped mode sends full content for small files
|
|
7
|
+
* - Full mode always sends all lines
|
|
8
|
+
* - Default mode uses scoped
|
|
9
|
+
* - Multi-file builder works correctly
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
buildHighContextValidationRequest,
|
|
14
|
+
buildMultiFileValidationRequest,
|
|
15
|
+
buildFileTaintSummary,
|
|
16
|
+
buildFindingTaintAnnotation,
|
|
17
|
+
} from '../request-builder'
|
|
18
|
+
import type { ScanFile, Vulnerability } from '../../shared/types'
|
|
19
|
+
import type { ProjectContext } from '../../model/project-context'
|
|
20
|
+
import type { FileTaintAnalysis } from '../../model/taint-types'
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Test Fixtures
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
function createMockFile(lineCount: number, path = 'src/test.ts'): ScanFile {
|
|
27
|
+
const content = Array.from({ length: lineCount }, (_, i) => `const line${i + 1} = 'value${i + 1}'`).join('\n')
|
|
28
|
+
return {
|
|
29
|
+
path,
|
|
30
|
+
content,
|
|
31
|
+
language: 'typescript',
|
|
32
|
+
size: content.length,
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function createMockFinding(lineNumber: number, category = 'hardcoded_secret' as const): Vulnerability {
|
|
37
|
+
return {
|
|
38
|
+
id: `test-${lineNumber}`,
|
|
39
|
+
filePath: 'src/test.ts',
|
|
40
|
+
lineNumber,
|
|
41
|
+
lineContent: `const line${lineNumber} = 'value${lineNumber}'`,
|
|
42
|
+
severity: 'high',
|
|
43
|
+
category,
|
|
44
|
+
title: 'Test Finding',
|
|
45
|
+
description: 'Test description',
|
|
46
|
+
confidence: 'high',
|
|
47
|
+
layer: 1,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function createMockProjectContext(): ProjectContext {
|
|
52
|
+
return {
|
|
53
|
+
summary: 'Test project context',
|
|
54
|
+
auth: {
|
|
55
|
+
hasGlobalMiddleware: false,
|
|
56
|
+
authProvider: null,
|
|
57
|
+
protectedPaths: [],
|
|
58
|
+
publicPaths: [],
|
|
59
|
+
throwingHelpers: [],
|
|
60
|
+
},
|
|
61
|
+
dataAccess: {
|
|
62
|
+
orm: null,
|
|
63
|
+
hasRLS: false,
|
|
64
|
+
},
|
|
65
|
+
frameworks: {
|
|
66
|
+
primary: null,
|
|
67
|
+
},
|
|
68
|
+
secrets: {
|
|
69
|
+
hasEnvConfig: false,
|
|
70
|
+
secretPatterns: [],
|
|
71
|
+
},
|
|
72
|
+
} as any
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// buildHighContextValidationRequest
|
|
77
|
+
// ============================================================================
|
|
78
|
+
|
|
79
|
+
describe('buildHighContextValidationRequest', () => {
|
|
80
|
+
test('scoped mode with large file shows omission markers', () => {
|
|
81
|
+
const file = createMockFile(300)
|
|
82
|
+
const findings = [createMockFinding(150)]
|
|
83
|
+
const context = createMockProjectContext()
|
|
84
|
+
|
|
85
|
+
const result = buildHighContextValidationRequest(file, findings, context, {
|
|
86
|
+
contextMode: 'scoped',
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
expect(result).toContain('lines omitted')
|
|
90
|
+
expect(result).toContain('Showing')
|
|
91
|
+
expect(result).toContain('relevant regions around findings')
|
|
92
|
+
expect(result).toContain(`const line150 = 'value150'`)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('scoped mode with small file sends full content', () => {
|
|
96
|
+
const file = createMockFile(50)
|
|
97
|
+
const findings = [createMockFinding(25)]
|
|
98
|
+
const context = createMockProjectContext()
|
|
99
|
+
|
|
100
|
+
const result = buildHighContextValidationRequest(file, findings, context, {
|
|
101
|
+
contextMode: 'scoped',
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
// Small file should not have omission markers
|
|
105
|
+
expect(result).not.toContain('lines omitted')
|
|
106
|
+
// Should contain first and last lines
|
|
107
|
+
expect(result).toContain(`const line1 = 'value1'`)
|
|
108
|
+
expect(result).toContain(`const line50 = 'value50'`)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
test('full mode sends all lines with no omission markers', () => {
|
|
112
|
+
const file = createMockFile(300)
|
|
113
|
+
const findings = [createMockFinding(150)]
|
|
114
|
+
const context = createMockProjectContext()
|
|
115
|
+
|
|
116
|
+
const result = buildHighContextValidationRequest(file, findings, context, {
|
|
117
|
+
contextMode: 'full',
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
expect(result).not.toContain('lines omitted')
|
|
121
|
+
expect(result).not.toContain('Showing')
|
|
122
|
+
expect(result).toContain(`const line1 = 'value1'`)
|
|
123
|
+
expect(result).toContain(`const line300 = 'value300'`)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
test('default mode uses scoped (large file gets omission markers)', () => {
|
|
127
|
+
const file = createMockFile(300)
|
|
128
|
+
const findings = [createMockFinding(150)]
|
|
129
|
+
const context = createMockProjectContext()
|
|
130
|
+
|
|
131
|
+
// No options passed = default
|
|
132
|
+
const result = buildHighContextValidationRequest(file, findings, context)
|
|
133
|
+
|
|
134
|
+
expect(result).toContain('lines omitted')
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
// ============================================================================
|
|
139
|
+
// buildMultiFileValidationRequest
|
|
140
|
+
// ============================================================================
|
|
141
|
+
|
|
142
|
+
describe('buildMultiFileValidationRequest', () => {
|
|
143
|
+
test('multi-file scoped mode extracts per-file', () => {
|
|
144
|
+
const file1 = createMockFile(300, 'src/auth.ts')
|
|
145
|
+
const file2 = createMockFile(50, 'src/utils.ts')
|
|
146
|
+
const findings1 = [createMockFinding(150)]
|
|
147
|
+
const findings2 = [createMockFinding(25)]
|
|
148
|
+
const context = createMockProjectContext()
|
|
149
|
+
|
|
150
|
+
const result = buildMultiFileValidationRequest(
|
|
151
|
+
[
|
|
152
|
+
{ file: file1, findings: findings1 },
|
|
153
|
+
{ file: file2, findings: findings2 },
|
|
154
|
+
],
|
|
155
|
+
context,
|
|
156
|
+
{ contextMode: 'scoped' }
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
// File 1 (large) should have omission
|
|
160
|
+
expect(result).toContain('FILE 1: src/auth.ts')
|
|
161
|
+
expect(result).toContain('lines omitted')
|
|
162
|
+
// File 2 (small) should be full
|
|
163
|
+
expect(result).toContain('FILE 2: src/utils.ts')
|
|
164
|
+
// Project context appears once
|
|
165
|
+
const contextMatches = result.split('## Project Context').length - 1
|
|
166
|
+
expect(contextMatches).toBe(1)
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
test('multi-file full mode sends all content', () => {
|
|
170
|
+
const file1 = createMockFile(300, 'src/auth.ts')
|
|
171
|
+
const findings1 = [createMockFinding(150)]
|
|
172
|
+
const context = createMockProjectContext()
|
|
173
|
+
|
|
174
|
+
const result = buildMultiFileValidationRequest(
|
|
175
|
+
[{ file: file1, findings: findings1 }],
|
|
176
|
+
context,
|
|
177
|
+
{ contextMode: 'full' }
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
expect(result).not.toContain('lines omitted')
|
|
181
|
+
expect(result).toContain(`const line300 = 'value300'`)
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
// ============================================================================
|
|
186
|
+
// Taint Annotation Tests
|
|
187
|
+
// ============================================================================
|
|
188
|
+
|
|
189
|
+
function createMockTaintAnalysis(filePath: string): FileTaintAnalysis {
|
|
190
|
+
return {
|
|
191
|
+
filePath,
|
|
192
|
+
sources: [
|
|
193
|
+
{
|
|
194
|
+
line: 12,
|
|
195
|
+
expression: 'req.params.id',
|
|
196
|
+
variable: 'id',
|
|
197
|
+
sourceType: 'http_params',
|
|
198
|
+
confidence: 'high',
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
taintedVariables: [
|
|
202
|
+
{
|
|
203
|
+
name: 'userId',
|
|
204
|
+
taintedAt: 18,
|
|
205
|
+
source: {
|
|
206
|
+
line: 12,
|
|
207
|
+
expression: 'req.params.id',
|
|
208
|
+
variable: 'id',
|
|
209
|
+
sourceType: 'http_params',
|
|
210
|
+
confidence: 'high',
|
|
211
|
+
},
|
|
212
|
+
propagation: 'direct_assignment',
|
|
213
|
+
sanitised: false,
|
|
214
|
+
scopeDepth: 0,
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
taintPaths: [
|
|
218
|
+
{
|
|
219
|
+
source: {
|
|
220
|
+
line: 12,
|
|
221
|
+
expression: 'req.params.id',
|
|
222
|
+
variable: 'id',
|
|
223
|
+
sourceType: 'http_params',
|
|
224
|
+
confidence: 'high',
|
|
225
|
+
},
|
|
226
|
+
chain: [
|
|
227
|
+
{
|
|
228
|
+
name: 'userId',
|
|
229
|
+
taintedAt: 18,
|
|
230
|
+
source: {
|
|
231
|
+
line: 12,
|
|
232
|
+
expression: 'req.params.id',
|
|
233
|
+
variable: 'id',
|
|
234
|
+
sourceType: 'http_params',
|
|
235
|
+
confidence: 'high',
|
|
236
|
+
},
|
|
237
|
+
propagation: 'direct_assignment',
|
|
238
|
+
sanitised: false,
|
|
239
|
+
scopeDepth: 0,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
sink: {
|
|
243
|
+
line: 42,
|
|
244
|
+
expression: 'db.query("SELECT * FROM users WHERE id = " + userId)',
|
|
245
|
+
sinkType: 'sql_query',
|
|
246
|
+
},
|
|
247
|
+
sanitised: false,
|
|
248
|
+
confidence: 'high',
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
sanitisers: [],
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
describe('buildFileTaintSummary', () => {
|
|
256
|
+
test('returns summary for file with taint data', () => {
|
|
257
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
258
|
+
analyses.set('src/test.ts', createMockTaintAnalysis('src/test.ts'))
|
|
259
|
+
|
|
260
|
+
const result = buildFileTaintSummary('src/test.ts', analyses)
|
|
261
|
+
|
|
262
|
+
expect(result).toContain('Data Flow Analysis')
|
|
263
|
+
expect(result).toContain('http_params')
|
|
264
|
+
expect(result).toContain('Taint paths: 1')
|
|
265
|
+
expect(result).toContain('1 unsanitised')
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
test('returns empty string for file without taint data', () => {
|
|
269
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
270
|
+
|
|
271
|
+
const result = buildFileTaintSummary('src/other.ts', analyses)
|
|
272
|
+
|
|
273
|
+
expect(result).toBe('')
|
|
274
|
+
})
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
describe('buildFindingTaintAnnotation', () => {
|
|
278
|
+
test('shows taint path when sink matches finding line', () => {
|
|
279
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
280
|
+
analyses.set('src/test.ts', createMockTaintAnalysis('src/test.ts'))
|
|
281
|
+
const finding = createMockFinding(42, 'sql_injection' as any)
|
|
282
|
+
|
|
283
|
+
const result = buildFindingTaintAnnotation(finding, 'src/test.ts', analyses)
|
|
284
|
+
|
|
285
|
+
expect(result).toContain('User input reaches this sink')
|
|
286
|
+
expect(result).toContain('req.params.id')
|
|
287
|
+
expect(result).toContain('http_params')
|
|
288
|
+
expect(result).toContain('sql_query')
|
|
289
|
+
expect(result).toContain('Sanitised: No')
|
|
290
|
+
expect(result).toContain('Confidence: high')
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
test('shows "no data flow" when file has sources but no matching path', () => {
|
|
294
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
295
|
+
analyses.set('src/test.ts', createMockTaintAnalysis('src/test.ts'))
|
|
296
|
+
const finding = createMockFinding(99) // line 99 has no matching sink
|
|
297
|
+
|
|
298
|
+
const result = buildFindingTaintAnnotation(finding, 'src/test.ts', analyses)
|
|
299
|
+
|
|
300
|
+
expect(result).toContain('No user-input data flow reaches this line')
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
test('returns empty string when file has no taint analysis', () => {
|
|
304
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
305
|
+
const finding = createMockFinding(42)
|
|
306
|
+
|
|
307
|
+
const result = buildFindingTaintAnnotation(finding, 'src/test.ts', analyses)
|
|
308
|
+
|
|
309
|
+
expect(result).toBe('')
|
|
310
|
+
})
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
describe('buildMultiFileValidationRequest with taint data', () => {
|
|
314
|
+
test('includes taint annotations when taint data provided', () => {
|
|
315
|
+
const file = createMockFile(50, 'src/test.ts')
|
|
316
|
+
const finding = createMockFinding(42, 'sql_injection' as any)
|
|
317
|
+
const context = createMockProjectContext()
|
|
318
|
+
|
|
319
|
+
const analyses = new Map<string, FileTaintAnalysis>()
|
|
320
|
+
analyses.set('src/test.ts', createMockTaintAnalysis('src/test.ts'))
|
|
321
|
+
|
|
322
|
+
const result = buildMultiFileValidationRequest(
|
|
323
|
+
[{ file, findings: [finding] }],
|
|
324
|
+
context,
|
|
325
|
+
{ contextMode: 'scoped' },
|
|
326
|
+
analyses
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
expect(result).toContain('Data Flow Analysis')
|
|
330
|
+
expect(result).toContain('User input reaches this sink')
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
test('no taint annotations when no taint data provided', () => {
|
|
334
|
+
const file = createMockFile(50, 'src/test.ts')
|
|
335
|
+
const finding = createMockFinding(42)
|
|
336
|
+
const context = createMockProjectContext()
|
|
337
|
+
|
|
338
|
+
const result = buildMultiFileValidationRequest(
|
|
339
|
+
[{ file, findings: [finding] }],
|
|
340
|
+
context,
|
|
341
|
+
{ contextMode: 'scoped' }
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
expect(result).not.toContain('Data Flow Analysis')
|
|
345
|
+
expect(result).not.toContain('Taint Analysis')
|
|
346
|
+
})
|
|
347
|
+
})
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
* Also provides high-context validation for Layer 1/2 findings.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import type { Vulnerability, ScanFile } from '
|
|
16
|
-
import type {
|
|
17
|
-
import {
|
|
15
|
+
import type { Vulnerability, ScanFile } from '../shared/types'
|
|
16
|
+
import type { ContextEngineResult } from '../model/taint-types'
|
|
17
|
+
import type { ProjectContext } from '../model/project-context'
|
|
18
|
+
import { buildProjectContext } from '../model/project-context'
|
|
18
19
|
import type { ValidationStats, AIValidationResult, Layer3Context, AIFinding } from './types'
|
|
19
20
|
import { createInitialStats } from './types'
|
|
20
21
|
import { getAnthropicClient } from './clients'
|
|
@@ -25,7 +26,7 @@ import { validateWithAnthropic } from './providers/anthropic'
|
|
|
25
26
|
|
|
26
27
|
// Re-export types and functions for backward compatibility
|
|
27
28
|
export type { ValidationStats, AIValidationResult, Layer3Context } from './types'
|
|
28
|
-
export { applyAutoDismissRules } from '
|
|
29
|
+
export { applyAutoDismissRules } from '../score/auto-dismiss'
|
|
29
30
|
|
|
30
31
|
// ============================================================================
|
|
31
32
|
// Layer 3: Deep AI Analysis
|
|
@@ -148,7 +149,7 @@ export async function batchAnalyzeWithAI(
|
|
|
148
149
|
export async function validateFindingsWithAI(
|
|
149
150
|
findings: Vulnerability[],
|
|
150
151
|
files: ScanFile[],
|
|
151
|
-
|
|
152
|
+
ceResult?: ContextEngineResult,
|
|
152
153
|
onProgress?: (progress: { filesProcessed: number; totalFiles: number; status: string }) => void
|
|
153
154
|
): Promise<AIValidationResult> {
|
|
154
155
|
// Initialize stats tracking
|
|
@@ -162,9 +163,9 @@ export async function validateFindingsWithAI(
|
|
|
162
163
|
const aiProvider = process.env.AI_PROVIDER || 'openai'
|
|
163
164
|
if (aiProvider === 'anthropic') {
|
|
164
165
|
console.log('[AI Validation] Using Anthropic provider (Claude 3.5 Haiku)')
|
|
165
|
-
return validateWithAnthropic(findings, files,
|
|
166
|
+
return validateWithAnthropic(findings, files, ceResult, stats, onProgress)
|
|
166
167
|
} else {
|
|
167
168
|
console.log('[AI Validation] Using OpenAI provider (GPT-5-mini)')
|
|
168
|
-
return validateWithOpenAI(findings, files,
|
|
169
|
+
return validateWithOpenAI(findings, files, ceResult, stats)
|
|
169
170
|
}
|
|
170
171
|
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Patterns Module
|
|
3
|
+
*
|
|
4
|
+
* Categories: ai_pattern, ai_prompt_injection, ai_unsafe_execution,
|
|
5
|
+
* ai_overpermissive_tool, suspicious_package, ai_rag_exfiltration,
|
|
6
|
+
* ai_endpoint_unprotected, ai_schema_mismatch, ai_package_hallucination,
|
|
7
|
+
* ai_rag_corpus_poisoning, ai_rag_pii_leakage, ai_mcp_tool_poisoning,
|
|
8
|
+
* ai_mcp_credential_issue, ai_mcp_confused_deputy,
|
|
9
|
+
* ai_mcp_description_injection, ai_mcp_server_shadowing,
|
|
10
|
+
* ai_mcp_config_secrets, ai_mcp_config_permissions,
|
|
11
|
+
* ai_rag_query_injection, ai_rag_embedding_poisoning,
|
|
12
|
+
* ai_rag_chunk_injection, ai_package_typosquat, ai_package_malicious,
|
|
13
|
+
* ai_unsafe_model_load, ai_unverified_model, ai_unsafe_finetuning,
|
|
14
|
+
* ai_excessive_agency
|
|
15
|
+
*
|
|
16
|
+
* Contains AI/LLM-specific patterns that require semantic AI reasoning.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export const AI_PATTERNS_MODULE = `
|
|
20
|
+
### AI/LLM-Specific Patterns
|
|
21
|
+
|
|
22
|
+
**Prompt Injection (ai_prompt_injection):**
|
|
23
|
+
- User input in system prompt WITHOUT delimiters (code fences, XML tags, separators) -> **HIGH** (real risk)
|
|
24
|
+
- User input in system prompt WITH clear delimiters -> **INFO** (properly fenced)
|
|
25
|
+
- Static prompts with no user interpolation -> **REJECT** (false positive)
|
|
26
|
+
- Prompt templates using proper parameterization/placeholders -> **REJECT**
|
|
27
|
+
|
|
28
|
+
**LLM Output Execution (ai_unsafe_execution):**
|
|
29
|
+
- LLM output fed to eval()/Function()/exec() WITHOUT sandbox -> **CRITICAL** (arbitrary code execution)
|
|
30
|
+
- LLM output to execution WITH sandbox (vm2, isolated-vm) -> **MEDIUM** (risk mitigated)
|
|
31
|
+
- LLM output to execution WITH validation AND sandbox -> **LOW** (well-protected)
|
|
32
|
+
- LLM output used for display only (console.log, UI) -> **REJECT** (not execution)
|
|
33
|
+
- Generated SQL from LLM without parameterization -> **CRITICAL** (SQL injection)
|
|
34
|
+
- Generated SQL with parameterized queries -> **MEDIUM** (logic may still be wrong)
|
|
35
|
+
|
|
36
|
+
**Agent Tool Permissions (ai_overpermissive_tool):**
|
|
37
|
+
- Tool with unrestricted file/network/exec access -> **HIGH** (overpermissive)
|
|
38
|
+
- Tool without user context verification -> **MEDIUM** (missing authorization)
|
|
39
|
+
- Tool with proper scoping, allowlists, and user verification -> **LOW** or **REJECT**
|
|
40
|
+
- Test files with tool definitions -> **INFO** or **REJECT**
|
|
41
|
+
|
|
42
|
+
**Hallucinated Dependencies (suspicious_package):**
|
|
43
|
+
- Package not found in registry -> **CRITICAL** (likely AI-hallucinated name)
|
|
44
|
+
- Very new package (less than 7 days old) with low downloads and typosquat pattern -> **HIGH**
|
|
45
|
+
- Legitimate looking package with source/repo but low popularity -> **MEDIUM** (needs review)
|
|
46
|
+
- Known legitimate package with unusual name (in allowlist) -> **REJECT**
|
|
47
|
+
|
|
48
|
+
**CRITICAL AI PATTERN RULES**:
|
|
49
|
+
- AI code generation often produces non-existent package names - flag these prominently
|
|
50
|
+
- Prompt injection is NOT the same as XSS - different threat model and severity
|
|
51
|
+
- Sandboxed code execution (vm2, isolated-vm) significantly reduces risk
|
|
52
|
+
- Agent tools need both access restrictions AND user context verification
|
|
53
|
+
|
|
54
|
+
### RAG Data Exfiltration (ai_rag_exfiltration)
|
|
55
|
+
Retrieval Augmented Generation systems can leak sensitive data across tenant boundaries.
|
|
56
|
+
|
|
57
|
+
**Unscoped Retrieval Queries:**
|
|
58
|
+
- Vector store query WITHOUT user/tenant filter -> **HIGH** (cross-tenant data access)
|
|
59
|
+
- .query(), .search(), .similaritySearch() without filter/where/userId/tenantId parameter
|
|
60
|
+
- LangChain retriever.invoke() without metadata filter
|
|
61
|
+
- Pinecone/Chroma/Weaviate query without namespace or metadata filter
|
|
62
|
+
- Query WITH proper scoping (filter by userId/tenantId) -> **REJECT** (properly scoped)
|
|
63
|
+
- Query with RLS-enabled Supabase tables -> **LOW/INFO** (verify RLS policy)
|
|
64
|
+
|
|
65
|
+
**Raw Context Exposure:**
|
|
66
|
+
- Raw sourceDocuments/chunks returned in API response -> **MEDIUM** (data leak to client)
|
|
67
|
+
- Raw context returned WITHOUT authentication -> **HIGH** (public data leak)
|
|
68
|
+
- Filtered response (only IDs, titles, metadata) -> **REJECT** (properly filtered)
|
|
69
|
+
- Response filtering visible nearby (.map, sanitize, redact) -> **INFO**
|
|
70
|
+
|
|
71
|
+
**Context Logging:**
|
|
72
|
+
- Logging retrieved documents (debug) -> **INFO** (hygiene, not direct risk)
|
|
73
|
+
- Logging full prompts with context -> **LOW** (audit concern if logs are accessible)
|
|
74
|
+
- Persisting prompts/context to database -> **MEDIUM** (sensitive data retention)
|
|
75
|
+
|
|
76
|
+
**CRITICAL RAG RULES**:
|
|
77
|
+
- Cross-tenant data access is the PRIMARY risk - always check for user/tenant scoping
|
|
78
|
+
- Authenticated endpoints exposing context are MEDIUM; unauthenticated are HIGH
|
|
79
|
+
- Debug logging is INFO severity - it's not a direct vulnerability
|
|
80
|
+
- If RLS or middleware protection is visible, downgrade significantly
|
|
81
|
+
|
|
82
|
+
### AI Endpoint Protection (ai_endpoint_unprotected)
|
|
83
|
+
AI/LLM API endpoints can incur significant costs and enable data exfiltration.
|
|
84
|
+
|
|
85
|
+
**No Authentication + No Rate Limiting -> HIGH:**
|
|
86
|
+
- Endpoint calls OpenAI/Anthropic/etc. without any auth check or rate limit
|
|
87
|
+
- Anyone on the internet can abuse the endpoint and run up API costs
|
|
88
|
+
- Potential for prompt exfiltration or model abuse
|
|
89
|
+
|
|
90
|
+
**Has Rate Limiting but No Authentication -> MEDIUM:**
|
|
91
|
+
- Rate limit provides some protection against abuse
|
|
92
|
+
- Still allows anonymous access to AI functionality
|
|
93
|
+
- Suggest adding authentication
|
|
94
|
+
|
|
95
|
+
**Has Authentication but No Rate Limiting -> LOW:**
|
|
96
|
+
- Authenticated users could still abuse the endpoint
|
|
97
|
+
- Suggest adding rate limiting for cost control
|
|
98
|
+
- severity: low (suggest improvement)
|
|
99
|
+
|
|
100
|
+
**Has Both Auth and Rate Limiting -> INFO/REJECT:**
|
|
101
|
+
- Properly protected endpoint
|
|
102
|
+
- REJECT if both are clearly present
|
|
103
|
+
- INFO if you want to note the good pattern
|
|
104
|
+
|
|
105
|
+
**BYOK (Bring Your Own Key) Endpoints:**
|
|
106
|
+
- If user provides their own API key, risk is LOWER
|
|
107
|
+
- User pays for their own usage - cost abuse is their problem
|
|
108
|
+
- Downgrade severity by one level for BYOK patterns
|
|
109
|
+
|
|
110
|
+
**Protected by Middleware:**
|
|
111
|
+
- If project context shows auth middleware protecting the route, downgrade to INFO
|
|
112
|
+
- Internal/admin routes should be INFO or REJECT
|
|
113
|
+
|
|
114
|
+
**CRITICAL ENDPOINT RULES**:
|
|
115
|
+
- Cost abuse is real - unprotected AI endpoints can bankrupt a startup
|
|
116
|
+
- Rate limiting alone isn't enough - need auth to prevent anonymous abuse
|
|
117
|
+
- BYOK endpoints have lower risk since user bears the cost
|
|
118
|
+
- Check for middleware protection before flagging
|
|
119
|
+
|
|
120
|
+
### Schema/Tooling Mismatch (ai_schema_mismatch)
|
|
121
|
+
AI-generated structured outputs need validation before use in security-sensitive contexts.
|
|
122
|
+
|
|
123
|
+
**Unvalidated AI Output Parsing:**
|
|
124
|
+
- JSON.parse(response.content) without schema validation -> **MEDIUM**
|
|
125
|
+
- AI may return malformed or unexpected structures
|
|
126
|
+
- Suggest zod/ajv/joi validation
|
|
127
|
+
- AI output to EXECUTION SINK (eval, exec, query) without validation -> **HIGH**
|
|
128
|
+
- Direct path to code/SQL injection
|
|
129
|
+
- AI output to DISPLAY only (console.log, UI render) -> **REJECT**
|
|
130
|
+
- Not a security issue for display purposes
|
|
131
|
+
- OpenAI Structured Outputs (json_schema in request) -> **REJECT**
|
|
132
|
+
- API-level validation provides guarantees
|
|
133
|
+
|
|
134
|
+
**Weak Schema Patterns:**
|
|
135
|
+
- response: any at API boundary -> **MEDIUM** (no type safety)
|
|
136
|
+
- z.any() or z.unknown() -> **LOW** (defeats purpose of validation)
|
|
137
|
+
- z.passthrough() -> **INFO** (allows extra properties, minor concern)
|
|
138
|
+
- Specific schema defined and used -> **REJECT** (properly validated)
|
|
139
|
+
|
|
140
|
+
**Tool Parameter Validation:**
|
|
141
|
+
- Tool parameter -> file path without validation -> **HIGH** (path traversal)
|
|
142
|
+
- Tool parameter -> shell command without validation -> **CRITICAL** (command injection)
|
|
143
|
+
- Tool parameter -> URL without validation -> **HIGH** (SSRF)
|
|
144
|
+
- Tool parameter -> DB query without validation -> **HIGH** (SQL injection)
|
|
145
|
+
- Tool parameter with allowlist check visible -> **LOW/REJECT** (mitigated)
|
|
146
|
+
|
|
147
|
+
**CRITICAL SCHEMA RULES**:
|
|
148
|
+
- The severity depends on WHERE the AI output is used, not just that it's parsed
|
|
149
|
+
- Execution sinks (eval, exec, query, fs) need HIGH severity without validation
|
|
150
|
+
- Display-only usage is NOT a security issue
|
|
151
|
+
- Schema validation (zod, ajv, joi) significantly reduces risk
|
|
152
|
+
- OpenAI Structured Outputs provide API-level guarantees
|
|
153
|
+
`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Access Prompt Module
|
|
3
|
+
*
|
|
4
|
+
* Categories: missing_auth, security_bypass
|
|
5
|
+
* Contains contradiction handling rules that require AI reasoning.
|
|
6
|
+
* Heuristic-handled patterns (middleware awareness, throwing helpers) are NOT included.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const AUTH_ACCESS_MODULE = `
|
|
10
|
+
### Authentication & Access Control
|
|
11
|
+
|
|
12
|
+
Flag as REAL vulnerability (keep high severity) ONLY when:
|
|
13
|
+
- Route has no visible auth check AND is NOT covered by middleware AND has no throwing auth helper
|
|
14
|
+
- Sensitive operations without user scoping (cross-tenant access possible)
|
|
15
|
+
- Auth checks that can be bypassed (e.g., checking wrong variable)
|
|
16
|
+
|
|
17
|
+
**CRITICAL CONTRADICTION HANDLING**:
|
|
18
|
+
- If we detect both "protected by middleware" and "missing auth" on the same route - REJECT the "missing auth" finding
|
|
19
|
+
- If we detect both "uses throwing auth helper" and "missing auth" - REJECT the "missing auth" finding
|
|
20
|
+
- Client components calling these protected API routes should NOT be flagged for "missing auth"
|
|
21
|
+
- Adding "if (!userId)" after a throwing helper is a FALSE POSITIVE - reject it
|
|
22
|
+
`
|