@oculum/scanner 1.0.11 → 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.
Files changed (1178) hide show
  1. package/dist/ai-context/index.d.ts +6 -0
  2. package/dist/ai-context/index.d.ts.map +1 -0
  3. package/dist/ai-context/index.js +13 -0
  4. package/dist/ai-context/index.js.map +1 -0
  5. package/dist/ai-context/manager.d.ts +67 -0
  6. package/dist/ai-context/manager.d.ts.map +1 -0
  7. package/dist/ai-context/manager.js +104 -0
  8. package/dist/ai-context/manager.js.map +1 -0
  9. package/dist/category-filter.d.ts +125 -0
  10. package/dist/category-filter.d.ts.map +1 -0
  11. package/dist/category-filter.js +360 -0
  12. package/dist/category-filter.js.map +1 -0
  13. package/dist/detect/ai-code/agent-tools.d.ts +22 -0
  14. package/dist/detect/ai-code/agent-tools.d.ts.map +1 -0
  15. package/dist/detect/ai-code/agent-tools.js +1509 -0
  16. package/dist/detect/ai-code/agent-tools.js.map +1 -0
  17. package/dist/detect/ai-code/byok-patterns.d.ts +15 -0
  18. package/dist/detect/ai-code/byok-patterns.d.ts.map +1 -0
  19. package/dist/detect/ai-code/byok-patterns.js +313 -0
  20. package/dist/detect/ai-code/byok-patterns.js.map +1 -0
  21. package/dist/detect/ai-code/endpoint-protection.d.ts +38 -0
  22. package/dist/detect/ai-code/endpoint-protection.d.ts.map +1 -0
  23. package/dist/detect/ai-code/endpoint-protection.js +349 -0
  24. package/dist/detect/ai-code/endpoint-protection.js.map +1 -0
  25. package/dist/detect/ai-code/execution-sinks.d.ts +21 -0
  26. package/dist/detect/ai-code/execution-sinks.d.ts.map +1 -0
  27. package/dist/detect/ai-code/execution-sinks.js +1158 -0
  28. package/dist/detect/ai-code/execution-sinks.js.map +1 -0
  29. package/dist/detect/ai-code/fingerprinting.d.ts +10 -0
  30. package/dist/detect/ai-code/fingerprinting.d.ts.map +1 -0
  31. package/dist/detect/ai-code/fingerprinting.js +665 -0
  32. package/dist/detect/ai-code/fingerprinting.js.map +1 -0
  33. package/dist/detect/ai-code/index.d.ts +12 -0
  34. package/dist/detect/ai-code/index.d.ts.map +1 -0
  35. package/dist/detect/ai-code/index.js +26 -0
  36. package/dist/detect/ai-code/index.js.map +1 -0
  37. package/dist/detect/ai-code/mcp-security.d.ts +20 -0
  38. package/dist/detect/ai-code/mcp-security.d.ts.map +1 -0
  39. package/dist/detect/ai-code/mcp-security.js +880 -0
  40. package/dist/detect/ai-code/mcp-security.js.map +1 -0
  41. package/dist/detect/ai-code/model-supply-chain.d.ts +23 -0
  42. package/dist/detect/ai-code/model-supply-chain.d.ts.map +1 -0
  43. package/dist/detect/ai-code/model-supply-chain.js +447 -0
  44. package/dist/detect/ai-code/model-supply-chain.js.map +1 -0
  45. package/dist/detect/ai-code/package-hallucination.d.ts +22 -0
  46. package/dist/detect/ai-code/package-hallucination.d.ts.map +1 -0
  47. package/dist/detect/ai-code/package-hallucination.js +841 -0
  48. package/dist/detect/ai-code/package-hallucination.js.map +1 -0
  49. package/dist/detect/ai-code/prompt-hygiene.d.ts +22 -0
  50. package/dist/detect/ai-code/prompt-hygiene.d.ts.map +1 -0
  51. package/dist/detect/ai-code/prompt-hygiene.js +1177 -0
  52. package/dist/detect/ai-code/prompt-hygiene.js.map +1 -0
  53. package/dist/detect/ai-code/rag-safety.d.ts +24 -0
  54. package/dist/detect/ai-code/rag-safety.d.ts.map +1 -0
  55. package/dist/detect/ai-code/rag-safety.js +913 -0
  56. package/dist/detect/ai-code/rag-safety.js.map +1 -0
  57. package/dist/detect/ai-code/schema-validation.d.ts +28 -0
  58. package/dist/detect/ai-code/schema-validation.d.ts.map +1 -0
  59. package/dist/detect/ai-code/schema-validation.js +378 -0
  60. package/dist/detect/ai-code/schema-validation.js.map +1 -0
  61. package/dist/detect/config/agent-skill-injection.d.ts +27 -0
  62. package/dist/detect/config/agent-skill-injection.d.ts.map +1 -0
  63. package/dist/detect/config/agent-skill-injection.js +472 -0
  64. package/dist/detect/config/agent-skill-injection.js.map +1 -0
  65. package/dist/detect/config/comments.d.ts +11 -0
  66. package/dist/detect/config/comments.d.ts.map +1 -0
  67. package/dist/detect/config/comments.js +206 -0
  68. package/dist/detect/config/comments.js.map +1 -0
  69. package/dist/detect/config/file-flags.d.ts +10 -0
  70. package/dist/detect/config/file-flags.d.ts.map +1 -0
  71. package/dist/detect/config/file-flags.js +124 -0
  72. package/dist/detect/config/file-flags.js.map +1 -0
  73. package/dist/detect/config/index.d.ts +7 -0
  74. package/dist/detect/config/index.d.ts.map +1 -0
  75. package/dist/detect/config/index.js +17 -0
  76. package/dist/detect/config/index.js.map +1 -0
  77. package/dist/detect/config/osv-check.d.ts +75 -0
  78. package/dist/detect/config/osv-check.d.ts.map +1 -0
  79. package/dist/detect/config/osv-check.js +309 -0
  80. package/dist/detect/config/osv-check.js.map +1 -0
  81. package/dist/detect/config/package-check.d.ts +63 -0
  82. package/dist/detect/config/package-check.d.ts.map +1 -0
  83. package/dist/detect/config/package-check.js +509 -0
  84. package/dist/detect/config/package-check.js.map +1 -0
  85. package/dist/detect/config/urls.d.ts +11 -0
  86. package/dist/detect/config/urls.d.ts.map +1 -0
  87. package/dist/detect/config/urls.js +450 -0
  88. package/dist/detect/config/urls.js.map +1 -0
  89. package/dist/detect/index.d.ts +37 -0
  90. package/dist/detect/index.d.ts.map +1 -0
  91. package/dist/detect/index.js +77 -0
  92. package/dist/detect/index.js.map +1 -0
  93. package/dist/detect/secrets/config-audit.d.ts +11 -0
  94. package/dist/detect/secrets/config-audit.d.ts.map +1 -0
  95. package/dist/detect/secrets/config-audit.js +315 -0
  96. package/dist/detect/secrets/config-audit.js.map +1 -0
  97. package/dist/detect/secrets/config-mcp-audit.d.ts +23 -0
  98. package/dist/detect/secrets/config-mcp-audit.d.ts.map +1 -0
  99. package/dist/detect/secrets/config-mcp-audit.js +243 -0
  100. package/dist/detect/secrets/config-mcp-audit.js.map +1 -0
  101. package/dist/detect/secrets/entropy.d.ts +11 -0
  102. package/dist/detect/secrets/entropy.d.ts.map +1 -0
  103. package/dist/detect/secrets/entropy.js +751 -0
  104. package/dist/detect/secrets/entropy.js.map +1 -0
  105. package/dist/detect/secrets/index.d.ts +36 -0
  106. package/dist/detect/secrets/index.d.ts.map +1 -0
  107. package/dist/detect/secrets/index.js +174 -0
  108. package/dist/detect/secrets/index.js.map +1 -0
  109. package/dist/detect/secrets/patterns.d.ts +11 -0
  110. package/dist/detect/secrets/patterns.d.ts.map +1 -0
  111. package/dist/detect/secrets/patterns.js +518 -0
  112. package/dist/detect/secrets/patterns.js.map +1 -0
  113. package/dist/detect/secrets/weak-crypto.d.ts +10 -0
  114. package/dist/detect/secrets/weak-crypto.d.ts.map +1 -0
  115. package/dist/detect/secrets/weak-crypto.js +432 -0
  116. package/dist/detect/secrets/weak-crypto.js.map +1 -0
  117. package/dist/detect/structural/auth-patterns.d.ts +22 -0
  118. package/dist/detect/structural/auth-patterns.d.ts.map +1 -0
  119. package/dist/detect/structural/auth-patterns.js +533 -0
  120. package/dist/detect/structural/auth-patterns.js.map +1 -0
  121. package/dist/detect/structural/dangerous-functions/child-process.d.ts +16 -0
  122. package/dist/detect/structural/dangerous-functions/child-process.d.ts.map +1 -0
  123. package/dist/detect/structural/dangerous-functions/child-process.js +74 -0
  124. package/dist/detect/structural/dangerous-functions/child-process.js.map +1 -0
  125. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts +34 -0
  126. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts.map +1 -0
  127. package/dist/detect/structural/dangerous-functions/dom-xss.js +230 -0
  128. package/dist/detect/structural/dangerous-functions/dom-xss.js.map +1 -0
  129. package/dist/detect/structural/dangerous-functions/index.d.ts +16 -0
  130. package/dist/detect/structural/dangerous-functions/index.d.ts.map +1 -0
  131. package/dist/detect/structural/dangerous-functions/index.js +1193 -0
  132. package/dist/detect/structural/dangerous-functions/index.js.map +1 -0
  133. package/dist/detect/structural/dangerous-functions/json-parse.d.ts +31 -0
  134. package/dist/detect/structural/dangerous-functions/json-parse.d.ts.map +1 -0
  135. package/dist/detect/structural/dangerous-functions/json-parse.js +326 -0
  136. package/dist/detect/structural/dangerous-functions/json-parse.js.map +1 -0
  137. package/dist/detect/structural/dangerous-functions/math-random.d.ts +111 -0
  138. package/dist/detect/structural/dangerous-functions/math-random.d.ts.map +1 -0
  139. package/dist/detect/structural/dangerous-functions/math-random.js +684 -0
  140. package/dist/detect/structural/dangerous-functions/math-random.js.map +1 -0
  141. package/dist/detect/structural/dangerous-functions/patterns.d.ts +21 -0
  142. package/dist/detect/structural/dangerous-functions/patterns.d.ts.map +1 -0
  143. package/dist/detect/structural/dangerous-functions/patterns.js +163 -0
  144. package/dist/detect/structural/dangerous-functions/patterns.js.map +1 -0
  145. package/dist/detect/structural/dangerous-functions/request-validation.d.ts +13 -0
  146. package/dist/detect/structural/dangerous-functions/request-validation.d.ts.map +1 -0
  147. package/dist/detect/structural/dangerous-functions/request-validation.js +126 -0
  148. package/dist/detect/structural/dangerous-functions/request-validation.js.map +1 -0
  149. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts +24 -0
  150. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  151. package/dist/detect/structural/dangerous-functions/utils/control-flow.js +70 -0
  152. package/dist/detect/structural/dangerous-functions/utils/control-flow.js.map +1 -0
  153. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts +31 -0
  154. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts.map +1 -0
  155. package/dist/detect/structural/dangerous-functions/utils/helpers.js +147 -0
  156. package/dist/detect/structural/dangerous-functions/utils/helpers.js.map +1 -0
  157. package/dist/detect/structural/dangerous-functions/utils/index.d.ts +9 -0
  158. package/dist/detect/structural/dangerous-functions/utils/index.d.ts.map +1 -0
  159. package/dist/detect/structural/dangerous-functions/utils/index.js +23 -0
  160. package/dist/detect/structural/dangerous-functions/utils/index.js.map +1 -0
  161. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts +22 -0
  162. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  163. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js +102 -0
  164. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js.map +1 -0
  165. package/dist/detect/structural/data-exposure.d.ts +19 -0
  166. package/dist/detect/structural/data-exposure.d.ts.map +1 -0
  167. package/dist/detect/structural/data-exposure.js +262 -0
  168. package/dist/detect/structural/data-exposure.js.map +1 -0
  169. package/dist/detect/structural/framework-checks.d.ts +10 -0
  170. package/dist/detect/structural/framework-checks.d.ts.map +1 -0
  171. package/dist/detect/structural/framework-checks.js +389 -0
  172. package/dist/detect/structural/framework-checks.js.map +1 -0
  173. package/dist/detect/structural/index.d.ts +71 -0
  174. package/dist/detect/structural/index.d.ts.map +1 -0
  175. package/dist/detect/structural/index.js +510 -0
  176. package/dist/detect/structural/index.js.map +1 -0
  177. package/dist/detect/structural/log-injection.d.ts +18 -0
  178. package/dist/detect/structural/log-injection.d.ts.map +1 -0
  179. package/dist/detect/structural/log-injection.js +217 -0
  180. package/dist/detect/structural/log-injection.js.map +1 -0
  181. package/dist/detect/structural/logic-gates.d.ts +10 -0
  182. package/dist/detect/structural/logic-gates.d.ts.map +1 -0
  183. package/dist/detect/structural/logic-gates.js +227 -0
  184. package/dist/detect/structural/logic-gates.js.map +1 -0
  185. package/dist/detect/structural/risky-imports.d.ts +10 -0
  186. package/dist/detect/structural/risky-imports.d.ts.map +1 -0
  187. package/dist/detect/structural/risky-imports.js +168 -0
  188. package/dist/detect/structural/risky-imports.js.map +1 -0
  189. package/dist/detect/structural/security-headers.d.ts +18 -0
  190. package/dist/detect/structural/security-headers.d.ts.map +1 -0
  191. package/dist/detect/structural/security-headers.js +196 -0
  192. package/dist/detect/structural/security-headers.js.map +1 -0
  193. package/dist/detect/structural/ssrf-detection.d.ts +18 -0
  194. package/dist/detect/structural/ssrf-detection.d.ts.map +1 -0
  195. package/dist/detect/structural/ssrf-detection.js +263 -0
  196. package/dist/detect/structural/ssrf-detection.js.map +1 -0
  197. package/dist/detect/structural/variables.d.ts +11 -0
  198. package/dist/detect/structural/variables.d.ts.map +1 -0
  199. package/dist/detect/structural/variables.js +159 -0
  200. package/dist/detect/structural/variables.js.map +1 -0
  201. package/dist/detect/structural/xxe-detection.d.ts +18 -0
  202. package/dist/detect/structural/xxe-detection.d.ts.map +1 -0
  203. package/dist/detect/structural/xxe-detection.js +245 -0
  204. package/dist/detect/structural/xxe-detection.js.map +1 -0
  205. package/dist/filtering/context-adjustments.d.ts +23 -0
  206. package/dist/filtering/context-adjustments.d.ts.map +1 -0
  207. package/dist/filtering/context-adjustments.js +100 -0
  208. package/dist/filtering/context-adjustments.js.map +1 -0
  209. package/dist/filtering/index.d.ts +3 -0
  210. package/dist/filtering/index.d.ts.map +1 -0
  211. package/dist/filtering/index.js +8 -0
  212. package/dist/filtering/index.js.map +1 -0
  213. package/dist/filtering/pipeline.d.ts +48 -0
  214. package/dist/filtering/pipeline.d.ts.map +1 -0
  215. package/dist/filtering/pipeline.js +76 -0
  216. package/dist/filtering/pipeline.js.map +1 -0
  217. package/dist/formatters/ai-context.d.ts +23 -0
  218. package/dist/formatters/ai-context.d.ts.map +1 -0
  219. package/dist/formatters/ai-context.js +238 -0
  220. package/dist/formatters/ai-context.js.map +1 -0
  221. package/dist/formatters/github-comment.d.ts +1 -1
  222. package/dist/formatters/github-comment.d.ts.map +1 -1
  223. package/dist/formatters/github-comment.js +2 -2
  224. package/dist/formatters/github-comment.js.map +1 -1
  225. package/dist/formatters/ide/claude-code.d.ts +17 -0
  226. package/dist/formatters/ide/claude-code.d.ts.map +1 -0
  227. package/dist/formatters/ide/claude-code.js +94 -0
  228. package/dist/formatters/ide/claude-code.js.map +1 -0
  229. package/dist/formatters/ide/cursor.d.ts +13 -0
  230. package/dist/formatters/ide/cursor.d.ts.map +1 -0
  231. package/dist/formatters/ide/cursor.js +125 -0
  232. package/dist/formatters/ide/cursor.js.map +1 -0
  233. package/dist/formatters/ide/index.d.ts +62 -0
  234. package/dist/formatters/ide/index.d.ts.map +1 -0
  235. package/dist/formatters/ide/index.js +184 -0
  236. package/dist/formatters/ide/index.js.map +1 -0
  237. package/dist/formatters/ide/windsurf.d.ts +13 -0
  238. package/dist/formatters/ide/windsurf.d.ts.map +1 -0
  239. package/dist/formatters/ide/windsurf.js +117 -0
  240. package/dist/formatters/ide/windsurf.js.map +1 -0
  241. package/dist/formatters/index.d.ts +2 -0
  242. package/dist/formatters/index.d.ts.map +1 -1
  243. package/dist/formatters/index.js +17 -1
  244. package/dist/formatters/index.js.map +1 -1
  245. package/dist/index.d.ts +17 -60
  246. package/dist/index.d.ts.map +1 -1
  247. package/dist/index.js +67 -824
  248. package/dist/index.js.map +1 -1
  249. package/dist/layer1/comments.d.ts +4 -1
  250. package/dist/layer1/comments.d.ts.map +1 -1
  251. package/dist/layer1/comments.js +1 -1
  252. package/dist/layer1/comments.js.map +1 -1
  253. package/dist/layer1/config-audit.d.ts +4 -1
  254. package/dist/layer1/config-audit.d.ts.map +1 -1
  255. package/dist/layer1/config-audit.js +45 -11
  256. package/dist/layer1/config-audit.js.map +1 -1
  257. package/dist/layer1/config-mcp-audit.d.ts +4 -1
  258. package/dist/layer1/config-mcp-audit.d.ts.map +1 -1
  259. package/dist/layer1/config-mcp-audit.js +2 -2
  260. package/dist/layer1/config-mcp-audit.js.map +1 -1
  261. package/dist/layer1/entropy.d.ts +4 -1
  262. package/dist/layer1/entropy.d.ts.map +1 -1
  263. package/dist/layer1/entropy.js +212 -1
  264. package/dist/layer1/entropy.js.map +1 -1
  265. package/dist/layer1/file-flags.d.ts +4 -1
  266. package/dist/layer1/file-flags.d.ts.map +1 -1
  267. package/dist/layer1/file-flags.js +12 -5
  268. package/dist/layer1/file-flags.js.map +1 -1
  269. package/dist/layer1/index.d.ts.map +1 -1
  270. package/dist/layer1/index.js +14 -19
  271. package/dist/layer1/index.js.map +1 -1
  272. package/dist/layer1/patterns.d.ts +4 -1
  273. package/dist/layer1/patterns.d.ts.map +1 -1
  274. package/dist/layer1/patterns.js +34 -4
  275. package/dist/layer1/patterns.js.map +1 -1
  276. package/dist/layer1/urls.d.ts +4 -1
  277. package/dist/layer1/urls.d.ts.map +1 -1
  278. package/dist/layer1/urls.js +162 -14
  279. package/dist/layer1/urls.js.map +1 -1
  280. package/dist/layer1/weak-crypto.d.ts +4 -1
  281. package/dist/layer1/weak-crypto.d.ts.map +1 -1
  282. package/dist/layer1/weak-crypto.js +144 -7
  283. package/dist/layer1/weak-crypto.js.map +1 -1
  284. package/dist/layer2/ai-agent-tools.d.ts +4 -1
  285. package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
  286. package/dist/layer2/ai-agent-tools.js +661 -2
  287. package/dist/layer2/ai-agent-tools.js.map +1 -1
  288. package/dist/layer2/ai-endpoint-protection.d.ts +2 -0
  289. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
  290. package/dist/layer2/ai-endpoint-protection.js +1 -1
  291. package/dist/layer2/ai-endpoint-protection.js.map +1 -1
  292. package/dist/layer2/ai-execution-sinks.d.ts +4 -1
  293. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
  294. package/dist/layer2/ai-execution-sinks.js +252 -43
  295. package/dist/layer2/ai-execution-sinks.js.map +1 -1
  296. package/dist/layer2/ai-fingerprinting.d.ts +4 -1
  297. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
  298. package/dist/layer2/ai-fingerprinting.js +25 -32
  299. package/dist/layer2/ai-fingerprinting.js.map +1 -1
  300. package/dist/layer2/ai-mcp-security.d.ts +4 -1
  301. package/dist/layer2/ai-mcp-security.d.ts.map +1 -1
  302. package/dist/layer2/ai-mcp-security.js +200 -2
  303. package/dist/layer2/ai-mcp-security.js.map +1 -1
  304. package/dist/layer2/ai-package-hallucination.d.ts +4 -1
  305. package/dist/layer2/ai-package-hallucination.d.ts.map +1 -1
  306. package/dist/layer2/ai-package-hallucination.js +136 -4
  307. package/dist/layer2/ai-package-hallucination.js.map +1 -1
  308. package/dist/layer2/ai-prompt-hygiene.d.ts +4 -1
  309. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
  310. package/dist/layer2/ai-prompt-hygiene.js +342 -28
  311. package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
  312. package/dist/layer2/ai-rag-safety.d.ts +4 -1
  313. package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
  314. package/dist/layer2/ai-rag-safety.js +82 -2
  315. package/dist/layer2/ai-rag-safety.js.map +1 -1
  316. package/dist/layer2/ai-schema-validation.d.ts +4 -1
  317. package/dist/layer2/ai-schema-validation.d.ts.map +1 -1
  318. package/dist/layer2/ai-schema-validation.js +2 -2
  319. package/dist/layer2/ai-schema-validation.js.map +1 -1
  320. package/dist/layer2/auth-antipatterns.d.ts +2 -0
  321. package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
  322. package/dist/layer2/auth-antipatterns.js +205 -20
  323. package/dist/layer2/auth-antipatterns.js.map +1 -1
  324. package/dist/layer2/byok-patterns.d.ts +4 -1
  325. package/dist/layer2/byok-patterns.d.ts.map +1 -1
  326. package/dist/layer2/byok-patterns.js +2 -2
  327. package/dist/layer2/byok-patterns.js.map +1 -1
  328. package/dist/layer2/dangerous-functions/dom-xss.d.ts +9 -4
  329. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -1
  330. package/dist/layer2/dangerous-functions/dom-xss.js +73 -22
  331. package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -1
  332. package/dist/layer2/dangerous-functions/index.d.ts +4 -1
  333. package/dist/layer2/dangerous-functions/index.d.ts.map +1 -1
  334. package/dist/layer2/dangerous-functions/index.js +551 -20
  335. package/dist/layer2/dangerous-functions/index.js.map +1 -1
  336. package/dist/layer2/dangerous-functions/math-random.d.ts +54 -4
  337. package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -1
  338. package/dist/layer2/dangerous-functions/math-random.js +241 -16
  339. package/dist/layer2/dangerous-functions/math-random.js.map +1 -1
  340. package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -1
  341. package/dist/layer2/dangerous-functions/patterns.js +3 -1
  342. package/dist/layer2/dangerous-functions/patterns.js.map +1 -1
  343. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +3 -2
  344. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -1
  345. package/dist/layer2/dangerous-functions/utils/control-flow.js +41 -120
  346. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -1
  347. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -1
  348. package/dist/layer2/dangerous-functions/utils/helpers.js +26 -3
  349. package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -1
  350. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -1
  351. package/dist/layer2/dangerous-functions/utils/schema-validation.js +14 -1
  352. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -1
  353. package/dist/layer2/data-exposure.d.ts +4 -1
  354. package/dist/layer2/data-exposure.d.ts.map +1 -1
  355. package/dist/layer2/data-exposure.js +11 -38
  356. package/dist/layer2/data-exposure.js.map +1 -1
  357. package/dist/layer2/framework-checks.d.ts +4 -1
  358. package/dist/layer2/framework-checks.d.ts.map +1 -1
  359. package/dist/layer2/framework-checks.js +3 -10
  360. package/dist/layer2/framework-checks.js.map +1 -1
  361. package/dist/layer2/index.d.ts +13 -1
  362. package/dist/layer2/index.d.ts.map +1 -1
  363. package/dist/layer2/index.js +107 -52
  364. package/dist/layer2/index.js.map +1 -1
  365. package/dist/layer2/log-injection.d.ts +18 -0
  366. package/dist/layer2/log-injection.d.ts.map +1 -0
  367. package/dist/layer2/log-injection.js +214 -0
  368. package/dist/layer2/log-injection.js.map +1 -0
  369. package/dist/layer2/logic-gates.d.ts +4 -1
  370. package/dist/layer2/logic-gates.d.ts.map +1 -1
  371. package/dist/layer2/logic-gates.js +54 -20
  372. package/dist/layer2/logic-gates.js.map +1 -1
  373. package/dist/layer2/model-supply-chain.d.ts +4 -1
  374. package/dist/layer2/model-supply-chain.d.ts.map +1 -1
  375. package/dist/layer2/model-supply-chain.js +72 -4
  376. package/dist/layer2/model-supply-chain.js.map +1 -1
  377. package/dist/layer2/risky-imports.d.ts +4 -1
  378. package/dist/layer2/risky-imports.d.ts.map +1 -1
  379. package/dist/layer2/risky-imports.js +2 -2
  380. package/dist/layer2/risky-imports.js.map +1 -1
  381. package/dist/layer2/security-headers.d.ts +18 -0
  382. package/dist/layer2/security-headers.d.ts.map +1 -0
  383. package/dist/layer2/security-headers.js +187 -0
  384. package/dist/layer2/security-headers.js.map +1 -0
  385. package/dist/layer2/ssrf-detection.d.ts +18 -0
  386. package/dist/layer2/ssrf-detection.d.ts.map +1 -0
  387. package/dist/layer2/ssrf-detection.js +252 -0
  388. package/dist/layer2/ssrf-detection.js.map +1 -0
  389. package/dist/layer2/variables.d.ts +4 -1
  390. package/dist/layer2/variables.d.ts.map +1 -1
  391. package/dist/layer2/variables.js +2 -2
  392. package/dist/layer2/variables.js.map +1 -1
  393. package/dist/layer2/xxe-detection.d.ts +18 -0
  394. package/dist/layer2/xxe-detection.d.ts.map +1 -0
  395. package/dist/layer2/xxe-detection.js +242 -0
  396. package/dist/layer2/xxe-detection.js.map +1 -0
  397. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -1
  398. package/dist/layer3/anthropic/auto-dismiss.js +11 -0
  399. package/dist/layer3/anthropic/auto-dismiss.js.map +1 -1
  400. package/dist/layer3/anthropic/prompts/index.d.ts +1 -1
  401. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -1
  402. package/dist/layer3/anthropic/prompts/index.js +3 -1
  403. package/dist/layer3/anthropic/prompts/index.js.map +1 -1
  404. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts +19 -0
  405. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts.map +1 -0
  406. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js +156 -0
  407. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js.map +1 -0
  408. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts +9 -0
  409. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts.map +1 -0
  410. package/dist/layer3/anthropic/prompts/modules/auth-access.js +25 -0
  411. package/dist/layer3/anthropic/prompts/modules/auth-access.js.map +1 -0
  412. package/dist/layer3/anthropic/prompts/modules/common.d.ts +11 -0
  413. package/dist/layer3/anthropic/prompts/modules/common.d.ts.map +1 -0
  414. package/dist/layer3/anthropic/prompts/modules/common.js +152 -0
  415. package/dist/layer3/anthropic/prompts/modules/common.js.map +1 -0
  416. package/dist/layer3/anthropic/prompts/modules/index.d.ts +54 -0
  417. package/dist/layer3/anthropic/prompts/modules/index.d.ts.map +1 -0
  418. package/dist/layer3/anthropic/prompts/modules/index.js +185 -0
  419. package/dist/layer3/anthropic/prompts/modules/index.js.map +1 -0
  420. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts +8 -0
  421. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts.map +1 -0
  422. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js +84 -0
  423. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js.map +1 -0
  424. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts +8 -0
  425. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts.map +1 -0
  426. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js +68 -0
  427. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js.map +1 -0
  428. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts +8 -0
  429. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts.map +1 -0
  430. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js +22 -0
  431. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js.map +1 -0
  432. package/dist/layer3/anthropic/prompts/validation.d.ts +9 -3
  433. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -1
  434. package/dist/layer3/anthropic/prompts/validation.js +14 -410
  435. package/dist/layer3/anthropic/prompts/validation.js.map +1 -1
  436. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -1
  437. package/dist/layer3/anthropic/providers/anthropic.js +6 -3
  438. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -1
  439. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -1
  440. package/dist/layer3/anthropic/providers/openai.js +6 -3
  441. package/dist/layer3/anthropic/providers/openai.js.map +1 -1
  442. package/dist/layer3/anthropic/request-builder.d.ts +11 -4
  443. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -1
  444. package/dist/layer3/anthropic/request-builder.js +32 -16
  445. package/dist/layer3/anthropic/request-builder.js.map +1 -1
  446. package/dist/layer3/anthropic/utils/context-extractor.d.ts +55 -0
  447. package/dist/layer3/anthropic/utils/context-extractor.d.ts.map +1 -0
  448. package/dist/layer3/anthropic/utils/context-extractor.js +161 -0
  449. package/dist/layer3/anthropic/utils/context-extractor.js.map +1 -0
  450. package/dist/layer3/anthropic/utils/index.d.ts +2 -0
  451. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -1
  452. package/dist/layer3/anthropic/utils/index.js +4 -1
  453. package/dist/layer3/anthropic/utils/index.js.map +1 -1
  454. package/dist/model/auth-helper-detector.d.ts +56 -0
  455. package/dist/model/auth-helper-detector.d.ts.map +1 -0
  456. package/dist/model/auth-helper-detector.js +360 -0
  457. package/dist/model/auth-helper-detector.js.map +1 -0
  458. package/dist/model/cross-file-taint.d.ts +40 -0
  459. package/dist/model/cross-file-taint.d.ts.map +1 -0
  460. package/dist/model/cross-file-taint.js +290 -0
  461. package/dist/model/cross-file-taint.js.map +1 -0
  462. package/dist/model/framework-models/django.d.ts +9 -0
  463. package/dist/model/framework-models/django.d.ts.map +1 -0
  464. package/dist/model/framework-models/django.js +82 -0
  465. package/dist/model/framework-models/django.js.map +1 -0
  466. package/dist/model/framework-models/express.d.ts +9 -0
  467. package/dist/model/framework-models/express.d.ts.map +1 -0
  468. package/dist/model/framework-models/express.js +52 -0
  469. package/dist/model/framework-models/express.js.map +1 -0
  470. package/dist/model/framework-models/index.d.ts +20 -0
  471. package/dist/model/framework-models/index.d.ts.map +1 -0
  472. package/dist/model/framework-models/index.js +102 -0
  473. package/dist/model/framework-models/index.js.map +1 -0
  474. package/dist/model/framework-models/nextjs.d.ts +9 -0
  475. package/dist/model/framework-models/nextjs.d.ts.map +1 -0
  476. package/dist/model/framework-models/nextjs.js +71 -0
  477. package/dist/model/framework-models/nextjs.js.map +1 -0
  478. package/dist/model/framework-models/prisma.d.ts +10 -0
  479. package/dist/model/framework-models/prisma.d.ts.map +1 -0
  480. package/dist/model/framework-models/prisma.js +54 -0
  481. package/dist/model/framework-models/prisma.js.map +1 -0
  482. package/dist/model/framework-models/react.d.ts +9 -0
  483. package/dist/model/framework-models/react.d.ts.map +1 -0
  484. package/dist/model/framework-models/react.js +67 -0
  485. package/dist/model/framework-models/react.js.map +1 -0
  486. package/dist/model/framework-models/sequelize.d.ts +9 -0
  487. package/dist/model/framework-models/sequelize.d.ts.map +1 -0
  488. package/dist/model/framework-models/sequelize.js +62 -0
  489. package/dist/model/framework-models/sequelize.js.map +1 -0
  490. package/dist/model/framework-models/types.d.ts +43 -0
  491. package/dist/model/framework-models/types.d.ts.map +1 -0
  492. package/dist/model/framework-models/types.js +10 -0
  493. package/dist/model/framework-models/types.js.map +1 -0
  494. package/dist/model/function-classifier.d.ts +32 -0
  495. package/dist/model/function-classifier.d.ts.map +1 -0
  496. package/dist/model/function-classifier.js +143 -0
  497. package/dist/model/function-classifier.js.map +1 -0
  498. package/dist/model/import-resolver.d.ts +45 -0
  499. package/dist/model/import-resolver.d.ts.map +1 -0
  500. package/dist/model/import-resolver.js +410 -0
  501. package/dist/model/import-resolver.js.map +1 -0
  502. package/dist/model/imported-auth-detector.d.ts +38 -0
  503. package/dist/model/imported-auth-detector.d.ts.map +1 -0
  504. package/dist/model/imported-auth-detector.js +199 -0
  505. package/dist/model/imported-auth-detector.js.map +1 -0
  506. package/dist/model/index.d.ts +63 -0
  507. package/dist/model/index.d.ts.map +1 -0
  508. package/dist/model/index.js +272 -0
  509. package/dist/model/index.js.map +1 -0
  510. package/dist/model/middleware-detector.d.ts +55 -0
  511. package/dist/model/middleware-detector.d.ts.map +1 -0
  512. package/dist/model/middleware-detector.js +382 -0
  513. package/dist/model/middleware-detector.js.map +1 -0
  514. package/dist/model/module-graph.d.ts +46 -0
  515. package/dist/model/module-graph.d.ts.map +1 -0
  516. package/dist/model/module-graph.js +187 -0
  517. package/dist/model/module-graph.js.map +1 -0
  518. package/dist/model/oauth-flow-detector.d.ts +41 -0
  519. package/dist/model/oauth-flow-detector.d.ts.map +1 -0
  520. package/dist/model/oauth-flow-detector.js +202 -0
  521. package/dist/model/oauth-flow-detector.js.map +1 -0
  522. package/dist/model/project-context.d.ts +119 -0
  523. package/dist/model/project-context.d.ts.map +1 -0
  524. package/dist/model/project-context.js +534 -0
  525. package/dist/model/project-context.js.map +1 -0
  526. package/dist/model/route-auth-resolver.d.ts +27 -0
  527. package/dist/model/route-auth-resolver.d.ts.map +1 -0
  528. package/dist/model/route-auth-resolver.js +182 -0
  529. package/dist/model/route-auth-resolver.js.map +1 -0
  530. package/dist/model/route-discovery/express.d.ts +25 -0
  531. package/dist/model/route-discovery/express.d.ts.map +1 -0
  532. package/dist/model/route-discovery/express.js +225 -0
  533. package/dist/model/route-discovery/express.js.map +1 -0
  534. package/dist/model/route-discovery/index.d.ts +21 -0
  535. package/dist/model/route-discovery/index.d.ts.map +1 -0
  536. package/dist/model/route-discovery/index.js +67 -0
  537. package/dist/model/route-discovery/index.js.map +1 -0
  538. package/dist/model/route-discovery/nextjs.d.ts +16 -0
  539. package/dist/model/route-discovery/nextjs.d.ts.map +1 -0
  540. package/dist/model/route-discovery/nextjs.js +179 -0
  541. package/dist/model/route-discovery/nextjs.js.map +1 -0
  542. package/dist/model/route-discovery/python.d.ts +16 -0
  543. package/dist/model/route-discovery/python.d.ts.map +1 -0
  544. package/dist/model/route-discovery/python.js +181 -0
  545. package/dist/model/route-discovery/python.js.map +1 -0
  546. package/dist/model/route-discovery/types.d.ts +36 -0
  547. package/dist/model/route-discovery/types.d.ts.map +1 -0
  548. package/dist/model/route-discovery/types.js +16 -0
  549. package/dist/model/route-discovery/types.js.map +1 -0
  550. package/dist/model/route-discovery/utils.d.ts +18 -0
  551. package/dist/model/route-discovery/utils.d.ts.map +1 -0
  552. package/dist/model/route-discovery/utils.js +55 -0
  553. package/dist/model/route-discovery/utils.js.map +1 -0
  554. package/dist/model/route-hierarchy.d.ts +50 -0
  555. package/dist/model/route-hierarchy.d.ts.map +1 -0
  556. package/dist/model/route-hierarchy.js +226 -0
  557. package/dist/model/route-hierarchy.js.map +1 -0
  558. package/dist/model/sanitiser-detection.d.ts +27 -0
  559. package/dist/model/sanitiser-detection.d.ts.map +1 -0
  560. package/dist/model/sanitiser-detection.js +224 -0
  561. package/dist/model/sanitiser-detection.js.map +1 -0
  562. package/dist/model/sink-matcher.d.ts +17 -0
  563. package/dist/model/sink-matcher.d.ts.map +1 -0
  564. package/dist/model/sink-matcher.js +141 -0
  565. package/dist/model/sink-matcher.js.map +1 -0
  566. package/dist/model/sink-patterns.d.ts +19 -0
  567. package/dist/model/sink-patterns.d.ts.map +1 -0
  568. package/dist/model/sink-patterns.js +88 -0
  569. package/dist/model/sink-patterns.js.map +1 -0
  570. package/dist/model/source-discovery.d.ts +15 -0
  571. package/dist/model/source-discovery.d.ts.map +1 -0
  572. package/dist/model/source-discovery.js +170 -0
  573. package/dist/model/source-discovery.js.map +1 -0
  574. package/dist/model/taint-tracker.d.ts +21 -0
  575. package/dist/model/taint-tracker.d.ts.map +1 -0
  576. package/dist/model/taint-tracker.js +281 -0
  577. package/dist/model/taint-tracker.js.map +1 -0
  578. package/dist/model/taint-types.d.ts +74 -0
  579. package/dist/model/taint-types.d.ts.map +1 -0
  580. package/dist/model/taint-types.js +9 -0
  581. package/dist/model/taint-types.js.map +1 -0
  582. package/dist/model/trpc-analyzer.d.ts +78 -0
  583. package/dist/model/trpc-analyzer.d.ts.map +1 -0
  584. package/dist/model/trpc-analyzer.js +297 -0
  585. package/dist/model/trpc-analyzer.js.map +1 -0
  586. package/dist/modes/incremental.js +1 -1
  587. package/dist/parse/file-classifier.d.ts +228 -0
  588. package/dist/parse/file-classifier.d.ts.map +1 -0
  589. package/dist/parse/file-classifier.js +933 -0
  590. package/dist/parse/file-classifier.js.map +1 -0
  591. package/dist/parse/path-exclusions.d.ts +55 -0
  592. package/dist/parse/path-exclusions.d.ts.map +1 -0
  593. package/dist/parse/path-exclusions.js +224 -0
  594. package/dist/parse/path-exclusions.js.map +1 -0
  595. package/dist/pipeline/config.d.ts +39 -0
  596. package/dist/pipeline/config.d.ts.map +1 -0
  597. package/dist/pipeline/config.js +46 -0
  598. package/dist/pipeline/config.js.map +1 -0
  599. package/dist/pipeline/index.d.ts +34 -0
  600. package/dist/pipeline/index.d.ts.map +1 -0
  601. package/dist/pipeline/index.js +377 -0
  602. package/dist/pipeline/index.js.map +1 -0
  603. package/dist/pipeline/modes/incremental.d.ts +66 -0
  604. package/dist/pipeline/modes/incremental.d.ts.map +1 -0
  605. package/dist/pipeline/modes/incremental.js +200 -0
  606. package/dist/pipeline/modes/incremental.js.map +1 -0
  607. package/dist/postprocess/aggregation.d.ts +14 -0
  608. package/dist/postprocess/aggregation.d.ts.map +1 -0
  609. package/dist/postprocess/aggregation.js +63 -0
  610. package/dist/postprocess/aggregation.js.map +1 -0
  611. package/dist/postprocess/contradictions.d.ts +18 -0
  612. package/dist/postprocess/contradictions.d.ts.map +1 -0
  613. package/dist/postprocess/contradictions.js +99 -0
  614. package/dist/postprocess/contradictions.js.map +1 -0
  615. package/dist/postprocess/dedup.d.ts +13 -0
  616. package/dist/postprocess/dedup.d.ts.map +1 -0
  617. package/dist/postprocess/dedup.js +58 -0
  618. package/dist/postprocess/dedup.js.map +1 -0
  619. package/dist/postprocess/filtering/context-adjustments.d.ts +23 -0
  620. package/dist/postprocess/filtering/context-adjustments.d.ts.map +1 -0
  621. package/dist/postprocess/filtering/context-adjustments.js +100 -0
  622. package/dist/postprocess/filtering/context-adjustments.js.map +1 -0
  623. package/dist/postprocess/filtering/index.d.ts +3 -0
  624. package/dist/postprocess/filtering/index.d.ts.map +1 -0
  625. package/dist/postprocess/filtering/index.js +8 -0
  626. package/dist/postprocess/filtering/index.js.map +1 -0
  627. package/dist/postprocess/filtering/pipeline.d.ts +48 -0
  628. package/dist/postprocess/filtering/pipeline.d.ts.map +1 -0
  629. package/dist/postprocess/filtering/pipeline.js +76 -0
  630. package/dist/postprocess/filtering/pipeline.js.map +1 -0
  631. package/dist/postprocess/index.d.ts +41 -0
  632. package/dist/postprocess/index.d.ts.map +1 -0
  633. package/dist/postprocess/index.js +85 -0
  634. package/dist/postprocess/index.js.map +1 -0
  635. package/dist/postprocess/suppression/config-loader.d.ts +74 -0
  636. package/dist/postprocess/suppression/config-loader.d.ts.map +1 -0
  637. package/dist/postprocess/suppression/config-loader.js +424 -0
  638. package/dist/postprocess/suppression/config-loader.js.map +1 -0
  639. package/dist/postprocess/suppression/hash.d.ts +48 -0
  640. package/dist/postprocess/suppression/hash.d.ts.map +1 -0
  641. package/dist/postprocess/suppression/hash.js +88 -0
  642. package/dist/postprocess/suppression/hash.js.map +1 -0
  643. package/dist/postprocess/suppression/index.d.ts +11 -0
  644. package/dist/postprocess/suppression/index.d.ts.map +1 -0
  645. package/dist/postprocess/suppression/index.js +39 -0
  646. package/dist/postprocess/suppression/index.js.map +1 -0
  647. package/dist/postprocess/suppression/inline-parser.d.ts +39 -0
  648. package/dist/postprocess/suppression/inline-parser.d.ts.map +1 -0
  649. package/dist/postprocess/suppression/inline-parser.js +218 -0
  650. package/dist/postprocess/suppression/inline-parser.js.map +1 -0
  651. package/dist/postprocess/suppression/manager.d.ts +94 -0
  652. package/dist/postprocess/suppression/manager.d.ts.map +1 -0
  653. package/dist/postprocess/suppression/manager.js +292 -0
  654. package/dist/postprocess/suppression/manager.js.map +1 -0
  655. package/dist/postprocess/suppression/types.d.ts +151 -0
  656. package/dist/postprocess/suppression/types.d.ts.map +1 -0
  657. package/dist/postprocess/suppression/types.js +28 -0
  658. package/dist/postprocess/suppression/types.js.map +1 -0
  659. package/dist/postprocess/validation-cap.d.ts +17 -0
  660. package/dist/postprocess/validation-cap.d.ts.map +1 -0
  661. package/dist/postprocess/validation-cap.js +64 -0
  662. package/dist/postprocess/validation-cap.js.map +1 -0
  663. package/dist/report/build-result.d.ts +33 -0
  664. package/dist/report/build-result.d.ts.map +1 -0
  665. package/dist/report/build-result.js +59 -0
  666. package/dist/report/build-result.js.map +1 -0
  667. package/dist/report/enrichment.d.ts +19 -0
  668. package/dist/report/enrichment.d.ts.map +1 -0
  669. package/dist/report/enrichment.js +44 -0
  670. package/dist/report/enrichment.js.map +1 -0
  671. package/dist/report/formatters/ai-context.d.ts +23 -0
  672. package/dist/report/formatters/ai-context.d.ts.map +1 -0
  673. package/dist/report/formatters/ai-context.js +238 -0
  674. package/dist/report/formatters/ai-context.js.map +1 -0
  675. package/dist/report/formatters/cli-terminal.d.ts +65 -0
  676. package/dist/report/formatters/cli-terminal.d.ts.map +1 -0
  677. package/dist/report/formatters/cli-terminal.js +735 -0
  678. package/dist/report/formatters/cli-terminal.js.map +1 -0
  679. package/dist/report/formatters/github-comment.d.ts +41 -0
  680. package/dist/report/formatters/github-comment.d.ts.map +1 -0
  681. package/dist/report/formatters/github-comment.js +370 -0
  682. package/dist/report/formatters/github-comment.js.map +1 -0
  683. package/dist/report/formatters/grouping.d.ts +52 -0
  684. package/dist/report/formatters/grouping.d.ts.map +1 -0
  685. package/dist/report/formatters/grouping.js +152 -0
  686. package/dist/report/formatters/grouping.js.map +1 -0
  687. package/dist/report/formatters/ide/claude-code.d.ts +17 -0
  688. package/dist/report/formatters/ide/claude-code.d.ts.map +1 -0
  689. package/dist/report/formatters/ide/claude-code.js +94 -0
  690. package/dist/report/formatters/ide/claude-code.js.map +1 -0
  691. package/dist/report/formatters/ide/cursor.d.ts +13 -0
  692. package/dist/report/formatters/ide/cursor.d.ts.map +1 -0
  693. package/dist/report/formatters/ide/cursor.js +125 -0
  694. package/dist/report/formatters/ide/cursor.js.map +1 -0
  695. package/dist/report/formatters/ide/index.d.ts +62 -0
  696. package/dist/report/formatters/ide/index.d.ts.map +1 -0
  697. package/dist/report/formatters/ide/index.js +184 -0
  698. package/dist/report/formatters/ide/index.js.map +1 -0
  699. package/dist/report/formatters/ide/windsurf.d.ts +13 -0
  700. package/dist/report/formatters/ide/windsurf.d.ts.map +1 -0
  701. package/dist/report/formatters/ide/windsurf.js +117 -0
  702. package/dist/report/formatters/ide/windsurf.js.map +1 -0
  703. package/dist/report/formatters/index.d.ts +11 -0
  704. package/dist/report/formatters/index.d.ts.map +1 -0
  705. package/dist/report/formatters/index.js +54 -0
  706. package/dist/report/formatters/index.js.map +1 -0
  707. package/dist/report/formatters/vscode-diagnostic.d.ts +103 -0
  708. package/dist/report/formatters/vscode-diagnostic.d.ts.map +1 -0
  709. package/dist/report/formatters/vscode-diagnostic.js +151 -0
  710. package/dist/report/formatters/vscode-diagnostic.js.map +1 -0
  711. package/dist/report/summary.d.ts +27 -0
  712. package/dist/report/summary.d.ts.map +1 -0
  713. package/dist/report/summary.js +57 -0
  714. package/dist/report/summary.js.map +1 -0
  715. package/dist/rules/metadata.d.ts.map +1 -1
  716. package/dist/rules/metadata.js +66 -0
  717. package/dist/rules/metadata.js.map +1 -1
  718. package/dist/score/adjustments.d.ts +22 -0
  719. package/dist/score/adjustments.d.ts.map +1 -0
  720. package/dist/score/adjustments.js +373 -0
  721. package/dist/score/adjustments.js.map +1 -0
  722. package/dist/score/auto-dismiss.d.ts +28 -0
  723. package/dist/score/auto-dismiss.d.ts.map +1 -0
  724. package/dist/score/auto-dismiss.js +200 -0
  725. package/dist/score/auto-dismiss.js.map +1 -0
  726. package/dist/score/confidence.d.ts +19 -0
  727. package/dist/score/confidence.d.ts.map +1 -0
  728. package/dist/score/confidence.js +52 -0
  729. package/dist/score/confidence.js.map +1 -0
  730. package/dist/score/index.d.ts +61 -0
  731. package/dist/score/index.d.ts.map +1 -0
  732. package/dist/score/index.js +250 -0
  733. package/dist/score/index.js.map +1 -0
  734. package/dist/score/types.d.ts +160 -0
  735. package/dist/score/types.d.ts.map +1 -0
  736. package/dist/score/types.js +14 -0
  737. package/dist/score/types.js.map +1 -0
  738. package/dist/shared/ai-context/index.d.ts +6 -0
  739. package/dist/shared/ai-context/index.d.ts.map +1 -0
  740. package/dist/shared/ai-context/index.js +13 -0
  741. package/dist/shared/ai-context/index.js.map +1 -0
  742. package/dist/shared/ai-context/manager.d.ts +67 -0
  743. package/dist/shared/ai-context/manager.d.ts.map +1 -0
  744. package/dist/shared/ai-context/manager.js +104 -0
  745. package/dist/shared/ai-context/manager.js.map +1 -0
  746. package/dist/shared/baseline/diff.d.ts +32 -0
  747. package/dist/shared/baseline/diff.d.ts.map +1 -0
  748. package/dist/shared/baseline/diff.js +119 -0
  749. package/dist/shared/baseline/diff.js.map +1 -0
  750. package/dist/shared/baseline/index.d.ts +9 -0
  751. package/dist/shared/baseline/index.d.ts.map +1 -0
  752. package/dist/shared/baseline/index.js +19 -0
  753. package/dist/shared/baseline/index.js.map +1 -0
  754. package/dist/shared/baseline/manager.d.ts +67 -0
  755. package/dist/shared/baseline/manager.d.ts.map +1 -0
  756. package/dist/shared/baseline/manager.js +180 -0
  757. package/dist/shared/baseline/manager.js.map +1 -0
  758. package/dist/shared/baseline/types.d.ts +91 -0
  759. package/dist/shared/baseline/types.d.ts.map +1 -0
  760. package/dist/shared/baseline/types.js +12 -0
  761. package/dist/shared/baseline/types.js.map +1 -0
  762. package/dist/shared/category-filter.d.ts +125 -0
  763. package/dist/shared/category-filter.d.ts.map +1 -0
  764. package/dist/shared/category-filter.js +360 -0
  765. package/dist/shared/category-filter.js.map +1 -0
  766. package/dist/shared/code-analysis.d.ts +39 -0
  767. package/dist/shared/code-analysis.d.ts.map +1 -0
  768. package/dist/shared/code-analysis.js +159 -0
  769. package/dist/shared/code-analysis.js.map +1 -0
  770. package/dist/shared/comment-analyzer.d.ts +38 -0
  771. package/dist/shared/comment-analyzer.d.ts.map +1 -0
  772. package/dist/shared/comment-analyzer.js +218 -0
  773. package/dist/shared/comment-analyzer.js.map +1 -0
  774. package/dist/shared/diff-detector.d.ts +53 -0
  775. package/dist/shared/diff-detector.d.ts.map +1 -0
  776. package/dist/shared/diff-detector.js +104 -0
  777. package/dist/shared/diff-detector.js.map +1 -0
  778. package/dist/shared/diff-parser.d.ts +80 -0
  779. package/dist/shared/diff-parser.d.ts.map +1 -0
  780. package/dist/shared/diff-parser.js +202 -0
  781. package/dist/shared/diff-parser.js.map +1 -0
  782. package/dist/shared/environment-context.d.ts +76 -0
  783. package/dist/shared/environment-context.d.ts.map +1 -0
  784. package/dist/shared/environment-context.js +271 -0
  785. package/dist/shared/environment-context.js.map +1 -0
  786. package/dist/shared/intent-detector.d.ts +66 -0
  787. package/dist/shared/intent-detector.d.ts.map +1 -0
  788. package/dist/shared/intent-detector.js +282 -0
  789. package/dist/shared/intent-detector.js.map +1 -0
  790. package/dist/shared/parsed-file.d.ts +51 -0
  791. package/dist/shared/parsed-file.d.ts.map +1 -0
  792. package/dist/shared/parsed-file.js +95 -0
  793. package/dist/shared/parsed-file.js.map +1 -0
  794. package/dist/shared/registry-clients.d.ts +93 -0
  795. package/dist/shared/registry-clients.d.ts.map +1 -0
  796. package/dist/shared/registry-clients.js +273 -0
  797. package/dist/shared/registry-clients.js.map +1 -0
  798. package/dist/shared/rules/framework-fixes.d.ts +48 -0
  799. package/dist/shared/rules/framework-fixes.d.ts.map +1 -0
  800. package/dist/shared/rules/framework-fixes.js +439 -0
  801. package/dist/shared/rules/framework-fixes.js.map +1 -0
  802. package/dist/shared/rules/index.d.ts +8 -0
  803. package/dist/shared/rules/index.d.ts.map +1 -0
  804. package/dist/shared/rules/index.js +18 -0
  805. package/dist/shared/rules/index.js.map +1 -0
  806. package/dist/shared/rules/metadata.d.ts +43 -0
  807. package/dist/shared/rules/metadata.d.ts.map +1 -0
  808. package/dist/shared/rules/metadata.js +819 -0
  809. package/dist/shared/rules/metadata.js.map +1 -0
  810. package/dist/shared/schema-semantics.d.ts +45 -0
  811. package/dist/shared/schema-semantics.d.ts.map +1 -0
  812. package/dist/shared/schema-semantics.js +193 -0
  813. package/dist/shared/schema-semantics.js.map +1 -0
  814. package/dist/shared/types.d.ts +337 -0
  815. package/dist/shared/types.d.ts.map +1 -0
  816. package/dist/shared/types.js +126 -0
  817. package/dist/shared/types.js.map +1 -0
  818. package/dist/tiers.d.ts +4 -4
  819. package/dist/tiers.d.ts.map +1 -1
  820. package/dist/tiers.js +17 -7
  821. package/dist/tiers.js.map +1 -1
  822. package/dist/types.d.ts +79 -9
  823. package/dist/types.d.ts.map +1 -1
  824. package/dist/types.js +34 -0
  825. package/dist/types.js.map +1 -1
  826. package/dist/utils/code-analysis.d.ts +39 -0
  827. package/dist/utils/code-analysis.d.ts.map +1 -0
  828. package/dist/utils/code-analysis.js +159 -0
  829. package/dist/utils/code-analysis.js.map +1 -0
  830. package/dist/utils/comment-analyzer.d.ts +38 -0
  831. package/dist/utils/comment-analyzer.d.ts.map +1 -0
  832. package/dist/utils/comment-analyzer.js +218 -0
  833. package/dist/utils/comment-analyzer.js.map +1 -0
  834. package/dist/utils/context-helpers.d.ts +108 -1
  835. package/dist/utils/context-helpers.d.ts.map +1 -1
  836. package/dist/utils/context-helpers.js +351 -2
  837. package/dist/utils/context-helpers.js.map +1 -1
  838. package/dist/utils/environment-context.d.ts +76 -0
  839. package/dist/utils/environment-context.d.ts.map +1 -0
  840. package/dist/utils/environment-context.js +271 -0
  841. package/dist/utils/environment-context.js.map +1 -0
  842. package/dist/utils/intent-detector.d.ts +66 -0
  843. package/dist/utils/intent-detector.d.ts.map +1 -0
  844. package/dist/utils/intent-detector.js +282 -0
  845. package/dist/utils/intent-detector.js.map +1 -0
  846. package/dist/utils/parsed-file.d.ts +51 -0
  847. package/dist/utils/parsed-file.d.ts.map +1 -0
  848. package/dist/utils/parsed-file.js +95 -0
  849. package/dist/utils/parsed-file.js.map +1 -0
  850. package/dist/utils/route-hierarchy.d.ts +50 -0
  851. package/dist/utils/route-hierarchy.d.ts.map +1 -0
  852. package/dist/utils/route-hierarchy.js +226 -0
  853. package/dist/utils/route-hierarchy.js.map +1 -0
  854. package/dist/utils/schema-semantics.d.ts +45 -0
  855. package/dist/utils/schema-semantics.d.ts.map +1 -0
  856. package/dist/utils/schema-semantics.js +193 -0
  857. package/dist/utils/schema-semantics.js.map +1 -0
  858. package/dist/validate/clients.d.ts +44 -0
  859. package/dist/validate/clients.d.ts.map +1 -0
  860. package/dist/validate/clients.js +81 -0
  861. package/dist/validate/clients.js.map +1 -0
  862. package/dist/validate/index.d.ts +41 -0
  863. package/dist/validate/index.d.ts.map +1 -0
  864. package/dist/validate/index.js +141 -0
  865. package/dist/validate/index.js.map +1 -0
  866. package/dist/validate/prompts/index.d.ts +8 -0
  867. package/dist/validate/prompts/index.d.ts.map +1 -0
  868. package/dist/validate/prompts/index.js +16 -0
  869. package/dist/validate/prompts/index.js.map +1 -0
  870. package/dist/validate/prompts/modules/ai-patterns.d.ts +19 -0
  871. package/dist/validate/prompts/modules/ai-patterns.d.ts.map +1 -0
  872. package/dist/validate/prompts/modules/ai-patterns.js +156 -0
  873. package/dist/validate/prompts/modules/ai-patterns.js.map +1 -0
  874. package/dist/validate/prompts/modules/auth-access.d.ts +9 -0
  875. package/dist/validate/prompts/modules/auth-access.d.ts.map +1 -0
  876. package/dist/validate/prompts/modules/auth-access.js +25 -0
  877. package/dist/validate/prompts/modules/auth-access.js.map +1 -0
  878. package/dist/validate/prompts/modules/common.d.ts +11 -0
  879. package/dist/validate/prompts/modules/common.d.ts.map +1 -0
  880. package/dist/validate/prompts/modules/common.js +186 -0
  881. package/dist/validate/prompts/modules/common.js.map +1 -0
  882. package/dist/validate/prompts/modules/index.d.ts +54 -0
  883. package/dist/validate/prompts/modules/index.d.ts.map +1 -0
  884. package/dist/validate/prompts/modules/index.js +186 -0
  885. package/dist/validate/prompts/modules/index.js.map +1 -0
  886. package/dist/validate/prompts/modules/owasp-classic.d.ts +8 -0
  887. package/dist/validate/prompts/modules/owasp-classic.d.ts.map +1 -0
  888. package/dist/validate/prompts/modules/owasp-classic.js +84 -0
  889. package/dist/validate/prompts/modules/owasp-classic.js.map +1 -0
  890. package/dist/validate/prompts/modules/secrets-crypto.d.ts +8 -0
  891. package/dist/validate/prompts/modules/secrets-crypto.d.ts.map +1 -0
  892. package/dist/validate/prompts/modules/secrets-crypto.js +68 -0
  893. package/dist/validate/prompts/modules/secrets-crypto.js.map +1 -0
  894. package/dist/validate/prompts/modules/xss-prompt.d.ts +8 -0
  895. package/dist/validate/prompts/modules/xss-prompt.d.ts.map +1 -0
  896. package/dist/validate/prompts/modules/xss-prompt.js +22 -0
  897. package/dist/validate/prompts/modules/xss-prompt.js.map +1 -0
  898. package/dist/validate/prompts/semantic-analysis.d.ts +15 -0
  899. package/dist/validate/prompts/semantic-analysis.d.ts.map +1 -0
  900. package/dist/validate/prompts/semantic-analysis.js +169 -0
  901. package/dist/validate/prompts/semantic-analysis.js.map +1 -0
  902. package/dist/validate/prompts/validation.d.ts +18 -0
  903. package/dist/validate/prompts/validation.d.ts.map +1 -0
  904. package/dist/validate/prompts/validation.js +25 -0
  905. package/dist/validate/prompts/validation.js.map +1 -0
  906. package/dist/validate/providers/anthropic.d.ts +17 -0
  907. package/dist/validate/providers/anthropic.d.ts.map +1 -0
  908. package/dist/validate/providers/anthropic.js +260 -0
  909. package/dist/validate/providers/anthropic.js.map +1 -0
  910. package/dist/validate/providers/index.d.ts +8 -0
  911. package/dist/validate/providers/index.d.ts.map +1 -0
  912. package/dist/validate/providers/index.js +13 -0
  913. package/dist/validate/providers/index.js.map +1 -0
  914. package/dist/validate/providers/openai.d.ts +14 -0
  915. package/dist/validate/providers/openai.d.ts.map +1 -0
  916. package/dist/validate/providers/openai.js +336 -0
  917. package/dist/validate/providers/openai.js.map +1 -0
  918. package/dist/validate/request-builder.d.ts +61 -0
  919. package/dist/validate/request-builder.d.ts.map +1 -0
  920. package/dist/validate/request-builder.js +346 -0
  921. package/dist/validate/request-builder.js.map +1 -0
  922. package/dist/validate/types.d.ts +88 -0
  923. package/dist/validate/types.d.ts.map +1 -0
  924. package/dist/validate/types.js +38 -0
  925. package/dist/validate/types.js.map +1 -0
  926. package/dist/validate/utils/context-extractor.d.ts +55 -0
  927. package/dist/validate/utils/context-extractor.d.ts.map +1 -0
  928. package/dist/validate/utils/context-extractor.js +161 -0
  929. package/dist/validate/utils/context-extractor.js.map +1 -0
  930. package/dist/validate/utils/index.d.ts +11 -0
  931. package/dist/validate/utils/index.d.ts.map +1 -0
  932. package/dist/validate/utils/index.js +27 -0
  933. package/dist/validate/utils/index.js.map +1 -0
  934. package/dist/validate/utils/path-helpers.d.ts +21 -0
  935. package/dist/validate/utils/path-helpers.d.ts.map +1 -0
  936. package/dist/validate/utils/path-helpers.js +69 -0
  937. package/dist/validate/utils/path-helpers.js.map +1 -0
  938. package/dist/validate/utils/response-parser.d.ts +40 -0
  939. package/dist/validate/utils/response-parser.d.ts.map +1 -0
  940. package/dist/validate/utils/response-parser.js +286 -0
  941. package/dist/validate/utils/response-parser.js.map +1 -0
  942. package/dist/validate/utils/retry.d.ts +15 -0
  943. package/dist/validate/utils/retry.d.ts.map +1 -0
  944. package/dist/validate/utils/retry.js +62 -0
  945. package/dist/validate/utils/retry.js.map +1 -0
  946. package/package.json +8 -7
  947. package/src/__tests__/benchmark/fixtures/layer1/agent-skill-injection.ts +204 -0
  948. package/src/__tests__/benchmark/fixtures/layer1/index.ts +3 -0
  949. package/src/__tests__/benchmark/fixtures/layer2/index.ts +27 -0
  950. package/src/__tests__/benchmark/fixtures/layer2/log-injection.ts +147 -0
  951. package/src/__tests__/benchmark/fixtures/layer2/phase5-excessive-agency.ts +580 -0
  952. package/src/__tests__/benchmark/fixtures/layer2/security-headers.ts +197 -0
  953. package/src/__tests__/benchmark/fixtures/layer2/sprint6-ai-enhancements.ts +515 -0
  954. package/src/__tests__/benchmark/fixtures/layer2/ssrf-detection.ts +210 -0
  955. package/src/__tests__/benchmark/fixtures/layer2/xxe-detection.ts +195 -0
  956. package/src/__tests__/benchmark/run-depth-validation.ts +12 -12
  957. package/src/__tests__/benchmark/run-real-world-test.ts +4 -4
  958. package/src/__tests__/benchmark/types.ts +1 -1
  959. package/src/__tests__/benchmark/utils/test-runner.ts +3 -3
  960. package/src/__tests__/category-filter.test.ts +478 -0
  961. package/src/__tests__/context-engine/cross-file-taint.test.ts +284 -0
  962. package/src/__tests__/context-engine/framework-models.test.ts +457 -0
  963. package/src/__tests__/context-engine/function-classifier.test.ts +146 -0
  964. package/src/__tests__/context-engine/import-resolver.test.ts +328 -0
  965. package/src/__tests__/context-engine/integration.test.ts +320 -0
  966. package/src/__tests__/context-engine/module-graph.test.ts +159 -0
  967. package/src/__tests__/context-engine/route-discovery/auth-resolver.test.ts +353 -0
  968. package/src/__tests__/context-engine/route-discovery/express.test.ts +150 -0
  969. package/src/__tests__/context-engine/route-discovery/nextjs.test.ts +138 -0
  970. package/src/__tests__/context-engine/route-discovery/python.test.ts +95 -0
  971. package/src/__tests__/context-engine/sanitiser-detection.test.ts +187 -0
  972. package/src/__tests__/context-engine/sink-matcher.test.ts +251 -0
  973. package/src/__tests__/context-engine/source-discovery.test.ts +186 -0
  974. package/src/__tests__/context-engine/taint-tracker.test.ts +182 -0
  975. package/src/__tests__/regression/agent-skill-benign.test.ts +174 -0
  976. package/src/__tests__/regression/known-false-positives.test.ts +801 -3
  977. package/src/__tests__/score/adjustments.test.ts +385 -0
  978. package/src/__tests__/score/confidence.test.ts +283 -0
  979. package/src/__tests__/score/framework-scoring.test.ts +275 -0
  980. package/src/__tests__/score/route-scoring.test.ts +156 -0
  981. package/src/__tests__/score/scoring-integration.test.ts +165 -0
  982. package/src/__tests__/score/taint-adjustments.test.ts +244 -0
  983. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +50 -58
  984. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +52 -0
  985. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +3 -12
  986. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +3 -3
  987. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +1 -1
  988. package/src/__tests__/snapshots/scan-depth.test.ts +3 -3
  989. package/src/__tests__/validate/route-annotations.test.ts +138 -0
  990. package/src/__tests__/validation/analyze-results.ts +1 -1
  991. package/src/__tests__/validation/extract-for-triage.ts +1 -1
  992. package/src/__tests__/validation/fp-deep-analysis.ts +1 -1
  993. package/src/__tests__/validation/run-validation.ts +7 -7
  994. package/src/{layer2/ai-agent-tools.ts → detect/ai-code/agent-tools.ts} +729 -4
  995. package/src/{layer2 → detect/ai-code}/byok-patterns.ts +20 -6
  996. package/src/{layer2/ai-endpoint-protection.ts → detect/ai-code/endpoint-protection.ts} +10 -4
  997. package/src/{layer2/ai-execution-sinks.ts → detect/ai-code/execution-sinks.ts} +272 -46
  998. package/src/{layer2/ai-fingerprinting.ts → detect/ai-code/fingerprinting.ts} +46 -34
  999. package/src/detect/ai-code/index.ts +11 -0
  1000. package/src/{layer2/ai-mcp-security.ts → detect/ai-code/mcp-security.ts} +212 -5
  1001. package/src/{layer2 → detect/ai-code}/model-supply-chain.ts +85 -6
  1002. package/src/{layer2/ai-package-hallucination.ts → detect/ai-code/package-hallucination.ts} +170 -6
  1003. package/src/{layer2/ai-prompt-hygiene.ts → detect/ai-code/prompt-hygiene.ts} +393 -28
  1004. package/src/{layer2/ai-rag-safety.ts → detect/ai-code/rag-safety.ts} +91 -4
  1005. package/src/{layer2/ai-schema-validation.ts → detect/ai-code/schema-validation.ts} +10 -4
  1006. package/src/detect/config/agent-skill-injection.ts +551 -0
  1007. package/src/{layer1 → detect/config}/comments.ts +8 -2
  1008. package/src/{layer1 → detect/config}/file-flags.ts +23 -6
  1009. package/src/detect/config/index.ts +6 -0
  1010. package/src/{layer3 → detect/config}/osv-check.ts +3 -2
  1011. package/src/{layer3 → detect/config}/package-check.ts +3 -2
  1012. package/src/{layer1 → detect/config}/urls.ts +196 -15
  1013. package/src/detect/index.ts +131 -0
  1014. package/src/{layer1 → detect/secrets}/config-audit.ts +56 -12
  1015. package/src/{layer1 → detect/secrets}/config-mcp-audit.ts +11 -4
  1016. package/src/{layer1 → detect/secrets}/entropy.ts +256 -11
  1017. package/src/{layer1 → detect/secrets}/index.ts +43 -46
  1018. package/src/{layer1 → detect/secrets}/patterns.ts +51 -6
  1019. package/src/{layer1 → detect/secrets}/weak-crypto.ts +174 -17
  1020. package/src/{layer2/auth-antipatterns.ts → detect/structural/auth-patterns.ts} +249 -27
  1021. package/src/{layer2 → detect/structural}/dangerous-functions/dom-xss.ts +94 -22
  1022. package/src/{layer2 → detect/structural}/dangerous-functions/index.ts +672 -65
  1023. package/src/{layer2 → detect/structural}/dangerous-functions/json-parse.ts +10 -2
  1024. package/src/{layer2 → detect/structural}/dangerous-functions/math-random.ts +269 -17
  1025. package/src/{layer2 → detect/structural}/dangerous-functions/patterns.ts +4 -2
  1026. package/src/{layer2 → detect/structural}/dangerous-functions/request-validation.ts +10 -2
  1027. package/src/detect/structural/dangerous-functions/utils/control-flow.ts +35 -0
  1028. package/src/{layer2 → detect/structural}/dangerous-functions/utils/schema-validation.ts +16 -1
  1029. package/src/{layer2 → detect/structural}/data-exposure.ts +23 -40
  1030. package/src/{layer2 → detect/structural}/framework-checks.ts +13 -12
  1031. package/src/{layer2 → detect/structural}/index.ts +144 -122
  1032. package/src/detect/structural/log-injection.ts +254 -0
  1033. package/src/{layer2 → detect/structural}/logic-gates.ts +69 -24
  1034. package/src/{layer2 → detect/structural}/risky-imports.ts +10 -4
  1035. package/src/detect/structural/security-headers.ts +231 -0
  1036. package/src/detect/structural/ssrf-detection.ts +300 -0
  1037. package/src/{layer2 → detect/structural}/variables.ts +10 -4
  1038. package/src/detect/structural/xxe-detection.ts +295 -0
  1039. package/src/index.ts +64 -1038
  1040. package/src/{utils → model}/auth-helper-detector.ts +1 -1
  1041. package/src/model/cross-file-taint.ts +374 -0
  1042. package/src/model/framework-models/django.ts +82 -0
  1043. package/src/model/framework-models/express.ts +54 -0
  1044. package/src/model/framework-models/index.ts +116 -0
  1045. package/src/model/framework-models/nextjs.ts +69 -0
  1046. package/src/model/framework-models/prisma.ts +57 -0
  1047. package/src/model/framework-models/react.ts +63 -0
  1048. package/src/model/framework-models/sequelize.ts +63 -0
  1049. package/src/model/framework-models/types.ts +46 -0
  1050. package/src/model/function-classifier.ts +184 -0
  1051. package/src/model/import-resolver.ts +453 -0
  1052. package/src/{utils → model}/imported-auth-detector.ts +21 -85
  1053. package/src/model/index.ts +353 -0
  1054. package/src/{utils → model}/middleware-detector.ts +156 -17
  1055. package/src/model/module-graph.ts +254 -0
  1056. package/src/{utils → model}/oauth-flow-detector.ts +1 -1
  1057. package/src/{utils/project-context-builder.ts → model/project-context.ts} +1 -1
  1058. package/src/model/route-auth-resolver.ts +216 -0
  1059. package/src/model/route-discovery/express.ts +251 -0
  1060. package/src/model/route-discovery/index.ts +83 -0
  1061. package/src/model/route-discovery/nextjs.ts +216 -0
  1062. package/src/model/route-discovery/python.ts +214 -0
  1063. package/src/model/route-discovery/types.ts +48 -0
  1064. package/src/model/route-discovery/utils.ts +54 -0
  1065. package/src/model/route-hierarchy.ts +250 -0
  1066. package/src/model/sanitiser-detection.ts +268 -0
  1067. package/src/model/sink-matcher.ts +178 -0
  1068. package/src/model/sink-patterns.ts +109 -0
  1069. package/src/model/source-discovery.ts +209 -0
  1070. package/src/model/taint-tracker.ts +333 -0
  1071. package/src/model/taint-types.ts +149 -0
  1072. package/src/{utils → model}/trpc-analyzer.ts +1 -1
  1073. package/src/{utils/context-helpers.ts → parse/file-classifier.ts} +462 -2
  1074. package/src/{utils → parse}/path-exclusions.ts +1 -1
  1075. package/src/pipeline/config.ts +81 -0
  1076. package/src/pipeline/index.ts +437 -0
  1077. package/src/{modes → pipeline/modes}/incremental.ts +6 -6
  1078. package/src/postprocess/aggregation.ts +74 -0
  1079. package/src/postprocess/contradictions.ts +128 -0
  1080. package/src/postprocess/dedup.ts +62 -0
  1081. package/src/postprocess/filtering/__tests__/pipeline.test.ts +134 -0
  1082. package/src/postprocess/filtering/context-adjustments.ts +111 -0
  1083. package/src/postprocess/filtering/index.ts +10 -0
  1084. package/src/postprocess/filtering/pipeline.ts +130 -0
  1085. package/src/postprocess/index.ts +118 -0
  1086. package/src/{suppression → postprocess/suppression}/config-loader.ts +1 -1
  1087. package/src/{suppression → postprocess/suppression}/hash.ts +1 -1
  1088. package/src/{suppression → postprocess/suppression}/inline-parser.ts +1 -1
  1089. package/src/{suppression → postprocess/suppression}/manager.ts +1 -1
  1090. package/src/{suppression → postprocess/suppression}/types.ts +2 -2
  1091. package/src/postprocess/validation-cap.ts +66 -0
  1092. package/src/report/build-result.ts +94 -0
  1093. package/src/report/enrichment.ts +52 -0
  1094. package/src/report/formatters/__tests__/ai-context.test.ts +254 -0
  1095. package/src/report/formatters/ai-context.ts +302 -0
  1096. package/src/{formatters → report/formatters}/cli-terminal.ts +11 -11
  1097. package/src/{formatters → report/formatters}/github-comment.ts +4 -4
  1098. package/src/{formatters → report/formatters}/grouping.ts +8 -8
  1099. package/src/report/formatters/ide/__tests__/ide.test.ts +319 -0
  1100. package/src/report/formatters/ide/claude-code.ts +110 -0
  1101. package/src/report/formatters/ide/cursor.ts +147 -0
  1102. package/src/report/formatters/ide/index.ts +216 -0
  1103. package/src/report/formatters/ide/windsurf.ts +135 -0
  1104. package/src/{formatters → report/formatters}/index.ts +24 -0
  1105. package/src/{formatters → report/formatters}/vscode-diagnostic.ts +1 -1
  1106. package/src/report/summary.ts +70 -0
  1107. package/src/score/adjustments.ts +387 -0
  1108. package/src/{layer3/anthropic → score}/auto-dismiss.ts +26 -14
  1109. package/src/score/confidence.ts +66 -0
  1110. package/src/score/index.ts +316 -0
  1111. package/src/score/types.ts +187 -0
  1112. package/src/shared/__tests__/code-analysis.test.ts +165 -0
  1113. package/src/shared/__tests__/parsed-file.test.ts +124 -0
  1114. package/src/shared/ai-context/__tests__/manager.test.ts +193 -0
  1115. package/src/shared/ai-context/index.ts +15 -0
  1116. package/src/shared/ai-context/manager.ts +145 -0
  1117. package/src/{baseline → shared/baseline}/__tests__/diff.test.ts +2 -2
  1118. package/src/{baseline → shared/baseline}/__tests__/manager.test.ts +2 -2
  1119. package/src/{baseline → shared/baseline}/diff.ts +1 -1
  1120. package/src/{baseline → shared/baseline}/manager.ts +1 -1
  1121. package/src/shared/category-filter.ts +400 -0
  1122. package/src/{layer2/dangerous-functions/utils/control-flow.ts → shared/code-analysis.ts} +56 -39
  1123. package/src/shared/comment-analyzer.ts +249 -0
  1124. package/src/shared/environment-context.ts +304 -0
  1125. package/src/shared/intent-detector.ts +318 -0
  1126. package/src/shared/parsed-file.ts +103 -0
  1127. package/src/{rules → shared/rules}/__tests__/metadata.test.ts +7 -0
  1128. package/src/{rules → shared/rules}/framework-fixes.ts +1 -1
  1129. package/src/{rules → shared/rules}/metadata.ts +94 -0
  1130. package/src/shared/schema-semantics.ts +233 -0
  1131. package/src/{types.ts → shared/types.ts} +142 -11
  1132. package/src/tiers.ts +27 -10
  1133. package/src/validate/__tests__/context-extractor.test.ts +191 -0
  1134. package/src/validate/__tests__/prompt-assembly.test.ts +233 -0
  1135. package/src/validate/__tests__/request-builder.test.ts +347 -0
  1136. package/src/{layer3/anthropic → validate}/index.ts +8 -7
  1137. package/src/{layer3/anthropic → validate}/prompts/index.ts +2 -0
  1138. package/src/validate/prompts/modules/ai-patterns.ts +153 -0
  1139. package/src/validate/prompts/modules/auth-access.ts +22 -0
  1140. package/src/validate/prompts/modules/common.ts +183 -0
  1141. package/src/validate/prompts/modules/index.ts +204 -0
  1142. package/src/validate/prompts/modules/owasp-classic.ts +81 -0
  1143. package/src/validate/prompts/modules/secrets-crypto.ts +65 -0
  1144. package/src/validate/prompts/modules/xss-prompt.ts +19 -0
  1145. package/src/validate/prompts/validation.ts +20 -0
  1146. package/src/{layer3/anthropic → validate}/providers/anthropic.ts +28 -27
  1147. package/src/validate/providers/index.ts +8 -0
  1148. package/src/{layer3/anthropic → validate}/providers/openai.ts +30 -25
  1149. package/src/validate/request-builder.ts +448 -0
  1150. package/src/{layer3/anthropic → validate}/types.ts +1 -1
  1151. package/src/validate/utils/context-extractor.ts +220 -0
  1152. package/src/{layer3/anthropic → validate}/utils/index.ts +10 -0
  1153. package/src/{layer3/anthropic → validate}/utils/response-parser.ts +2 -1
  1154. package/src/layer3/anthropic/prompts/validation.ts +0 -419
  1155. package/src/layer3/anthropic/providers/index.ts +0 -8
  1156. package/src/layer3/anthropic/request-builder.ts +0 -150
  1157. package/src/layer3/index.ts +0 -168
  1158. /package/src/{layer3 → detect/config}/__tests__/osv-check.test.ts +0 -0
  1159. /package/src/{layer2 → detect/structural}/__tests__/math-random-enhanced.test.ts +0 -0
  1160. /package/src/{layer2 → detect/structural}/dangerous-functions/child-process.ts +0 -0
  1161. /package/src/{layer2 → detect/structural}/dangerous-functions/utils/helpers.ts +0 -0
  1162. /package/src/{layer2 → detect/structural}/dangerous-functions/utils/index.ts +0 -0
  1163. /package/src/{suppression → postprocess/suppression}/__tests__/config-loader.test.ts +0 -0
  1164. /package/src/{suppression → postprocess/suppression}/__tests__/hash.test.ts +0 -0
  1165. /package/src/{suppression → postprocess/suppression}/__tests__/inline-parser.test.ts +0 -0
  1166. /package/src/{suppression → postprocess/suppression}/__tests__/manager.test.ts +0 -0
  1167. /package/src/{suppression → postprocess/suppression}/index.ts +0 -0
  1168. /package/src/{baseline → shared/baseline}/index.ts +0 -0
  1169. /package/src/{baseline → shared/baseline}/types.ts +0 -0
  1170. /package/src/{utils → shared}/diff-detector.ts +0 -0
  1171. /package/src/{utils → shared}/diff-parser.ts +0 -0
  1172. /package/src/{utils → shared}/registry-clients.ts +0 -0
  1173. /package/src/{rules → shared/rules}/__tests__/framework-fixes.test.ts +0 -0
  1174. /package/src/{rules → shared/rules}/index.ts +0 -0
  1175. /package/src/{layer3/anthropic → validate}/clients.ts +0 -0
  1176. /package/src/{layer3/anthropic → validate}/prompts/semantic-analysis.ts +0 -0
  1177. /package/src/{layer3/anthropic → validate}/utils/path-helpers.ts +0 -0
  1178. /package/src/{layer3/anthropic → validate}/utils/retry.ts +0 -0
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * Scanner Orchestrator
4
- * Coordinates all three scanning layers and produces final results
3
+ * Scanner Public API
4
+ *
5
+ * Re-exports from stage modules. All prior exports preserved.
5
6
  */
