@oculum/scanner 1.0.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/dist/formatters/cli-terminal.d.ts +27 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/formatters/cli-terminal.js +412 -0
- package/dist/formatters/cli-terminal.js.map +1 -0
- package/dist/formatters/github-comment.d.ts +41 -0
- package/dist/formatters/github-comment.d.ts.map +1 -0
- package/dist/formatters/github-comment.js +306 -0
- package/dist/formatters/github-comment.js.map +1 -0
- package/dist/formatters/grouping.d.ts +52 -0
- package/dist/formatters/grouping.d.ts.map +1 -0
- package/dist/formatters/grouping.js +152 -0
- package/dist/formatters/grouping.js.map +1 -0
- package/dist/formatters/index.d.ts +9 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +35 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/formatters/vscode-diagnostic.js +151 -0
- package/dist/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/layer1/comments.d.ts +8 -0
- package/dist/layer1/comments.d.ts.map +1 -0
- package/dist/layer1/comments.js +203 -0
- package/dist/layer1/comments.js.map +1 -0
- package/dist/layer1/config-audit.d.ts +8 -0
- package/dist/layer1/config-audit.d.ts.map +1 -0
- package/dist/layer1/config-audit.js +252 -0
- package/dist/layer1/config-audit.js.map +1 -0
- package/dist/layer1/entropy.d.ts +8 -0
- package/dist/layer1/entropy.d.ts.map +1 -0
- package/dist/layer1/entropy.js +500 -0
- package/dist/layer1/entropy.js.map +1 -0
- package/dist/layer1/file-flags.d.ts +7 -0
- package/dist/layer1/file-flags.d.ts.map +1 -0
- package/dist/layer1/file-flags.js +112 -0
- package/dist/layer1/file-flags.js.map +1 -0
- package/dist/layer1/index.d.ts +36 -0
- package/dist/layer1/index.d.ts.map +1 -0
- package/dist/layer1/index.js +132 -0
- package/dist/layer1/index.js.map +1 -0
- package/dist/layer1/patterns.d.ts +8 -0
- package/dist/layer1/patterns.d.ts.map +1 -0
- package/dist/layer1/patterns.js +482 -0
- package/dist/layer1/patterns.js.map +1 -0
- package/dist/layer1/urls.d.ts +8 -0
- package/dist/layer1/urls.d.ts.map +1 -0
- package/dist/layer1/urls.js +296 -0
- package/dist/layer1/urls.js.map +1 -0
- package/dist/layer1/weak-crypto.d.ts +7 -0
- package/dist/layer1/weak-crypto.d.ts.map +1 -0
- package/dist/layer1/weak-crypto.js +291 -0
- package/dist/layer1/weak-crypto.js.map +1 -0
- package/dist/layer2/ai-agent-tools.d.ts +19 -0
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
- package/dist/layer2/ai-agent-tools.js +528 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -0
- package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
- package/dist/layer2/ai-endpoint-protection.js +332 -0
- package/dist/layer2/ai-endpoint-protection.js.map +1 -0
- package/dist/layer2/ai-execution-sinks.d.ts +18 -0
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
- package/dist/layer2/ai-execution-sinks.js +496 -0
- package/dist/layer2/ai-execution-sinks.js.map +1 -0
- package/dist/layer2/ai-fingerprinting.d.ts +7 -0
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
- package/dist/layer2/ai-fingerprinting.js +654 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.js +356 -0
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
- package/dist/layer2/ai-rag-safety.d.ts +21 -0
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
- package/dist/layer2/ai-rag-safety.js +459 -0
- package/dist/layer2/ai-rag-safety.js.map +1 -0
- package/dist/layer2/ai-schema-validation.d.ts +25 -0
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
- package/dist/layer2/ai-schema-validation.js +375 -0
- package/dist/layer2/ai-schema-validation.js.map +1 -0
- package/dist/layer2/auth-antipatterns.d.ts +20 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
- package/dist/layer2/auth-antipatterns.js +333 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -0
- package/dist/layer2/byok-patterns.d.ts +12 -0
- package/dist/layer2/byok-patterns.d.ts.map +1 -0
- package/dist/layer2/byok-patterns.js +299 -0
- package/dist/layer2/byok-patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions.d.ts +7 -0
- package/dist/layer2/dangerous-functions.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions.js +1375 -0
- package/dist/layer2/dangerous-functions.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts +16 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -0
- package/dist/layer2/data-exposure.js +279 -0
- package/dist/layer2/data-exposure.js.map +1 -0
- package/dist/layer2/framework-checks.d.ts +7 -0
- package/dist/layer2/framework-checks.d.ts.map +1 -0
- package/dist/layer2/framework-checks.js +388 -0
- package/dist/layer2/framework-checks.js.map +1 -0
- package/dist/layer2/index.d.ts +58 -0
- package/dist/layer2/index.d.ts.map +1 -0
- package/dist/layer2/index.js +380 -0
- package/dist/layer2/index.js.map +1 -0
- package/dist/layer2/logic-gates.d.ts +7 -0
- package/dist/layer2/logic-gates.d.ts.map +1 -0
- package/dist/layer2/logic-gates.js +182 -0
- package/dist/layer2/logic-gates.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts +7 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -0
- package/dist/layer2/risky-imports.js +161 -0
- package/dist/layer2/risky-imports.js.map +1 -0
- package/dist/layer2/variables.d.ts +8 -0
- package/dist/layer2/variables.d.ts.map +1 -0
- package/dist/layer2/variables.js +152 -0
- package/dist/layer2/variables.js.map +1 -0
- package/dist/layer3/anthropic.d.ts +83 -0
- package/dist/layer3/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic.js +1745 -0
- package/dist/layer3/anthropic.js.map +1 -0
- package/dist/layer3/index.d.ts +24 -0
- package/dist/layer3/index.d.ts.map +1 -0
- package/dist/layer3/index.js +119 -0
- package/dist/layer3/index.js.map +1 -0
- package/dist/layer3/openai.d.ts +25 -0
- package/dist/layer3/openai.d.ts.map +1 -0
- package/dist/layer3/openai.js +238 -0
- package/dist/layer3/openai.js.map +1 -0
- package/dist/layer3/package-check.d.ts +63 -0
- package/dist/layer3/package-check.d.ts.map +1 -0
- package/dist/layer3/package-check.js +508 -0
- package/dist/layer3/package-check.js.map +1 -0
- package/dist/modes/incremental.d.ts +66 -0
- package/dist/modes/incremental.d.ts.map +1 -0
- package/dist/modes/incremental.js +200 -0
- package/dist/modes/incremental.js.map +1 -0
- package/dist/tiers.d.ts +125 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +234 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-helper-detector.d.ts +56 -0
- package/dist/utils/auth-helper-detector.d.ts.map +1 -0
- package/dist/utils/auth-helper-detector.js +360 -0
- package/dist/utils/auth-helper-detector.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +96 -0
- package/dist/utils/context-helpers.d.ts.map +1 -0
- package/dist/utils/context-helpers.js +493 -0
- package/dist/utils/context-helpers.js.map +1 -0
- package/dist/utils/diff-detector.d.ts +53 -0
- package/dist/utils/diff-detector.d.ts.map +1 -0
- package/dist/utils/diff-detector.js +104 -0
- package/dist/utils/diff-detector.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +80 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +202 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/imported-auth-detector.d.ts +37 -0
- package/dist/utils/imported-auth-detector.d.ts.map +1 -0
- package/dist/utils/imported-auth-detector.js +251 -0
- package/dist/utils/imported-auth-detector.js.map +1 -0
- package/dist/utils/middleware-detector.d.ts +55 -0
- package/dist/utils/middleware-detector.d.ts.map +1 -0
- package/dist/utils/middleware-detector.js +260 -0
- package/dist/utils/middleware-detector.js.map +1 -0
- package/dist/utils/oauth-flow-detector.d.ts +41 -0
- package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
- package/dist/utils/oauth-flow-detector.js +202 -0
- package/dist/utils/oauth-flow-detector.js.map +1 -0
- package/dist/utils/path-exclusions.d.ts +55 -0
- package/dist/utils/path-exclusions.d.ts.map +1 -0
- package/dist/utils/path-exclusions.js +222 -0
- package/dist/utils/path-exclusions.js.map +1 -0
- package/dist/utils/project-context-builder.d.ts +119 -0
- package/dist/utils/project-context-builder.d.ts.map +1 -0
- package/dist/utils/project-context-builder.js +534 -0
- package/dist/utils/project-context-builder.js.map +1 -0
- package/dist/utils/registry-clients.d.ts +93 -0
- package/dist/utils/registry-clients.d.ts.map +1 -0
- package/dist/utils/registry-clients.js +273 -0
- package/dist/utils/registry-clients.js.map +1 -0
- package/dist/utils/trpc-analyzer.d.ts +78 -0
- package/dist/utils/trpc-analyzer.d.ts.map +1 -0
- package/dist/utils/trpc-analyzer.js +297 -0
- package/dist/utils/trpc-analyzer.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
- package/src/__tests__/benchmark/fixtures/index.ts +68 -0
- package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
- package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
- package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
- package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
- package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
- package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
- package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
- package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
- package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
- package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
- package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
- package/src/__tests__/benchmark/index.ts +29 -0
- package/src/__tests__/benchmark/run-benchmark.ts +144 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
- package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
- package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
- package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
- package/src/__tests__/benchmark/types.ts +144 -0
- package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
- package/src/__tests__/regression/known-false-positives.test.ts +467 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
- package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
- package/src/__tests__/validation/analyze-results.ts +542 -0
- package/src/__tests__/validation/extract-for-triage.ts +146 -0
- package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
- package/src/__tests__/validation/run-validation.ts +364 -0
- package/src/__tests__/validation/triage-template.md +132 -0
- package/src/formatters/cli-terminal.ts +446 -0
- package/src/formatters/github-comment.ts +382 -0
- package/src/formatters/grouping.ts +190 -0
- package/src/formatters/index.ts +47 -0
- package/src/formatters/vscode-diagnostic.ts +243 -0
- package/src/index.ts +823 -0
- package/src/layer1/comments.ts +218 -0
- package/src/layer1/config-audit.ts +289 -0
- package/src/layer1/entropy.ts +583 -0
- package/src/layer1/file-flags.ts +127 -0
- package/src/layer1/index.ts +181 -0
- package/src/layer1/patterns.ts +516 -0
- package/src/layer1/urls.ts +334 -0
- package/src/layer1/weak-crypto.ts +328 -0
- package/src/layer2/ai-agent-tools.ts +601 -0
- package/src/layer2/ai-endpoint-protection.ts +387 -0
- package/src/layer2/ai-execution-sinks.ts +580 -0
- package/src/layer2/ai-fingerprinting.ts +758 -0
- package/src/layer2/ai-prompt-hygiene.ts +411 -0
- package/src/layer2/ai-rag-safety.ts +511 -0
- package/src/layer2/ai-schema-validation.ts +421 -0
- package/src/layer2/auth-antipatterns.ts +394 -0
- package/src/layer2/byok-patterns.ts +336 -0
- package/src/layer2/dangerous-functions.ts +1563 -0
- package/src/layer2/data-exposure.ts +315 -0
- package/src/layer2/framework-checks.ts +433 -0
- package/src/layer2/index.ts +473 -0
- package/src/layer2/logic-gates.ts +206 -0
- package/src/layer2/risky-imports.ts +186 -0
- package/src/layer2/variables.ts +166 -0
- package/src/layer3/anthropic.ts +2030 -0
- package/src/layer3/index.ts +130 -0
- package/src/layer3/package-check.ts +604 -0
- package/src/modes/incremental.ts +293 -0
- package/src/tiers.ts +318 -0
- package/src/types.ts +284 -0
- package/src/utils/auth-helper-detector.ts +443 -0
- package/src/utils/context-helpers.ts +535 -0
- package/src/utils/diff-detector.ts +135 -0
- package/src/utils/diff-parser.ts +272 -0
- package/src/utils/imported-auth-detector.ts +320 -0
- package/src/utils/middleware-detector.ts +333 -0
- package/src/utils/oauth-flow-detector.ts +246 -0
- package/src/utils/path-exclusions.ts +266 -0
- package/src/utils/project-context-builder.ts +707 -0
- package/src/utils/registry-clients.ts +351 -0
- package/src/utils/trpc-analyzer.ts +382 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scanner Types and Interfaces
|
|
3
|
+
* Defines the core data structures for the security scanning engine
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type VulnerabilitySeverity = 'critical' | 'high' | 'medium' | 'low' | 'info'
|
|
7
|
+
|
|
8
|
+
export type VulnerabilityCategory =
|
|
9
|
+
| 'hardcoded_secret'
|
|
10
|
+
| 'high_entropy_string'
|
|
11
|
+
| 'sensitive_variable'
|
|
12
|
+
| 'security_bypass'
|
|
13
|
+
| 'dangerous_function'
|
|
14
|
+
| 'sql_injection'
|
|
15
|
+
| 'xss'
|
|
16
|
+
| 'command_injection'
|
|
17
|
+
| 'insecure_config'
|
|
18
|
+
| 'missing_auth'
|
|
19
|
+
| 'suspicious_package'
|
|
20
|
+
| 'cors_misconfiguration'
|
|
21
|
+
| 'root_container'
|
|
22
|
+
| 'dangerous_file'
|
|
23
|
+
| 'ai_pattern'
|
|
24
|
+
| 'sensitive_url'
|
|
25
|
+
| 'weak_crypto'
|
|
26
|
+
| 'data_exposure' // Logging/exposing sensitive data
|
|
27
|
+
// AI-specific categories (Story B)
|
|
28
|
+
| 'ai_prompt_injection' // B1: Prompt hygiene issues - user input in system prompts
|
|
29
|
+
| 'ai_unsafe_execution' // B2: LLM output fed to dangerous sinks (eval, exec, SQL)
|
|
30
|
+
| 'ai_overpermissive_tool' // B4: Agent tools with excessive permissions
|
|
31
|
+
// AI-era vulnerability categories (M5)
|
|
32
|
+
| 'ai_rag_exfiltration' // M5: RAG data leakage - cross-tenant retrieval, raw context exposure
|
|
33
|
+
| 'ai_endpoint_unprotected' // M5: AI endpoints without auth/rate limiting
|
|
34
|
+
| 'ai_schema_mismatch' // M5: Missing schema validation on AI-generated outputs
|
|
35
|
+
|
|
36
|
+
export type ValidationStatus = 'confirmed' | 'downgraded' | 'dismissed' | 'not_validated'
|
|
37
|
+
|
|
38
|
+
export interface Vulnerability {
|
|
39
|
+
id: string
|
|
40
|
+
filePath: string
|
|
41
|
+
lineNumber: number
|
|
42
|
+
lineContent: string
|
|
43
|
+
severity: VulnerabilitySeverity
|
|
44
|
+
category: VulnerabilityCategory
|
|
45
|
+
title: string
|
|
46
|
+
description: string
|
|
47
|
+
suggestedFix?: string
|
|
48
|
+
confidence: 'high' | 'medium' | 'low'
|
|
49
|
+
layer: 1 | 2 | 3 // Which scan layer detected this
|
|
50
|
+
requiresAIValidation?: boolean // If true, must pass through AI validation before surfacing
|
|
51
|
+
|
|
52
|
+
// AI validation metadata
|
|
53
|
+
validatedByAI?: boolean // true if this finding was processed by AI validation
|
|
54
|
+
validationStatus?: ValidationStatus // outcome of AI validation
|
|
55
|
+
validationNotes?: string // e.g., "Route protected by Clerk middleware"
|
|
56
|
+
originalSeverity?: VulnerabilitySeverity // For downgraded findings, the original severity
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ScanFile {
|
|
60
|
+
path: string
|
|
61
|
+
content: string
|
|
62
|
+
language: string
|
|
63
|
+
size: number
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Severity counts for issue-mix display
|
|
67
|
+
export interface SeverityCounts {
|
|
68
|
+
critical: number
|
|
69
|
+
high: number
|
|
70
|
+
medium: number
|
|
71
|
+
low: number
|
|
72
|
+
info: number
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Category counts keyed by VulnerabilityCategory
|
|
76
|
+
export type CategoryCounts = Partial<Record<VulnerabilityCategory, number>>
|
|
77
|
+
|
|
78
|
+
export interface ScanResult {
|
|
79
|
+
repoName: string
|
|
80
|
+
repoUrl: string
|
|
81
|
+
branch: string
|
|
82
|
+
filesScanned: number
|
|
83
|
+
filesSkipped: number
|
|
84
|
+
vulnerabilities: Vulnerability[]
|
|
85
|
+
|
|
86
|
+
// Issue-mix fields - use these for displaying security posture
|
|
87
|
+
severityCounts: SeverityCounts
|
|
88
|
+
categoryCounts: CategoryCounts
|
|
89
|
+
hasBlockingIssues: boolean // true if any critical or high severity issues
|
|
90
|
+
|
|
91
|
+
scanDuration: number // milliseconds
|
|
92
|
+
timestamp: string
|
|
93
|
+
|
|
94
|
+
// AI Validation stats (Phase 1 optimization metrics)
|
|
95
|
+
validationStats?: {
|
|
96
|
+
totalFindings: number
|
|
97
|
+
validatedFindings: number
|
|
98
|
+
confirmedFindings: number
|
|
99
|
+
dismissedFindings: number
|
|
100
|
+
downgradedFindings: number
|
|
101
|
+
autoDismissedFindings: number
|
|
102
|
+
estimatedInputTokens: number
|
|
103
|
+
estimatedOutputTokens: number
|
|
104
|
+
estimatedCost: number
|
|
105
|
+
apiCalls: number
|
|
106
|
+
cacheCreationTokens: number
|
|
107
|
+
cacheReadTokens: number
|
|
108
|
+
cacheHitRate: number
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface ScanProgress {
|
|
113
|
+
status: 'fetching' | 'scanning_layer1' | 'scanning_layer2' | 'scanning_layer3' | 'complete' | 'failed'
|
|
114
|
+
currentFile?: string
|
|
115
|
+
filesProcessed: number
|
|
116
|
+
totalFiles: number
|
|
117
|
+
vulnerabilitiesFound: number
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Pattern definitions for Layer 1
|
|
121
|
+
export interface SecretPattern {
|
|
122
|
+
name: string
|
|
123
|
+
pattern: RegExp
|
|
124
|
+
severity: VulnerabilitySeverity
|
|
125
|
+
description: string
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Config audit rules for Layer 1
|
|
129
|
+
export interface ConfigRule {
|
|
130
|
+
name: string
|
|
131
|
+
filePatterns: string[]
|
|
132
|
+
check: (content: string, filePath: string) => ConfigViolation[]
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface ConfigViolation {
|
|
136
|
+
line: number
|
|
137
|
+
lineContent: string
|
|
138
|
+
message: string
|
|
139
|
+
severity: VulnerabilitySeverity
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Layer 2 heuristics
|
|
143
|
+
export interface SensitiveVariablePattern {
|
|
144
|
+
pattern: RegExp
|
|
145
|
+
severity: VulnerabilitySeverity
|
|
146
|
+
description: string
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Layer 3 AI analysis
|
|
150
|
+
export interface AIAnalysisRequest {
|
|
151
|
+
filePath: string
|
|
152
|
+
content: string
|
|
153
|
+
context: string
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface AIFinding {
|
|
157
|
+
lineNumber: number
|
|
158
|
+
lineContent: string
|
|
159
|
+
severity: VulnerabilitySeverity
|
|
160
|
+
category: VulnerabilityCategory
|
|
161
|
+
title: string
|
|
162
|
+
description: string
|
|
163
|
+
suggestedFix: string
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Supported file extensions for scanning
|
|
167
|
+
export const SCANNABLE_EXTENSIONS = [
|
|
168
|
+
'.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs',
|
|
169
|
+
'.py', '.rb', '.php', '.go', '.java', '.cs',
|
|
170
|
+
'.env', '.yaml', '.yml', '.json', '.toml',
|
|
171
|
+
'.dockerfile', '.sh', '.bash',
|
|
172
|
+
]
|
|
173
|
+
|
|
174
|
+
// Files to always scan regardless of extension
|
|
175
|
+
export const SPECIAL_FILES = [
|
|
176
|
+
'Dockerfile',
|
|
177
|
+
'docker-compose.yml',
|
|
178
|
+
'docker-compose.yaml',
|
|
179
|
+
'.env',
|
|
180
|
+
'.env.local',
|
|
181
|
+
'.env.production',
|
|
182
|
+
'.env.development',
|
|
183
|
+
'package.json',
|
|
184
|
+
'requirements.txt',
|
|
185
|
+
'Gemfile',
|
|
186
|
+
'go.mod',
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
// Max file size to scan (50KB as per PRD)
|
|
190
|
+
export const MAX_FILE_SIZE = 50 * 1024
|
|
191
|
+
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// Scan Mode Configuration
|
|
194
|
+
// ============================================================================
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Scan mode determines the depth and cost of the scan
|
|
198
|
+
*
|
|
199
|
+
* - full: Complete scan with AI validation on all files (initial onboarding, deep audits)
|
|
200
|
+
* - incremental: Focused scan on changed files only (CI/CD, fast feedback)
|
|
201
|
+
*/
|
|
202
|
+
export type ScanMode = 'full' | 'incremental'
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Scan depth controls AI usage independent of full vs incremental mode
|
|
206
|
+
*
|
|
207
|
+
* - cheap: Layer 1 + Layer 2 only. No AI validation, no Layer 3.
|
|
208
|
+
* Only Tier A (core) findings are surfaced.
|
|
209
|
+
* Target: <5s for typical PR scans.
|
|
210
|
+
*
|
|
211
|
+
* - validated: Layer 1 + Layer 2 + AI validation on selected findings. No Layer 3.
|
|
212
|
+
* Tier A is surfaced directly, Tier B goes through AI validation.
|
|
213
|
+
* Target: <15s with <10 AI calls.
|
|
214
|
+
*
|
|
215
|
+
* - deep: Layer 1 + Layer 2 + AI validation + Layer 3 semantic analysis.
|
|
216
|
+
* Full analysis for initial onboarding or deep security audits.
|
|
217
|
+
* Target: Complete thoroughness, cost secondary.
|
|
218
|
+
*
|
|
219
|
+
* ## Workflow Profile Recommendations:
|
|
220
|
+
*
|
|
221
|
+
* | Workflow | Default Depth | Rationale |
|
|
222
|
+
* |----------------|---------------|--------------------------------------|
|
|
223
|
+
* | GitHub PR | cheap | Fast feedback, high-signal findings |
|
|
224
|
+
* | VS Code | validated | Interactive, balance depth + speed |
|
|
225
|
+
* | CLI (default) | cheap | Fast local scans |
|
|
226
|
+
* | CLI --deep | deep | Thorough analysis when requested |
|
|
227
|
+
* | Onboarding | deep | Full picture on first scan |
|
|
228
|
+
*/
|
|
229
|
+
export type ScanDepth = 'cheap' | 'validated' | 'deep'
|
|
230
|
+
|
|
231
|
+
export interface ScanModeConfig {
|
|
232
|
+
/** The scan mode */
|
|
233
|
+
mode: ScanMode
|
|
234
|
+
|
|
235
|
+
/** For incremental scans: paths of changed files */
|
|
236
|
+
changedFiles?: string[]
|
|
237
|
+
|
|
238
|
+
/** For incremental scans: base commit/branch to diff against */
|
|
239
|
+
baseBranch?: string
|
|
240
|
+
|
|
241
|
+
/** Whether to skip AI validation entirely (for very fast scans) */
|
|
242
|
+
skipAIValidation?: boolean
|
|
243
|
+
|
|
244
|
+
/** Whether to skip Layer 3 deep analysis (reduces cost) */
|
|
245
|
+
skipLayer3?: boolean
|
|
246
|
+
|
|
247
|
+
/** Maximum files to send to AI validation (cost control) */
|
|
248
|
+
maxAIValidationFiles?: number
|
|
249
|
+
|
|
250
|
+
/** Maximum files for Layer 3 analysis (cost control) */
|
|
251
|
+
maxLayer3Files?: number
|
|
252
|
+
|
|
253
|
+
/** Scan depth mode (cheap/validated/deep) - controls AI usage */
|
|
254
|
+
scanDepth?: ScanDepth
|
|
255
|
+
|
|
256
|
+
/** Whether to exclude test files from scanning (default: true) */
|
|
257
|
+
excludeTestFiles?: boolean
|
|
258
|
+
|
|
259
|
+
/** Whether to exclude seed files from scanning (default: true) */
|
|
260
|
+
excludeSeedFiles?: boolean
|
|
261
|
+
|
|
262
|
+
/** Custom file path patterns to exclude (glob format) */
|
|
263
|
+
customExclusions?: string[]
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Default configurations for each scan mode
|
|
268
|
+
*/
|
|
269
|
+
export const SCAN_MODE_DEFAULTS: Record<ScanMode, Partial<ScanModeConfig>> = {
|
|
270
|
+
full: {
|
|
271
|
+
mode: 'full',
|
|
272
|
+
skipAIValidation: false,
|
|
273
|
+
skipLayer3: false,
|
|
274
|
+
maxAIValidationFiles: 50,
|
|
275
|
+
maxLayer3Files: 15,
|
|
276
|
+
},
|
|
277
|
+
incremental: {
|
|
278
|
+
mode: 'incremental',
|
|
279
|
+
skipAIValidation: false,
|
|
280
|
+
skipLayer3: true, // Skip expensive Layer 3 for incremental
|
|
281
|
+
maxAIValidationFiles: 20,
|
|
282
|
+
maxLayer3Files: 5,
|
|
283
|
+
},
|
|
284
|
+
}
|