@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.
Files changed (281) hide show
  1. package/dist/formatters/cli-terminal.d.ts +27 -0
  2. package/dist/formatters/cli-terminal.d.ts.map +1 -0
  3. package/dist/formatters/cli-terminal.js +412 -0
  4. package/dist/formatters/cli-terminal.js.map +1 -0
  5. package/dist/formatters/github-comment.d.ts +41 -0
  6. package/dist/formatters/github-comment.d.ts.map +1 -0
  7. package/dist/formatters/github-comment.js +306 -0
  8. package/dist/formatters/github-comment.js.map +1 -0
  9. package/dist/formatters/grouping.d.ts +52 -0
  10. package/dist/formatters/grouping.d.ts.map +1 -0
  11. package/dist/formatters/grouping.js +152 -0
  12. package/dist/formatters/grouping.js.map +1 -0
  13. package/dist/formatters/index.d.ts +9 -0
  14. package/dist/formatters/index.d.ts.map +1 -0
  15. package/dist/formatters/index.js +35 -0
  16. package/dist/formatters/index.js.map +1 -0
  17. package/dist/formatters/vscode-diagnostic.d.ts +103 -0
  18. package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
  19. package/dist/formatters/vscode-diagnostic.js +151 -0
  20. package/dist/formatters/vscode-diagnostic.js.map +1 -0
  21. package/dist/index.d.ts +52 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +648 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layer1/comments.d.ts +8 -0
  26. package/dist/layer1/comments.d.ts.map +1 -0
  27. package/dist/layer1/comments.js +203 -0
  28. package/dist/layer1/comments.js.map +1 -0
  29. package/dist/layer1/config-audit.d.ts +8 -0
  30. package/dist/layer1/config-audit.d.ts.map +1 -0
  31. package/dist/layer1/config-audit.js +252 -0
  32. package/dist/layer1/config-audit.js.map +1 -0
  33. package/dist/layer1/entropy.d.ts +8 -0
  34. package/dist/layer1/entropy.d.ts.map +1 -0
  35. package/dist/layer1/entropy.js +500 -0
  36. package/dist/layer1/entropy.js.map +1 -0
  37. package/dist/layer1/file-flags.d.ts +7 -0
  38. package/dist/layer1/file-flags.d.ts.map +1 -0
  39. package/dist/layer1/file-flags.js +112 -0
  40. package/dist/layer1/file-flags.js.map +1 -0
  41. package/dist/layer1/index.d.ts +36 -0
  42. package/dist/layer1/index.d.ts.map +1 -0
  43. package/dist/layer1/index.js +132 -0
  44. package/dist/layer1/index.js.map +1 -0
  45. package/dist/layer1/patterns.d.ts +8 -0
  46. package/dist/layer1/patterns.d.ts.map +1 -0
  47. package/dist/layer1/patterns.js +482 -0
  48. package/dist/layer1/patterns.js.map +1 -0
  49. package/dist/layer1/urls.d.ts +8 -0
  50. package/dist/layer1/urls.d.ts.map +1 -0
  51. package/dist/layer1/urls.js +296 -0
  52. package/dist/layer1/urls.js.map +1 -0
  53. package/dist/layer1/weak-crypto.d.ts +7 -0
  54. package/dist/layer1/weak-crypto.d.ts.map +1 -0
  55. package/dist/layer1/weak-crypto.js +291 -0
  56. package/dist/layer1/weak-crypto.js.map +1 -0
  57. package/dist/layer2/ai-agent-tools.d.ts +19 -0
  58. package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
  59. package/dist/layer2/ai-agent-tools.js +528 -0
  60. package/dist/layer2/ai-agent-tools.js.map +1 -0
  61. package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
  62. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
  63. package/dist/layer2/ai-endpoint-protection.js +332 -0
  64. package/dist/layer2/ai-endpoint-protection.js.map +1 -0
  65. package/dist/layer2/ai-execution-sinks.d.ts +18 -0
  66. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
  67. package/dist/layer2/ai-execution-sinks.js +496 -0
  68. package/dist/layer2/ai-execution-sinks.js.map +1 -0
  69. package/dist/layer2/ai-fingerprinting.d.ts +7 -0
  70. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
  71. package/dist/layer2/ai-fingerprinting.js +654 -0
  72. package/dist/layer2/ai-fingerprinting.js.map +1 -0
  73. package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
  74. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
  75. package/dist/layer2/ai-prompt-hygiene.js +356 -0
  76. package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
  77. package/dist/layer2/ai-rag-safety.d.ts +21 -0
  78. package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
  79. package/dist/layer2/ai-rag-safety.js +459 -0
  80. package/dist/layer2/ai-rag-safety.js.map +1 -0
  81. package/dist/layer2/ai-schema-validation.d.ts +25 -0
  82. package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
  83. package/dist/layer2/ai-schema-validation.js +375 -0
  84. package/dist/layer2/ai-schema-validation.js.map +1 -0
  85. package/dist/layer2/auth-antipatterns.d.ts +20 -0
  86. package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
  87. package/dist/layer2/auth-antipatterns.js +333 -0
  88. package/dist/layer2/auth-antipatterns.js.map +1 -0
  89. package/dist/layer2/byok-patterns.d.ts +12 -0
  90. package/dist/layer2/byok-patterns.d.ts.map +1 -0
  91. package/dist/layer2/byok-patterns.js +299 -0
  92. package/dist/layer2/byok-patterns.js.map +1 -0
  93. package/dist/layer2/dangerous-functions.d.ts +7 -0
  94. package/dist/layer2/dangerous-functions.d.ts.map +1 -0
  95. package/dist/layer2/dangerous-functions.js +1375 -0
  96. package/dist/layer2/dangerous-functions.js.map +1 -0
  97. package/dist/layer2/data-exposure.d.ts +16 -0
  98. package/dist/layer2/data-exposure.d.ts.map +1 -0
  99. package/dist/layer2/data-exposure.js +279 -0
  100. package/dist/layer2/data-exposure.js.map +1 -0
  101. package/dist/layer2/framework-checks.d.ts +7 -0
  102. package/dist/layer2/framework-checks.d.ts.map +1 -0
  103. package/dist/layer2/framework-checks.js +388 -0
  104. package/dist/layer2/framework-checks.js.map +1 -0
  105. package/dist/layer2/index.d.ts +58 -0
  106. package/dist/layer2/index.d.ts.map +1 -0
  107. package/dist/layer2/index.js +380 -0
  108. package/dist/layer2/index.js.map +1 -0
  109. package/dist/layer2/logic-gates.d.ts +7 -0
  110. package/dist/layer2/logic-gates.d.ts.map +1 -0
  111. package/dist/layer2/logic-gates.js +182 -0
  112. package/dist/layer2/logic-gates.js.map +1 -0
  113. package/dist/layer2/risky-imports.d.ts +7 -0
  114. package/dist/layer2/risky-imports.d.ts.map +1 -0
  115. package/dist/layer2/risky-imports.js +161 -0
  116. package/dist/layer2/risky-imports.js.map +1 -0
  117. package/dist/layer2/variables.d.ts +8 -0
  118. package/dist/layer2/variables.d.ts.map +1 -0
  119. package/dist/layer2/variables.js +152 -0
  120. package/dist/layer2/variables.js.map +1 -0
  121. package/dist/layer3/anthropic.d.ts +83 -0
  122. package/dist/layer3/anthropic.d.ts.map +1 -0
  123. package/dist/layer3/anthropic.js +1745 -0
  124. package/dist/layer3/anthropic.js.map +1 -0
  125. package/dist/layer3/index.d.ts +24 -0
  126. package/dist/layer3/index.d.ts.map +1 -0
  127. package/dist/layer3/index.js +119 -0
  128. package/dist/layer3/index.js.map +1 -0
  129. package/dist/layer3/openai.d.ts +25 -0
  130. package/dist/layer3/openai.d.ts.map +1 -0
  131. package/dist/layer3/openai.js +238 -0
  132. package/dist/layer3/openai.js.map +1 -0
  133. package/dist/layer3/package-check.d.ts +63 -0
  134. package/dist/layer3/package-check.d.ts.map +1 -0
  135. package/dist/layer3/package-check.js +508 -0
  136. package/dist/layer3/package-check.js.map +1 -0
  137. package/dist/modes/incremental.d.ts +66 -0
  138. package/dist/modes/incremental.d.ts.map +1 -0
  139. package/dist/modes/incremental.js +200 -0
  140. package/dist/modes/incremental.js.map +1 -0
  141. package/dist/tiers.d.ts +125 -0
  142. package/dist/tiers.d.ts.map +1 -0
  143. package/dist/tiers.js +234 -0
  144. package/dist/tiers.js.map +1 -0
  145. package/dist/types.d.ts +175 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +50 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils/auth-helper-detector.d.ts +56 -0
  150. package/dist/utils/auth-helper-detector.d.ts.map +1 -0
  151. package/dist/utils/auth-helper-detector.js +360 -0
  152. package/dist/utils/auth-helper-detector.js.map +1 -0
  153. package/dist/utils/context-helpers.d.ts +96 -0
  154. package/dist/utils/context-helpers.d.ts.map +1 -0
  155. package/dist/utils/context-helpers.js +493 -0
  156. package/dist/utils/context-helpers.js.map +1 -0
  157. package/dist/utils/diff-detector.d.ts +53 -0
  158. package/dist/utils/diff-detector.d.ts.map +1 -0
  159. package/dist/utils/diff-detector.js +104 -0
  160. package/dist/utils/diff-detector.js.map +1 -0
  161. package/dist/utils/diff-parser.d.ts +80 -0
  162. package/dist/utils/diff-parser.d.ts.map +1 -0
  163. package/dist/utils/diff-parser.js +202 -0
  164. package/dist/utils/diff-parser.js.map +1 -0
  165. package/dist/utils/imported-auth-detector.d.ts +37 -0
  166. package/dist/utils/imported-auth-detector.d.ts.map +1 -0
  167. package/dist/utils/imported-auth-detector.js +251 -0
  168. package/dist/utils/imported-auth-detector.js.map +1 -0
  169. package/dist/utils/middleware-detector.d.ts +55 -0
  170. package/dist/utils/middleware-detector.d.ts.map +1 -0
  171. package/dist/utils/middleware-detector.js +260 -0
  172. package/dist/utils/middleware-detector.js.map +1 -0
  173. package/dist/utils/oauth-flow-detector.d.ts +41 -0
  174. package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
  175. package/dist/utils/oauth-flow-detector.js +202 -0
  176. package/dist/utils/oauth-flow-detector.js.map +1 -0
  177. package/dist/utils/path-exclusions.d.ts +55 -0
  178. package/dist/utils/path-exclusions.d.ts.map +1 -0
  179. package/dist/utils/path-exclusions.js +222 -0
  180. package/dist/utils/path-exclusions.js.map +1 -0
  181. package/dist/utils/project-context-builder.d.ts +119 -0
  182. package/dist/utils/project-context-builder.d.ts.map +1 -0
  183. package/dist/utils/project-context-builder.js +534 -0
  184. package/dist/utils/project-context-builder.js.map +1 -0
  185. package/dist/utils/registry-clients.d.ts +93 -0
  186. package/dist/utils/registry-clients.d.ts.map +1 -0
  187. package/dist/utils/registry-clients.js +273 -0
  188. package/dist/utils/registry-clients.js.map +1 -0
  189. package/dist/utils/trpc-analyzer.d.ts +78 -0
  190. package/dist/utils/trpc-analyzer.d.ts.map +1 -0
  191. package/dist/utils/trpc-analyzer.js +297 -0
  192. package/dist/utils/trpc-analyzer.js.map +1 -0
  193. package/package.json +45 -0
  194. package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
  195. package/src/__tests__/benchmark/fixtures/index.ts +68 -0
  196. package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
  197. package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
  198. package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
  199. package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
  200. package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
  201. package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
  202. package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
  203. package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
  204. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
  205. package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
  206. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
  207. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
  208. package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
  209. package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
  210. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
  211. package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
  212. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
  213. package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
  214. package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
  215. package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
  216. package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
  217. package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
  218. package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
  219. package/src/__tests__/benchmark/index.ts +29 -0
  220. package/src/__tests__/benchmark/run-benchmark.ts +144 -0
  221. package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
  222. package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
  223. package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
  224. package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
  225. package/src/__tests__/benchmark/types.ts +144 -0
  226. package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
  227. package/src/__tests__/regression/known-false-positives.test.ts +467 -0
  228. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
  229. package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
  230. package/src/__tests__/validation/analyze-results.ts +542 -0
  231. package/src/__tests__/validation/extract-for-triage.ts +146 -0
  232. package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
  233. package/src/__tests__/validation/run-validation.ts +364 -0
  234. package/src/__tests__/validation/triage-template.md +132 -0
  235. package/src/formatters/cli-terminal.ts +446 -0
  236. package/src/formatters/github-comment.ts +382 -0
  237. package/src/formatters/grouping.ts +190 -0
  238. package/src/formatters/index.ts +47 -0
  239. package/src/formatters/vscode-diagnostic.ts +243 -0
  240. package/src/index.ts +823 -0
  241. package/src/layer1/comments.ts +218 -0
  242. package/src/layer1/config-audit.ts +289 -0
  243. package/src/layer1/entropy.ts +583 -0
  244. package/src/layer1/file-flags.ts +127 -0
  245. package/src/layer1/index.ts +181 -0
  246. package/src/layer1/patterns.ts +516 -0
  247. package/src/layer1/urls.ts +334 -0
  248. package/src/layer1/weak-crypto.ts +328 -0
  249. package/src/layer2/ai-agent-tools.ts +601 -0
  250. package/src/layer2/ai-endpoint-protection.ts +387 -0
  251. package/src/layer2/ai-execution-sinks.ts +580 -0
  252. package/src/layer2/ai-fingerprinting.ts +758 -0
  253. package/src/layer2/ai-prompt-hygiene.ts +411 -0
  254. package/src/layer2/ai-rag-safety.ts +511 -0
  255. package/src/layer2/ai-schema-validation.ts +421 -0
  256. package/src/layer2/auth-antipatterns.ts +394 -0
  257. package/src/layer2/byok-patterns.ts +336 -0
  258. package/src/layer2/dangerous-functions.ts +1563 -0
  259. package/src/layer2/data-exposure.ts +315 -0
  260. package/src/layer2/framework-checks.ts +433 -0
  261. package/src/layer2/index.ts +473 -0
  262. package/src/layer2/logic-gates.ts +206 -0
  263. package/src/layer2/risky-imports.ts +186 -0
  264. package/src/layer2/variables.ts +166 -0
  265. package/src/layer3/anthropic.ts +2030 -0
  266. package/src/layer3/index.ts +130 -0
  267. package/src/layer3/package-check.ts +604 -0
  268. package/src/modes/incremental.ts +293 -0
  269. package/src/tiers.ts +318 -0
  270. package/src/types.ts +284 -0
  271. package/src/utils/auth-helper-detector.ts +443 -0
  272. package/src/utils/context-helpers.ts +535 -0
  273. package/src/utils/diff-detector.ts +135 -0
  274. package/src/utils/diff-parser.ts +272 -0
  275. package/src/utils/imported-auth-detector.ts +320 -0
  276. package/src/utils/middleware-detector.ts +333 -0
  277. package/src/utils/oauth-flow-detector.ts +246 -0
  278. package/src/utils/path-exclusions.ts +266 -0
  279. package/src/utils/project-context-builder.ts +707 -0
  280. package/src/utils/registry-clients.ts +351 -0
  281. 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
+ }