6
7
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
8
  if (k2 === undefined) k2 = k;
@@ -18,826 +19,50 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
19
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
20
  };
20
21
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.hasMetadata = exports.getAllCategories = exports.getRuleMetadata = exports.RULE_REGISTRY = exports.OCULUM_DIR = exports.BASELINE_FILE_PATH = exports.formatDiffSummary = exports.hasNewBlockingIssues = exports.computeDiff = exports.BaselineManager = exports.isValidHash = exports.generateSuppressionComment = exports.parseInlineSuppressions = exports.listSuppressions = exports.addRuleSuppression = exports.removeFindingSuppression = exports.addFindingSuppression = exports.loadSuppressionConfig = exports.computeFindingHash = exports.SuppressionManager = exports.createCancellationToken = exports.validateFindingsWithAI = exports.buildProjectContext = exports.runLayer3Scan = exports.runLayer2Scan = exports.runLayer1Scan = void 0;
22
- exports.runScan = runScan;
23
- exports.computeIssueMixFromVulnerabilities = computeIssueMixFromVulnerabilities;
24
- const types_1 = require("./types");
25
- const layer1_1 = require("./layer1");
26
- const layer2_1 = require("./layer2");
27
- const layer3_1 = require("./layer3");
28
- const anthropic_1 = require("./layer3/anthropic");
29
- const urls_1 = require("./layer1/urls");
30
- const middleware_detector_1 = require("./utils/middleware-detector");
31
- const auth_helper_detector_1 = require("./utils/auth-helper-detector");
32
- const imported_auth_detector_1 = require("./utils/imported-auth-detector");
33
- // Tier system imports for filtering by scan depth
34
- const tiers_1 = require("./tiers");
35
- // Suppression system
36
- const suppression_1 = require("./suppression");
37
- // Rule metadata for actionable output (PRO-82)
38
- const rules_1 = require("./rules");
39
- // Framework-aware fix suggestions (PRO-83)
40
- const framework_fixes_1 = require("./rules/framework-fixes");
41
- // Project context for framework detection
42
- const project_context_builder_1 = require("./utils/project-context-builder");
43
- // Maximum candidates per file to send to AI validation (cost control)
44
- const MAX_VALIDATION_CANDIDATES_PER_FILE = 10;
45
- /**
46
- * Classify vulnerabilities by their detector tier
47
- */
48
- function classifyByTier(vulnerabilities) {
49
- const result = {
50
- core: [],
51
- ai_assisted: [],
52
- experimental: [],
53
- };
54
- for (const vuln of vulnerabilities) {
55
- const tier = (0, tiers_1.getTierForCategory)(vuln.category, vuln.layer);
56
- result[tier].push(vuln);
57
- }
58
- return result;
59
- }
60
- /**
61
- * Filter vulnerabilities based on scan depth and tier
62
- *
63
- * - cheap: Only Tier A (core) findings are surfaced
64
- * - validated: Tier A visible, Tier B goes through AI validation
65
- * - deep: Same as validated, plus Layer 3 semantic analysis
66
- *
67
- * Tier C (experimental) is NEVER surfaced to users, regardless of depth.
68
- */
69
- function filterByTierAndDepth(vulnerabilities, depth) {
70
- const classified = classifyByTier(vulnerabilities);
71
- const tierStats = (0, tiers_1.computeTierStats)(vulnerabilities.map(v => ({ category: v.category, layer: v.layer })));
72
- switch (depth) {
73
- case 'cheap':
74
- // Only Tier A is visible, no AI validation
75
- return {
76
- toSurface: classified.core,
77
- toValidate: [],
78
- hidden: [...classified.ai_assisted, ...classified.experimental],
79
- tierStats,
80
- };
81
- case 'validated':
82
- case 'deep':
83
- // Tier A always surfaces, Tier B goes to AI validation
84
- // For findings that already require AI validation, only include Tier A/B
85
- const coreRequiringValidation = classified.core.filter(v => v.requiresAIValidation ||
86
- v.category === 'high_entropy_string' ||
87
- v.category === 'hardcoded_secret' ||
88
- (v.category === 'sensitive_url' && v.severity !== 'info'));
89
- const coreNotRequiringValidation = classified.core.filter(v => !coreRequiringValidation.includes(v));
90
- return {
91
- toSurface: coreNotRequiringValidation,
92
- toValidate: [...coreRequiringValidation, ...classified.ai_assisted],
93
- hidden: classified.experimental,
94
- tierStats,
95
- };
96
- }
97
- }
98
- /**
99
- * Resolve scan mode configuration from options
100
- *
101
- * Handles both scan mode (full/incremental) and depth (cheap/validated/deep).
102
- * Depth controls AI usage:
103
- * - cheap: skip AI validation + skip Layer 3
104
- * - validated: run AI validation, skip Layer 3
105
- * - deep: run AI validation + Layer 3
106
- */
107
- function resolveScanModeConfig(options) {
108
- const scanModeOption = options.scanMode;
109
- // Determine base mode
110
- const mode = !scanModeOption ? 'full'
111
- : typeof scanModeOption === 'string' ? scanModeOption
112
- : scanModeOption.mode;
113
- const defaults = types_1.SCAN_MODE_DEFAULTS[mode];
114
- // Build config from defaults + explicit overrides
115
- let config = {
116
- ...defaults,
117
- mode,
118
- ...(typeof scanModeOption === 'object' ? scanModeOption : {}),
119
- };
120
- // Apply depth mode (default: 'cheap')
121
- const depth = options.scanDepth ?? 'cheap';
122
- config.scanDepth = depth;
123
- // Map depth to skipAIValidation/skipLayer3 unless explicitly overridden
124
- const hasExplicitSkipAI = typeof scanModeOption === 'object' && scanModeOption.skipAIValidation !== undefined;
125
- const hasExplicitSkipL3 = typeof scanModeOption === 'object' && scanModeOption.skipLayer3 !== undefined;
126
- if (!hasExplicitSkipAI) {
127
- config.skipAIValidation = depth === 'cheap';
128
- }
129
- if (!hasExplicitSkipL3) {
130
- config.skipLayer3 = depth !== 'deep';
131
- }
132
- return config;
133
- }
134
- /**
135
- * Run a complete security scan on the provided files
136
- *
137
- * Supports two scan modes:
138
- * - full: Complete scan with AI validation on all files (initial onboarding, deep audits)
139
- * - incremental: Focused scan on changed files only (CI/CD, fast feedback)
140
- */
141
- async function runScan(files, repoInfo, options = {}, onProgress) {
142
- const startTime = Date.now();
143
- const allVulnerabilities = [];
144
- // Resolve scan mode configuration
145
- const scanModeConfig = resolveScanModeConfig(options);
146
- const isIncremental = scanModeConfig.mode === 'incremental';
147
- const depth = scanModeConfig.scanDepth || 'cheap';
148
- const quiet = options.quiet ?? false;
149
- const cancellationToken = options.cancellationToken;
150
- // Conditional logging helper - suppresses output in quiet mode (interactive CLI)
151
- const log = (message) => {
152
- if (!quiet) {
153
- console.log(message);
154
- }
155
- };
156
- // Helper to check cancellation and throw if cancelled
157
- const checkCancelled = () => {
158
- if (cancellationToken?.cancelled) {
159
- throw new Error(`Scan cancelled: ${cancellationToken.reason || 'user requested'}`);
160
- }
161
- };
162
- log(`[Scanner] repo=${repoInfo.name} mode=${scanModeConfig.mode} depth=${depth} files=${files.length}`);
163
- if (isIncremental && scanModeConfig.changedFiles) {
164
- log(`[Scanner] repo=${repoInfo.name} incremental_files=${scanModeConfig.changedFiles.length}`);
165
- }
166
- // Report progress helper
167
- const reportProgress = (status, message, vulnerabilitiesFound = allVulnerabilities.length) => {
168
- if (onProgress) {
169
- onProgress({
170
- status,
171
- message,
172
- filesProcessed: files.length,
173
- totalFiles: files.length,
174
- vulnerabilitiesFound,
175
- });
176
- }
177
- };
178
- // For incremental scans, filter to only changed files for AI-heavy operations
179
- // but still run static analysis on all files for context
180
- const filesForAI = isIncremental && scanModeConfig.changedFiles
181
- ? files.filter(f => scanModeConfig.changedFiles.some(cf => f.path.endsWith(cf) || f.path.includes(cf)))
182
- : files;
183
- // Declare variables that need to be accessible in catch block
184
- let middlewareConfig;
185
- let capturedValidationStats;
186
- try {
187
- checkCancelled();
188
- // Detect global auth middleware before scanning (always on all files for context)
189
- middlewareConfig = (0, middleware_detector_1.detectGlobalAuthMiddleware)(files);
190
- if (middlewareConfig.hasAuthMiddleware) {
191
- log(`[Scanner] repo=${repoInfo.name} auth_middleware=${middlewareConfig.authType || 'unknown'} file=${middlewareConfig.middlewareFile}`);
192
- }
193
- // Build imported auth registry for cross-file middleware detection
194
- const fileAuthImports = (0, imported_auth_detector_1.buildFileAuthImports)(files);
195
- const filesWithImportedAuth = Array.from(fileAuthImports.values()).filter(f => f.usesImportedAuth).length;
196
- if (filesWithImportedAuth > 0) {
197
- log(`[Scanner] repo=${repoInfo.name} files_with_imported_auth=${filesWithImportedAuth}`);
198
- }
199
- checkCancelled();
200
- // Phase timing tracking
201
- const phaseTiming = {};
202
- // Layer 1: Surface Scan
203
- const layer1Start = Date.now();
204
- reportProgress('layer1', 'Running surface scan (patterns, entropy, config)...');
205
- let layer1Result = await (0, layer1_1.runLayer1Scan)(files, onProgress, cancellationToken);
206
- // Aggregate repeated localhost findings
207
- const layer1RawCount = layer1Result.vulnerabilities.length;
208
- layer1Result = {
209
- ...layer1Result,
210
- vulnerabilities: (0, urls_1.aggregateLocalhostFindings)(layer1Result.vulnerabilities)
211
- };
212
- phaseTiming.layer1 = Date.now() - layer1Start;
213
- log(`[Layer1] repo=${repoInfo.name} findings_raw=${layer1RawCount} findings_deduped=${layer1Result.vulnerabilities.length} duration=${phaseTiming.layer1}ms`);
214
- checkCancelled();
215
- // Layer 2: Structural Scan
216
- const layer2Start = Date.now();
217
- reportProgress('layer2', 'Running structural scan (variables, logic gates)...', layer1Result.vulnerabilities.length);
218
- const layer2Result = await (0, layer2_1.runLayer2Scan)(files, { middlewareConfig, fileAuthImports }, onProgress, cancellationToken);
219
- // Format heuristic breakdown for logging
220
- const heuristicBreakdown = Object.entries(layer2Result.stats.raw)
221
- .filter(([, count]) => count > 0)
222
- .map(([name, count]) => `${name}:${count}`)
223
- .join(',');
224
- phaseTiming.layer2 = Date.now() - layer2Start;
225
- log(`[Layer2] repo=${repoInfo.name} findings_raw=${Object.values(layer2Result.stats.raw).reduce((a, b) => a + b, 0)} findings_deduped=${layer2Result.vulnerabilities.length} duration=${phaseTiming.layer2}ms heuristic_breakdown={${heuristicBreakdown}}`);
226
- // Combine Layer 1 and Layer 2 findings
227
- const layer12Findings = [...layer1Result.vulnerabilities, ...layer2Result.vulnerabilities];
228
- // Aggregate noisy findings BEFORE tier filtering to reduce noise
229
- const beforeAggregationCount = layer12Findings.length;
230
- const aggregatedFindings = aggregateNoisyFindings(layer12Findings);
231
- const aggregatedCount = beforeAggregationCount - aggregatedFindings.length;
232
- // Build project context for framework-aware fixes (PRO-83)
233
- // This detects frameworks (Next.js, Express), ORMs (Prisma, Drizzle), and frontend libs (React, Vue)
234
- const projectContext = (0, project_context_builder_1.buildProjectContext)(files);
235
- // Enrich findings with metadata from rule registry (PRO-82)
236
- // PRO-83: Uses projectContext for framework-specific fix suggestions
237
- // This provides default impact, evidence, fixSteps, references for all findings
238
- // AI validation can override these later with context-aware content
239
- const enrichedFindings = enrichWithMetadata(aggregatedFindings, projectContext);
240
- // Apply tier-based filtering based on scan depth
241
- // This is the key integration point for the detector tier system
242
- const tierFiltered = filterByTierAndDepth(enrichedFindings, depth);
243
- // Log tier breakdown
244
- log(`[Scanner] repo=${repoInfo.name} tier_breakdown=${(0, tiers_1.formatTierStats)(tierFiltered.tierStats)}`);
245
- log(`[Scanner] repo=${repoInfo.name} depth=${depth} tier_routing: surface=${tierFiltered.toSurface.length} validate=${tierFiltered.toValidate.length} hidden=${tierFiltered.hidden.length}`);
246
- // For cheap scans: Tier A surfaces directly, Tier B/C are hidden
247
- // For validated/deep: Tier A surfaces, Tier B goes through AI validation, Tier C hidden
248
- // Some Tier A findings still need AI validation (entropy, secrets, AI-specific)
249
- const additionalValidation = tierFiltered.toSurface.filter(v => v.requiresAIValidation ||
250
- v.category === 'ai_prompt_injection' || // Story B1: Prompt hygiene
251
- v.category === 'ai_unsafe_execution' || // Story B2: LLM output execution
252
- v.category === 'ai_overpermissive_tool' // Story B4: Agent tool permissions
253
- );
254
- // Surface findings that don't need validation (excluding those that do)
255
- const noValidationNeededRaw = tierFiltered.toSurface.filter(v => !additionalValidation.includes(v));
256
- // Apply auto-dismiss rules to direct-surface findings (mode='surface')
257
- // Uses 'surface' mode to exclude cost-saving rules like 'info_severity_core_only'
258
- // This ensures test/scanner/example files are dismissed, but info-severity findings still surface
259
- const { toValidate: noValidationNeeded, dismissed: surfaceDismissed } = (0, anthropic_1.applyAutoDismissRules)(noValidationNeededRaw, 'surface');
260
- // Combine tier-filtered validation candidates with additional ones
261
- const requiresValidation = [...tierFiltered.toValidate, ...additionalValidation];
262
- // Apply smart auto-dismiss rules BEFORE AI validation (saves API costs)
263
- const { toValidate: afterAutoDismiss, dismissed: autoDismissed } = (0, anthropic_1.applyAutoDismissRules)(requiresValidation);
264
- // Combine all dismissed findings for logging
265
- const allDismissed = [...surfaceDismissed, ...autoDismissed];
266
- // Track auto-dismiss by severity and category for logging
267
- const autoDismissBySeverity = { info: 0, low: 0, medium: 0, high: 0, critical: 0 };
268
- const autoDismissByCategory = {};
269
- for (const d of allDismissed) {
270
- autoDismissBySeverity[d.finding.severity] = (autoDismissBySeverity[d.finding.severity] || 0) + 1;
271
- autoDismissByCategory[d.finding.category] = (autoDismissByCategory[d.finding.category] || 0) + 1;
272
- }
273
- if (allDismissed.length > 0) {
274
- const categoryBreakdown = Object.entries(autoDismissByCategory)
275
- .sort(([, a], [, b]) => b - a)
276
- .map(([cat, count]) => `${cat}:${count}`)
277
- .join(',');
278
- log(`[AutoDismiss] repo=${repoInfo.name} total=${allDismissed.length} (surface=${surfaceDismissed.length} validation=${autoDismissed.length}) by_severity={info:${autoDismissBySeverity.info},low:${autoDismissBySeverity.low},medium:${autoDismissBySeverity.medium},high:${autoDismissBySeverity.high}} by_category={${categoryBreakdown}}`);
279
- }
280
- // Apply per-file cap to validation candidates (cost control)
281
- // Use scan mode config for max files
282
- const maxValidationFiles = scanModeConfig.maxAIValidationFiles || MAX_VALIDATION_CANDIDATES_PER_FILE;
283
- const cappedValidation = capValidationCandidatesPerFile(afterAutoDismiss, maxValidationFiles);
284
- checkCancelled();
285
- // AI Validation of selected findings (if AI is enabled and not skipped by scan mode)
286
- let validatedFindings = cappedValidation;
287
- let capturedValidationStats = undefined;
288
- const shouldValidate = options.enableAI !== false && !scanModeConfig.skipAIValidation && cappedValidation.length > 0;
289
- if (shouldValidate) {
290
- checkCancelled();
291
- const aiValidationStart = Date.now();
292
- reportProgress('validating', 'AI validating findings (entropy, secrets, AI patterns)...', cappedValidation.length);
293
- // For incremental scans, only validate findings in changed files
294
- const findingsToValidate = isIncremental && scanModeConfig.changedFiles
295
- ? cappedValidation.filter(v => scanModeConfig.changedFiles.some(cf => v.filePath.endsWith(cf) || v.filePath.includes(cf)))
296
- : cappedValidation;
297
- if (findingsToValidate.length > 0) {
298
- const validationResult = await (0, anthropic_1.validateFindingsWithAI)(findingsToValidate, filesForAI, undefined, // projectContext (uses default)
299
- onProgress ? (progress) => {
300
- // Convert AI validation progress to ScanProgress format
301
- onProgress({
302
- status: 'validating',
303
- message: progress.status,
304
- filesProcessed: progress.filesProcessed,
305
- totalFiles: progress.totalFiles,
306
- vulnerabilitiesFound: allVulnerabilities.length,
307
- });
308
- } : undefined);
309
- validatedFindings = validationResult.vulnerabilities;
310
- const { stats: validationStats } = validationResult;
311
- capturedValidationStats = validationStats; // Capture for return
312
- phaseTiming.aiValidation = Date.now() - aiValidationStart;
313
- log(`[AI Validation] repo=${repoInfo.name} depth=${depth} duration=${phaseTiming.aiValidation}ms candidates=${findingsToValidate.length} capped_from=${requiresValidation.length} auto_dismissed=${autoDismissed.length} kept=${validationStats.confirmedFindings} rejected=${validationStats.dismissedFindings} downgraded=${validationStats.downgradedFindings}`);
314
- log(`[AI Validation] cost_estimate: input_tokens=${validationStats.estimatedInputTokens} output_tokens=${validationStats.estimatedOutputTokens} cost=$${validationStats.estimatedCost.toFixed(4)} api_calls=${validationStats.apiCalls}`);
315
- // Add back findings that weren't validated (not in changed files)
316
- // Mark them as skipped rather than failed validation
317
- const notValidated = cappedValidation.filter(v => !findingsToValidate.includes(v)).map(v => ({
318
- ...v,
319
- validatedByAI: false,
320
- validationStatus: 'not_validated',
321
- validationNotes: 'Skipped validation (not in changed files for incremental scan)',
322
- }));
323
- validatedFindings.push(...notValidated);
324
- }
325
- }
326
- else if (scanModeConfig.skipAIValidation) {
327
- log(`[AI Validation] repo=${repoInfo.name} depth=${depth} skipped=true reason=scan_mode_config findings_requiring_validation=${cappedValidation.length}`);
328
- // In cheap mode, don't surface findings that require AI validation
329
- // These are low-confidence without validation and would be noise
330
- // Only surface high-confidence findings that don't need validation
331
- validatedFindings = [];
332
- }
333
- // Combine validated and non-validated findings
334
- allVulnerabilities.push(...validatedFindings, ...noValidationNeeded);
335
- // Layer 3: AI Semantic Analysis (new findings)
336
- // Skip for incremental scans by default (configurable)
337
- const shouldRunLayer3 = options.enableAI !== false && !scanModeConfig.skipLayer3;
338
- if (shouldRunLayer3) {
339
- checkCancelled();
340
- const layer3Start = Date.now();
341
- reportProgress('layer3', 'Running AI semantic analysis...', allVulnerabilities.length);
342
- // For incremental scans, only analyze changed files
343
- const filesToAnalyze = isIncremental ? filesForAI : files;
344
- const maxLayer3Files = scanModeConfig.maxLayer3Files || 10;
345
- // Detect auth helpers for Layer 3 context
346
- const authHelperContext = (0, auth_helper_detector_1.detectAuthHelpers)(files);
347
- const layer3Result = await (0, layer3_1.runLayer3Scan)(filesToAnalyze, {
348
- enableAI: options.enableAI,
349
- maxFiles: maxLayer3Files,
350
- projectContext: {
351
- middlewareConfig: middlewareConfig.hasAuthMiddleware ? {
352
- hasAuthMiddleware: true,
353
- authType: middlewareConfig.authType,
354
- protectedPaths: middlewareConfig.protectedPaths,
355
- } : undefined,
356
- authHelpers: authHelperContext.hasThrowingHelpers ? {
357
- hasThrowingHelpers: true,
358
- summary: authHelperContext.summary,
359
- } : undefined,
360
- },
361
- cancellationToken,
362
- });
363
- phaseTiming.layer3 = Date.now() - layer3Start;
364
- allVulnerabilities.push(...layer3Result.vulnerabilities);
365
- log(`[Layer3] repo=${repoInfo.name} depth=${depth} duration=${phaseTiming.layer3}ms files_analyzed=${layer3Result.aiAnalyzed} findings=${layer3Result.vulnerabilities.length}`);
366
- }
367
- else if (scanModeConfig.skipLayer3) {
368
- log(`[Layer3] repo=${repoInfo.name} depth=${depth} skipped=true reason=scan_mode_config`);
369
- }
370
- // Log phase timing summary
371
- const phaseTimingStr = Object.entries(phaseTiming)
372
- .filter(([, ms]) => ms !== undefined)
373
- .map(([phase, ms]) => `${phase}=${ms}ms`)
374
- .join(' ');
375
- if (phaseTimingStr) {
376
- log(`[Scanner] repo=${repoInfo.name} phase_timing: ${phaseTimingStr}`);
377
- }
378
- // Deduplicate vulnerabilities
379
- const uniqueVulnerabilities = deduplicateVulnerabilities(allVulnerabilities);
380
- // Resolve contradictions (e.g., middleware-protected INFO vs missing-auth CRITICAL on same route)
381
- const resolvedVulnerabilities = resolveContradictions(uniqueVulnerabilities, middlewareConfig);
382
- // Apply suppressions (inline comments + config file)
383
- const projectPath = options.projectPath || process.cwd();
384
- const suppressionManager = new suppression_1.SuppressionManager({ projectPath });
385
- const suppressionResult = suppressionManager.applySuppressions(resolvedVulnerabilities, files);
386
- // Log suppression stats if any were suppressed
387
- if (suppressionResult.suppressed.length > 0 || suppressionResult.expiredSuppressions > 0) {
388
- log(`[Suppression] repo=${repoInfo.name} suppressed=${suppressionResult.suppressed.length} (inline=${suppressionResult.stats.inlineSuppressed} config_finding=${suppressionResult.stats.configFindingSuppressed} config_rule=${suppressionResult.stats.configRuleSuppressed}) expired=${suppressionResult.expiredSuppressions}`);
389
- }
390
- // Use the filtered findings (after suppression)
391
- const afterSuppression = suppressionResult.findings;
392
- // Sort by severity
393
- const sortedVulnerabilities = sortBySeverity(afterSuppression);
394
- // Compute issue-mix counts (based on unsuppressed findings)
395
- const severityCounts = computeSeverityCounts(sortedVulnerabilities);
396
- const categoryCounts = computeCategoryCounts(sortedVulnerabilities);
397
- const hasBlockingIssues = severityCounts.critical > 0 || severityCounts.high > 0;
398
- // Build suppressed vulnerabilities summary (for --show-suppressed)
399
- const suppressedVulnerabilities = options.showSuppressed
400
- ? suppressionResult.suppressed.map(s => ({
401
- hash: s.suppression.hash,
402
- filePath: s.vulnerability.filePath,
403
- lineNumber: s.vulnerability.lineNumber,
404
- category: s.vulnerability.category,
405
- severity: s.vulnerability.severity,
406
- title: s.vulnerability.title,
407
- suppressionType: s.suppression.type,
408
- suppressionReason: s.suppression.reason,
409
- expires: s.suppression.expires,
410
- }))
411
- : undefined;
412
- reportProgress('complete', 'Scan complete!', sortedVulnerabilities.length);
413
- return {
414
- repoName: repoInfo.name,
415
- repoUrl: repoInfo.url,
416
- branch: repoInfo.branch,
417
- filesScanned: files.length,
418
- filesSkipped: 0, // TODO: track skipped files
419
- vulnerabilities: sortedVulnerabilities,
420
- severityCounts,
421
- categoryCounts,
422
- hasBlockingIssues,
423
- scanDuration: Date.now() - startTime,
424
- timestamp: new Date().toISOString(),
425
- validationStats: capturedValidationStats,
426
- suppressionStats: suppressionResult.suppressed.length > 0 || suppressionResult.expiredSuppressions > 0
427
- ? suppressionResult.stats
428
- : undefined,
429
- suppressedVulnerabilities,
430
- };
431
- }
432
- catch (error) {
433
- if (cancellationToken?.cancelled) {
434
- // Return partial results on cancellation
435
- reportProgress('failed', 'Scan cancelled');
436
- // Compute partial results
437
- const uniqueVulnerabilities = deduplicateVulnerabilities(allVulnerabilities);
438
- const resolvedVulnerabilities = resolveContradictions(uniqueVulnerabilities, middlewareConfig);
439
- const sortedVulnerabilities = sortBySeverity(resolvedVulnerabilities);
440
- const severityCounts = computeSeverityCounts(sortedVulnerabilities);
441
- const categoryCounts = computeCategoryCounts(sortedVulnerabilities);
442
- return {
443
- repoName: repoInfo.name,
444
- repoUrl: repoInfo.url,
445
- branch: repoInfo.branch,
446
- filesScanned: files.length,
447
- filesSkipped: 0,
448
- vulnerabilities: sortedVulnerabilities,
449
- severityCounts,
450
- categoryCounts,
451
- hasBlockingIssues: false, // Don't block on partial results
452
- scanDuration: Date.now() - startTime,
453
- timestamp: new Date().toISOString(),
454
- validationStats: capturedValidationStats,
455
- cancelled: true,
456
- cancelReason: cancellationToken.reason,
457
- };
458
- }
459
- reportProgress('failed', `Scan failed: ${error}`);
460
- throw error;
461
- }
462
- }
463
- /**
464
- * Enrich findings with metadata from the rule registry (PRO-82)
465
- * Sets default impact, evidence, fixSteps, and references from registry
466
- *
467
- * PRO-83: When projectContext is provided, uses framework-aware fix suggestions
468
- * that are tailored to the user's detected tech stack (e.g., Prisma-specific
469
- * SQL injection fixes instead of generic advice).
470
- *
471
- * These can be overridden later by AI-generated content
472
- */
473
- function enrichWithMetadata(findings, projectContext) {
474
- return findings.map(f => {
475
- const metadata = (0, rules_1.getRuleMetadata)(f.category);
476
- if (!metadata)
477
- return f;
478
- // PRO-83: Check for framework-specific fix suggestions
479
- let fixSteps = metadata.fixSteps;
480
- if (projectContext) {
481
- const frameworkFix = (0, framework_fixes_1.getFrameworkFix)(f.category, projectContext.frameworks, projectContext.dataAccess);
482
- if (frameworkFix) {
483
- fixSteps = frameworkFix.fixSteps;
484
- // Optionally append code example to description if available
485
- // This makes the fix more actionable
486
- }
487
- }
488
- return {
489
- ...f,
490
- // Set defaults from registry (AI can override later)
491
- impact: f.impact || metadata.whyItMatters,
492
- evidence: f.evidence || metadata.evidence,
493
- fixSteps: f.fixSteps || fixSteps,
494
- references: f.references || metadata.references,
495
- };
496
- });
497
- }
498
- /**
499
- * Aggregate noisy findings in the same file to reduce clutter
500
- * Groups repeated findings with same filePath + category + title
501
- * Especially useful for AI pattern spam
502
- */
503
- function aggregateNoisyFindings(vulnerabilities) {
504
- // Group findings by file + category + title
505
- const groups = new Map();
506
- for (const vuln of vulnerabilities) {
507
- // Create grouping key: same file, category, and base title (without line-specific info)
508
- const baseTitle = vuln.title.replace(/\s*\(\d+ instances?\)/, '').trim();
509
- const key = `${vuln.filePath}|${vuln.category}|${baseTitle}`;
510
- const existing = groups.get(key) || [];
511
- existing.push(vuln);
512
- groups.set(key, existing);
513
- }
514
- const result = [];
515
- for (const [key, group] of groups) {
516
- // If only 1-2 findings, keep them as-is
517
- if (group.length <= 2) {
518
- result.push(...group);
519
- continue;
520
- }
521
- // For 3+ similar findings in same file, aggregate into one
522
- const first = group[0];
523
- const lineNumbers = group.map(v => v.lineNumber).sort((a, b) => a - b);
524
- const uniqueLines = [...new Set(lineNumbers)];
525
- // Format line numbers nicely (show first few, then "...")
526
- const lineDisplay = uniqueLines.length > 5
527
- ? `${uniqueLines.slice(0, 5).join(', ')}... (${uniqueLines.length} total)`
528
- : uniqueLines.join(', ');
529
- // Keep highest severity from the group
530
- const highestSeverity = group.reduce((max, v) => severityRank(v.severity) > severityRank(max.severity) ? v : max, group[0]).severity;
531
- // Create aggregated finding
532
- const aggregated = {
533
- id: `${first.id}-aggregated`,
534
- filePath: first.filePath,
535
- lineNumber: uniqueLines[0], // First occurrence
536
- lineContent: `${group.length} instances across this file`,
537
- severity: highestSeverity,
538
- category: first.category,
539
- title: `${first.title.replace(/\s*\(\d+ instances?\)/, '')} (${group.length} instances)`,
540
- description: `${first.description}\n\nFound ${group.length} occurrences at lines: ${lineDisplay}`,
541
- suggestedFix: first.suggestedFix,
542
- confidence: first.confidence,
543
- layer: first.layer,
544
- requiresAIValidation: first.requiresAIValidation,
545
- };
546
- result.push(aggregated);
547
- }
548
- return result;
549
- }
550
- /**
551
- * Cap validation candidates per file to control AI costs
552
- * Prioritizes by:
553
- * 1. Tier (ai_assisted findings need AI most, so they get priority)
554
- * 2. Severity (critical > high > medium > low > info)
555
- * 3. Category importance (secrets/URLs/auth before cosmetic patterns)
556
- */
557
- function capValidationCandidatesPerFile(vulnerabilities, maxPerFile = MAX_VALIDATION_CANDIDATES_PER_FILE) {
558
- // Group by file
559
- const byFile = new Map();
560
- for (const vuln of vulnerabilities) {
561
- const existing = byFile.get(vuln.filePath) || [];
562
- existing.push(vuln);
563
- byFile.set(vuln.filePath, existing);
564
- }
565
- const result = [];
566
- for (const [filePath, fileVulns] of byFile) {
567
- // Sort by priority: tier first (ai_assisted needs AI most), then severity, then category
568
- const sorted = [...fileVulns].sort((a, b) => {
569
- // Tier comparison: ai_assisted (needs AI) > core (high precision) > experimental (hidden anyway)
570
- const tierPriority = (v) => {
571
- const tier = (0, tiers_1.getTierForCategory)(v.category, v.layer);
572
- if (tier === 'ai_assisted')
573
- return 10; // Highest priority - these NEED AI validation
574
- if (tier === 'core')
575
- return 5; // High precision, but AI can still help
576
- return 1; // Experimental - shouldn't even be here
577
- };
578
- const tierDiff = tierPriority(b) - tierPriority(a);
579
- if (tierDiff !== 0)
580
- return tierDiff;
581
- // Severity comparison (higher severity = higher priority)
582
- const severityDiff = severityRank(b.severity) - severityRank(a.severity);
583
- if (severityDiff !== 0)
584
- return severityDiff;
585
- // Category importance (secrets/URLs/auth before AI patterns)
586
- const categoryPriority = (v) => {
587
- if (v.category === 'hardcoded_secret')
588
- return 10;
589
- if (v.category === 'high_entropy_string')
590
- return 9;
591
- if (v.category === 'sensitive_url')
592
- return 8;
593
- if (v.category === 'missing_auth')
594
- return 7;
595
- if (v.category === 'ai_pattern')
596
- return 3;
597
- return 5;
598
- };
599
- return categoryPriority(b) - categoryPriority(a);
600
- });
601
- // Take top N per file
602
- const capped = sorted.slice(0, maxPerFile);
603
- result.push(...capped);
604
- // Note: Capping log removed to support quiet mode - this is debug info only
605
- }
606
- return result;
607
- }
608
- /**
609
- * Remove duplicate vulnerabilities (same file, line, category)
610
- * Also handles cross-layer URL duplicates (sensitive_url + ai_pattern)
611
- */
612
- function deduplicateVulnerabilities(vulnerabilities) {
613
- const seen = new Map();
614
- const urlDedupMap = new Map();
615
- for (const vuln of vulnerabilities) {
616
- // Special handling for URL duplicates across layers
617
- // (e.g., Layer 1 detects as sensitive_url, Layer 2 detects as ai_pattern)
618
- if ((vuln.category === 'sensitive_url' || vuln.category === 'ai_pattern') &&
619
- /url|localhost|127\.0\.0\.1|http/i.test(vuln.lineContent)) {
620
- // Create compound key that ignores category differences for URLs
621
- const urlKey = `${vuln.filePath}:${vuln.lineNumber}:url_finding`;
622
- const existing = urlDedupMap.get(urlKey);
623
- if (!existing) {
624
- urlDedupMap.set(urlKey, vuln);
625
- }
626
- else {
627
- // Keep Layer 1 (more specific) over Layer 2 AI pattern
628
- // Or keep higher severity
629
- if (vuln.layer < existing.layer ||
630
- severityRank(vuln.severity) > severityRank(existing.severity)) {
631
- urlDedupMap.set(urlKey, vuln);
632
- }
633
- }
634
- continue;
635
- }
636
- // Standard deduplication for non-URL findings
637
- const key = `${vuln.filePath}:${vuln.lineNumber}:${vuln.category}`;
638
- const existing = seen.get(key);
639
- // Keep the higher severity or higher confidence finding
640
- if (!existing) {
641
- seen.set(key, vuln);
642
- }
643
- else if (severityRank(vuln.severity) > severityRank(existing.severity)) {
644
- seen.set(key, vuln);
645
- }
646
- else if (severityRank(vuln.severity) === severityRank(existing.severity) &&
647
- confidenceRank(vuln.confidence) > confidenceRank(existing.confidence)) {
648
- seen.set(key, vuln);
649
- }
650
- }
651
- // Combine URL and non-URL findings
652
- return [...Array.from(seen.values()), ...Array.from(urlDedupMap.values())];
653
- }
654
- /**
655
- * Resolve contradictions in findings
656
- *
657
- * Key contradiction types:
658
- * 1. Same route has both "protected by middleware" (info) AND "missing auth" (high/critical)
659
- * → Keep only the info-level "protected by middleware" finding
660
- * 2. Same file has BYOK "transient use" (info) AND "key stored insecurely" (high)
661
- * → Keep only the most accurate one based on context
662
- * 3. Same line has conflicting severities from different layers
663
- * → Prefer the lower severity if one explicitly notes protection
664
- */
665
- function resolveContradictions(vulnerabilities, middlewareConfig) {
666
- // Group findings by file path for contradiction analysis
667
- const byFile = new Map();
668
- for (const vuln of vulnerabilities) {
669
- const existing = byFile.get(vuln.filePath) || [];
670
- existing.push(vuln);
671
- byFile.set(vuln.filePath, existing);
672
- }
673
- const result = [];
674
- for (const [filePath, fileVulns] of byFile) {
675
- // Check for auth contradictions in this file
676
- const authFindings = fileVulns.filter(v => v.category === 'missing_auth');
677
- const otherFindings = fileVulns.filter(v => v.category !== 'missing_auth');
678
- // Identify protected routes (middleware or auth helper)
679
- const protectedInfos = authFindings.filter(v => v.severity === 'info' &&
680
- (v.validationNotes === 'MIDDLEWARE_PROTECTED' ||
681
- v.validationNotes === 'AUTH_HELPER_PROTECTED' ||
682
- v.title.includes('protected by middleware') ||
683
- v.title.includes('uses auth helper')));
684
- // NEW: Check if this file's route is protected by middleware (even without explicit info finding)
685
- // This catches Layer 3 findings that don't have the Layer 2 protection info
686
- const routePath = (0, middleware_detector_1.getRoutePathFromFile)(filePath);
687
- const isAPIRouteProtected = routePath && middlewareConfig?.hasAuthMiddleware
688
- ? (0, middleware_detector_1.isRouteProtectedByMiddleware)(routePath, middlewareConfig).isProtected
689
- : false;
690
- // Also check if file is a client component calling protected API routes
691
- // Client components (components/, app/ without route.ts) calling /api/** are safe
692
- const isClientCallingProtectedAPI = middlewareConfig?.hasAuthMiddleware &&
693
- (filePath.includes('/components/') ||
694
- (filePath.includes('/app/') && !filePath.includes('route.ts')));
695
- // If we have protected route info findings OR the route is protected by middleware
696
- if (protectedInfos.length > 0 || isAPIRouteProtected || isClientCallingProtectedAPI) {
697
- // Keep the protected info findings
698
- result.push(...protectedInfos);
699
- // For other auth findings on same file, either drop or downgrade to info
700
- const otherAuthFindings = authFindings.filter(v => !protectedInfos.includes(v));
701
- for (const vuln of otherAuthFindings) {
702
- // If it's high/critical missing auth on a protected route, drop it entirely
703
- // (the middleware/helper protection supersedes)
704
- if (vuln.severity === 'critical' || vuln.severity === 'high') {
705
- const reason = isAPIRouteProtected
706
- ? 'API route protected by middleware'
707
- : isClientCallingProtectedAPI
708
- ? 'client component calling protected API'
709
- : 'route is protected';
710
- // Note: Contradiction log removed to support quiet mode - this is debug info only
711
- continue; // Skip this finding
712
- }
713
- // Keep lower severity auth findings as-is
714
- result.push(vuln);
715
- }
716
- }
717
- else {
718
- // No protection detected - keep all auth findings as-is
719
- result.push(...authFindings);
720
- }
721
- // Handle BYOK contradictions
722
- const byokFindings = otherFindings.filter(v => v.category === 'ai_pattern' && v.title.toLowerCase().includes('byok'));
723
- const nonByokFindings = otherFindings.filter(v => !(v.category === 'ai_pattern' && v.title.toLowerCase().includes('byok')));
724
- if (byokFindings.length > 0) {
725
- // Check if we have both transient (low) and storage (high) BYOK findings
726
- const transientByok = byokFindings.filter(v => v.severity === 'low' || v.severity === 'info');
727
- const storageByok = byokFindings.filter(v => v.severity === 'high' || v.severity === 'medium');
728
- if (transientByok.length > 0 && storageByok.length > 0) {
729
- // If we detected transient usage, prefer the lower severity
730
- // The higher severity ones may be false positives
731
- result.push(...transientByok);
732
- // Mark high-severity BYOK for review
733
- for (const vuln of storageByok) {
734
- result.push({
735
- ...vuln,
736
- severity: 'low',
737
- validationNotes: `${vuln.validationNotes || ''} (downgraded: transient BYOK usage detected in same file)`.trim(),
738
- });
739
- }
740
- }
741
- else {
742
- // Keep all BYOK findings as-is
743
- result.push(...byokFindings);
744
- }
745
- }
746
- // Add non-BYOK other findings
747
- result.push(...nonByokFindings);
748
- }
749
- return result;
750
- }
751
- /**
752
- * Sort vulnerabilities by severity (critical first)
753
- */
754
- function sortBySeverity(vulnerabilities) {
755
- return [...vulnerabilities].sort((a, b) => {
756
- const severityDiff = severityRank(b.severity) - severityRank(a.severity);
757
- if (severityDiff !== 0)
758
- return severityDiff;
759
- // Secondary sort by confidence
760
- return confidenceRank(b.confidence) - confidenceRank(a.confidence);
761
- });
762
- }
763
- function severityRank(severity) {
764
- const ranks = {
765
- critical: 5,
766
- high: 4,
767
- medium: 3,
768
- low: 2,
769
- info: 1,
770
- };
771
- return ranks[severity] || 0;
772
- }
773
- function confidenceRank(confidence) {
774
- const ranks = {
775
- high: 3,
776
- medium: 2,
777
- low: 1,
778
- };
779
- return ranks[confidence] || 0;
780
- }
781
- /**
782
- * Compute severity counts from vulnerabilities
783
- */
784
- function computeSeverityCounts(vulnerabilities) {
785
- const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
786
- for (const vuln of vulnerabilities) {
787
- if (vuln.severity in counts) {
788
- counts[vuln.severity]++;
789
- }
790
- }
791
- return counts;
792
- }
793
- /**
794
- * Compute category counts from vulnerabilities
795
- */
796
- function computeCategoryCounts(vulnerabilities) {
797
- const counts = {};
798
- for (const vuln of vulnerabilities) {
799
- const category = vuln.category;
800
- counts[category] = (counts[category] || 0) + 1;
801
- }
802
- return counts;
803
- }
804
- /**
805
- * Helper to compute counts from vulnerabilities (for backfilling legacy scans)
806
- */
807
- function computeIssueMixFromVulnerabilities(vulnerabilities) {
808
- const severityCounts = computeSeverityCounts(vulnerabilities);
809
- const categoryCounts = computeCategoryCounts(vulnerabilities);
810
- const hasBlockingIssues = severityCounts.critical > 0 || severityCounts.high > 0;
811
- return { severityCounts, categoryCounts, hasBlockingIssues };
812
- }
22
+ exports.getCategoryGroupCounts = exports.getAvailableCategoryGroups = exports.validateCategories = exports.parseCategoryList = exports.getMatchingCategories = exports.shouldFailOnCategories = exports.matchesAnyCategory = exports.expandCategoryPattern = exports.normalizeCategory = exports.ALL_CATEGORIES = exports.CATEGORY_GROUPS = exports.AI_CONTEXT_PATH = exports.AI_CONTEXT_FILE = exports.AIContextManager = exports.hasMetadata = exports.getAllCategories = exports.getRuleMetadata = exports.RULE_REGISTRY = exports.OCULUM_DIR = exports.BASELINE_FILE_PATH = exports.formatDiffSummary = exports.hasNewBlockingIssues = exports.computeDiff = exports.BaselineManager = exports.isValidHash = exports.generateSuppressionComment = exports.parseInlineSuppressions = exports.listSuppressions = exports.addRuleSuppression = exports.removeFindingSuppression = exports.addFindingSuppression = exports.loadSuppressionConfig = exports.computeFindingHash = exports.SuppressionManager = exports.DEPTH_CONFIGS = exports.buildConfidenceLog = exports.buildAdjustmentContext = exports.scoreFindings = exports.createCancellationToken = exports.validateFindingsWithAI = exports.buildProjectContext = exports.runLayer2Scan = exports.runLayer1Scan = exports.computeIssueMixFromVulnerabilities = exports.runScan = void 0;
23
+ // ============================================================================
24
+ // Core Scanner API
25
+ // ============================================================================
26
+ // Pipeline orchestrator — main entry point
27
+ var pipeline_1 = require("./pipeline");
28
+ Object.defineProperty(exports, "runScan", { enumerable: true, get: function () { return pipeline_1.runScan; } });
29
+ // Summary utilities (public API for backfilling legacy scans etc.)
30
+ var summary_1 = require("./report/summary");
31
+ Object.defineProperty(exports, "computeIssueMixFromVulnerabilities", { enumerable: true, get: function () { return summary_1.computeIssueMixFromVulnerabilities; } });
32
+ // ============================================================================
813
33
  // Re-export types and utilities
