@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
@@ -5,13 +5,17 @@
5
5
  * This module orchestrates detection across multiple specialized modules.
6
6
  */
7
7
 
8
- import type { Vulnerability, VulnerabilitySeverity } from '../../types'
8
+ import type { Vulnerability, VulnerabilitySeverity } from '../../../shared/types'
9
+ import type { ParsedFile } from '../../../shared/parsed-file'
9
10
  import {
10
11
  isComment,
11
12
  isTestOrMockFile,
12
13
  isScannerOrFixtureFile,
13
14
  isSeedOrDataGenFile,
14
- } from '../../utils/context-helpers'
15
+ isDesktopAppContext,
16
+ isMcpServerContext,
17
+ isFileLoaderContext,
18
+ } from '../../../parse/file-classifier'
15
19
 
16
20
  // Pattern definitions
17
21
  import {
@@ -30,6 +34,7 @@ import {
30
34
  hasDOMPurifySanitization,
31
35
  isLLMPromptContext,
32
36
  isStaticBootstrapScript,
37
+ isTrustedLibraryHTMLOutput,
33
38
  } from './dom-xss'
34
39
 
35
40
  // JSON.parse detection
@@ -57,12 +62,15 @@ import { hasOnlyStaticInputs, hasPathTraversalProtection } from './utils/helpers
57
62
  // Re-export types and patterns for external use
58
63
  export { DANGEROUS_FUNCTIONS, type DangerousFunctionPattern } from './patterns'
59
64
 
65
+ const BASE_CONFIDENCE = 0.40
66
+
60
67
  /**
61
68
  * Main detection function for dangerous function calls
62
69
  */
63
70
  export function detectDangerousFunctions(
64
71
  content: string,
65
- filePath: string
72
+ filePath: string,
73
+ options?: { parsed?: ParsedFile }
66
74
  ): Vulnerability[] {
67
75
  const vulnerabilities: Vulnerability[] = []
68
76
 
@@ -71,7 +79,7 @@ export function detectDangerousFunctions(
71
79
  return vulnerabilities
72
80
  }
73
81
 
74
- const lines = content.split('\n')
82
+ const lines = options?.parsed?.lines ?? content.split('\n')
75
83
  const isTestFile = isTestOrMockFile(filePath)
76
84
 
77
85
  lines.forEach((line, index) => {
@@ -100,7 +108,8 @@ export function detectDangerousFunctions(
100
108
  index,
101
109
  filePath,
102
110
  isTestFile,
103
- vulnerabilities
111
+ vulnerabilities,
112
+ lines
104
113
  )
105
114
  break
106
115
  }
@@ -139,7 +148,8 @@ export function detectDangerousFunctions(
139
148
  index,
140
149
  filePath,
141
150
  isTestFile,
142
- vulnerabilities
151
+ vulnerabilities,
152
+ lines
143
153
  )
144
154
  ) {
145
155
  break
@@ -159,7 +169,8 @@ export function detectDangerousFunctions(
159
169
  index,
160
170
  filePath,
161
171
  isTestFile,
162
- vulnerabilities
172
+ vulnerabilities,
173
+ lines
163
174
  )
164
175
  break
165
176
  }
@@ -176,7 +187,8 @@ export function detectDangerousFunctions(
176
187
  index,
177
188
  filePath,
178
189
  isTestFile,
179
- vulnerabilities
190
+ vulnerabilities,
191
+ lines
180
192
  )
181
193
  break
182
194
  }
@@ -204,7 +216,38 @@ export function detectDangerousFunctions(
204
216
  index,
205
217
  filePath,
206
218
  isTestFile,
207
- vulnerabilities
219
+ vulnerabilities,
220
+ lines
221
+ )
222
+ break
223
+ }
224
+
225
+ // Special handling for regex patterns - check for escaped input
226
+ if (funcPattern.name === 'Potentially unsafe regex') {
227
+ handleRegexPattern(
228
+ funcPattern,
229
+ line,
230
+ content,
231
+ index,
232
+ filePath,
233
+ isTestFile,
234
+ vulnerabilities,
235
+ lines
236
+ )
237
+ break
238
+ }
239
+
240
+ // Special handling for spread operator with user input
241
+ if (funcPattern.name === 'Spread operator with user input') {
242
+ handleSpreadPattern(
243
+ funcPattern,
244
+ line,
245
+ content,
246
+ index,
247
+ filePath,
248
+ isTestFile,
249
+ vulnerabilities,
250
+ lines
208
251
  )
209
252
  break
210
253
  }
