@oculum/scanner 1.0.10 → 1.0.12

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 (520) 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/baseline/diff.d.ts +32 -0
  10. package/dist/baseline/diff.d.ts.map +1 -0
  11. package/dist/baseline/diff.js +119 -0
  12. package/dist/baseline/diff.js.map +1 -0
  13. package/dist/baseline/index.d.ts +9 -0
  14. package/dist/baseline/index.d.ts.map +1 -0
  15. package/dist/baseline/index.js +19 -0
  16. package/dist/baseline/index.js.map +1 -0
  17. package/dist/baseline/manager.d.ts +67 -0
  18. package/dist/baseline/manager.d.ts.map +1 -0
  19. package/dist/baseline/manager.js +180 -0
  20. package/dist/baseline/manager.js.map +1 -0
  21. package/dist/baseline/types.d.ts +91 -0
  22. package/dist/baseline/types.d.ts.map +1 -0
  23. package/dist/baseline/types.js +12 -0
  24. package/dist/baseline/types.js.map +1 -0
  25. package/dist/category-filter.d.ts +125 -0
  26. package/dist/category-filter.d.ts.map +1 -0
  27. package/dist/category-filter.js +360 -0
  28. package/dist/category-filter.js.map +1 -0
  29. package/dist/filtering/context-adjustments.d.ts +23 -0
  30. package/dist/filtering/context-adjustments.d.ts.map +1 -0
  31. package/dist/filtering/context-adjustments.js +100 -0
  32. package/dist/filtering/context-adjustments.js.map +1 -0
  33. package/dist/filtering/index.d.ts +3 -0
  34. package/dist/filtering/index.d.ts.map +1 -0
  35. package/dist/filtering/index.js +8 -0
  36. package/dist/filtering/index.js.map +1 -0
  37. package/dist/filtering/pipeline.d.ts +48 -0
  38. package/dist/filtering/pipeline.d.ts.map +1 -0
  39. package/dist/filtering/pipeline.js +76 -0
  40. package/dist/filtering/pipeline.js.map +1 -0
  41. package/dist/formatters/ai-context.d.ts +23 -0
  42. package/dist/formatters/ai-context.d.ts.map +1 -0
  43. package/dist/formatters/ai-context.js +238 -0
  44. package/dist/formatters/ai-context.js.map +1 -0
  45. package/dist/formatters/cli-terminal.d.ts +38 -0
  46. package/dist/formatters/cli-terminal.d.ts.map +1 -1
  47. package/dist/formatters/cli-terminal.js +365 -42
  48. package/dist/formatters/cli-terminal.js.map +1 -1
  49. package/dist/formatters/github-comment.d.ts +2 -2
  50. package/dist/formatters/github-comment.d.ts.map +1 -1
  51. package/dist/formatters/github-comment.js +77 -13
  52. package/dist/formatters/github-comment.js.map +1 -1
  53. package/dist/formatters/ide/claude-code.d.ts +17 -0
  54. package/dist/formatters/ide/claude-code.d.ts.map +1 -0
  55. package/dist/formatters/ide/claude-code.js +94 -0
  56. package/dist/formatters/ide/claude-code.js.map +1 -0
  57. package/dist/formatters/ide/cursor.d.ts +13 -0
  58. package/dist/formatters/ide/cursor.d.ts.map +1 -0
  59. package/dist/formatters/ide/cursor.js +125 -0
  60. package/dist/formatters/ide/cursor.js.map +1 -0
  61. package/dist/formatters/ide/index.d.ts +62 -0
  62. package/dist/formatters/ide/index.d.ts.map +1 -0
  63. package/dist/formatters/ide/index.js +184 -0
  64. package/dist/formatters/ide/index.js.map +1 -0
  65. package/dist/formatters/ide/windsurf.d.ts +13 -0
  66. package/dist/formatters/ide/windsurf.d.ts.map +1 -0
  67. package/dist/formatters/ide/windsurf.js +117 -0
  68. package/dist/formatters/ide/windsurf.js.map +1 -0
  69. package/dist/formatters/index.d.ts +3 -1
  70. package/dist/formatters/index.d.ts.map +1 -1
  71. package/dist/formatters/index.js +20 -1
  72. package/dist/formatters/index.js.map +1 -1
  73. package/dist/index.d.ts +11 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +423 -56
  76. package/dist/index.js.map +1 -1
  77. package/dist/layer1/comments.d.ts +4 -1
  78. package/dist/layer1/comments.d.ts.map +1 -1
  79. package/dist/layer1/comments.js +1 -1
  80. package/dist/layer1/comments.js.map +1 -1
  81. package/dist/layer1/config-audit.d.ts +4 -1
  82. package/dist/layer1/config-audit.d.ts.map +1 -1
  83. package/dist/layer1/config-audit.js +65 -14
  84. package/dist/layer1/config-audit.js.map +1 -1
  85. package/dist/layer1/config-mcp-audit.d.ts +23 -0
  86. package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
  87. package/dist/layer1/config-mcp-audit.js +239 -0
  88. package/dist/layer1/config-mcp-audit.js.map +1 -0
  89. package/dist/layer1/entropy.d.ts +4 -1
  90. package/dist/layer1/entropy.d.ts.map +1 -1
  91. package/dist/layer1/entropy.js +212 -1
  92. package/dist/layer1/entropy.js.map +1 -1
  93. package/dist/layer1/file-flags.d.ts +4 -1
  94. package/dist/layer1/file-flags.d.ts.map +1 -1
  95. package/dist/layer1/file-flags.js +12 -5
  96. package/dist/layer1/file-flags.js.map +1 -1
  97. package/dist/layer1/index.d.ts +1 -0
  98. package/dist/layer1/index.d.ts.map +1 -1
  99. package/dist/layer1/index.js +22 -19
  100. package/dist/layer1/index.js.map +1 -1
  101. package/dist/layer1/patterns.d.ts +4 -1
  102. package/dist/layer1/patterns.d.ts.map +1 -1
  103. package/dist/layer1/patterns.js +34 -4
  104. package/dist/layer1/patterns.js.map +1 -1
  105. package/dist/layer1/urls.d.ts +4 -1
  106. package/dist/layer1/urls.d.ts.map +1 -1
  107. package/dist/layer1/urls.js +162 -14
  108. package/dist/layer1/urls.js.map +1 -1
  109. package/dist/layer1/weak-crypto.d.ts +4 -1
  110. package/dist/layer1/weak-crypto.d.ts.map +1 -1
  111. package/dist/layer1/weak-crypto.js +144 -7
  112. package/dist/layer1/weak-crypto.js.map +1 -1
  113. package/dist/layer2/ai-agent-tools.d.ts +4 -1
  114. package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
  115. package/dist/layer2/ai-agent-tools.js +964 -2
  116. package/dist/layer2/ai-agent-tools.js.map +1 -1
  117. package/dist/layer2/ai-endpoint-protection.d.ts +2 -0
  118. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
  119. package/dist/layer2/ai-endpoint-protection.js +18 -4
  120. package/dist/layer2/ai-endpoint-protection.js.map +1 -1
  121. package/dist/layer2/ai-execution-sinks.d.ts +4 -1
  122. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
  123. package/dist/layer2/ai-execution-sinks.js +688 -29
  124. package/dist/layer2/ai-execution-sinks.js.map +1 -1
  125. package/dist/layer2/ai-fingerprinting.d.ts +4 -1
  126. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
  127. package/dist/layer2/ai-fingerprinting.js +28 -32
  128. package/dist/layer2/ai-fingerprinting.js.map +1 -1
  129. package/dist/layer2/ai-mcp-security.d.ts +20 -0
  130. package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
  131. package/dist/layer2/ai-mcp-security.js +877 -0
  132. package/dist/layer2/ai-mcp-security.js.map +1 -0
  133. package/dist/layer2/ai-package-hallucination.d.ts +22 -0
  134. package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
  135. package/dist/layer2/ai-package-hallucination.js +828 -0
  136. package/dist/layer2/ai-package-hallucination.js.map +1 -0
  137. package/dist/layer2/ai-prompt-hygiene.d.ts +4 -1
  138. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
  139. package/dist/layer2/ai-prompt-hygiene.js +817 -17
  140. package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
  141. package/dist/layer2/ai-rag-safety.d.ts +4 -1
  142. package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
  143. package/dist/layer2/ai-rag-safety.js +454 -3
  144. package/dist/layer2/ai-rag-safety.js.map +1 -1
  145. package/dist/layer2/ai-schema-validation.d.ts +4 -1
  146. package/dist/layer2/ai-schema-validation.d.ts.map +1 -1
  147. package/dist/layer2/ai-schema-validation.js +2 -2
  148. package/dist/layer2/ai-schema-validation.js.map +1 -1
  149. package/dist/layer2/auth-antipatterns.d.ts +2 -0
  150. package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
  151. package/dist/layer2/auth-antipatterns.js +209 -20
  152. package/dist/layer2/auth-antipatterns.js.map +1 -1
  153. package/dist/layer2/byok-patterns.d.ts +4 -1
  154. package/dist/layer2/byok-patterns.d.ts.map +1 -1
  155. package/dist/layer2/byok-patterns.js +5 -2
  156. package/dist/layer2/byok-patterns.js.map +1 -1
  157. package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
  158. package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
  159. package/dist/layer2/dangerous-functions/child-process.js +74 -0
  160. package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
  161. package/dist/layer2/dangerous-functions/dom-xss.d.ts +34 -0
  162. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
  163. package/dist/layer2/dangerous-functions/dom-xss.js +230 -0
  164. package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
  165. package/dist/layer2/dangerous-functions/index.d.ts +16 -0
  166. package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
  167. package/dist/layer2/dangerous-functions/index.js +1152 -0
  168. package/dist/layer2/dangerous-functions/index.js.map +1 -0
  169. package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
  170. package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
  171. package/dist/layer2/dangerous-functions/json-parse.js +319 -0
  172. package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
  173. package/dist/layer2/dangerous-functions/math-random.d.ts +111 -0
  174. package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
  175. package/dist/layer2/dangerous-functions/math-random.js +684 -0
  176. package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
  177. package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
  178. package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
  179. package/dist/layer2/dangerous-functions/patterns.js +163 -0
  180. package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
  181. package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
  182. package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
  183. package/dist/layer2/dangerous-functions/request-validation.js +119 -0
  184. package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
  185. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +24 -0
  186. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  187. package/dist/layer2/dangerous-functions/utils/control-flow.js +70 -0
  188. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
  189. package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
  190. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
  191. package/dist/layer2/dangerous-functions/utils/helpers.js +147 -0
  192. package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
  193. package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
  194. package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
  195. package/dist/layer2/dangerous-functions/utils/index.js +23 -0
  196. package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
  197. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
  198. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  199. package/dist/layer2/dangerous-functions/utils/schema-validation.js +102 -0
  200. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
  201. package/dist/layer2/data-exposure.d.ts +4 -1
  202. package/dist/layer2/data-exposure.d.ts.map +1 -1
  203. package/dist/layer2/data-exposure.js +14 -38
  204. package/dist/layer2/data-exposure.js.map +1 -1
  205. package/dist/layer2/framework-checks.d.ts +4 -1
  206. package/dist/layer2/framework-checks.d.ts.map +1 -1
  207. package/dist/layer2/framework-checks.js +5 -2
  208. package/dist/layer2/framework-checks.js.map +1 -1
  209. package/dist/layer2/index.d.ts +12 -1
  210. package/dist/layer2/index.d.ts.map +1 -1
  211. package/dist/layer2/index.js +110 -45
  212. package/dist/layer2/index.js.map +1 -1
  213. package/dist/layer2/logic-gates.d.ts +4 -1
  214. package/dist/layer2/logic-gates.d.ts.map +1 -1
  215. package/dist/layer2/logic-gates.js +58 -20
  216. package/dist/layer2/logic-gates.js.map +1 -1
  217. package/dist/layer2/model-supply-chain.d.ts +23 -0
  218. package/dist/layer2/model-supply-chain.d.ts.map +1 -0
  219. package/dist/layer2/model-supply-chain.js +444 -0
  220. package/dist/layer2/model-supply-chain.js.map +1 -0
  221. package/dist/layer2/risky-imports.d.ts +4 -1
  222. package/dist/layer2/risky-imports.d.ts.map +1 -1
  223. package/dist/layer2/risky-imports.js +6 -2
  224. package/dist/layer2/risky-imports.js.map +1 -1
  225. package/dist/layer2/variables.d.ts +4 -1
  226. package/dist/layer2/variables.d.ts.map +1 -1
  227. package/dist/layer2/variables.js +6 -2
  228. package/dist/layer2/variables.js.map +1 -1
  229. package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
  230. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
  231. package/dist/layer3/anthropic/auto-dismiss.js +199 -0
  232. package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
  233. package/dist/layer3/anthropic/clients.d.ts +44 -0
  234. package/dist/layer3/anthropic/clients.d.ts.map +1 -0
  235. package/dist/layer3/anthropic/clients.js +81 -0
  236. package/dist/layer3/anthropic/clients.js.map +1 -0
  237. package/dist/layer3/anthropic/index.d.ts +41 -0
  238. package/dist/layer3/anthropic/index.d.ts.map +1 -0
  239. package/dist/layer3/anthropic/index.js +141 -0
  240. package/dist/layer3/anthropic/index.js.map +1 -0
  241. package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
  242. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
  243. package/dist/layer3/anthropic/prompts/index.js +14 -0
  244. package/dist/layer3/anthropic/prompts/index.js.map +1 -0
  245. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
  246. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
  247. package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
  248. package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
  249. package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
  250. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
  251. package/dist/layer3/anthropic/prompts/validation.js +421 -0
  252. package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
  253. package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
  254. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
  255. package/dist/layer3/anthropic/providers/anthropic.js +266 -0
  256. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
  257. package/dist/layer3/anthropic/providers/index.d.ts +8 -0
  258. package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
  259. package/dist/layer3/anthropic/providers/index.js +15 -0
  260. package/dist/layer3/anthropic/providers/index.js.map +1 -0
  261. package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
  262. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
  263. package/dist/layer3/anthropic/providers/openai.js +340 -0
  264. package/dist/layer3/anthropic/providers/openai.js.map +1 -0
  265. package/dist/layer3/anthropic/request-builder.d.ts +20 -0
  266. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
  267. package/dist/layer3/anthropic/request-builder.js +134 -0
  268. package/dist/layer3/anthropic/request-builder.js.map +1 -0
  269. package/dist/layer3/anthropic/types.d.ts +88 -0
  270. package/dist/layer3/anthropic/types.d.ts.map +1 -0
  271. package/dist/layer3/anthropic/types.js +38 -0
  272. package/dist/layer3/anthropic/types.js.map +1 -0
  273. package/dist/layer3/anthropic/utils/index.d.ts +9 -0
  274. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
  275. package/dist/layer3/anthropic/utils/index.js +24 -0
  276. package/dist/layer3/anthropic/utils/index.js.map +1 -0
  277. package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
  278. package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
  279. package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
  280. package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
  281. package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
  282. package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
  283. package/dist/layer3/anthropic/utils/response-parser.js +285 -0
  284. package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
  285. package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
  286. package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
  287. package/dist/layer3/anthropic/utils/retry.js +62 -0
  288. package/dist/layer3/anthropic/utils/retry.js.map +1 -0
  289. package/dist/layer3/index.d.ts +1 -0
  290. package/dist/layer3/index.d.ts.map +1 -1
  291. package/dist/layer3/index.js +16 -6
  292. package/dist/layer3/index.js.map +1 -1
  293. package/dist/layer3/osv-check.d.ts +75 -0
  294. package/dist/layer3/osv-check.d.ts.map +1 -0
  295. package/dist/layer3/osv-check.js +308 -0
  296. package/dist/layer3/osv-check.js.map +1 -0
  297. package/dist/modes/incremental.js +1 -1
  298. package/dist/rules/framework-fixes.d.ts +48 -0
  299. package/dist/rules/framework-fixes.d.ts.map +1 -0
  300. package/dist/rules/framework-fixes.js +439 -0
  301. package/dist/rules/framework-fixes.js.map +1 -0
  302. package/dist/rules/index.d.ts +8 -0
  303. package/dist/rules/index.d.ts.map +1 -0
  304. package/dist/rules/index.js +18 -0
  305. package/dist/rules/index.js.map +1 -0
  306. package/dist/rules/metadata.d.ts +43 -0
  307. package/dist/rules/metadata.d.ts.map +1 -0
  308. package/dist/rules/metadata.js +734 -0
  309. package/dist/rules/metadata.js.map +1 -0
  310. package/dist/suppression/config-loader.d.ts +74 -0
  311. package/dist/suppression/config-loader.d.ts.map +1 -0
  312. package/dist/suppression/config-loader.js +424 -0
  313. package/dist/suppression/config-loader.js.map +1 -0
  314. package/dist/suppression/hash.d.ts +48 -0
  315. package/dist/suppression/hash.d.ts.map +1 -0
  316. package/dist/suppression/hash.js +88 -0
  317. package/dist/suppression/hash.js.map +1 -0
  318. package/dist/suppression/index.d.ts +11 -0
  319. package/dist/suppression/index.d.ts.map +1 -0
  320. package/dist/suppression/index.js +39 -0
  321. package/dist/suppression/index.js.map +1 -0
  322. package/dist/suppression/inline-parser.d.ts +39 -0
  323. package/dist/suppression/inline-parser.d.ts.map +1 -0
  324. package/dist/suppression/inline-parser.js +218 -0
  325. package/dist/suppression/inline-parser.js.map +1 -0
  326. package/dist/suppression/manager.d.ts +94 -0
  327. package/dist/suppression/manager.d.ts.map +1 -0
  328. package/dist/suppression/manager.js +292 -0
  329. package/dist/suppression/manager.js.map +1 -0
  330. package/dist/suppression/types.d.ts +151 -0
  331. package/dist/suppression/types.d.ts.map +1 -0
  332. package/dist/suppression/types.js +28 -0
  333. package/dist/suppression/types.js.map +1 -0
  334. package/dist/tiers.d.ts +3 -3
  335. package/dist/tiers.d.ts.map +1 -1
  336. package/dist/tiers.js +34 -7
  337. package/dist/tiers.js.map +1 -1
  338. package/dist/types.d.ts +140 -9
  339. package/dist/types.d.ts.map +1 -1
  340. package/dist/types.js +34 -0
  341. package/dist/types.js.map +1 -1
  342. package/dist/utils/code-analysis.d.ts +39 -0
  343. package/dist/utils/code-analysis.d.ts.map +1 -0
  344. package/dist/utils/code-analysis.js +159 -0
  345. package/dist/utils/code-analysis.js.map +1 -0
  346. package/dist/utils/comment-analyzer.d.ts +38 -0
  347. package/dist/utils/comment-analyzer.d.ts.map +1 -0
  348. package/dist/utils/comment-analyzer.js +218 -0
  349. package/dist/utils/comment-analyzer.js.map +1 -0
  350. package/dist/utils/context-helpers.d.ts +112 -1
  351. package/dist/utils/context-helpers.d.ts.map +1 -1
  352. package/dist/utils/context-helpers.js +364 -11
  353. package/dist/utils/context-helpers.js.map +1 -1
  354. package/dist/utils/environment-context.d.ts +76 -0
  355. package/dist/utils/environment-context.d.ts.map +1 -0
  356. package/dist/utils/environment-context.js +271 -0
  357. package/dist/utils/environment-context.js.map +1 -0
  358. package/dist/utils/intent-detector.d.ts +66 -0
  359. package/dist/utils/intent-detector.d.ts.map +1 -0
  360. package/dist/utils/intent-detector.js +282 -0
  361. package/dist/utils/intent-detector.js.map +1 -0
  362. package/dist/utils/parsed-file.d.ts +51 -0
  363. package/dist/utils/parsed-file.d.ts.map +1 -0
  364. package/dist/utils/parsed-file.js +95 -0
  365. package/dist/utils/parsed-file.js.map +1 -0
  366. package/dist/utils/route-hierarchy.d.ts +50 -0
  367. package/dist/utils/route-hierarchy.d.ts.map +1 -0
  368. package/dist/utils/route-hierarchy.js +226 -0
  369. package/dist/utils/route-hierarchy.js.map +1 -0
  370. package/dist/utils/schema-semantics.d.ts +45 -0
  371. package/dist/utils/schema-semantics.d.ts.map +1 -0
  372. package/dist/utils/schema-semantics.js +193 -0
  373. package/dist/utils/schema-semantics.js.map +1 -0
  374. package/package.json +4 -2
  375. package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
  376. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
  377. package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
  378. package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
  379. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
  380. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
  381. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
  382. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
  383. package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
  384. package/src/__tests__/benchmark/fixtures/layer2/index.ts +30 -0
  385. package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
  386. package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
  387. package/src/__tests__/benchmark/fixtures/layer2/phase5-excessive-agency.ts +580 -0
  388. package/src/__tests__/benchmark/fixtures/layer2/sprint6-ai-enhancements.ts +515 -0
  389. package/src/__tests__/benchmark/run-depth-validation.ts +9 -9
  390. package/src/__tests__/category-filter.test.ts +478 -0
  391. package/src/__tests__/regression/known-false-positives.test.ts +490 -0
  392. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +762 -0
  393. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
  394. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +0 -9
  395. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
  396. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
  397. package/src/__tests__/validation/run-validation.ts +7 -7
  398. package/src/ai-context/__tests__/manager.test.ts +193 -0
  399. package/src/ai-context/index.ts +15 -0
  400. package/src/ai-context/manager.ts +145 -0
  401. package/src/baseline/__tests__/diff.test.ts +261 -0
  402. package/src/baseline/__tests__/manager.test.ts +225 -0
  403. package/src/baseline/diff.ts +135 -0
  404. package/src/baseline/index.ts +29 -0
  405. package/src/baseline/manager.ts +230 -0
  406. package/src/baseline/types.ts +97 -0
  407. package/src/category-filter.ts +400 -0
  408. package/src/filtering/__tests__/pipeline.test.ts +134 -0
  409. package/src/filtering/context-adjustments.ts +111 -0
  410. package/src/filtering/index.ts +10 -0
  411. package/src/filtering/pipeline.ts +130 -0
  412. package/src/formatters/__tests__/ai-context.test.ts +254 -0
  413. package/src/formatters/ai-context.ts +302 -0
  414. package/src/formatters/cli-terminal.ts +444 -41
  415. package/src/formatters/github-comment.ts +82 -14
  416. package/src/formatters/ide/__tests__/ide.test.ts +319 -0
  417. package/src/formatters/ide/claude-code.ts +110 -0
  418. package/src/formatters/ide/cursor.ts +147 -0
  419. package/src/formatters/ide/index.ts +216 -0
  420. package/src/formatters/ide/windsurf.ts +135 -0
  421. package/src/formatters/index.ts +28 -0
  422. package/src/index.ts +506 -45
  423. package/src/layer1/comments.ts +3 -1
  424. package/src/layer1/config-audit.ts +74 -14
  425. package/src/layer1/config-mcp-audit.ts +278 -0
  426. package/src/layer1/entropy.ts +234 -1
  427. package/src/layer1/file-flags.ts +17 -6
  428. package/src/layer1/index.ts +29 -23
  429. package/src/layer1/patterns.ts +42 -4
  430. package/src/layer1/urls.ts +188 -14
  431. package/src/layer1/weak-crypto.ts +168 -16
  432. package/src/layer2/ai-agent-tools.ts +1043 -2
  433. package/src/layer2/ai-endpoint-protection.ts +19 -4
  434. package/src/layer2/ai-execution-sinks.ts +755 -29
  435. package/src/layer2/ai-fingerprinting.ts +33 -33
  436. package/src/layer2/ai-mcp-security.ts +933 -0
  437. package/src/layer2/ai-package-hallucination.ts +940 -0
  438. package/src/layer2/ai-prompt-hygiene.ts +898 -17
  439. package/src/layer2/ai-rag-safety.ts +467 -5
  440. package/src/layer2/ai-schema-validation.ts +4 -2
  441. package/src/layer2/auth-antipatterns.ts +235 -20
  442. package/src/layer2/byok-patterns.ts +9 -3
  443. package/src/layer2/dangerous-functions/child-process.ts +98 -0
  444. package/src/layer2/dangerous-functions/dom-xss.ts +292 -0
  445. package/src/layer2/dangerous-functions/index.ts +1533 -0
  446. package/src/layer2/dangerous-functions/json-parse.ts +385 -0
  447. package/src/layer2/dangerous-functions/math-random.ts +789 -0
  448. package/src/layer2/dangerous-functions/patterns.ts +176 -0
  449. package/src/layer2/dangerous-functions/request-validation.ts +145 -0
  450. package/src/layer2/dangerous-functions/utils/control-flow.ts +35 -0
  451. package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
  452. package/src/layer2/dangerous-functions/utils/index.ts +25 -0
  453. package/src/layer2/dangerous-functions/utils/schema-validation.ts +106 -0
  454. package/src/layer2/data-exposure.ts +18 -39
  455. package/src/layer2/framework-checks.ts +9 -2
  456. package/src/layer2/index.ts +124 -43
  457. package/src/layer2/logic-gates.ts +64 -22
  458. package/src/layer2/model-supply-chain.ts +531 -0
  459. package/src/layer2/risky-imports.ts +9 -2
  460. package/src/layer2/variables.ts +9 -2
  461. package/src/layer3/__tests__/osv-check.test.ts +384 -0
  462. package/src/layer3/anthropic/auto-dismiss.ts +223 -0
  463. package/src/layer3/anthropic/clients.ts +84 -0
  464. package/src/layer3/anthropic/index.ts +170 -0
  465. package/src/layer3/anthropic/prompts/index.ts +14 -0
  466. package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
  467. package/src/layer3/anthropic/prompts/validation.ts +419 -0
  468. package/src/layer3/anthropic/providers/anthropic.ts +310 -0
  469. package/src/layer3/anthropic/providers/index.ts +8 -0
  470. package/src/layer3/anthropic/providers/openai.ts +384 -0
  471. package/src/layer3/anthropic/request-builder.ts +150 -0
  472. package/src/layer3/anthropic/types.ts +148 -0
  473. package/src/layer3/anthropic/utils/index.ts +26 -0
  474. package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
  475. package/src/layer3/anthropic/utils/response-parser.ts +322 -0
  476. package/src/layer3/anthropic/utils/retry.ts +75 -0
  477. package/src/layer3/index.ts +18 -5
  478. package/src/layer3/osv-check.ts +420 -0
  479. package/src/modes/incremental.ts +1 -1
  480. package/src/rules/__tests__/framework-fixes.test.ts +689 -0
  481. package/src/rules/__tests__/metadata.test.ts +218 -0
  482. package/src/rules/framework-fixes.ts +470 -0
  483. package/src/rules/index.ts +21 -0
  484. package/src/rules/metadata.ts +831 -0
  485. package/src/suppression/__tests__/config-loader.test.ts +382 -0
  486. package/src/suppression/__tests__/hash.test.ts +166 -0
  487. package/src/suppression/__tests__/inline-parser.test.ts +212 -0
  488. package/src/suppression/__tests__/manager.test.ts +415 -0
  489. package/src/suppression/config-loader.ts +462 -0
  490. package/src/suppression/hash.ts +95 -0
  491. package/src/suppression/index.ts +51 -0
  492. package/src/suppression/inline-parser.ts +273 -0
  493. package/src/suppression/manager.ts +379 -0
  494. package/src/suppression/types.ts +174 -0
  495. package/src/tiers.ts +45 -9
  496. package/src/types.ts +212 -8
  497. package/src/utils/__tests__/code-analysis.test.ts +165 -0
  498. package/src/utils/__tests__/parsed-file.test.ts +124 -0
  499. package/src/utils/code-analysis.ts +179 -0
  500. package/src/utils/comment-analyzer.ts +249 -0
  501. package/src/utils/context-helpers.ts +421 -11
  502. package/src/utils/environment-context.ts +304 -0
  503. package/src/utils/intent-detector.ts +318 -0
  504. package/src/utils/parsed-file.ts +103 -0
  505. package/src/utils/route-hierarchy.ts +250 -0
  506. package/src/utils/schema-semantics.ts +233 -0
  507. package/dist/layer2/dangerous-functions.d.ts +0 -7
  508. package/dist/layer2/dangerous-functions.d.ts.map +0 -1
  509. package/dist/layer2/dangerous-functions.js +0 -1701
  510. package/dist/layer2/dangerous-functions.js.map +0 -1
  511. package/dist/layer3/anthropic.d.ts +0 -87
  512. package/dist/layer3/anthropic.d.ts.map +0 -1
  513. package/dist/layer3/anthropic.js +0 -1948
  514. package/dist/layer3/anthropic.js.map +0 -1
  515. package/dist/layer3/openai.d.ts +0 -25
  516. package/dist/layer3/openai.d.ts.map +0 -1
  517. package/dist/layer3/openai.js +0 -238
  518. package/dist/layer3/openai.js.map +0 -1
  519. package/src/layer2/dangerous-functions.ts +0 -1940
  520. package/src/layer3/anthropic.ts +0 -2257