814
- __exportStar(require("./types"), exports);
815
- var layer1_2 = require("./layer1");
816
- Object.defineProperty(exports, "runLayer1Scan", { enumerable: true, get: function () { return layer1_2.runLayer1Scan; } });
817
- var layer2_2 = require("./layer2");
818
- Object.defineProperty(exports, "runLayer2Scan", { enumerable: true, get: function () { return layer2_2.runLayer2Scan; } });
819
- var layer3_2 = require("./layer3");
820
- Object.defineProperty(exports, "runLayer3Scan", { enumerable: true, get: function () { return layer3_2.runLayer3Scan; } });
821
- var project_context_builder_2 = require("./utils/project-context-builder");
822
- Object.defineProperty(exports, "buildProjectContext", { enumerable: true, get: function () { return project_context_builder_2.buildProjectContext; } });
823
- var anthropic_2 = require("./layer3/anthropic");
824
- Object.defineProperty(exports, "validateFindingsWithAI", { enumerable: true, get: function () { return anthropic_2.validateFindingsWithAI; } });
825
- var types_2 = require("./types");
826
- Object.defineProperty(exports, "createCancellationToken", { enumerable: true, get: function () { return types_2.createCancellationToken; } });
34
+ // ============================================================================
35
+ __exportStar(require("./shared/types"), exports);
36
+ var secrets_1 = require("./detect/secrets");
37
+ Object.defineProperty(exports, "runLayer1Scan", { enumerable: true, get: function () { return secrets_1.runLayer1Scan; } });
38
+ var structural_1 = require("./detect/structural");
39
+ Object.defineProperty(exports, "runLayer2Scan", { enumerable: true, get: function () { return structural_1.runLayer2Scan; } });
40
+ var project_context_1 = require("./model/project-context");
41
+ Object.defineProperty(exports, "buildProjectContext", { enumerable: true, get: function () { return project_context_1.buildProjectContext; } });
42
+ var validate_1 = require("./validate");
43
+ Object.defineProperty(exports, "validateFindingsWithAI", { enumerable: true, get: function () { return validate_1.validateFindingsWithAI; } });
44
+ var types_1 = require("./shared/types");
45
+ Object.defineProperty(exports, "createCancellationToken", { enumerable: true, get: function () { return types_1.createCancellationToken; } });
46
+ // Confidence scoring exports (Phase 2B)
47
+ var score_1 = require("./score");
48
+ Object.defineProperty(exports, "scoreFindings", { enumerable: true, get: function () { return score_1.scoreFindings; } });
49
+ Object.defineProperty(exports, "buildAdjustmentContext", { enumerable: true, get: function () { return score_1.buildAdjustmentContext; } });
50
+ Object.defineProperty(exports, "buildConfidenceLog", { enumerable: true, get: function () { return score_1.buildConfidenceLog; } });
51
+ Object.defineProperty(exports, "DEPTH_CONFIGS", { enumerable: true, get: function () { return score_1.DEPTH_CONFIGS; } });
827
52
  // Suppression system exports