@@ -244,30 +287,37 @@ function handleInnerHTMLPattern(
244
287
  index: number,
245
288
  filePath: string,
246
289
  isTestFile: boolean,
247
- vulnerabilities: Vulnerability[]
290
+ vulnerabilities: Vulnerability[],
291
+ lines?: string[]
248
292
  ): void {
249
293
  // Check if this is a style element (CSS injection is not XSS)
250
- if (isStyleElementInnerHTML(line, content, index)) {
294
+ if (isStyleElementInnerHTML(line, content, index, lines)) {
251
295
  // Style elements with CSS are safe - don't report anything
252
296
  // CSS cannot execute JavaScript, so there's no XSS risk
253
297
  return
254
298
  }
255
299
 
256
300
  // Check if this uses static content only - skip entirely (safe)
257
- if (isStaticHTMLContent(line, content, index)) {
301
+ if (isStaticHTMLContent(line, content, index, lines)) {
258
302
  return // Static HTML is safe - no finding needed
259
303
  }
260
304
 
261
305
  // Check if DOMPurify or similar sanitization is used - skip entirely (safe)
262
- if (hasDOMPurifySanitization(line, content, index)) {
306
+ if (hasDOMPurifySanitization(line, content, index, lines)) {
263
307
  return // Sanitized HTML is safe - no finding needed
264
308
  }
265
309
 
266
310
  // Check if this is a static bootstrap script (e.g., theme/font loader) - skip entirely (safe)
267
- if (isStaticBootstrapScript(line, content, index)) {
311
+ if (isStaticBootstrapScript(line, content, index, lines)) {
268
312
  return // Static bootstrap scripts are safe - no finding needed
269
313
  }
270
314
 
315
+ // Check if this uses output from trusted HTML rendering libraries (Shiki, highlight.js, marked, etc.)
316
+ // These libraries produce sanitized HTML output
317
+ if (isTrustedLibraryHTMLOutput(line, content, index, lines)) {
318
+ return // Trusted library output is safe - no finding needed
319
+ }
320
+
271
321
  // Check if this is in LLM prompt context (not XSS - it's prompt injection)
272
322
  if (isLLMPromptContext(line, content, filePath)) {
273
323
  vulnerabilities.push({
@@ -283,8 +333,9 @@ function handleInnerHTMLPattern(
283
333
  suggestedFix:
284
334
  'Consider input validation, content filtering, or structured prompts to limit prompt injection risk.',
285
335
  confidence: 'low',
336
+ baseConfidence: BASE_CONFIDENCE,
286
337
  layer: 2,
287
- })
338
+ source: 'structural' as const, })
288
339
  return
289
340
  }
290
341
 
@@ -308,8 +359,9 @@ function handleInnerHTMLPattern(
308
359
  (isTestFile ? ' (in test file)' : ''),
309
360
  suggestedFix: funcPattern.suggestedFix,
310
361
  confidence: isTestFile ? 'low' : 'high',
362
+ baseConfidence: BASE_CONFIDENCE,
311
363
  layer: 2,
312
- requiresAIValidation: true, // Dynamic HTML needs validation
364
+ source: 'structural' as const, requiresAIValidation: true, // Dynamic HTML needs validation
313
365
  })
314
366
  }
315
367
 
@@ -362,8 +414,9 @@ function handleEvalPattern(
362
414
  description: funcPattern.description,
363
415
  suggestedFix: funcPattern.suggestedFix,
364
416
  confidence: 'high',
417
+ baseConfidence: BASE_CONFIDENCE,
365
418
  layer: 2,
366
- requiresAIValidation: true, // Code execution patterns need validation
419
+ source: 'structural' as const, requiresAIValidation: true, // Code execution patterns need validation
367
420
  })
368
421
  return true
369
422
  }
@@ -379,7 +432,8 @@ function handleChildProcessPattern(
379
432
  index: number,
380
433
  filePath: string,
381
434
  isTestFile: boolean,
382
- vulnerabilities: Vulnerability[]
435
+ vulnerabilities: Vulnerability[],
436
+ lines?: string[]
383
437
  ): boolean {
384
438
  // First check if this is actually from child_process (not RegExp.exec)
385
439
  const isExecMatch = /\bexec\s*\(/.test(line)
@@ -400,10 +454,10 @@ function handleChildProcessPattern(
400
454
  }
401
455
 
402
456
  // Check if arguments are validated via allowlist
403
- const lines = content.split('\n')
457
+ const _lines = lines ?? content.split('\n')
404
458
  const contextStart = Math.max(0, index - 15)
405
- const contextEnd = Math.min(lines.length, index + 5)
406
- const context = lines.slice(contextStart, contextEnd).join('\n')
459
+ const contextEnd = Math.min(_lines.length, index + 5)
460
+ const context = _lines.slice(contextStart, contextEnd).join('\n')
407
461
 
408
462
  // Detect allowlist validation patterns before exec/spawn
409
463
  const hasArgAllowlist =
@@ -432,6 +486,59 @@ function handleChildProcessPattern(
432
486
  return true // Static command is safe - no finding needed
433
487
  }
434
488
 
489
+ // Check for build/script context with hardcoded command + args array
490
+ const isBuildScript = /(build|generate|format|lint|setup|deploy|migrate|compile)/i.test(filePath) ||
491
+ /\/(scripts?|tools?|bin)\//i.test(filePath)
492
+
493
+ if (isBuildScript) {
494
+ // spawnSync("cmd", ["arg1", "arg2"]) with string literal command is safe in build scripts
495
+ const hasHardcodedCommand = /spawn(?:Sync)?\s*\(\s*['"][^'"]+['"]/.test(line)
496
+ if (hasHardcodedCommand) {
497
+ vulnerabilities.push({
498
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
499
+ filePath,
500
+ lineNumber: index + 1,
501
+ lineContent: line.trim(),
502
+ severity: 'info',
503
+ category: 'dangerous_function',
504
+ title: funcPattern.name + ' (build script)',
505
+ description: 'Shell command execution in build/tooling script with hardcoded command. Build scripts are developer-controlled.',
506
+ suggestedFix: 'Ensure this script is not exposed to untrusted input.',
507
+ confidence: 'low',
508
+ baseConfidence: BASE_CONFIDENCE,
509
+ layer: 2,
510
+ source: 'structural' as const, })
511
+ return true
512
+ }
513
+ }
514
+
515
+ // Check for desktop app or MCP server context
516
+ // These contexts legitimately spawn processes
517
+ const isDesktopApp = isDesktopAppContext(filePath)
518
+ const isMcpServer = isMcpServerContext(filePath)
519
+
520
+ if (isDesktopApp || isMcpServer) {
521
+ // Desktop apps and MCP servers legitimately spawn processes
522
+ // Still report but with reduced severity and context
523
+ const contextType = isDesktopApp ? 'desktop app' : 'MCP server'
524
+ vulnerabilities.push({
525
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
526
+ filePath,
527
+ lineNumber: index + 1,
528
+ lineContent: line.trim(),
529
+ severity: 'medium', // Reduced from high
530
+ category: 'dangerous_function',
531
+ title: `${funcPattern.name} (${contextType})`,
532
+ description: `${funcPattern.description} (Expected in ${contextType} context - verify input validation)`,
533
+ suggestedFix:
534
+ 'Ensure command arguments from IPC are validated against an allowlist.',
535
+ confidence: 'medium',
536
+ baseConfidence: BASE_CONFIDENCE,
537
+ layer: 2,
538
+ source: 'structural' as const, })
539
+ return true
540
+ }
541
+
435
542
  // Dynamic command - report with standard severity
436
543
  let severity = funcPattern.severity
437
544
  let confidence: 'high' | 'medium' | 'low' = 'high'
@@ -458,8 +565,9 @@ function handleChildProcessPattern(
458
565
  description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
459
566
  suggestedFix: funcPattern.suggestedFix,
460
567
  confidence,
568
+ baseConfidence: BASE_CONFIDENCE,
461
569
  layer: 2,
462
- })
570
+ source: 'structural' as const, })
463
571
  return true