@@ -0,0 +1,684 @@
1
+ "use strict";
2
+ /**
3
+ * Math.random() Detection
4
+ *
5
+ * Context-aware detection of Math.random() usage with intelligent severity
6
+ * classification based on usage context, variable names, and function intent.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isJitterOrBackoffContext = isJitterOrBackoffContext;
10
+ exports.isReactKeyPattern = isReactKeyPattern;
11
+ exports.isCosmeticMathRandom = isCosmeticMathRandom;
12
+ exports.classifyFunctionIntent = classifyFunctionIntent;
13
+ exports.analyzeToStringPattern = analyzeToStringPattern;
14
+ exports.extractMathRandomVariableName = extractMathRandomVariableName;
15
+ exports.classifyVariableNameRisk = classifyVariableNameRisk;
16
+ exports.analyzeMathRandomContext = analyzeMathRandomContext;
17
+ exports.isAnimationFile = isAnimationFile;
18
+ exports.isAnimationCoordinateUsage = isAnimationCoordinateUsage;
19
+ exports.isTemplatePlaceholderGenerator = isTemplatePlaceholderGenerator;
20
+ exports.shouldSkipMathRandom = shouldSkipMathRandom;
21
+ const context_helpers_1 = require("../../utils/context-helpers");
22
+ const control_flow_1 = require("./utils/control-flow");
23
+ /**
24
+ * Check if Math.random() is used in a jitter/backoff/retry context
25
+ * These are legitimate uses of Math.random() for network resilience,
26
+ * not security-sensitive randomness.
27
+ *
28
+ * Examples:
29
+ * const delay = baseDelay + Math.random() * jitter
30
+ * setTimeout(retry, delay * Math.random())
31
+ * await sleep(backoff * (1 + Math.random() * 0.1))
32
+ *
33
+ * @param content - Full file content
34
+ * @param lineNumber - The 0-indexed line number where Math.random() was found
35
+ */
36
+ function isJitterOrBackoffContext(content, lineNumber, lines) {
37
+ const _lines = lines ?? content.split('\n');
38
+ const start = Math.max(0, lineNumber - 10);
39
+ const end = Math.min(_lines.length, lineNumber + 5);
40
+ const context = _lines.slice(start, end).join('\n');
41
+ // Patterns indicating jitter/backoff/retry context
42
+ const jitterPatterns = [
43
+ // Direct keyword matches
44
+ /\b(jitter|backoff|retry|retries|exponential)\b/i,
45
+ // Delay/timeout with random
46
+ /setTimeout.*Math\.random/i,
47
+ /setInterval.*Math\.random/i,
48
+ /sleep.*Math\.random/i,
49
+ /await.*delay.*Math\.random/i,
50
+ // Common backoff patterns
51
+ /\* Math\.random\(\).*delay/i,
52
+ /delay\s*\*\s*Math\.random/i,
53
+ /Math\.random\(\)\s*\*\s*\d+.*delay/i,
54
+ // Retry-related function names
55
+ /function\s+(retry|withRetry|backoff|withBackoff|exponentialBackoff)/i,
56
+ // Common retry library patterns
57
+ /retryPolicy|retryConfig|retryOptions|maxRetries|retryCount/i,
58
+ // Network resilience patterns
59
+ /\b(throttle|debounce|rateLimit)\b.*Math\.random/i,
60
+ // Sampling/probability for non-security uses
61
+ /sampleRate|samplingRate|probability\s*[<>]=?\s*Math\.random/i,
62
+ ];
63
+ return jitterPatterns.some(p => p.test(context));
64
+ }
65
+ /**
66
+ * Check if Math.random() is used in a React key prop context
67
+ * This is a common pattern to force re-renders, not a security issue.
68
+ *
69
+ * Examples:
70
+ * key={Math.random()}
71
+ * key={`prefix-${Math.random()}`}
72
+ * key={Math.random().toString()}
73
+ *
74
+ * @param lineContent - The line of code to check
75
+ * @param filePath - The file path (only check JSX/TSX files)
76
+ */
77
+ function isReactKeyPattern(lineContent, filePath) {
78
+ // Only check in JSX/TSX files
79
+ if (!/\.[jt]sx$/.test(filePath)) {
80
+ return false;
81
+ }
82
+ // Pattern: key={...Math.random()...}
83
+ // Matches:
84
+ // key={Math.random()}
85
+ // key={`foo-${Math.random()}`}
86
+ // key={Math.random().toString()}
87
+ // key={`${Math.random()}-bar`}
88
+ // key={something + Math.random()}
89
+ const keyPattern = /key\s*=\s*\{[^}]*Math\.random\(\)/;
90
+ return keyPattern.test(lineContent);
91
+ }
92
+ /**
93
+ * Check if Math.random() is used for cosmetic/UI purposes (not security)
94
+ * Cosmetic uses: CSS values, animations, UI variations, demo data
95
+ * Security uses: tokens, IDs, cryptographic operations, session management
96
+ */
97
+ function isCosmeticMathRandom(lineContent, content, lineNumber, lines) {
98
+ const _lines = lines ?? content.split('\n');
99
+ // Check the line itself for cosmetic indicators
100
+ const cosmeticLinePatterns = [
101
+ // CSS/style values
102
+ /['"`]\s*\$\{.*Math\.random.*\}\s*%['"`]/, // `${Math.random() * 40 + 50}%`
103
+ /Math\.random.*\s*\+\s*['"`]%['"`]/, // Math.random() * 40 + '%'
104
+ /Math\.random.*\)\s*\*\s*\d+\s*\+\s*\d+\s*\}\s*%/, // }) * 40 + 50}%
105
+ /return\s+`.*Math\.random.*%`/, // return `${...}%`
106
+ /width:\s*['"`].*Math\.random/i, // width: `${Math.random()...}%`
107
+ /height:\s*['"`].*Math\.random/i, // height: `${Math.random()...}%`
108
+ /opacity:\s*['"`]?.*Math\.random/i, // opacity: Math.random()
109
+ /transform:\s*['"`]?.*Math\.random/i, // transform: translate(...)
110
+ /rotate\(.*Math\.random/i, // rotate(Math.random() * 360)
111
+ /translate\(.*Math\.random/i, // translate(Math.random() * 100)
112
+ /scale\(.*Math\.random/i, // scale(Math.random() * 2)
113
+ // Color/animation values
114
+ /rgba?\(.*Math\.random/i, // rgb(Math.random() * 255, ...)
115
+ /hsl\(.*Math\.random/i, // hsl(Math.random() * 360, ...)
116
+ /Math\.random.*\*\s*360/, // Math.random() * 360 (degrees/hue)
117
+ /Math\.random.*\*\s*255/, // Math.random() * 255 (RGB values)
118
+ // Array/list randomization for UI
119
+ /Math\.floor\(Math\.random.*\.length\)/, // Math.floor(Math.random() * array.length)
120
+ /\[Math\.floor\(Math\.random/, // array[Math.floor(Math.random()...)]
121
+ // Demo/placeholder data
122
+ /Math\.random.*\*\s*\d+\s*\+\s*\d+.*\bpx\b/i, // Math.random() * 100 + 50 + 'px'
123
+ /Math\.random.*\*\s*\d+\s*\+\s*\d+.*\bms\b/i, // Math.random() * 1000 + 500 + 'ms'
124
+ /Math\.random.*\*\s*\d+\s*\+\s*\d+.*\bs\b/i, // Math.random() * 5 + 2 + 's'
125
+ // NOTE: toString patterns removed - now handled by analyzeToStringPattern()
126
+ // which provides more granular severity classification (info/low/medium/high)
127
+ // based on truncation length and context
128
+ ];
129
+ if (cosmeticLinePatterns.some(p => p.test(lineContent))) {
130
+ return true;
131
+ }
132
+ // Check surrounding context (5 lines before and after)
133
+ const contextStart = Math.max(0, lineNumber - 5);
134
+ const contextEnd = Math.min(_lines.length, lineNumber + 5);
135
+ const context = _lines.slice(contextStart, contextEnd).join('\n');
136
+ // Context indicators of cosmetic use
137
+ const cosmeticContextPatterns = [
138
+ // UI component files - REMOVED, let severity classification handle these
139
+ // Style-related variables/functions
140
+ /\b(style|styles|css|className|animation|transition)/i,
141
+ /\b(width|height|opacity|color|transform|rotate|scale|translate)/i,
142
+ // Demo/example data
143
+ /\b(demo|example|placeholder|mock|fake|sample|test)Data/i,
144
+ /\b(random|shuffle|pick|choose).*\b(color|item|element|option)/i,
145
+ // Animation/timing
146
+ /setTimeout.*Math\.random/i,
147
+ /setInterval.*Math\.random/i,
148
+ /delay.*Math\.random/i,
149
+ /duration.*Math\.random/i,
150
+ // UI state variations
151
+ /\b(variant|theme|layout|position).*Math\.random/i,
152
+ // NOTE: Removed UI identifier patterns (key, id, tempId, etc.) - these should be
153
+ // classified with info/low severity by the severity classification logic, not skipped entirely
154
+ ];
155
+ if (cosmeticContextPatterns.some(p => p.test(context))) {
156
+ return true;
157
+ }
158
+ // Security-sensitive patterns that override cosmetic detection
159
+ const securityPatterns = [
160
+ /\b(token|secret|key|password|credential|signature)/i,
161
+ /\b(auth|crypto|encrypt|decrypt|hash)/i,
162
+ /\b(session|nonce|salt)\b/i,
163
+ /Math\.random.*\*\s*1e\d+/, // Math.random() * 1e16 (large numbers for IDs)
164
+ ];
165
+ if (securityPatterns.some(p => p.test(lineContent) || p.test(context))) {
166
+ return false; // Not cosmetic - this is security-sensitive
167
+ }
168
+ // Check for .toString(36) WITHOUT substring/slice/substr (security token pattern)
169
+ // If it has substring/slice/substr, it's already caught by cosmeticLinePatterns above
170
+ const hasToString36WithoutTruncation = /Math\.random\(\)\.toString\(36\)/.test(lineContent) &&
171
+ !/\.(substring|substr|slice)\(/.test(lineContent);
172
+ const hasToString16WithoutTruncation = /Math\.random\(\)\.toString\(16\)/.test(lineContent) &&
173
+ !/\.(substring|substr|slice)\(/.test(lineContent);
174
+ if (hasToString36WithoutTruncation || hasToString16WithoutTruncation) {
175
+ return false; // Full-length toString() without truncation - likely security token
176
+ }
177
+ return false; // Default to flagging if unclear
178
+ }
179
+ /**
180
+ * Classify function intent based on function name
181
+ * Used to determine if Math.random() usage is legitimate
182
+ */
183
+ function classifyFunctionIntent(functionName) {
184
+ if (!functionName)
185
+ return 'unknown';
186
+ const lower = functionName.toLowerCase();
187
+ // UUID/ID generation (UI correlation, not security)
188
+ // Check for specific UUID patterns and generic ID generation functions
189
+ const uuidPatterns = ['uuid', 'guid', 'uniqueid', 'correlationid', 'tempid', 'temp_id'];
190
+ // Match patterns like generateId, generateTempId, createId, etc.
191
+ const idGenerationPatterns = /^(generate|create|make|build)(\w*)?(id|identifier)$/i;
192
+ if (uuidPatterns.some(p => lower.includes(p)) ||
193
+ idGenerationPatterns.test(lower)) {
194
+ return 'uuid';
195
+ }
196
+ // CAPTCHA/puzzle generation (legitimate non-security)
197
+ const captchaPatterns = ['captcha', 'puzzle', 'mathproblem'];
198
+ // Also check for 'challenge' but only if not in security context
199
+ if (captchaPatterns.some(p => lower.includes(p)))
200
+ return 'captcha';
201
+ if (lower.includes('challenge') && !lower.includes('auth'))
202
+ return 'captcha';
203
+ // Demo/seed/fixture data
204
+ const demoPatterns = ['seed', 'fixture', 'demo', 'mock', 'fake'];
205
+ if (demoPatterns.some(p => lower.includes(p)))
206
+ return 'demo';
207
+ // Security-sensitive (check this after id generation to avoid false positives)
208
+ const securityPatterns = [
209
+ 'token',
210
+ 'secret',
211
+ 'key',
212
+ 'password',
213
+ 'credential',
214
+ 'signature',
215
+ ];
216
+ // Also match generate/create + security term combinations
217
+ const securityFunctionPattern = /^(generate|create|make)(token|secret|key|session|password|credential)/i;
218
+ if (securityPatterns.some(p => lower.includes(p)) ||
219
+ securityFunctionPattern.test(lower)) {
220
+ return 'security';
221
+ }
222
+ return 'unknown';
223
+ }
224
+ /**
225
+ * Analyze toString() pattern in Math.random() usage
226
+ * Determines intent based on base and truncation length
227
+ */
228
+ function analyzeToStringPattern(lineContent) {
229
+ const toString36Match = lineContent.match(/Math\.random\(\)\.toString\(36\)/);
230
+ const toString16Match = lineContent.match(/Math\.random\(\)\.toString\(16\)/);
231
+ if (!toString36Match && !toString16Match) {
232
+ return {
233
+ hasToString: false,
234
+ base: null,
235
+ isTruncated: false,
236
+ truncationLength: null,
237
+ intent: 'unknown',
238
+ };
239
+ }
240
+ const base = toString36Match ? 36 : 16;
241
+ // Check for truncation methods
242
+ const substringMatch = lineContent.match(/\.substring\((\d+)(?:,\s*(\d+))?\)/);
243
+ const sliceMatch = lineContent.match(/\.slice\((\d+)(?:,\s*(\d+))?\)/);
244
+ const substrMatch = lineContent.match(/\.substr\((\d+)(?:,\s*(\d+))?\)/);
245
+ const truncMatch = substringMatch || sliceMatch || substrMatch;
246
+ if (!truncMatch) {
247
+ return {
248
+ hasToString: true,
249
+ base,
250
+ isTruncated: false,
251
+ truncationLength: null,
252
+ intent: 'full-token',
253
+ };
254
+ }
255
+ // Calculate truncation length
256
+ const start = parseInt(truncMatch[1]);
257
+ const end = truncMatch[2] ? parseInt(truncMatch[2]) : null;
258
+ // If no end specified (e.g., .substring(7)), the result is from start to end of string
259
+ // Math.random().toString(36) produces ~11 chars like "0.abc123def"
260
+ // .substring(2) gives ~9 chars, .substring(7) gives ~4 chars
261
+ // Estimate remaining length: ~11 - start
262
+ const estimatedFullLength = 11;
263
+ const length = end ? end - start : (start >= 2 ? estimatedFullLength - start : null);
264
+ // Classify intent by length
265
+ // Short (2-9 chars): UI correlation IDs, React keys
266
+ // Medium (10-15 chars): Business IDs, order numbers
267
+ if (length && length <= 9) {
268
+ return {
269
+ hasToString: true,
270
+ base,
271
+ isTruncated: true,
272
+ truncationLength: length,
273
+ intent: 'short-ui-id',
274
+ };
275
+ }
276
+ else if (length && length <= 15) {
277
+ return {
278
+ hasToString: true,
279
+ base,
280
+ isTruncated: true,
281
+ truncationLength: length,
282
+ intent: 'business-id',
283
+ };
284
+ }
285
+ else {
286
+ return {
287
+ hasToString: true,
288
+ base,
289
+ isTruncated: true,
290
+ truncationLength: length,
291
+ intent: 'business-id',
292
+ };
293
+ }
294
+ }
295
+ /**
296
+ * Extract variable name from Math.random() assignment
297
+ * Examples:
298
+ * const token = Math.random() -> "token"
299
+ * const businessId = Math.random().toString(36) -> "businessId"
300
+ * return Math.random() -> null (no variable)
301
+ */
302
+ function extractMathRandomVariableName(lineContent) {
303
+ // const/let/var variableName = Math.random...
304
+ const assignmentMatch = lineContent.match(/(?:const|let|var)\s+(\w+)\s*=.*Math\.random/);
305
+ if (assignmentMatch)
306
+ return assignmentMatch[1];
307
+ // object.property = Math.random...
308
+ const propertyMatch = lineContent.match(/(\w+)\s*[:=]\s*Math\.random/);
309
+ if (propertyMatch)
310
+ return propertyMatch[1];
311
+ // function parameter default: functionName(param = Math.random())
312
+ const paramMatch = lineContent.match(/(\w+)\s*=\s*Math\.random/);
313
+ if (paramMatch)
314
+ return paramMatch[1];
315
+ return null; // No variable name found
316
+ }
317
+ /**
318
+ * Classify variable name security risk based on naming patterns
319
+ *
320
+ * High risk: Security-sensitive names (token, secret, key, etc.)
321
+ * Medium risk: Unclear context
322
+ * Low risk: Non-security names (id, businessId, orderId, etc.)
323
+ */
324
+ function classifyVariableNameRisk(varName) {
325
+ if (!varName)
326
+ return 'medium'; // Unknown usage, moderate risk
327
+ const lower = varName.toLowerCase();
328
+ // High risk: security-sensitive variable names
329
+ // Note: 'key' alone is NOT included - it often means React key, not crypto key
330
+ // Instead, we match specific security key patterns
331
+ const highRiskPatterns = [
332
+ 'token',
333
+ 'secret',
334
+ 'password',
335
+ 'credential',
336
+ 'signature',
337
+ 'salt',
338
+ 'nonce',
339
+ 'session',
340
+ 'csrf',
341
+ 'auth',
342
+ 'apikey',
343
+ 'secretkey',
344
+ 'privatekey',
345
+ 'encryptionkey',
346
+ 'accesstoken',
347
+ 'refreshtoken',
348
+ 'jwt',
349
+ 'bearer',
350
+ 'oauth',
351
+ 'sessionid',
352
+ ];
353
+ if (highRiskPatterns.some(p => lower.includes(p))) {
354
+ return 'high';
355
+ }
356
+ // Low risk: clearly non-security contexts
357
+ const lowRiskPatterns = [
358
+ // Business identifiers
359
+ 'id',
360
+ 'uid',
361
+ 'guid',
362
+ 'business',
363
+ 'order',
364
+ 'invoice',
365
+ 'customer',
366
+ 'user',
367
+ 'product',
368
+ 'item',
369
+ 'transaction',
370
+ 'request',
371
+ 'reference',
372
+ 'tracking',
373
+ 'confirmation',
374
+ // Test/demo data
375
+ 'test',
376
+ 'mock',
377
+ 'demo',
378
+ 'sample',
379
+ 'example',
380
+ 'fixture',
381
+ 'random',
382
+ 'temp',
383
+ 'temporary',
384
+ 'generated',
385
+ 'dummy',
386
+ // UI identifiers (checked after high-risk, so 'apikey' etc. already caught)
387
+ 'key',
388
+ 'toast',
389
+ 'notification',
390
+ 'element',
391
+ 'component',
392
+ 'widget',
393
+ 'modal',
394
+ 'dialog',
395
+ 'popup',
396
+ 'unique',
397
+ 'react',
398
+ // Non-security randomness usage (backoff/sampling/experiments)
399
+ 'jitter',
400
+ 'retry',
401
+ 'backoff',
402
+ 'delay',
403
+ 'timeout',
404
+ 'latency',
405
+ 'sample',
406
+ 'sampling',
407
+ 'probability',
408
+ 'chance',
409
+ 'rollout',
410
+ 'experiment',
411
+ 'abtest',
412
+ 'cohort',
413
+ 'bucket',
414
+ 'variant',
415
+ ];
416
+ if (lowRiskPatterns.some(p => lower.includes(p))) {
417
+ return 'low';
418
+ }
419
+ return 'medium'; // Unclear context, moderate risk
420
+ }
421
+ /**
422
+ * Analyze surrounding code context for security signals
423
+ * Returns context type and description for severity classification
424
+ */
425
+ function analyzeMathRandomContext(content, filePath, lineNumber, lines) {
426
+ const _lines = lines ?? content.split('\n');
427
+ const start = Math.max(0, lineNumber - 10);
428
+ const end = Math.min(_lines.length, lineNumber + 5);
429
+ const context = _lines.slice(start, end).join('\n');
430
+ // Security context indicators (functions, imports, comments)
431
+ const securityPatterns = [
432
+ /\b(generate|create)(Token|Secret|Key|Password|Nonce|Salt|Session|Signature)/i,
433
+ /\b(auth|crypto|encrypt|decrypt|hash|sign)\b/i,
434
+ /function\s+.*(?:token|secret|key|auth|crypto)/i,
435
+ /\bimport.*(?:crypto|jsonwebtoken|bcrypt|argon2|jose)/i,
436
+ /\/\*.*(?:security|authentication|cryptograph|authorization)/i,
437
+ /\/\/.*(?:security|auth|crypto|token|secret)/i,
438
+ ];
439
+ const inSecurityContext = securityPatterns.some(p => p.test(context));
440
+ // Test context
441
+ const testFilePatterns = /\.(test|spec)\.(ts|tsx|js|jsx)$/i;
442
+ const testContextPatterns = [
443
+ /\b(describe|it|test|expect|mock|jest|vitest|mocha|chai)\b/i,
444
+ /\b(beforeEach|afterEach|beforeAll|afterAll)\b/i,
445
+ /\b(fixture|stub|spy)\b/i,
446
+ ];
447
+ const inTestContext = testFilePatterns.test(filePath) ||
448
+ testContextPatterns.some(p => p.test(context));
449
+ // UI/cosmetic context (reuse existing logic)
450
+ const lineContent = _lines[lineNumber];
451
+ const inUIContext = isCosmeticMathRandom(lineContent, content, lineNumber, _lines);
452
+ // Business logic context (non-security ID generation)
453
+ // Note: UUID/CAPTCHA patterns excluded - handled by functionIntent classification
454
+ const businessLogicPatterns = [
455
+ /\b(business|order|invoice|customer|product|transaction)Id\b/i,
456
+ /\b(reference|tracking|confirmation)Number\b/i,
457
+ /\b(backoff|retry|jitter|delay|timeout|latency)\b/i,
458
+ /\b(sample|sampling|probability|chance|rollout|experiment|abtest|cohort|bucket|variant)\b/i,
459
+ // Load balancing and selection patterns
460
+ /mode\s*===?\s*['"]random['"]/i, // mode === 'random'
461
+ /\.\w*index\s*%/i, // round-robin patterns
462
+ /keys?\[.*Math\.random/i, // keys[Math.floor(Math.random() * keys.length)]
463
+ /\[\s*Math\.floor\s*\(\s*Math\.random/i, // array[Math.floor(Math.random()...)]
464
+ /shuffle/i, // shuffle functions
465
+ /pickRandom/i, // pickRandom helpers
466
+ /randomElement/i, // randomElement helpers
467
+ ];
468
+ const inBusinessLogicContext = businessLogicPatterns.some(p => p.test(context)) && !inSecurityContext;
469
+ // Determine context description
470
+ let contextDescription = 'unknown context';
471
+ if (inSecurityContext) {
472
+ contextDescription = 'security-sensitive function';
473
+ }
474
+ else if (inTestContext) {
475
+ contextDescription = 'test/mock data generation';
476
+ }
477
+ else if (inUIContext) {
478
+ contextDescription = 'UI/cosmetic usage';
479
+ }
480
+ else if (inBusinessLogicContext) {
481
+ contextDescription = 'non-security usage';
482
+ }
483
+ return {
484
+ inSecurityContext,
485
+ inTestContext,
486
+ inUIContext,
487
+ inBusinessLogicContext,
488
+ contextDescription,
489
+ };
490
+ }
491
+ /**
492
+ * Check if file is an animation/motion component based on file name
493
+ * Files with animation-related names typically use Math.random for visual effects
494
+ */
495
+ function isAnimationFile(filePath) {
496
+ const animationPatterns = [
497
+ /animated[-_]/i, // animated-document-scanner.tsx
498
+ /[-_]animation/i, // document-animation.tsx
499
+ /motion[-_]/i, // motion-component.tsx
500
+ /[-_]motion/i, // scroll-motion.tsx
501
+ /particles?[-_]/i, // particles-background.tsx
502
+ /confetti/i, // confetti.tsx
503
+ /[-_]effect/i, // hover-effect.tsx
504
+ /transition[-_]/i, // transition-wrapper.tsx
505
+ /visual[-_]/i, // visual-effects.tsx
506
+ /canvas[-_]/i, // canvas-animation.tsx
507
+ ];
508
+ return animationPatterns.some(p => p.test(filePath));
509
+ }
510
+ /**
511
+ * Check if Math.random() is used for animation/motion coordinates
512
+ * Common in animation libraries like framer-motion, react-spring, Three.js, etc.
513
+ */
514
+ function isAnimationCoordinateUsage(lineContent, context) {
515
+ // Object property assignments for coordinates
516
+ const coordinatePatterns = [
517
+ /\bx:\s*Math\.random/i, // x: Math.random()
518
+ /\by:\s*Math\.random/i, // y: Math.random()
519
+ /\bz:\s*Math\.random/i, // z: Math.random()
520
+ /\bleft:\s*.*Math\.random/i, // left: Math.random()
521
+ /\btop:\s*.*Math\.random/i, // top: Math.random()
522
+ /\bright:\s*.*Math\.random/i, // right: Math.random()
523
+ /\bbottom:\s*.*Math\.random/i, // bottom: Math.random()
524
+ /\brotation:\s*.*Math\.random/i, // rotation: Math.random()
525
+ /\brotateX:\s*.*Math\.random/i, // rotateX: Math.random()
526
+ /\brotateY:\s*.*Math\.random/i, // rotateY: Math.random()
527
+ /\brotateZ:\s*.*Math\.random/i, // rotateZ: Math.random()
528
+ /\bscaleX?:\s*.*Math\.random/i, // scale/scaleX: Math.random()
529
+ /\bscaleY:\s*.*Math\.random/i, // scaleY: Math.random()
530
+ /\bopacity:\s*.*Math\.random/i, // opacity: Math.random()
531
+ /\bduration:\s*.*Math\.random/i, // duration: Math.random()
532
+ /\bdelay:\s*.*Math\.random/i, // delay: Math.random()
533
+ // 3D/Three.js specific patterns
534
+ /\boffset\s*=.*Math\.random/i, // offset = Math.random()
535
+ /useMemo\s*\(\s*\(\s*\)\s*=>\s*Math\.random/i, // useMemo(() => Math.random(), [])
536
+ /\bphase\s*[:=].*Math\.random/i, // phase: Math.random() or phase = Math.random()
537
+ /\bspeed\s*[:=].*Math\.random/i, // speed: Math.random()
538
+ /\bangle\s*[:=].*Math\.random/i, // angle: Math.random()
539
+ ];
540
+ if (coordinatePatterns.some(p => p.test(lineContent))) {
541
+ return true;
542
+ }
543
+ // Motion/animation library context patterns
544
+ const motionLibraryPatterns = [
545
+ /framer-motion/i,
546
+ /react-spring/i,
547
+ /react-motion/i,
548
+ /gsap/i,
549
+ /animejs/i,
550
+ /popmotion/i,
551
+ /motion\.div/i,
552
+ /useSpring/i,
553
+ /useAnimation/i,
554
+ /animate\s*\(/i,
555
+ /keyframes/i,
556
+ // Three.js and React Three Fiber patterns
557
+ /three/i,
558
+ /useFrame/i,
559
+ /@react-three/i,
560
+ /Canvas/i, // React Three Fiber Canvas
561
+ /mesh/i, // Three.js mesh
562
+ /geometry/i, // Three.js geometry
563
+ /material/i, // Three.js material
564
+ ];
565
+ return motionLibraryPatterns.some(p => p.test(context));
566
+ }
567
+ /**
568
+ * Check if Math.random() is used in a template placeholder generator context
569
+ * Template systems often use random generators for placeholder values
570
+ *
571
+ * Examples:
572
+ * const templates = { random: () => Math.random().toString() }
573
+ * random_hex: () => Math.random().toString(16)
574
+ * {{random}} placeholder generation
575
+ */
576
+ function isTemplatePlaceholderGenerator(line, content, lineNumber, lines) {
577
+ const _lines = lines ?? content.split('\n');
578
+ const contextStart = Math.max(0, lineNumber - 10);
579
+ const contextEnd = Math.min(_lines.length, lineNumber + 5);
580
+ const context = _lines.slice(contextStart, contextEnd).join('\n');
581
+ const templatePatterns = [
582
+ /\{\{random\w*\}\}/i, // {{random}}, {{random_hex}}, etc.
583
+ /random:\s*\(\s*\)\s*=>\s*Math\.random/i, // random: () => Math.random()
584
+ /random_\w+:\s*\(\s*\)\s*=>/i, // random_int: () => ...
585
+ /placeholder.*random/i, // placeholder context
586
+ /templates?\s*[=:]\s*\{/i, // templates = { or template: {
587
+ /generatePlaceholder/i, // generatePlaceholder function
588
+ /placeholder\s*[:=]/i, // placeholder: or placeholder =
589
+ ];
590
+ return templatePatterns.some(p => p.test(context) || p.test(line));
591
+ }
592
+ /**
593
+ * Check if Math.random() should be skipped entirely
594
+ * Returns true for seed files, test fixtures, captcha/puzzle, uuid, React keys, jitter/backoff, and pure cosmetic uses
595
+ */
596
+ function shouldSkipMathRandom(content, filePath, lineNumber, options) {
597
+ // Seed/data generation files - skip entirely
598
+ if ((0, context_helpers_1.isSeedOrDataGenFile)(filePath)) {
599
+ return true;
600
+ }
601
+ // Animation/motion component files - skip entirely
602
+ // These use Math.random for visual effects, not security
603
+ if (isAnimationFile(filePath)) {
604
+ return true;
605
+ }
606
+ // Educational/intentional vulnerability files - skip entirely
607
+ // These include OWASP Juice Shop, intentionally-vulnerable examples, etc.
608
+ if ((0, context_helpers_1.isEducationalVulnerabilityFile)(filePath)) {
609
+ return true;
610
+ }
611
+ // Check for React key pattern - this is a common pattern to force re-renders
612
+ // It's not a security issue, just a way to reset component state
613
+ const lines = options?.parsed?.lines ?? content.split('\n');
614
+ const lineContent = lines[lineNumber] || '';
615
+ if (isReactKeyPattern(lineContent, filePath)) {
616
+ return true;
617
+ }
618
+ // Template placeholder generators - skip entirely
619
+ // These generate placeholder values for templates, not security tokens
620
+ if (isTemplatePlaceholderGenerator(lineContent, content, lineNumber, lines)) {
621
+ return true;
622
+ }
623
+ // Jitter/backoff/retry patterns - legitimate non-security use of randomness
624
+ // Used for network resilience, rate limiting, exponential backoff, etc.
625
+ if (isJitterOrBackoffContext(content, lineNumber, lines)) {
626
+ return true;
627
+ }
628
+ // Test files with test fixture patterns
629
+ if ((0, context_helpers_1.isTestOrMockFile)(filePath)) {
630
+ const line = lines[lineNumber];
631
+ // If in a test file and generating test data, skip
632
+ if (/\b(mock|fake|fixture|test)Data/i.test(line) ||
633
+ /\b(it|test|describe)\s*\(/.test(line)) {
634
+ return true;
635
+ }
636
+ }
637
+ // Pure cosmetic usage (CSS values, animations)
638
+ if (isCosmeticMathRandom(lineContent, content, lineNumber, lines)) {
639
+ // Additional check: if this is for animation/style, truly skip
640
+ const pureStylePatterns = [
641
+ /\.style\./,
642
+ /animation/i,
643
+ /transform/i,
644
+ /opacity/i,
645
+ /\brgb/i,
646
+ /\bhsl/i,
647
+ ];
648
+ if (pureStylePatterns.some(p => p.test(lineContent))) {
649
+ return true;
650
+ }
651
+ }
652
+ // Animation coordinate usage (x, y, rotation, etc.)
653
+ // Get surrounding context for animation library detection
654
+ const contextStart = Math.max(0, lineNumber - 15);
655
+ const contextEnd = Math.min(lines.length, lineNumber + 5);
656
+ const animContext = lines.slice(contextStart, contextEnd).join('\n');
657
+ if (isAnimationCoordinateUsage(lineContent, animContext)) {
658
+ return true;
659
+ }
660
+ // Check function context for demo/seed/captcha/uuid functions
661
+ const functionName = (0, control_flow_1.extractFunctionContext)(content, lineNumber);
662
+ const functionIntent = classifyFunctionIntent(functionName);
663
+ // Skip demo, captcha, and uuid functions entirely - these are legitimate uses
664
+ if (functionIntent === 'demo' || functionIntent === 'captcha' || functionIntent === 'uuid') {
665
+ return true;
666
+ }
667
+ // Check for fallback pattern: crypto.randomUUID?.() ?? Math.random()
668
+ // When a secure primary method is used with Math.random as fallback,
669
+ // the code is safe (Math.random only runs in environments without crypto API)
670
+ const prevLines = lines.slice(Math.max(0, lineNumber - 2), lineNumber + 1).join(' ');
671
+ const multiLineFallbackPatterns = [
672
+ /crypto\??\.?\s*randomUUID\??\.?\s*\(\s*\)\s*\?\?/i, // crypto.randomUUID() ??
673
+ /globalThis\.crypto\??\.?\s*randomUUID\??\.?\s*\(/i, // globalThis.crypto?.randomUUID?.()
674
+ /window\.crypto\??\.?\s*randomUUID\??\.?\s*\(/i, // window.crypto?.randomUUID?.()
675
+ /\?\.\s*randomUUID\??\.?\s*\(\s*\)\s*\?\?/i, // ?.randomUUID?.() ??
676
+ /crypto\??\.?\s*getRandomValues\s*\(/i, // crypto.getRandomValues()
677
+ /randomUUID\??\.?\s*\(\s*\)\s*\?\?/i, // randomUUID?.() ?? (generic)
678
+ ];
679
+ if (multiLineFallbackPatterns.some(p => p.test(prevLines))) {
680
+ return true; // Skip - Math.random is only a fallback for missing crypto API
681
+ }
682
+ return false;
683
+ }
684
+ //# sourceMappingURL=math-random.js.map