828
- var suppression_2 = require("./suppression");
829
- Object.defineProperty(exports, "SuppressionManager", { enumerable: true, get: function () { return suppression_2.SuppressionManager; } });
830
- Object.defineProperty(exports, "computeFindingHash", { enumerable: true, get: function () { return suppression_2.computeFindingHash; } });
831
- Object.defineProperty(exports, "loadSuppressionConfig", { enumerable: true, get: function () { return suppression_2.loadSuppressionConfig; } });
832
- Object.defineProperty(exports, "addFindingSuppression", { enumerable: true, get: function () { return suppression_2.addFindingSuppression; } });
833
- Object.defineProperty(exports, "removeFindingSuppression", { enumerable: true, get: function () { return suppression_2.removeFindingSuppression; } });
834
- Object.defineProperty(exports, "addRuleSuppression", { enumerable: true, get: function () { return suppression_2.addRuleSuppression; } });
835
- Object.defineProperty(exports, "listSuppressions", { enumerable: true, get: function () { return suppression_2.listSuppressions; } });
836
- Object.defineProperty(exports, "parseInlineSuppressions", { enumerable: true, get: function () { return suppression_2.parseInlineSuppressions; } });
837
- Object.defineProperty(exports, "generateSuppressionComment", { enumerable: true, get: function () { return suppression_2.generateSuppressionComment; } });
838
- Object.defineProperty(exports, "isValidHash", { enumerable: true, get: function () { return suppression_2.isValidHash; } });
53
+ var suppression_1 = require("./postprocess/suppression");
54
+ Object.defineProperty(exports, "SuppressionManager", { enumerable: true, get: function () { return suppression_1.SuppressionManager; } });
55
+ Object.defineProperty(exports, "computeFindingHash", { enumerable: true, get: function () { return suppression_1.computeFindingHash; } });
56
+ Object.defineProperty(exports, "loadSuppressionConfig", { enumerable: true, get: function () { return suppression_1.loadSuppressionConfig; } });
57
+ Object.defineProperty(exports, "addFindingSuppression", { enumerable: true, get: function () { return suppression_1.addFindingSuppression; } });
58
+ Object.defineProperty(exports, "removeFindingSuppression", { enumerable: true, get: function () { return suppression_1.removeFindingSuppression; } });
59
+ Object.defineProperty(exports, "addRuleSuppression", { enumerable: true, get: function () { return suppression_1.addRuleSuppression; } });
60
+ Object.defineProperty(exports, "listSuppressions", { enumerable: true, get: function () { return suppression_1.listSuppressions; } });
61
+ Object.defineProperty(exports, "parseInlineSuppressions", { enumerable: true, get: function () { return suppression_1.parseInlineSuppressions; } });
62
+ Object.defineProperty(exports, "generateSuppressionComment", { enumerable: true, get: function () { return suppression_1.generateSuppressionComment; } });
63
+ Object.defineProperty(exports, "isValidHash", { enumerable: true, get: function () { return suppression_1.isValidHash; } });
839
64
  // Baseline system exports