464
572
  }
465
573
 
@@ -473,7 +581,8 @@ function handleSQLPattern(
473
581
  index: number,
474
582
  filePath: string,
475
583
  isTestFile: boolean,
476
- vulnerabilities: Vulnerability[]
584
+ vulnerabilities: Vulnerability[],
585
+ lines?: string[]
477
586
  ): void {
478
587
  // Check for whitelist validation - skip entirely (safe)
479
588
  if (hasSQLWhitelistValidation(content, index)) {
@@ -496,6 +605,40 @@ function handleSQLPattern(
496
605
  return // Parameterized query - safe, no finding needed
497
606
  }
498
607
 
608
+ // Knex .raw() with ? placeholders and array binding - this IS parameterized
609
+ // e.g., db.raw(`"table"."col" + ?`, [value]) or db.raw('SELECT ... WHERE id = ?', [id])
610
+ const knexRawParameterized = /\.raw\s*\(\s*[`'"]/i.test(line) &&
611
+ /\?\s*[`'"]\s*,\s*\[/.test(line)
612
+ if (knexRawParameterized) {
613
+ return // Knex .raw() with ? placeholders is parameterized - safe
614
+ }
615
+
616
+ // Knex .raw() with only const enum/table name interpolation (not user input)
617
+ // e.g., db.raw(`"${TableName.Users}"."col"`) where TableName is a const enum
618
+ const knexRawConstInterpolation = /\.raw\s*\(\s*`/.test(line) &&
619
+ /\$\{[A-Z][A-Za-z]*\.[A-Z]/.test(line)
620
+ if (knexRawConstInterpolation) {
621
+ const interpolations = line.match(/\$\{([^}]+)\}/g) || []
622
+ const allConst = interpolations.every(i => /^\$\{[A-Z_][A-Z_a-z]*\./.test(i))
623
+ if (allConst) {
624
+ return // Only const enum interpolation - safe
625
+ }
626
+ }
627
+
628
+ // Knex .raw() for SET statement_timeout (infrastructure, not user input)
629
+ // e.g., trx.raw(`SET statement_timeout = ${QUERY_TIMEOUT_MS}`)
630
+ const isSetStatement = /\.raw\s*\(\s*[`'"]SET\s+/i.test(line)
631
+ if (isSetStatement) {
632
+ return // SET statements are infrastructure config, not queries with user data
633
+ }
634
+
635
+ // DROP TRIGGER / DDL statements from migration/schema files
636
+ const isDDLStatement = /\.raw\s*\(\s*[`'"](DROP|CREATE|ALTER)\s+/i.test(line) &&
637
+ /(migration|schema|seed)/i.test(filePath)
638
+ if (isDDLStatement) {
639
+ return // DDL in migration/schema files - not user-facing
640
+ }
641
+
499
642
  // Check for Prisma tagged template literal - these ARE parameterized (safe)
500
643
  // Prisma's $queryRaw`...${var}...` treats ${} as parameterized values, not string interpolation
501
644
  // e.g., prisma.$queryRaw`SELECT * FROM users WHERE id = ${userId}`
@@ -506,10 +649,10 @@ function handleSQLPattern(
506
649
 
507
650
  // Check for schema-validated input (zod .enum() for table/column names)
508
651
  // e.g., z.enum(['users', 'posts']).parse(input) followed by SQL
509
- const lines = content.split('\n')
652
+ const _lines = lines ?? content.split('\n')
510
653
  const contextStart = Math.max(0, index - 20)
511
654
  const contextEnd = index
512
- const previousContext = lines.slice(contextStart, contextEnd).join('\n')
655
+ const previousContext = _lines.slice(contextStart, contextEnd).join('\n')
513
656
 
514
657
  // Detect zod enum validation for SQL identifiers
515
658
  const hasSchemaValidation =
@@ -549,8 +692,9 @@ function handleSQLPattern(
549
692
  description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
550
693
  suggestedFix: funcPattern.suggestedFix,
551
694
  confidence,
695
+ baseConfidence: BASE_CONFIDENCE,
552
696
  layer: 2,
553
- })
697
+ source: 'structural' as const, })
554
698
  }
555
699
 
556
700
  /**
@@ -563,8 +707,38 @@ function handleFilePathPattern(
563
707
  index: number,
564
708
  filePath: string,
565
709
  isTestFile: boolean,
566
- vulnerabilities: Vulnerability[]
710
+ vulnerabilities: Vulnerability[],
711
+ lines?: string[]
567
712
  ): void {
713
+ // Check for desktop app context (Electron, Tauri, etc.)
714
+ // Desktop apps legitimately access filesystem
715
+ const isDesktopApp = isDesktopAppContext(filePath)
716
+
717
+ // Check for file loader context
718
+ // File loaders legitimately access filesystem to process files
719
+ const isFileLoader = isFileLoaderContext(filePath)
720
+
721
+ // Desktop apps and file loaders are expected to access filesystem
722
+ if (isDesktopApp || isFileLoader) {
723
+ const contextType = isDesktopApp ? 'desktop app' : 'file loader'
724
+ vulnerabilities.push({
725
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
726
+ filePath,
727
+ lineNumber: index + 1,
728
+ lineContent: line.trim(),
729
+ severity: 'info',
730
+ category: 'dangerous_function',
731
+ title: `${funcPattern.name} (${contextType})`,
732
+ description: `Dynamic file path in ${contextType} context. File system access is expected functionality. Verify path inputs are validated.`,
733
+ suggestedFix:
734
+ 'Ensure file paths are validated and constrained to expected directories.',
735
+ confidence: 'low',
736
+ baseConfidence: BASE_CONFIDENCE,
737
+ layer: 2,
738
+ source: 'structural' as const, })
739
+ return
740
+ }
741
+
568
742
  // Check file context for CLI/tooling (lower risk)
569
743
  const isCLITool =
570
744
  /\/(cli|scripts?|tools?|bin)\//i.test(filePath) ||
@@ -580,11 +754,18 @@ function handleFilePathPattern(
580
754
  /\/(utils?|helpers?|lib|common|shared)\//i.test(filePath) ||
581
755
  /(util(s)?|helper(s)?|checksum|hash)\.(ts|js)$/i.test(filePath)
582
756
 
757
+ // Check for server infrastructure/config files (transport, signing, credentials)
758
+ // These files read/write config-controlled paths, not user input
759
+ const isServerInfrastructureFile =
760
+ /\/(transports?|signing|credentials?|certificates?|certs?)\//i.test(filePath) ||
761
+ /\/(config|infrastructure|provisioning)\//i.test(filePath) ||
762
+ /(transport|signer|credential|certificate)\.(ts|js)$/i.test(filePath)
763
+
583
764
  // Get surrounding context for protection check
584
- const lines = content.split('\n')
765
+ const _lines = lines ?? content.split('\n')
585
766
  const contextStart = Math.max(0, index - 10)
586
- const contextEnd = Math.min(lines.length, index + 10)
587
- const context = lines.slice(contextStart, contextEnd).join('\n')
767
+ const contextEnd = Math.min(_lines.length, index + 10)
768
+ const context = _lines.slice(contextStart, contextEnd).join('\n')
588
769
 
589
770
  // Check if path comes from directory iteration (fs.readdir, fs.readdirSync)
590
771
  // These paths are filesystem-controlled, not user input
@@ -592,6 +773,9 @@ function handleFilePathPattern(
592
773
  /\b(readdir|readdirSync|opendir|opendirSync)\s*\(/.test(content) &&
593
774
  (/for\s*\(\s*(const|let|var)\s+\w+\s+of/.test(context) ||
594
775
  /\.forEach\s*\(/.test(context) ||
776
+ /\.map\s*\(/.test(context) || // array.map() iteration
777
+ /pMap\s*\(/.test(context) || // p-map library (parallel map)
778
+ /Promise\.all\s*\(/.test(context) || // Promise.all mapping
595
779
  /entry\.(name|isFile|isDirectory)/.test(context) ||
596
780
  /dirent\.(name|isFile|isDirectory)/.test(context))
597
781
 
@@ -609,8 +793,9 @@ function handleFilePathPattern(
609
793
  suggestedFix:
610
794
  'Ensure path normalization and base directory checks are applied consistently.',
611
795
  confidence: 'low',
796
+ baseConfidence: BASE_CONFIDENCE,
612
797
  layer: 2,
613
- })
798
+ source: 'structural' as const, })
614
799
  return
615
800
  }
616
801
 
@@ -620,6 +805,29 @@ function handleFilePathPattern(
620
805
  return
621
806
  }
622
807
 
808
+ // Check for Object.entries/keys/values over hardcoded objects
809
+ // Pattern: for (const [key, val] of Object.entries(STATIC_OBJ))
810
+ const hasHardcodedObjectIteration = ((): boolean => {
811
+ // Look for Object.entries/keys/values in context
812
+ const hasObjectIteration = /Object\.(entries|keys|values)\s*\(/.test(context)
813
+ if (!hasObjectIteration) return false
814
+
815
+ // Check if the object being iterated is defined as a const literal nearby
816
+ // Pattern: const objName = { ... }; ... Object.entries(objName)
817
+ const objectMatch = context.match(/Object\.(entries|keys|values)\s*\(\s*(\w+)\s*\)/)
818
+ if (!objectMatch) return false
819
+
820
+ const objName = objectMatch[2]
821
+ // Check if objName is defined as a const object literal in the file
822
+ const isConstObject = new RegExp(`const\\s+${objName}\\s*=\\s*\\{`).test(content)
823
+ return isConstObject
824
+ })()
825
+
826
+ if (hasHardcodedObjectIteration) {
827
+ // Skip entirely - iterating over hardcoded object, not user input
828
+ return
829
+ }
830
+
623
831
  // GitHub Action paths are workflow-controlled (not arbitrary user input)
624
832
  if (isGitHubAction) {
625
833
  vulnerabilities.push({
@@ -635,8 +843,9 @@ function handleFilePathPattern(
635
843
  suggestedFix:
636
844
  'Verify paths come from trusted action inputs or environment variables.',
637
845
  confidence: 'low',
846
+ baseConfidence: BASE_CONFIDENCE,
638
847
  layer: 2,
639
- })
848
+ source: 'structural' as const, })
640
849
  return
641
850
  }
642
851
 
@@ -655,8 +864,9 @@ function handleFilePathPattern(
655
864
  suggestedFix:
656
865
  'Add path validation if accepting paths from untrusted sources.',
657
866
  confidence: 'low',
867
+ baseConfidence: BASE_CONFIDENCE,
658
868
  layer: 2,
659
- })
869
+ source: 'structural' as const, })
660
870
  return
661
871
  }
662
872
 
@@ -668,6 +878,30 @@ function handleFilePathPattern(
668
878
  return
669
879
  }
670
880
 
881
+ // Server infrastructure files (signing, transport, credentials) use config-controlled paths
882
+ // These paths come from environment variables or internal configuration, not user input
883
+ if (isServerInfrastructureFile && !hasRequestData) {
884
+ // Check if path comes from environment variables or function parameters
885
+ const hasEnvVarPath = /process\.env\.|import\.meta\.env\.|env\s*\(/i.test(context)
886
+ const hasConfigPath = /config\.|settings\.|credentials?\./i.test(context)
887
+ const hasCertPath = /certPath|keyPath|credentialsPath|googleApplicationCredentials/i.test(context)
888
+
889
+ if (hasEnvVarPath || hasConfigPath || hasCertPath) {
890
+ // Skip entirely - paths from env vars/config are not user-controlled
891
+ return
892
+ }
893
+ }
894
+
895
+ // Check if file path variable comes from environment variable wrapper function
896
+ // Common pattern: env('VAR_NAME') || 'default', process.env.VAR, etc.
897
+ const hasEnvVarSource = /env\s*\(\s*['"][^'"]+['"]\s*\)|process\.env\.\w+|import\.meta\.env\.\w+/i.test(context)
898
+ const hasOnlyConfigSource = hasEnvVarSource && !hasRequestData
899
+
900
+ if (hasOnlyConfigSource) {
901
+ // Path comes from environment variable, not user input - skip
902
+ return
903
+ }
904
+
671
905
  // Standard handling for unprotected paths
672
906
  let severity = funcPattern.severity
673
907
  let confidence: 'high' | 'medium' | 'low' = 'high'
@@ -694,8 +928,9 @@ function handleFilePathPattern(
694
928
  description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
695
929
  suggestedFix: funcPattern.suggestedFix,
696
930
  confidence,
931
+ baseConfidence: BASE_CONFIDENCE,
697
932
  layer: 2,
698
- })
933
+ source: 'structural' as const, })
699
934
  }
700
935
 
701
936
  /**
@@ -809,6 +1044,14 @@ function handleMathRandomPattern(
809
1044
  suggestedFix =
810
1045
  'Use crypto.randomBytes() for security tokens. Use crypto.randomUUID() for unique IDs.'
811
1046
  }
1047
+ // UI/cosmetic context - info (skeleton widths, animations, visual effects)
1048
+ else if (context.inUIContext) {
1049
+ severity = 'info'
1050
+ confidence = 'low'
1051
+ description =
1052
+ 'Math.random() in UI/cosmetic context. Acceptable for visual effects, skeleton loading, animations.'
1053
+ suggestedFix = 'No change needed for UI/cosmetic randomness.'
1054
+ }
812
1055
  // Business logic context - low
813
1056
  else if (context.inBusinessLogicContext) {
814
1057
  severity = 'low'
@@ -842,14 +1085,83 @@ function handleMathRandomPattern(
842
1085
  description,
843
1086
  suggestedFix,
844
1087
  confidence,
1088
+ baseConfidence: BASE_CONFIDENCE,
845
1089
  layer: 2,
846
- })
1090
+ source: 'structural' as const, })
847
1091
  }
848
1092
 
849
1093
  /**
850
- * Handle Python subprocess/os.system patterns
851
- * Safe pattern: subprocess.run(['static', 'args']) without shell=True
852
- * Unsafe pattern: subprocess.run(command, shell=True) or os.system(command)
1094
+ * Extract the full Python function call block starting from the trigger line.
1095
+ * Uses paren-balancing to collect up to `maxLines` forward, capturing multi-line calls.
1096
+ * Returns the joined block string.
1097
+ */
1098
+ function extractPythonCallBlock(
1099
+ lines: string[],
1100
+ startIndex: number,
1101
+ maxLines: number = 10
1102
+ ): string {
1103
+ let depth = 0
1104
+ let started = false
1105
+ const blockLines: string[] = []
1106
+
1107
+ for (let i = startIndex; i < Math.min(lines.length, startIndex + maxLines); i++) {
1108
+ const ln = lines[i]
1109
+ blockLines.push(ln)
1110
+
1111
+ for (const ch of ln) {
1112
+ if (ch === '(') {
1113
+ depth++
1114
+ started = true
1115
+ } else if (ch === ')') {
1116
+ depth--
1117
+ }
1118
+ }
1119
+
1120
+ // Once we've opened at least one paren and balanced back to 0, we're done
1121
+ if (started && depth <= 0) break
1122
+ }
1123
+
1124
+ return blockLines.join('\n')
1125
+ }
1126
+
1127
+ /**
1128
+ * Check if a Python list (as a string) contains only static string literals.
1129
+ * Returns true if every element is a plain string literal (no f-strings, no variables).
1130
+ */
1131
+ function isPythonListAllStatic(listContent: string): boolean {
1132
+ // Remove the outer brackets
1133
+ const inner = listContent.replace(/^\[/, '').replace(/\]$/, '').trim()
1134
+ if (!inner) return true // empty list
1135
+
1136
+ // Split on commas (rough — good enough for typical subprocess args)
1137
+ const elements = inner.split(',').map(e => e.trim()).filter(e => e.length > 0)
1138
+
1139
+ for (const el of elements) {
1140
+ // Must be a plain string literal: 'foo', "bar", or """...""" / '''...'''
1141
+ // Reject f-strings, variables, function calls
1142
+ if (/^f['"`]/.test(el)) return false // f-string
1143
+ if (/^['"]/.test(el) && /['"]$/.test(el)) continue // simple string literal
1144
+ if (/^"""/.test(el) || /^'''/.test(el)) continue // triple-quoted
1145
+ return false // variable, function call, or other expression
1146
+ }
1147
+ return true
1148
+ }
1149
+
1150
+ /**
1151
+ * Handle Python subprocess/os.system patterns with multi-line awareness.
1152
+ *
1153
+ * Decision tree:
1154
+ * 1. os.system(...) → HIGH (always dangerous)
1155
+ * 2. shell=True in call block? → HIGH
1156
+ * 3. First arg is inline list [...]?
1157
+ * a. All string literals, no f-strings → SKIP (safe)
1158
+ * b. Has f-strings or variables → LOW (list args prevent shell injection)
1159
+ * 4. First arg is a variable name?
1160
+ * a. Resolved to list nearby, all static → SKIP
1161
+ * b. Resolved to list nearby, has dynamics → LOW
1162
+ * c. Can't resolve → LOW (unresolved, flag for review)
1163
+ * 5. f-string as direct arg (not in list)? → HIGH (command injection)
1164
+ * 6. Everything else → HIGH (fallback)
853
1165
  */
854
1166
  function handlePythonSubprocessPattern(
855
1167
  funcPattern: DangerousFunctionPattern,
@@ -858,53 +1170,347 @@ function handlePythonSubprocessPattern(
858
1170
  index: number,
859
1171
  filePath: string,
860
1172
  isTestFile: boolean,
861
- vulnerabilities: Vulnerability[]
1173
+ vulnerabilities: Vulnerability[],
1174
+ lines?: string[]
862
1175
  ): void {
863
- // os.system is always dangerous - no safe usage
1176
+ // 1. os.system is always dangerous - no safe usage
864
1177
  if (/os\.system\s*\(/i.test(line)) {
865
1178
  handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
866
1179
  return
867
1180
  }
868
1181
 
869
- // Check for subprocess with list args and no shell=True (safe)
870
- // Pattern: subprocess.run(['git', 'status', '--porcelain'], ...)
871
- // This is safe because args are not parsed by shell
872
- const hasListArgs = /subprocess\.(run|call|check_output|Popen)\s*\(\s*\[/i.test(line)
873
-
874
- // Check for shell=True (dangerous)
875
- // Look at next line too in case it's multi-line
876
- const lines = content.split('\n')
877
- const nextLine = lines[index + 1] || ''
878
- const combinedLines = line + ' ' + nextLine
879
- const hasShellTrue = /shell\s*=\s*True/i.test(combinedLines)
880
-
881
- // Safe: list args without shell=True
882
- if (hasListArgs && !hasShellTrue) {
883
- // Check if the command is completely static (all string literals in the list)
884
- const staticListPattern = /subprocess\.(run|call|check_output|Popen)\s*\(\s*\[\s*(['"][^'"]*['"],?\s*)+\]/i
885
- if (staticListPattern.test(line)) {
886
- // Completely static command list - safe, skip entirely
1182
+ const _lines = lines ?? content.split('\n')
1183
+
1184
+ // Extract the full multi-line call block (up to 10 lines forward)
1185
+ const callBlock = extractPythonCallBlock(_lines, index)
1186
+
1187
+ // 2. Check for shell=True across the entire call block
1188
+ const hasShellTrue = /shell\s*=\s*True/i.test(callBlock)
1189
+ if (hasShellTrue) {
1190
+ handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
1191
+ return
1192
+ }
1193
+
1194
+ // 3. Check for inline list args in the call block (not just same line)
1195
+ const inlineListMatch = callBlock.match(
1196
+ /subprocess\.(run|call|check_output|Popen)\s*\(\s*\[([\s\S]*?)\]/i
1197
+ )
1198
+ if (inlineListMatch) {
1199
+ const listContent = '[' + inlineListMatch[2] + ']'
1200
+ if (isPythonListAllStatic(listContent)) {
1201
+ // 3a. All static string literals → SKIP (safe)
887
1202
  return
888
1203
  }
889
- // List args but might have variable args - lower severity
1204
+ // 3b. Has f-strings or variables LOW (list args prevent shell injection)
890
1205
  vulnerabilities.push({
891
1206
  id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
892
1207
  filePath,
893
1208
  lineNumber: index + 1,
894
1209
  lineContent: line.trim(),
895
- severity: 'low',
1210
+ severity: isTestFile ? 'info' : 'low',
896
1211
  category: 'dangerous_function',
897
1212
  title: funcPattern.name + ' (list args)',
898
1213
  description:
899
- 'subprocess with list arguments (safer than shell=True). Verify command arguments are validated.',
900
- suggestedFix: 'Ensure all arguments are validated and sanitized.',
1214
+ 'subprocess with list arguments (safer than shell=True). Some arguments contain variables or f-strings — verify they are validated.',
1215
+ suggestedFix: 'Ensure dynamic arguments are validated and sanitized.',
1216
+ confidence: 'low',
1217
+ baseConfidence: BASE_CONFIDENCE,
1218
+ layer: 2,
1219
+ source: 'structural' as const, })
1220
+ return
1221
+ }
1222
+
1223
+ // 4. Check for variable reference as first arg
1224
+ // Pattern: subprocess.run(args, ...) or subprocess.check_output(cmd, ...)
1225
+ const varArgMatch = callBlock.match(
1226
+ /subprocess\.(run|call|check_output|Popen)\s*\(\s*([a-zA-Z_]\w*)\s*[,)]/i
1227
+ )
1228
+ if (varArgMatch) {
1229
+ const varName = varArgMatch[2]
1230
+
1231
+ // Look backwards up to 15 lines for assignment: varName = [...]
1232
+ const searchStart = Math.max(0, index - 15)
1233
+ const previousLines = _lines.slice(searchStart, index + 1).join('\n')
1234
+
1235
+ // Match varName = [...] assignment (possibly multi-line)
1236
+ const assignmentPattern = new RegExp(
1237
+ varName + '\\s*=\\s*\\[([\\s\\S]*?)\\]',
1238
+ 'i'
1239
+ )
1240
+ const assignmentMatch = previousLines.match(assignmentPattern)
1241
+
1242
+ if (assignmentMatch) {
1243
+ const listContent = '[' + assignmentMatch[1] + ']'
1244
+ if (isPythonListAllStatic(listContent)) {
1245
+ // 4a. Variable resolves to all-static list → SKIP
1246
+ return
1247
+ }
1248
+ // 4b. Variable resolves to list with dynamic elements → LOW
1249
+ vulnerabilities.push({
1250
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1251
+ filePath,
1252
+ lineNumber: index + 1,
1253
+ lineContent: line.trim(),
1254
+ severity: isTestFile ? 'info' : 'low',
1255
+ category: 'dangerous_function',
1256
+ title: funcPattern.name + ' (list args via variable)',
1257
+ description:
1258
+ `subprocess called with variable '${varName}' which resolves to a list. List arguments prevent shell injection, but some elements are dynamic.`,
1259
+ suggestedFix: 'Ensure dynamic list elements are validated and sanitized.',
1260
+ confidence: 'low',
1261
+ baseConfidence: BASE_CONFIDENCE,
1262
+ layer: 2,
1263
+ source: 'structural' as const, })
1264
+ return
1265
+ }
1266
+
1267
+ // 4c. Can't resolve the variable — flag for review at LOW
1268
+ vulnerabilities.push({
1269
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1270
+ filePath,
1271
+ lineNumber: index + 1,
1272
+ lineContent: line.trim(),
1273
+ severity: isTestFile ? 'info' : 'low',
1274
+ category: 'dangerous_function',
1275
+ title: funcPattern.name + ' (unresolved variable)',
1276
+ description:
1277
+ `subprocess called with variable '${varName}' — could not resolve its value nearby. If it is a list, shell injection risk is low.`,
1278
+ suggestedFix: 'Verify the variable is a list (not a string) and arguments are validated.',
1279
+ confidence: 'low',
1280
+ baseConfidence: BASE_CONFIDENCE,
1281
+ layer: 2,
1282
+ source: 'structural' as const, })
1283
+ return
1284
+ }
1285
+
1286
+ // 5. f-string as direct arg (not inside a list) → HIGH (command injection)
1287
+ const hasFStringDirectArg = /subprocess\.(run|call|check_output|Popen)\s*\(\s*f['"`]/i.test(callBlock)
1288
+ if (hasFStringDirectArg) {
1289
+ handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
1290
+ return
1291
+ }
1292
+
1293
+ // 6. Everything else → HIGH (fallback)
1294
+ handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
1295
+ }
1296
+
1297
+ /**
1298
+ * Handle regex patterns - check for escaped input
1299
+ * Pattern: new RegExp(escapedInput) or new RegExp(input.replaceAll(...escaped...))
1300
+ */
1301
+ function handleRegexPattern(
1302
+ funcPattern: DangerousFunctionPattern,
1303
+ line: string,
1304
+ content: string,
1305
+ index: number,
1306
+ filePath: string,
1307
+ isTestFile: boolean,
1308
+ vulnerabilities: Vulnerability[],
1309
+ lines?: string[]
1310
+ ): void {
1311
+ const _lines = lines ?? content.split('\n')
1312
+ const contextStart = Math.max(0, index - 15)
1313
+ const contextEnd = Math.min(_lines.length, index + 3)
1314
+ const context = _lines.slice(contextStart, contextEnd).join('\n')
1315
+
1316
+ // Check for RegExp object property access (.source, .flags)
1317
+ // This indicates input is already a validated RegExp, not user string
1318
+ // e.g., new RegExp(existingRegex.source, existingRegex.flags)
1319
+ const isRegExpFromRegExp = /\.source\s*[,)\s]/.test(line)
1320
+ if (isRegExpFromRegExp) {
1321
+ return // Safe - .source only exists on RegExp objects (already validated)
1322
+ }
1323
+
1324
+ // Check for escaping ON THE SAME LINE as new RegExp() - this is a strong signal
1325
+ const sameLineEscapingPatterns = [
1326
+ /\.replaceAll\s*\([^)]*\)\s*[,)]/i, // .replaceAll(...)) - escaping before RegExp
1327
+ /escape\w*\s*\([^)]*\)\s*[,)]/i, // escapeRegExp(input)) - function result used
1328
+ /\.replace\s*\([^,]+,[^)]+\)\s*[,)]/i, // .replace(..., ...) followed by closing
1329
+ ]
1330
+ if (sameLineEscapingPatterns.some(p => p.test(line))) {
1331
+ return // Safe - escaping applied on same line before RegExp construction
1332
+ }
1333
+
1334
+ // Check previous 5 lines for escaping assignment (extended from 3 to catch multi-line patterns)
1335
+ const prevLinesStart = Math.max(0, index - 5)
1336
+ const prevLines = _lines.slice(prevLinesStart, index + 1).join('\n')
1337
+
1338
+ // Check for escaping patterns before new RegExp
1339
+ const escapingPatterns = [
1340
+ // Direct escaping function calls
1341
+ /escapeRegExp\s*\(/i, // escapeRegExp(input)
1342
+ /escapeString\s*\(/i, // escapeString(input)
1343
+ /escape\s*\(\s*pattern/i, // escape(pattern)
1344
+ /escapeForRegex\s*\(/i, // escapeForRegex(input)
1345
+ /regexEscape\s*\(/i, // regexEscape(input)
1346
+
1347
+ // replaceAll with regex escape pattern - original strict patterns
1348
+ /\.replaceAll\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replaceAll(/[special]/g, '\\$&')
1349
+ /\.replace\s*\(\s*\/\[.*\\\\\]\s*\/[gi]*\s*,\s*['"`]\\\\?\$&['"`]\s*\)/, // .replace(/[special]/g, '\\$&')
1350
+
1351
+ // More permissive $& replacement detection (the escape marker)
1352
+ // $& is the regex replacement marker that inserts the matched string - used for escaping
1353
+ /\.replace(?:All)?[\s\S]*?['"`]\\*\$&['"`]/, // .replace/.replaceAll with $& anywhere in call
1354
+ /\.replaceAll?[^;]*\$&/, // .replace/.replaceAll until semicolon with $&
1355
+
1356
+ // Lodash/underscore escapeRegExp
1357
+ /_\.escapeRegExp\s*\(/, // _.escapeRegExp(input)
1358
+ /lodash.*escapeRegExp/i, // lodash.escapeRegExp
1359
+
1360
+ // Variable assignment with escaping (check previous lines)
1361
+ /escaped\w*\s*=.*\.replace/i, // escapedInput = input.replace(...)
1362
+ /safe\w*\s*=.*escape/i, // safePattern = escapeRegExp(...)
1363
+ ]
1364
+
1365
+ // Check both previous lines and full context
1366
+ const hasEscaping = escapingPatterns.some(p => p.test(line) || p.test(prevLines) || p.test(context))
1367
+
1368
+ // Check for try-catch wrapping (ReDoS contained)
1369
+ const hasTryCatch =
1370
+ /try\s*\{[^}]*new\s+RegExp/i.test(context) ||
1371
+ (context.includes('try {') && _lines.slice(Math.max(0, index - 5), index + 1).some(l => /try\s*\{/.test(l)))
1372
+
1373
+ // Check for configuration-based patterns (trusted input)
1374
+ const isConfigBased =
1375
+ /config\./i.test(line) ||
1376
+ /settings\./i.test(line) ||
1377
+ /rules\./i.test(line) ||
1378
+ /options\.\w+Pattern/i.test(line) ||
1379
+ /urlPattern/i.test(line) ||
1380
+ /routePattern/i.test(line)
1381
+
1382
+ // Escaped input is safe - skip entirely
1383
+ if (hasEscaping) {
1384
+ return
1385
+ }
1386
+
1387
+ // Config-based patterns are trusted - skip
1388
+ if (isConfigBased) {
1389
+ return
1390
+ }
1391
+
1392
+ // Check if regex source is an object property (app-controlled data, not user input)
1393
+ // Patterns: obj.pattern, item.regex, l.urlRegExp, entry.matchPattern
1394
+ const objectPropertySource = /new\s+RegExp\s*\(\s*\w+\.\w*(regex|pattern|regexp|match|rule|expression|filter)\w*/i.test(line)
1395
+ if (objectPropertySource) {
1396
+ vulnerabilities.push({
1397
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1398
+ filePath,
1399
+ lineNumber: index + 1,
1400
+ lineContent: line.trim(),
1401
+ severity: 'info',
1402
+ category: 'dangerous_function',
1403
+ title: funcPattern.name + ' (app-controlled)',
1404
+ description: 'Dynamic regex from object property. If the regex source is app-defined (not user input), ReDoS risk is minimal.',
1405
+ suggestedFix: 'Ensure regex patterns come from trusted, validated sources.',
1406
+ confidence: 'low',
1407
+ baseConfidence: BASE_CONFIDENCE,
1408
+ layer: 2,
1409
+ source: 'structural' as const, })
1410
+ return
1411
+ }
1412
+
1413
+ // Check if regex source is from array iteration over app data
1414
+ // Pattern: for (const item of items) { new RegExp(item.xxx) }
1415
+ const isArrayIterationContext = /for\s*\(\s*(const|let|var)\s+\w+\s+(of|in)\s+/.test(context) &&
1416
+ /new\s+RegExp\s*\(\s*\w+\./.test(line)
1417
+ if (isArrayIterationContext) {
1418
+ vulnerabilities.push({
1419
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1420
+ filePath,
1421
+ lineNumber: index + 1,
1422
+ lineContent: line.trim(),
1423
+ severity: 'info',
1424
+ category: 'dangerous_function',
1425
+ title: funcPattern.name + ' (iteration)',
1426
+ description: 'Dynamic regex in array iteration. If iterating over app-defined data, ReDoS risk is minimal.',
1427
+ suggestedFix: 'Ensure regex patterns come from trusted sources, not user input.',
1428
+ confidence: 'low',
1429
+ baseConfidence: BASE_CONFIDENCE,
1430
+ layer: 2,
1431
+ source: 'structural' as const, })
1432
+ return
1433
+ }
1434
+
1435
+ // Try-catch wrapped - lower severity (ReDoS contained)
1436
+ if (hasTryCatch) {
1437
+ vulnerabilities.push({
1438
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1439
+ filePath,
1440
+ lineNumber: index + 1,
1441
+ lineContent: line.trim(),
1442
+ severity: 'info',
1443
+ category: 'dangerous_function',
1444
+ title: funcPattern.name + ' (try-catch wrapped)',
1445
+ description:
1446
+ 'Dynamic regex with try-catch error handling. ReDoS attacks are contained but may still cause performance issues.',
1447
+ suggestedFix: 'Consider using safe-regex library or adding timeout for regex operations.',
901
1448
  confidence: 'low',
1449
+ baseConfidence: BASE_CONFIDENCE,
902
1450
  layer: 2,
903
- })
1451
+ source: 'structural' as const, })
904
1452
  return
905
1453
  }
906
1454
 
907
- // Standard handling for shell=True or non-list args
1455
+ // Standard handling for unprotected regex
1456
+ handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
1457
+ }
1458
+
1459
+ /**
1460
+ * Handle spread operator with user input patterns
1461
+ * Checks for schema validation (Fastify, Zod, tRPC) that strips unknown properties
1462
+ */
1463
+ function handleSpreadPattern(
1464
+ funcPattern: DangerousFunctionPattern,
1465
+ line: string,
1466
+ content: string,
1467
+ index: number,
1468
+ filePath: string,
1469
+ isTestFile: boolean,
1470
+ vulnerabilities: Vulnerability[],
1471
+ lines?: string[]
1472
+ ): void {
1473
+ const _lines = lines ?? content.split('\n')
1474
+ const contextStart = Math.max(0, index - 30)
1475
+ const contextEnd = index
1476
+ const context = _lines.slice(contextStart, contextEnd).join('\n')
1477
+
1478
+ // Fastify/Hapi schema validation on route - body is pre-validated
1479
+ // Pattern: schema: { body: someSchema } before handler
1480
+ const hasRouteSchemaValidation =
1481
+ /schema\s*:\s*\{[^}]*body\s*:\s*\w+/i.test(context) ||
1482
+ /body\s*:\s*\w+Schema/i.test(context)
1483
+
1484
+ // Express + Zod/Joi/Yup middleware validation
1485
+ const hasMiddlewareValidation =
1486
+ /validate\s*\(\s*\w+Schema\s*\)/i.test(context) ||
1487
+ /\.parse\s*\(\s*req\.body\s*\)/i.test(context) ||
1488
+ /celebrate\s*\(/i.test(context)
1489
+
1490
+ // tRPC input validation
1491
+ const hasTRPCValidation =
1492
+ /\.input\s*\(\s*z\./i.test(context) ||
1493
+ /\.input\s*\(\s*\w+Schema\s*\)/i.test(context)
1494
+
1495
+ if (hasRouteSchemaValidation || hasMiddlewareValidation || hasTRPCValidation) {
1496
+ vulnerabilities.push({
1497
+ id: `dangerous-func-${filePath}-${index + 1}-${funcPattern.name}`,
1498
+ filePath,
1499
+ lineNumber: index + 1,
1500
+ lineContent: line.trim(),
1501
+ severity: 'info',
1502
+ category: 'dangerous_function',
1503
+ title: funcPattern.name + ' (schema-validated)',
1504
+ description: 'Request body is spread but has schema validation. Schema validation strips unknown properties, reducing mass assignment risk.',
1505
+ suggestedFix: 'Ensure schema validation is strict (no .passthrough() in Zod, no additionalProperties in JSON Schema).',
1506
+ confidence: 'low',
1507
+ baseConfidence: BASE_CONFIDENCE,
1508
+ layer: 2,
1509
+ source: 'structural' as const, })
1510
+ return
1511
+ }
1512
+
1513
+ // No schema validation - standard handling
908
1514
  handleStandardPattern(funcPattern, line, index, filePath, isTestFile, vulnerabilities)
909
1515
  }
910
1516
 
@@ -944,6 +1550,7 @@ function handleStandardPattern(
944
1550
  description: funcPattern.description + (isTestFile ? ' (in test file)' : ''),
945
1551
  suggestedFix: funcPattern.suggestedFix,
946
1552
  confidence,
1553
+ baseConfidence: BASE_CONFIDENCE,
947
1554
  layer: 2,
948
- })
1555
+ source: 'structural' as const, })
949
1556
  }