840
- var baseline_1 = require("./baseline");
65
+ var baseline_1 = require("./shared/baseline");
841
66
  Object.defineProperty(exports, "BaselineManager", { enumerable: true, get: function () { return baseline_1.BaselineManager; } });
842
67
  Object.defineProperty(exports, "computeDiff", { enumerable: true, get: function () { return baseline_1.computeDiff; } });
843
68
  Object.defineProperty(exports, "hasNewBlockingIssues", { enumerable: true, get: function () { return baseline_1.hasNewBlockingIssues; } });
@@ -845,9 +70,27 @@ Object.defineProperty(exports, "formatDiffSummary", { enumerable: true, get: fun
845
70
  Object.defineProperty(exports, "BASELINE_FILE_PATH", { enumerable: true, get: function () { return baseline_1.BASELINE_FILE_PATH; } });
846
71
  Object.defineProperty(exports, "OCULUM_DIR", { enumerable: true, get: function () { return baseline_1.OCULUM_DIR; } });
847
72
  // Rule metadata exports (PRO-82)
848
- var rules_2 = require("./rules");
849
- Object.defineProperty(exports, "RULE_REGISTRY", { enumerable: true, get: function () { return rules_2.RULE_REGISTRY; } });
850
- Object.defineProperty(exports, "getRuleMetadata", { enumerable: true, get: function () { return rules_2.getRuleMetadata; } });
851
- Object.defineProperty(exports, "getAllCategories", { enumerable: true, get: function () { return rules_2.getAllCategories; } });
852
- Object.defineProperty(exports, "hasMetadata", { enumerable: true, get: function () { return rules_2.hasMetadata; } });
73
+ var rules_1 = require("./shared/rules");
74
+ Object.defineProperty(exports, "RULE_REGISTRY", { enumerable: true, get: function () { return rules_1.RULE_REGISTRY; } });
75
+ Object.defineProperty(exports, "getRuleMetadata", { enumerable: true, get: function () { return rules_1.getRuleMetadata; } });
76
+ Object.defineProperty(exports, "getAllCategories", { enumerable: true, get: function () { return rules_1.getAllCategories; } });
77
+ Object.defineProperty(exports, "hasMetadata", { enumerable: true, get: function () { return rules_1.hasMetadata; } });
78
+ // AI Context exports
79
+ var ai_context_1 = require("./shared/ai-context");
80
+ Object.defineProperty(exports, "AIContextManager", { enumerable: true, get: function () { return ai_context_1.AIContextManager; } });
81
+ Object.defineProperty(exports, "AI_CONTEXT_FILE", { enumerable: true, get: function () { return ai_context_1.AI_CONTEXT_FILE; } });
82
+ Object.defineProperty(exports, "AI_CONTEXT_PATH", { enumerable: true, get: function () { return ai_context_1.AI_CONTEXT_PATH; } });
83
+ // Category filter exports (Phase 2: Category-Based Filtering)
84
+ var category_filter_1 = require("./shared/category-filter");
85
+ Object.defineProperty(exports, "CATEGORY_GROUPS", { enumerable: true, get: function () { return category_filter_1.CATEGORY_GROUPS; } });
86
+ Object.defineProperty(exports, "ALL_CATEGORIES", { enumerable: true, get: function () { return category_filter_1.ALL_CATEGORIES; } });
87
+ Object.defineProperty(exports, "normalizeCategory", { enumerable: true, get: function () { return category_filter_1.normalizeCategory; } });
88
+ Object.defineProperty(exports, "expandCategoryPattern", { enumerable: true, get: function () { return category_filter_1.expandCategoryPattern; } });
89
+ Object.defineProperty(exports, "matchesAnyCategory", { enumerable: true, get: function () { return category_filter_1.matchesAnyCategory; } });
90
+ Object.defineProperty(exports, "shouldFailOnCategories", { enumerable: true, get: function () { return category_filter_1.shouldFailOnCategories; } });
91
+ Object.defineProperty(exports, "getMatchingCategories", { enumerable: true, get: function () { return category_filter_1.getMatchingCategories; } });
92
+ Object.defineProperty(exports, "parseCategoryList", { enumerable: true, get: function () { return category_filter_1.parseCategoryList; } });
93
+ Object.defineProperty(exports, "validateCategories", { enumerable: true, get: function () { return category_filter_1.validateCategories; } });
94
+ Object.defineProperty(exports, "getAvailableCategoryGroups", { enumerable: true, get: function () { return category_filter_1.getAvailableCategoryGroups; } });
95
+ Object.defineProperty(exports, "getCategoryGroupCounts", { enumerable: true, get: function () { return category_filter_1.getCategoryGroupCounts; } });
853
96
  //# sourceMappingURL=index.js.map