@oculum/scanner 1.0.12 → 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 (961) hide show
  1. package/dist/detect/ai-code/agent-tools.d.ts +22 -0
  2. package/dist/detect/ai-code/agent-tools.d.ts.map +1 -0
  3. package/dist/detect/ai-code/agent-tools.js +1509 -0
  4. package/dist/detect/ai-code/agent-tools.js.map +1 -0
  5. package/dist/detect/ai-code/byok-patterns.d.ts +15 -0
  6. package/dist/detect/ai-code/byok-patterns.d.ts.map +1 -0
  7. package/dist/detect/ai-code/byok-patterns.js +313 -0
  8. package/dist/detect/ai-code/byok-patterns.js.map +1 -0
  9. package/dist/detect/ai-code/endpoint-protection.d.ts +38 -0
  10. package/dist/detect/ai-code/endpoint-protection.d.ts.map +1 -0
  11. package/dist/detect/ai-code/endpoint-protection.js +349 -0
  12. package/dist/detect/ai-code/endpoint-protection.js.map +1 -0
  13. package/dist/detect/ai-code/execution-sinks.d.ts +21 -0
  14. package/dist/detect/ai-code/execution-sinks.d.ts.map +1 -0
  15. package/dist/detect/ai-code/execution-sinks.js +1158 -0
  16. package/dist/detect/ai-code/execution-sinks.js.map +1 -0
  17. package/dist/detect/ai-code/fingerprinting.d.ts +10 -0
  18. package/dist/detect/ai-code/fingerprinting.d.ts.map +1 -0
  19. package/dist/detect/ai-code/fingerprinting.js +665 -0
  20. package/dist/detect/ai-code/fingerprinting.js.map +1 -0
  21. package/dist/detect/ai-code/index.d.ts +12 -0
  22. package/dist/detect/ai-code/index.d.ts.map +1 -0
  23. package/dist/detect/ai-code/index.js +26 -0
  24. package/dist/detect/ai-code/index.js.map +1 -0
  25. package/dist/detect/ai-code/mcp-security.d.ts +20 -0
  26. package/dist/detect/ai-code/mcp-security.d.ts.map +1 -0
  27. package/dist/detect/ai-code/mcp-security.js +880 -0
  28. package/dist/detect/ai-code/mcp-security.js.map +1 -0
  29. package/dist/detect/ai-code/model-supply-chain.d.ts +23 -0
  30. package/dist/detect/ai-code/model-supply-chain.d.ts.map +1 -0
  31. package/dist/detect/ai-code/model-supply-chain.js +447 -0
  32. package/dist/detect/ai-code/model-supply-chain.js.map +1 -0
  33. package/dist/detect/ai-code/package-hallucination.d.ts +22 -0
  34. package/dist/detect/ai-code/package-hallucination.d.ts.map +1 -0
  35. package/dist/detect/ai-code/package-hallucination.js +841 -0
  36. package/dist/detect/ai-code/package-hallucination.js.map +1 -0
  37. package/dist/detect/ai-code/prompt-hygiene.d.ts +22 -0
  38. package/dist/detect/ai-code/prompt-hygiene.d.ts.map +1 -0
  39. package/dist/detect/ai-code/prompt-hygiene.js +1177 -0
  40. package/dist/detect/ai-code/prompt-hygiene.js.map +1 -0
  41. package/dist/detect/ai-code/rag-safety.d.ts +24 -0
  42. package/dist/detect/ai-code/rag-safety.d.ts.map +1 -0
  43. package/dist/detect/ai-code/rag-safety.js +913 -0
  44. package/dist/detect/ai-code/rag-safety.js.map +1 -0
  45. package/dist/detect/ai-code/schema-validation.d.ts +28 -0
  46. package/dist/detect/ai-code/schema-validation.d.ts.map +1 -0
  47. package/dist/detect/ai-code/schema-validation.js +378 -0
  48. package/dist/detect/ai-code/schema-validation.js.map +1 -0
  49. package/dist/detect/config/agent-skill-injection.d.ts +27 -0
  50. package/dist/detect/config/agent-skill-injection.d.ts.map +1 -0
  51. package/dist/detect/config/agent-skill-injection.js +472 -0
  52. package/dist/detect/config/agent-skill-injection.js.map +1 -0
  53. package/dist/detect/config/comments.d.ts +11 -0
  54. package/dist/detect/config/comments.d.ts.map +1 -0
  55. package/dist/detect/config/comments.js +206 -0
  56. package/dist/detect/config/comments.js.map +1 -0
  57. package/dist/detect/config/file-flags.d.ts +10 -0
  58. package/dist/detect/config/file-flags.d.ts.map +1 -0
  59. package/dist/detect/config/file-flags.js +124 -0
  60. package/dist/detect/config/file-flags.js.map +1 -0
  61. package/dist/detect/config/index.d.ts +7 -0
  62. package/dist/detect/config/index.d.ts.map +1 -0
  63. package/dist/detect/config/index.js +17 -0
  64. package/dist/detect/config/index.js.map +1 -0
  65. package/dist/detect/config/osv-check.d.ts +75 -0
  66. package/dist/detect/config/osv-check.d.ts.map +1 -0
  67. package/dist/detect/config/osv-check.js +309 -0
  68. package/dist/detect/config/osv-check.js.map +1 -0
  69. package/dist/detect/config/package-check.d.ts +63 -0
  70. package/dist/detect/config/package-check.d.ts.map +1 -0
  71. package/dist/detect/config/package-check.js +509 -0
  72. package/dist/detect/config/package-check.js.map +1 -0
  73. package/dist/detect/config/urls.d.ts +11 -0
  74. package/dist/detect/config/urls.d.ts.map +1 -0
  75. package/dist/detect/config/urls.js +450 -0
  76. package/dist/detect/config/urls.js.map +1 -0
  77. package/dist/detect/index.d.ts +37 -0
  78. package/dist/detect/index.d.ts.map +1 -0
  79. package/dist/detect/index.js +77 -0
  80. package/dist/detect/index.js.map +1 -0
  81. package/dist/detect/secrets/config-audit.d.ts +11 -0
  82. package/dist/detect/secrets/config-audit.d.ts.map +1 -0
  83. package/dist/detect/secrets/config-audit.js +315 -0
  84. package/dist/detect/secrets/config-audit.js.map +1 -0
  85. package/dist/detect/secrets/config-mcp-audit.d.ts +23 -0
  86. package/dist/detect/secrets/config-mcp-audit.d.ts.map +1 -0
  87. package/dist/detect/secrets/config-mcp-audit.js +243 -0
  88. package/dist/detect/secrets/config-mcp-audit.js.map +1 -0
  89. package/dist/detect/secrets/entropy.d.ts +11 -0
  90. package/dist/detect/secrets/entropy.d.ts.map +1 -0
  91. package/dist/detect/secrets/entropy.js +751 -0
  92. package/dist/detect/secrets/entropy.js.map +1 -0
  93. package/dist/detect/secrets/index.d.ts +36 -0
  94. package/dist/detect/secrets/index.d.ts.map +1 -0
  95. package/dist/detect/secrets/index.js +174 -0
  96. package/dist/detect/secrets/index.js.map +1 -0
  97. package/dist/detect/secrets/patterns.d.ts +11 -0
  98. package/dist/detect/secrets/patterns.d.ts.map +1 -0
  99. package/dist/detect/secrets/patterns.js +518 -0
  100. package/dist/detect/secrets/patterns.js.map +1 -0
  101. package/dist/detect/secrets/weak-crypto.d.ts +10 -0
  102. package/dist/detect/secrets/weak-crypto.d.ts.map +1 -0
  103. package/dist/detect/secrets/weak-crypto.js +432 -0
  104. package/dist/detect/secrets/weak-crypto.js.map +1 -0
  105. package/dist/detect/structural/auth-patterns.d.ts +22 -0
  106. package/dist/detect/structural/auth-patterns.d.ts.map +1 -0
  107. package/dist/detect/structural/auth-patterns.js +533 -0
  108. package/dist/detect/structural/auth-patterns.js.map +1 -0
  109. package/dist/detect/structural/dangerous-functions/child-process.d.ts +16 -0
  110. package/dist/detect/structural/dangerous-functions/child-process.d.ts.map +1 -0
  111. package/dist/detect/structural/dangerous-functions/child-process.js +74 -0
  112. package/dist/detect/structural/dangerous-functions/child-process.js.map +1 -0
  113. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts +34 -0
  114. package/dist/detect/structural/dangerous-functions/dom-xss.d.ts.map +1 -0
  115. package/dist/detect/structural/dangerous-functions/dom-xss.js +230 -0
  116. package/dist/detect/structural/dangerous-functions/dom-xss.js.map +1 -0
  117. package/dist/detect/structural/dangerous-functions/index.d.ts +16 -0
  118. package/dist/detect/structural/dangerous-functions/index.d.ts.map +1 -0
  119. package/dist/detect/structural/dangerous-functions/index.js +1193 -0
  120. package/dist/detect/structural/dangerous-functions/index.js.map +1 -0
  121. package/dist/detect/structural/dangerous-functions/json-parse.d.ts +31 -0
  122. package/dist/detect/structural/dangerous-functions/json-parse.d.ts.map +1 -0
  123. package/dist/detect/structural/dangerous-functions/json-parse.js +326 -0
  124. package/dist/detect/structural/dangerous-functions/json-parse.js.map +1 -0
  125. package/dist/detect/structural/dangerous-functions/math-random.d.ts +111 -0
  126. package/dist/detect/structural/dangerous-functions/math-random.d.ts.map +1 -0
  127. package/dist/detect/structural/dangerous-functions/math-random.js +684 -0
  128. package/dist/detect/structural/dangerous-functions/math-random.js.map +1 -0
  129. package/dist/detect/structural/dangerous-functions/patterns.d.ts +21 -0
  130. package/dist/detect/structural/dangerous-functions/patterns.d.ts.map +1 -0
  131. package/dist/detect/structural/dangerous-functions/patterns.js +163 -0
  132. package/dist/detect/structural/dangerous-functions/patterns.js.map +1 -0
  133. package/dist/detect/structural/dangerous-functions/request-validation.d.ts +13 -0
  134. package/dist/detect/structural/dangerous-functions/request-validation.d.ts.map +1 -0
  135. package/dist/detect/structural/dangerous-functions/request-validation.js +126 -0
  136. package/dist/detect/structural/dangerous-functions/request-validation.js.map +1 -0
  137. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts +24 -0
  138. package/dist/detect/structural/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  139. package/dist/detect/structural/dangerous-functions/utils/control-flow.js +70 -0
  140. package/dist/detect/structural/dangerous-functions/utils/control-flow.js.map +1 -0
  141. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts +31 -0
  142. package/dist/detect/structural/dangerous-functions/utils/helpers.d.ts.map +1 -0
  143. package/dist/detect/structural/dangerous-functions/utils/helpers.js +147 -0
  144. package/dist/detect/structural/dangerous-functions/utils/helpers.js.map +1 -0
  145. package/dist/detect/structural/dangerous-functions/utils/index.d.ts +9 -0
  146. package/dist/detect/structural/dangerous-functions/utils/index.d.ts.map +1 -0
  147. package/dist/detect/structural/dangerous-functions/utils/index.js +23 -0
  148. package/dist/detect/structural/dangerous-functions/utils/index.js.map +1 -0
  149. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts +22 -0
  150. package/dist/detect/structural/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  151. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js +102 -0
  152. package/dist/detect/structural/dangerous-functions/utils/schema-validation.js.map +1 -0
  153. package/dist/detect/structural/data-exposure.d.ts +19 -0
  154. package/dist/detect/structural/data-exposure.d.ts.map +1 -0
  155. package/dist/detect/structural/data-exposure.js +262 -0
  156. package/dist/detect/structural/data-exposure.js.map +1 -0
  157. package/dist/detect/structural/framework-checks.d.ts +10 -0
  158. package/dist/detect/structural/framework-checks.d.ts.map +1 -0
  159. package/dist/detect/structural/framework-checks.js +389 -0
  160. package/dist/detect/structural/framework-checks.js.map +1 -0
  161. package/dist/detect/structural/index.d.ts +71 -0
  162. package/dist/detect/structural/index.d.ts.map +1 -0
  163. package/dist/detect/structural/index.js +510 -0
  164. package/dist/detect/structural/index.js.map +1 -0
  165. package/dist/detect/structural/log-injection.d.ts +18 -0
  166. package/dist/detect/structural/log-injection.d.ts.map +1 -0
  167. package/dist/detect/structural/log-injection.js +217 -0
  168. package/dist/detect/structural/log-injection.js.map +1 -0
  169. package/dist/detect/structural/logic-gates.d.ts +10 -0
  170. package/dist/detect/structural/logic-gates.d.ts.map +1 -0
  171. package/dist/detect/structural/logic-gates.js +227 -0
  172. package/dist/detect/structural/logic-gates.js.map +1 -0
  173. package/dist/detect/structural/risky-imports.d.ts +10 -0
  174. package/dist/detect/structural/risky-imports.d.ts.map +1 -0
  175. package/dist/detect/structural/risky-imports.js +168 -0
  176. package/dist/detect/structural/risky-imports.js.map +1 -0
  177. package/dist/detect/structural/security-headers.d.ts +18 -0
  178. package/dist/detect/structural/security-headers.d.ts.map +1 -0
  179. package/dist/detect/structural/security-headers.js +196 -0
  180. package/dist/detect/structural/security-headers.js.map +1 -0
  181. package/dist/detect/structural/ssrf-detection.d.ts +18 -0
  182. package/dist/detect/structural/ssrf-detection.d.ts.map +1 -0
  183. package/dist/detect/structural/ssrf-detection.js +263 -0
  184. package/dist/detect/structural/ssrf-detection.js.map +1 -0
  185. package/dist/detect/structural/variables.d.ts +11 -0
  186. package/dist/detect/structural/variables.d.ts.map +1 -0
  187. package/dist/detect/structural/variables.js +159 -0
  188. package/dist/detect/structural/variables.js.map +1 -0
  189. package/dist/detect/structural/xxe-detection.d.ts +18 -0
  190. package/dist/detect/structural/xxe-detection.d.ts.map +1 -0
  191. package/dist/detect/structural/xxe-detection.js +245 -0
  192. package/dist/detect/structural/xxe-detection.js.map +1 -0
  193. package/dist/index.d.ts +17 -64
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +49 -1034
  196. package/dist/index.js.map +1 -1
  197. package/dist/layer2/framework-checks.d.ts.map +1 -1
  198. package/dist/layer2/framework-checks.js +1 -8
  199. package/dist/layer2/framework-checks.js.map +1 -1
  200. package/dist/layer2/index.d.ts +4 -0
  201. package/dist/layer2/index.d.ts.map +1 -1
  202. package/dist/layer2/index.js +50 -1
  203. package/dist/layer2/index.js.map +1 -1
  204. package/dist/layer2/log-injection.d.ts +18 -0
  205. package/dist/layer2/log-injection.d.ts.map +1 -0
  206. package/dist/layer2/log-injection.js +214 -0
  207. package/dist/layer2/log-injection.js.map +1 -0
  208. package/dist/layer2/security-headers.d.ts +18 -0
  209. package/dist/layer2/security-headers.d.ts.map +1 -0
  210. package/dist/layer2/security-headers.js +187 -0
  211. package/dist/layer2/security-headers.js.map +1 -0
  212. package/dist/layer2/ssrf-detection.d.ts +18 -0
  213. package/dist/layer2/ssrf-detection.d.ts.map +1 -0
  214. package/dist/layer2/ssrf-detection.js +252 -0
  215. package/dist/layer2/ssrf-detection.js.map +1 -0
  216. package/dist/layer2/xxe-detection.d.ts +18 -0
  217. package/dist/layer2/xxe-detection.d.ts.map +1 -0
  218. package/dist/layer2/xxe-detection.js +242 -0
  219. package/dist/layer2/xxe-detection.js.map +1 -0
  220. package/dist/layer3/anthropic/prompts/index.d.ts +1 -1
  221. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -1
  222. package/dist/layer3/anthropic/prompts/index.js +3 -1
  223. package/dist/layer3/anthropic/prompts/index.js.map +1 -1
  224. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts +19 -0
  225. package/dist/layer3/anthropic/prompts/modules/ai-patterns.d.ts.map +1 -0
  226. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js +156 -0
  227. package/dist/layer3/anthropic/prompts/modules/ai-patterns.js.map +1 -0
  228. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts +9 -0
  229. package/dist/layer3/anthropic/prompts/modules/auth-access.d.ts.map +1 -0
  230. package/dist/layer3/anthropic/prompts/modules/auth-access.js +25 -0
  231. package/dist/layer3/anthropic/prompts/modules/auth-access.js.map +1 -0
  232. package/dist/layer3/anthropic/prompts/modules/common.d.ts +11 -0
  233. package/dist/layer3/anthropic/prompts/modules/common.d.ts.map +1 -0
  234. package/dist/layer3/anthropic/prompts/modules/common.js +152 -0
  235. package/dist/layer3/anthropic/prompts/modules/common.js.map +1 -0
  236. package/dist/layer3/anthropic/prompts/modules/index.d.ts +54 -0
  237. package/dist/layer3/anthropic/prompts/modules/index.d.ts.map +1 -0
  238. package/dist/layer3/anthropic/prompts/modules/index.js +185 -0
  239. package/dist/layer3/anthropic/prompts/modules/index.js.map +1 -0
  240. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts +8 -0
  241. package/dist/layer3/anthropic/prompts/modules/owasp-classic.d.ts.map +1 -0
  242. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js +84 -0
  243. package/dist/layer3/anthropic/prompts/modules/owasp-classic.js.map +1 -0
  244. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts +8 -0
  245. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.d.ts.map +1 -0
  246. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js +68 -0
  247. package/dist/layer3/anthropic/prompts/modules/secrets-crypto.js.map +1 -0
  248. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts +8 -0
  249. package/dist/layer3/anthropic/prompts/modules/xss-prompt.d.ts.map +1 -0
  250. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js +22 -0
  251. package/dist/layer3/anthropic/prompts/modules/xss-prompt.js.map +1 -0
  252. package/dist/layer3/anthropic/prompts/validation.d.ts +9 -3
  253. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -1
  254. package/dist/layer3/anthropic/prompts/validation.js +14 -410
  255. package/dist/layer3/anthropic/prompts/validation.js.map +1 -1
  256. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -1
  257. package/dist/layer3/anthropic/providers/anthropic.js +6 -3
  258. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -1
  259. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -1
  260. package/dist/layer3/anthropic/providers/openai.js +6 -3
  261. package/dist/layer3/anthropic/providers/openai.js.map +1 -1
  262. package/dist/layer3/anthropic/request-builder.d.ts +11 -4
  263. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -1
  264. package/dist/layer3/anthropic/request-builder.js +32 -16
  265. package/dist/layer3/anthropic/request-builder.js.map +1 -1
  266. package/dist/layer3/anthropic/utils/context-extractor.d.ts +55 -0
  267. package/dist/layer3/anthropic/utils/context-extractor.d.ts.map +1 -0
  268. package/dist/layer3/anthropic/utils/context-extractor.js +161 -0
  269. package/dist/layer3/anthropic/utils/context-extractor.js.map +1 -0
  270. package/dist/layer3/anthropic/utils/index.d.ts +2 -0
  271. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -1
  272. package/dist/layer3/anthropic/utils/index.js +4 -1
  273. package/dist/layer3/anthropic/utils/index.js.map +1 -1
  274. package/dist/model/auth-helper-detector.d.ts +56 -0
  275. package/dist/model/auth-helper-detector.d.ts.map +1 -0
  276. package/dist/model/auth-helper-detector.js +360 -0
  277. package/dist/model/auth-helper-detector.js.map +1 -0
  278. package/dist/model/cross-file-taint.d.ts +40 -0
  279. package/dist/model/cross-file-taint.d.ts.map +1 -0
  280. package/dist/model/cross-file-taint.js +290 -0
  281. package/dist/model/cross-file-taint.js.map +1 -0
  282. package/dist/model/framework-models/django.d.ts +9 -0
  283. package/dist/model/framework-models/django.d.ts.map +1 -0
  284. package/dist/model/framework-models/django.js +82 -0
  285. package/dist/model/framework-models/django.js.map +1 -0
  286. package/dist/model/framework-models/express.d.ts +9 -0
  287. package/dist/model/framework-models/express.d.ts.map +1 -0
  288. package/dist/model/framework-models/express.js +52 -0
  289. package/dist/model/framework-models/express.js.map +1 -0
  290. package/dist/model/framework-models/index.d.ts +20 -0
  291. package/dist/model/framework-models/index.d.ts.map +1 -0
  292. package/dist/model/framework-models/index.js +102 -0
  293. package/dist/model/framework-models/index.js.map +1 -0
  294. package/dist/model/framework-models/nextjs.d.ts +9 -0
  295. package/dist/model/framework-models/nextjs.d.ts.map +1 -0
  296. package/dist/model/framework-models/nextjs.js +71 -0
  297. package/dist/model/framework-models/nextjs.js.map +1 -0
  298. package/dist/model/framework-models/prisma.d.ts +10 -0
  299. package/dist/model/framework-models/prisma.d.ts.map +1 -0
  300. package/dist/model/framework-models/prisma.js +54 -0
  301. package/dist/model/framework-models/prisma.js.map +1 -0
  302. package/dist/model/framework-models/react.d.ts +9 -0
  303. package/dist/model/framework-models/react.d.ts.map +1 -0
  304. package/dist/model/framework-models/react.js +67 -0
  305. package/dist/model/framework-models/react.js.map +1 -0
  306. package/dist/model/framework-models/sequelize.d.ts +9 -0
  307. package/dist/model/framework-models/sequelize.d.ts.map +1 -0
  308. package/dist/model/framework-models/sequelize.js +62 -0
  309. package/dist/model/framework-models/sequelize.js.map +1 -0
  310. package/dist/model/framework-models/types.d.ts +43 -0
  311. package/dist/model/framework-models/types.d.ts.map +1 -0
  312. package/dist/model/framework-models/types.js +10 -0
  313. package/dist/model/framework-models/types.js.map +1 -0
  314. package/dist/model/function-classifier.d.ts +32 -0
  315. package/dist/model/function-classifier.d.ts.map +1 -0
  316. package/dist/model/function-classifier.js +143 -0
  317. package/dist/model/function-classifier.js.map +1 -0
  318. package/dist/model/import-resolver.d.ts +45 -0
  319. package/dist/model/import-resolver.d.ts.map +1 -0
  320. package/dist/model/import-resolver.js +410 -0
  321. package/dist/model/import-resolver.js.map +1 -0
  322. package/dist/model/imported-auth-detector.d.ts +38 -0
  323. package/dist/model/imported-auth-detector.d.ts.map +1 -0
  324. package/dist/model/imported-auth-detector.js +199 -0
  325. package/dist/model/imported-auth-detector.js.map +1 -0
  326. package/dist/model/index.d.ts +63 -0
  327. package/dist/model/index.d.ts.map +1 -0
  328. package/dist/model/index.js +272 -0
  329. package/dist/model/index.js.map +1 -0
  330. package/dist/model/middleware-detector.d.ts +55 -0
  331. package/dist/model/middleware-detector.d.ts.map +1 -0
  332. package/dist/model/middleware-detector.js +382 -0
  333. package/dist/model/middleware-detector.js.map +1 -0
  334. package/dist/model/module-graph.d.ts +46 -0
  335. package/dist/model/module-graph.d.ts.map +1 -0
  336. package/dist/model/module-graph.js +187 -0
  337. package/dist/model/module-graph.js.map +1 -0
  338. package/dist/model/oauth-flow-detector.d.ts +41 -0
  339. package/dist/model/oauth-flow-detector.d.ts.map +1 -0
  340. package/dist/model/oauth-flow-detector.js +202 -0
  341. package/dist/model/oauth-flow-detector.js.map +1 -0
  342. package/dist/model/project-context.d.ts +119 -0
  343. package/dist/model/project-context.d.ts.map +1 -0
  344. package/dist/model/project-context.js +534 -0
  345. package/dist/model/project-context.js.map +1 -0
  346. package/dist/model/route-auth-resolver.d.ts +27 -0
  347. package/dist/model/route-auth-resolver.d.ts.map +1 -0
  348. package/dist/model/route-auth-resolver.js +182 -0
  349. package/dist/model/route-auth-resolver.js.map +1 -0
  350. package/dist/model/route-discovery/express.d.ts +25 -0
  351. package/dist/model/route-discovery/express.d.ts.map +1 -0
  352. package/dist/model/route-discovery/express.js +225 -0
  353. package/dist/model/route-discovery/express.js.map +1 -0
  354. package/dist/model/route-discovery/index.d.ts +21 -0
  355. package/dist/model/route-discovery/index.d.ts.map +1 -0
  356. package/dist/model/route-discovery/index.js +67 -0
  357. package/dist/model/route-discovery/index.js.map +1 -0
  358. package/dist/model/route-discovery/nextjs.d.ts +16 -0
  359. package/dist/model/route-discovery/nextjs.d.ts.map +1 -0
  360. package/dist/model/route-discovery/nextjs.js +179 -0
  361. package/dist/model/route-discovery/nextjs.js.map +1 -0
  362. package/dist/model/route-discovery/python.d.ts +16 -0
  363. package/dist/model/route-discovery/python.d.ts.map +1 -0
  364. package/dist/model/route-discovery/python.js +181 -0
  365. package/dist/model/route-discovery/python.js.map +1 -0
  366. package/dist/model/route-discovery/types.d.ts +36 -0
  367. package/dist/model/route-discovery/types.d.ts.map +1 -0
  368. package/dist/model/route-discovery/types.js +16 -0
  369. package/dist/model/route-discovery/types.js.map +1 -0
  370. package/dist/model/route-discovery/utils.d.ts +18 -0
  371. package/dist/model/route-discovery/utils.d.ts.map +1 -0
  372. package/dist/model/route-discovery/utils.js +55 -0
  373. package/dist/model/route-discovery/utils.js.map +1 -0
  374. package/dist/model/route-hierarchy.d.ts +50 -0
  375. package/dist/model/route-hierarchy.d.ts.map +1 -0
  376. package/dist/model/route-hierarchy.js +226 -0
  377. package/dist/model/route-hierarchy.js.map +1 -0
  378. package/dist/model/sanitiser-detection.d.ts +27 -0
  379. package/dist/model/sanitiser-detection.d.ts.map +1 -0
  380. package/dist/model/sanitiser-detection.js +224 -0
  381. package/dist/model/sanitiser-detection.js.map +1 -0
  382. package/dist/model/sink-matcher.d.ts +17 -0
  383. package/dist/model/sink-matcher.d.ts.map +1 -0
  384. package/dist/model/sink-matcher.js +141 -0
  385. package/dist/model/sink-matcher.js.map +1 -0
  386. package/dist/model/sink-patterns.d.ts +19 -0
  387. package/dist/model/sink-patterns.d.ts.map +1 -0
  388. package/dist/model/sink-patterns.js +88 -0
  389. package/dist/model/sink-patterns.js.map +1 -0
  390. package/dist/model/source-discovery.d.ts +15 -0
  391. package/dist/model/source-discovery.d.ts.map +1 -0
  392. package/dist/model/source-discovery.js +170 -0
  393. package/dist/model/source-discovery.js.map +1 -0
  394. package/dist/model/taint-tracker.d.ts +21 -0
  395. package/dist/model/taint-tracker.d.ts.map +1 -0
  396. package/dist/model/taint-tracker.js +281 -0
  397. package/dist/model/taint-tracker.js.map +1 -0
  398. package/dist/model/taint-types.d.ts +74 -0
  399. package/dist/model/taint-types.d.ts.map +1 -0
  400. package/dist/model/taint-types.js +9 -0
  401. package/dist/model/taint-types.js.map +1 -0
  402. package/dist/model/trpc-analyzer.d.ts +78 -0
  403. package/dist/model/trpc-analyzer.d.ts.map +1 -0
  404. package/dist/model/trpc-analyzer.js +297 -0
  405. package/dist/model/trpc-analyzer.js.map +1 -0
  406. package/dist/parse/file-classifier.d.ts +228 -0
  407. package/dist/parse/file-classifier.d.ts.map +1 -0
  408. package/dist/parse/file-classifier.js +933 -0
  409. package/dist/parse/file-classifier.js.map +1 -0
  410. package/dist/parse/path-exclusions.d.ts +55 -0
  411. package/dist/parse/path-exclusions.d.ts.map +1 -0
  412. package/dist/parse/path-exclusions.js +224 -0
  413. package/dist/parse/path-exclusions.js.map +1 -0
  414. package/dist/pipeline/config.d.ts +39 -0
  415. package/dist/pipeline/config.d.ts.map +1 -0
  416. package/dist/pipeline/config.js +46 -0
  417. package/dist/pipeline/config.js.map +1 -0
  418. package/dist/pipeline/index.d.ts +34 -0
  419. package/dist/pipeline/index.d.ts.map +1 -0
  420. package/dist/pipeline/index.js +377 -0
  421. package/dist/pipeline/index.js.map +1 -0
  422. package/dist/pipeline/modes/incremental.d.ts +66 -0
  423. package/dist/pipeline/modes/incremental.d.ts.map +1 -0
  424. package/dist/pipeline/modes/incremental.js +200 -0
  425. package/dist/pipeline/modes/incremental.js.map +1 -0
  426. package/dist/postprocess/aggregation.d.ts +14 -0
  427. package/dist/postprocess/aggregation.d.ts.map +1 -0
  428. package/dist/postprocess/aggregation.js +63 -0
  429. package/dist/postprocess/aggregation.js.map +1 -0
  430. package/dist/postprocess/contradictions.d.ts +18 -0
  431. package/dist/postprocess/contradictions.d.ts.map +1 -0
  432. package/dist/postprocess/contradictions.js +99 -0
  433. package/dist/postprocess/contradictions.js.map +1 -0
  434. package/dist/postprocess/dedup.d.ts +13 -0
  435. package/dist/postprocess/dedup.d.ts.map +1 -0
  436. package/dist/postprocess/dedup.js +58 -0
  437. package/dist/postprocess/dedup.js.map +1 -0
  438. package/dist/postprocess/filtering/context-adjustments.d.ts +23 -0
  439. package/dist/postprocess/filtering/context-adjustments.d.ts.map +1 -0
  440. package/dist/postprocess/filtering/context-adjustments.js +100 -0
  441. package/dist/postprocess/filtering/context-adjustments.js.map +1 -0
  442. package/dist/postprocess/filtering/index.d.ts +3 -0
  443. package/dist/postprocess/filtering/index.d.ts.map +1 -0
  444. package/dist/postprocess/filtering/index.js +8 -0
  445. package/dist/postprocess/filtering/index.js.map +1 -0
  446. package/dist/postprocess/filtering/pipeline.d.ts +48 -0
  447. package/dist/postprocess/filtering/pipeline.d.ts.map +1 -0
  448. package/dist/postprocess/filtering/pipeline.js +76 -0
  449. package/dist/postprocess/filtering/pipeline.js.map +1 -0
  450. package/dist/postprocess/index.d.ts +41 -0
  451. package/dist/postprocess/index.d.ts.map +1 -0
  452. package/dist/postprocess/index.js +85 -0
  453. package/dist/postprocess/index.js.map +1 -0
  454. package/dist/postprocess/suppression/config-loader.d.ts +74 -0
  455. package/dist/postprocess/suppression/config-loader.d.ts.map +1 -0
  456. package/dist/postprocess/suppression/config-loader.js +424 -0
  457. package/dist/postprocess/suppression/config-loader.js.map +1 -0
  458. package/dist/postprocess/suppression/hash.d.ts +48 -0
  459. package/dist/postprocess/suppression/hash.d.ts.map +1 -0
  460. package/dist/postprocess/suppression/hash.js +88 -0
  461. package/dist/postprocess/suppression/hash.js.map +1 -0
  462. package/dist/postprocess/suppression/index.d.ts +11 -0
  463. package/dist/postprocess/suppression/index.d.ts.map +1 -0
  464. package/dist/postprocess/suppression/index.js +39 -0
  465. package/dist/postprocess/suppression/index.js.map +1 -0
  466. package/dist/postprocess/suppression/inline-parser.d.ts +39 -0
  467. package/dist/postprocess/suppression/inline-parser.d.ts.map +1 -0
  468. package/dist/postprocess/suppression/inline-parser.js +218 -0
  469. package/dist/postprocess/suppression/inline-parser.js.map +1 -0
  470. package/dist/postprocess/suppression/manager.d.ts +94 -0
  471. package/dist/postprocess/suppression/manager.d.ts.map +1 -0
  472. package/dist/postprocess/suppression/manager.js +292 -0
  473. package/dist/postprocess/suppression/manager.js.map +1 -0
  474. package/dist/postprocess/suppression/types.d.ts +151 -0
  475. package/dist/postprocess/suppression/types.d.ts.map +1 -0
  476. package/dist/postprocess/suppression/types.js +28 -0
  477. package/dist/postprocess/suppression/types.js.map +1 -0
  478. package/dist/postprocess/validation-cap.d.ts +17 -0
  479. package/dist/postprocess/validation-cap.d.ts.map +1 -0
  480. package/dist/postprocess/validation-cap.js +64 -0
  481. package/dist/postprocess/validation-cap.js.map +1 -0
  482. package/dist/report/build-result.d.ts +33 -0
  483. package/dist/report/build-result.d.ts.map +1 -0
  484. package/dist/report/build-result.js +59 -0
  485. package/dist/report/build-result.js.map +1 -0
  486. package/dist/report/enrichment.d.ts +19 -0
  487. package/dist/report/enrichment.d.ts.map +1 -0
  488. package/dist/report/enrichment.js +44 -0
  489. package/dist/report/enrichment.js.map +1 -0
  490. package/dist/report/formatters/ai-context.d.ts +23 -0
  491. package/dist/report/formatters/ai-context.d.ts.map +1 -0
  492. package/dist/report/formatters/ai-context.js +238 -0
  493. package/dist/report/formatters/ai-context.js.map +1 -0
  494. package/dist/report/formatters/cli-terminal.d.ts +65 -0
  495. package/dist/report/formatters/cli-terminal.d.ts.map +1 -0
  496. package/dist/report/formatters/cli-terminal.js +735 -0
  497. package/dist/report/formatters/cli-terminal.js.map +1 -0
  498. package/dist/report/formatters/github-comment.d.ts +41 -0
  499. package/dist/report/formatters/github-comment.d.ts.map +1 -0
  500. package/dist/report/formatters/github-comment.js +370 -0
  501. package/dist/report/formatters/github-comment.js.map +1 -0
  502. package/dist/report/formatters/grouping.d.ts +52 -0
  503. package/dist/report/formatters/grouping.d.ts.map +1 -0
  504. package/dist/report/formatters/grouping.js +152 -0
  505. package/dist/report/formatters/grouping.js.map +1 -0
  506. package/dist/report/formatters/ide/claude-code.d.ts +17 -0
  507. package/dist/report/formatters/ide/claude-code.d.ts.map +1 -0
  508. package/dist/report/formatters/ide/claude-code.js +94 -0
  509. package/dist/report/formatters/ide/claude-code.js.map +1 -0
  510. package/dist/report/formatters/ide/cursor.d.ts +13 -0
  511. package/dist/report/formatters/ide/cursor.d.ts.map +1 -0
  512. package/dist/report/formatters/ide/cursor.js +125 -0
  513. package/dist/report/formatters/ide/cursor.js.map +1 -0
  514. package/dist/report/formatters/ide/index.d.ts +62 -0
  515. package/dist/report/formatters/ide/index.d.ts.map +1 -0
  516. package/dist/report/formatters/ide/index.js +184 -0
  517. package/dist/report/formatters/ide/index.js.map +1 -0
  518. package/dist/report/formatters/ide/windsurf.d.ts +13 -0
  519. package/dist/report/formatters/ide/windsurf.d.ts.map +1 -0
  520. package/dist/report/formatters/ide/windsurf.js +117 -0
  521. package/dist/report/formatters/ide/windsurf.js.map +1 -0
  522. package/dist/report/formatters/index.d.ts +11 -0
  523. package/dist/report/formatters/index.d.ts.map +1 -0
  524. package/dist/report/formatters/index.js +54 -0
  525. package/dist/report/formatters/index.js.map +1 -0
  526. package/dist/report/formatters/vscode-diagnostic.d.ts +103 -0
  527. package/dist/report/formatters/vscode-diagnostic.d.ts.map +1 -0
  528. package/dist/report/formatters/vscode-diagnostic.js +151 -0
  529. package/dist/report/formatters/vscode-diagnostic.js.map +1 -0
  530. package/dist/report/summary.d.ts +27 -0
  531. package/dist/report/summary.d.ts.map +1 -0
  532. package/dist/report/summary.js +57 -0
  533. package/dist/report/summary.js.map +1 -0
  534. package/dist/rules/metadata.d.ts.map +1 -1
  535. package/dist/rules/metadata.js +66 -0
  536. package/dist/rules/metadata.js.map +1 -1
  537. package/dist/score/adjustments.d.ts +22 -0
  538. package/dist/score/adjustments.d.ts.map +1 -0
  539. package/dist/score/adjustments.js +373 -0
  540. package/dist/score/adjustments.js.map +1 -0
  541. package/dist/score/auto-dismiss.d.ts +28 -0
  542. package/dist/score/auto-dismiss.d.ts.map +1 -0
  543. package/dist/score/auto-dismiss.js +200 -0
  544. package/dist/score/auto-dismiss.js.map +1 -0
  545. package/dist/score/confidence.d.ts +19 -0
  546. package/dist/score/confidence.d.ts.map +1 -0
  547. package/dist/score/confidence.js +52 -0
  548. package/dist/score/confidence.js.map +1 -0
  549. package/dist/score/index.d.ts +61 -0
  550. package/dist/score/index.d.ts.map +1 -0
  551. package/dist/score/index.js +250 -0
  552. package/dist/score/index.js.map +1 -0
  553. package/dist/score/types.d.ts +160 -0
  554. package/dist/score/types.d.ts.map +1 -0
  555. package/dist/score/types.js +14 -0
  556. package/dist/score/types.js.map +1 -0
  557. package/dist/shared/ai-context/index.d.ts +6 -0
  558. package/dist/shared/ai-context/index.d.ts.map +1 -0
  559. package/dist/shared/ai-context/index.js +13 -0
  560. package/dist/shared/ai-context/index.js.map +1 -0
  561. package/dist/shared/ai-context/manager.d.ts +67 -0
  562. package/dist/shared/ai-context/manager.d.ts.map +1 -0
  563. package/dist/shared/ai-context/manager.js +104 -0
  564. package/dist/shared/ai-context/manager.js.map +1 -0
  565. package/dist/shared/baseline/diff.d.ts +32 -0
  566. package/dist/shared/baseline/diff.d.ts.map +1 -0
  567. package/dist/shared/baseline/diff.js +119 -0
  568. package/dist/shared/baseline/diff.js.map +1 -0
  569. package/dist/shared/baseline/index.d.ts +9 -0
  570. package/dist/shared/baseline/index.d.ts.map +1 -0
  571. package/dist/shared/baseline/index.js +19 -0
  572. package/dist/shared/baseline/index.js.map +1 -0
  573. package/dist/shared/baseline/manager.d.ts +67 -0
  574. package/dist/shared/baseline/manager.d.ts.map +1 -0
  575. package/dist/shared/baseline/manager.js +180 -0
  576. package/dist/shared/baseline/manager.js.map +1 -0
  577. package/dist/shared/baseline/types.d.ts +91 -0
  578. package/dist/shared/baseline/types.d.ts.map +1 -0
  579. package/dist/shared/baseline/types.js +12 -0
  580. package/dist/shared/baseline/types.js.map +1 -0
  581. package/dist/shared/category-filter.d.ts +125 -0
  582. package/dist/shared/category-filter.d.ts.map +1 -0
  583. package/dist/shared/category-filter.js +360 -0
  584. package/dist/shared/category-filter.js.map +1 -0
  585. package/dist/shared/code-analysis.d.ts +39 -0
  586. package/dist/shared/code-analysis.d.ts.map +1 -0
  587. package/dist/shared/code-analysis.js +159 -0
  588. package/dist/shared/code-analysis.js.map +1 -0
  589. package/dist/shared/comment-analyzer.d.ts +38 -0
  590. package/dist/shared/comment-analyzer.d.ts.map +1 -0
  591. package/dist/shared/comment-analyzer.js +218 -0
  592. package/dist/shared/comment-analyzer.js.map +1 -0
  593. package/dist/shared/diff-detector.d.ts +53 -0
  594. package/dist/shared/diff-detector.d.ts.map +1 -0
  595. package/dist/shared/diff-detector.js +104 -0
  596. package/dist/shared/diff-detector.js.map +1 -0
  597. package/dist/shared/diff-parser.d.ts +80 -0
  598. package/dist/shared/diff-parser.d.ts.map +1 -0
  599. package/dist/shared/diff-parser.js +202 -0
  600. package/dist/shared/diff-parser.js.map +1 -0
  601. package/dist/shared/environment-context.d.ts +76 -0
  602. package/dist/shared/environment-context.d.ts.map +1 -0
  603. package/dist/shared/environment-context.js +271 -0
  604. package/dist/shared/environment-context.js.map +1 -0
  605. package/dist/shared/intent-detector.d.ts +66 -0
  606. package/dist/shared/intent-detector.d.ts.map +1 -0
  607. package/dist/shared/intent-detector.js +282 -0
  608. package/dist/shared/intent-detector.js.map +1 -0
  609. package/dist/shared/parsed-file.d.ts +51 -0
  610. package/dist/shared/parsed-file.d.ts.map +1 -0
  611. package/dist/shared/parsed-file.js +95 -0
  612. package/dist/shared/parsed-file.js.map +1 -0
  613. package/dist/shared/registry-clients.d.ts +93 -0
  614. package/dist/shared/registry-clients.d.ts.map +1 -0
  615. package/dist/shared/registry-clients.js +273 -0
  616. package/dist/shared/registry-clients.js.map +1 -0
  617. package/dist/shared/rules/framework-fixes.d.ts +48 -0
  618. package/dist/shared/rules/framework-fixes.d.ts.map +1 -0
  619. package/dist/shared/rules/framework-fixes.js +439 -0
  620. package/dist/shared/rules/framework-fixes.js.map +1 -0
  621. package/dist/shared/rules/index.d.ts +8 -0
  622. package/dist/shared/rules/index.d.ts.map +1 -0
  623. package/dist/shared/rules/index.js +18 -0
  624. package/dist/shared/rules/index.js.map +1 -0
  625. package/dist/shared/rules/metadata.d.ts +43 -0
  626. package/dist/shared/rules/metadata.d.ts.map +1 -0
  627. package/dist/shared/rules/metadata.js +819 -0
  628. package/dist/shared/rules/metadata.js.map +1 -0
  629. package/dist/shared/schema-semantics.d.ts +45 -0
  630. package/dist/shared/schema-semantics.d.ts.map +1 -0
  631. package/dist/shared/schema-semantics.js +193 -0
  632. package/dist/shared/schema-semantics.js.map +1 -0
  633. package/dist/shared/types.d.ts +337 -0
  634. package/dist/shared/types.d.ts.map +1 -0
  635. package/dist/shared/types.js +126 -0
  636. package/dist/shared/types.js.map +1 -0
  637. package/dist/tiers.d.ts +2 -2
  638. package/dist/tiers.d.ts.map +1 -1
  639. package/dist/tiers.js +10 -0
  640. package/dist/tiers.js.map +1 -1
  641. package/dist/types.d.ts +1 -1
  642. package/dist/types.d.ts.map +1 -1
  643. package/dist/types.js.map +1 -1
  644. package/dist/validate/clients.d.ts +44 -0
  645. package/dist/validate/clients.d.ts.map +1 -0
  646. package/dist/validate/clients.js +81 -0
  647. package/dist/validate/clients.js.map +1 -0
  648. package/dist/validate/index.d.ts +41 -0
  649. package/dist/validate/index.d.ts.map +1 -0
  650. package/dist/validate/index.js +141 -0
  651. package/dist/validate/index.js.map +1 -0
  652. package/dist/validate/prompts/index.d.ts +8 -0
  653. package/dist/validate/prompts/index.d.ts.map +1 -0
  654. package/dist/validate/prompts/index.js +16 -0
  655. package/dist/validate/prompts/index.js.map +1 -0
  656. package/dist/validate/prompts/modules/ai-patterns.d.ts +19 -0
  657. package/dist/validate/prompts/modules/ai-patterns.d.ts.map +1 -0
  658. package/dist/validate/prompts/modules/ai-patterns.js +156 -0
  659. package/dist/validate/prompts/modules/ai-patterns.js.map +1 -0
  660. package/dist/validate/prompts/modules/auth-access.d.ts +9 -0
  661. package/dist/validate/prompts/modules/auth-access.d.ts.map +1 -0
  662. package/dist/validate/prompts/modules/auth-access.js +25 -0
  663. package/dist/validate/prompts/modules/auth-access.js.map +1 -0
  664. package/dist/validate/prompts/modules/common.d.ts +11 -0
  665. package/dist/validate/prompts/modules/common.d.ts.map +1 -0
  666. package/dist/validate/prompts/modules/common.js +186 -0
  667. package/dist/validate/prompts/modules/common.js.map +1 -0
  668. package/dist/validate/prompts/modules/index.d.ts +54 -0
  669. package/dist/validate/prompts/modules/index.d.ts.map +1 -0
  670. package/dist/validate/prompts/modules/index.js +186 -0
  671. package/dist/validate/prompts/modules/index.js.map +1 -0
  672. package/dist/validate/prompts/modules/owasp-classic.d.ts +8 -0
  673. package/dist/validate/prompts/modules/owasp-classic.d.ts.map +1 -0
  674. package/dist/validate/prompts/modules/owasp-classic.js +84 -0
  675. package/dist/validate/prompts/modules/owasp-classic.js.map +1 -0
  676. package/dist/validate/prompts/modules/secrets-crypto.d.ts +8 -0
  677. package/dist/validate/prompts/modules/secrets-crypto.d.ts.map +1 -0
  678. package/dist/validate/prompts/modules/secrets-crypto.js +68 -0
  679. package/dist/validate/prompts/modules/secrets-crypto.js.map +1 -0
  680. package/dist/validate/prompts/modules/xss-prompt.d.ts +8 -0
  681. package/dist/validate/prompts/modules/xss-prompt.d.ts.map +1 -0
  682. package/dist/validate/prompts/modules/xss-prompt.js +22 -0
  683. package/dist/validate/prompts/modules/xss-prompt.js.map +1 -0
  684. package/dist/validate/prompts/semantic-analysis.d.ts +15 -0
  685. package/dist/validate/prompts/semantic-analysis.d.ts.map +1 -0
  686. package/dist/validate/prompts/semantic-analysis.js +169 -0
  687. package/dist/validate/prompts/semantic-analysis.js.map +1 -0
  688. package/dist/validate/prompts/validation.d.ts +18 -0
  689. package/dist/validate/prompts/validation.d.ts.map +1 -0
  690. package/dist/validate/prompts/validation.js +25 -0
  691. package/dist/validate/prompts/validation.js.map +1 -0
  692. package/dist/validate/providers/anthropic.d.ts +17 -0
  693. package/dist/validate/providers/anthropic.d.ts.map +1 -0
  694. package/dist/validate/providers/anthropic.js +260 -0
  695. package/dist/validate/providers/anthropic.js.map +1 -0
  696. package/dist/validate/providers/index.d.ts +8 -0
  697. package/dist/validate/providers/index.d.ts.map +1 -0
  698. package/dist/validate/providers/index.js +13 -0
  699. package/dist/validate/providers/index.js.map +1 -0
  700. package/dist/validate/providers/openai.d.ts +14 -0
  701. package/dist/validate/providers/openai.d.ts.map +1 -0
  702. package/dist/validate/providers/openai.js +336 -0
  703. package/dist/validate/providers/openai.js.map +1 -0
  704. package/dist/validate/request-builder.d.ts +61 -0
  705. package/dist/validate/request-builder.d.ts.map +1 -0
  706. package/dist/validate/request-builder.js +346 -0
  707. package/dist/validate/request-builder.js.map +1 -0
  708. package/dist/validate/types.d.ts +88 -0
  709. package/dist/validate/types.d.ts.map +1 -0
  710. package/dist/validate/types.js +38 -0
  711. package/dist/validate/types.js.map +1 -0
  712. package/dist/validate/utils/context-extractor.d.ts +55 -0
  713. package/dist/validate/utils/context-extractor.d.ts.map +1 -0
  714. package/dist/validate/utils/context-extractor.js +161 -0
  715. package/dist/validate/utils/context-extractor.js.map +1 -0
  716. package/dist/validate/utils/index.d.ts +11 -0
  717. package/dist/validate/utils/index.d.ts.map +1 -0
  718. package/dist/validate/utils/index.js +27 -0
  719. package/dist/validate/utils/index.js.map +1 -0
  720. package/dist/validate/utils/path-helpers.d.ts +21 -0
  721. package/dist/validate/utils/path-helpers.d.ts.map +1 -0
  722. package/dist/validate/utils/path-helpers.js +69 -0
  723. package/dist/validate/utils/path-helpers.js.map +1 -0
  724. package/dist/validate/utils/response-parser.d.ts +40 -0
  725. package/dist/validate/utils/response-parser.d.ts.map +1 -0
  726. package/dist/validate/utils/response-parser.js +286 -0
  727. package/dist/validate/utils/response-parser.js.map +1 -0
  728. package/dist/validate/utils/retry.d.ts +15 -0
  729. package/dist/validate/utils/retry.d.ts.map +1 -0
  730. package/dist/validate/utils/retry.js +62 -0
  731. package/dist/validate/utils/retry.js.map +1 -0
  732. package/package.json +8 -7
  733. package/src/__tests__/benchmark/fixtures/layer1/agent-skill-injection.ts +204 -0
  734. package/src/__tests__/benchmark/fixtures/layer1/index.ts +3 -0
  735. package/src/__tests__/benchmark/fixtures/layer2/index.ts +15 -0
  736. package/src/__tests__/benchmark/fixtures/layer2/log-injection.ts +147 -0
  737. package/src/__tests__/benchmark/fixtures/layer2/security-headers.ts +197 -0
  738. package/src/__tests__/benchmark/fixtures/layer2/ssrf-detection.ts +210 -0
  739. package/src/__tests__/benchmark/fixtures/layer2/xxe-detection.ts +195 -0
  740. package/src/__tests__/benchmark/run-depth-validation.ts +3 -3
  741. package/src/__tests__/benchmark/run-real-world-test.ts +4 -4
  742. package/src/__tests__/benchmark/types.ts +1 -1
  743. package/src/__tests__/benchmark/utils/test-runner.ts +3 -3
  744. package/src/__tests__/category-filter.test.ts +2 -2
  745. package/src/__tests__/context-engine/cross-file-taint.test.ts +284 -0
  746. package/src/__tests__/context-engine/framework-models.test.ts +457 -0
  747. package/src/__tests__/context-engine/function-classifier.test.ts +146 -0
  748. package/src/__tests__/context-engine/import-resolver.test.ts +328 -0
  749. package/src/__tests__/context-engine/integration.test.ts +320 -0
  750. package/src/__tests__/context-engine/module-graph.test.ts +159 -0
  751. package/src/__tests__/context-engine/route-discovery/auth-resolver.test.ts +353 -0
  752. package/src/__tests__/context-engine/route-discovery/express.test.ts +150 -0
  753. package/src/__tests__/context-engine/route-discovery/nextjs.test.ts +138 -0
  754. package/src/__tests__/context-engine/route-discovery/python.test.ts +95 -0
  755. package/src/__tests__/context-engine/sanitiser-detection.test.ts +187 -0
  756. package/src/__tests__/context-engine/sink-matcher.test.ts +251 -0
  757. package/src/__tests__/context-engine/source-discovery.test.ts +186 -0
  758. package/src/__tests__/context-engine/taint-tracker.test.ts +182 -0
  759. package/src/__tests__/regression/agent-skill-benign.test.ts +174 -0
  760. package/src/__tests__/regression/known-false-positives.test.ts +312 -4
  761. package/src/__tests__/score/adjustments.test.ts +385 -0
  762. package/src/__tests__/score/confidence.test.ts +283 -0
  763. package/src/__tests__/score/framework-scoring.test.ts +275 -0
  764. package/src/__tests__/score/route-scoring.test.ts +156 -0
  765. package/src/__tests__/score/scoring-integration.test.ts +165 -0
  766. package/src/__tests__/score/taint-adjustments.test.ts +244 -0
  767. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +37 -49
  768. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +52 -0
  769. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +3 -3
  770. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +2 -2
  771. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +1 -1
  772. package/src/__tests__/snapshots/scan-depth.test.ts +3 -3
  773. package/src/__tests__/validate/route-annotations.test.ts +138 -0
  774. package/src/__tests__/validation/analyze-results.ts +1 -1
  775. package/src/__tests__/validation/extract-for-triage.ts +1 -1
  776. package/src/__tests__/validation/fp-deep-analysis.ts +1 -1
  777. package/src/{layer2/ai-agent-tools.ts → detect/ai-code/agent-tools.ts} +23 -3
  778. package/src/{layer2 → detect/ai-code}/byok-patterns.ts +17 -5
  779. package/src/{layer2/ai-endpoint-protection.ts → detect/ai-code/endpoint-protection.ts} +8 -4
  780. package/src/{layer2/ai-execution-sinks.ts → detect/ai-code/execution-sinks.ts} +8 -4
  781. package/src/{layer2/ai-fingerprinting.ts → detect/ai-code/fingerprinting.ts} +20 -4
  782. package/src/detect/ai-code/index.ts +11 -0
  783. package/src/{layer2/ai-mcp-security.ts → detect/ai-code/mcp-security.ts} +7 -3
  784. package/src/{layer2 → detect/ai-code}/model-supply-chain.ts +7 -3
  785. package/src/{layer2/ai-package-hallucination.ts → detect/ai-code/package-hallucination.ts} +18 -3
  786. package/src/{layer2/ai-prompt-hygiene.ts → detect/ai-code/prompt-hygiene.ts} +25 -3
  787. package/src/{layer2/ai-rag-safety.ts → detect/ai-code/rag-safety.ts} +7 -3
  788. package/src/{layer2/ai-schema-validation.ts → detect/ai-code/schema-validation.ts} +7 -3
  789. package/src/detect/config/agent-skill-injection.ts +551 -0
  790. package/src/{layer1 → detect/config}/comments.ts +6 -2
  791. package/src/{layer1 → detect/config}/file-flags.ts +9 -3
  792. package/src/detect/config/index.ts +6 -0
  793. package/src/{layer3 → detect/config}/osv-check.ts +3 -2
  794. package/src/{layer3 → detect/config}/package-check.ts +3 -2
  795. package/src/{layer1 → detect/config}/urls.ts +12 -5
  796. package/src/detect/index.ts +131 -0
  797. package/src/{layer1 → detect/secrets}/config-audit.ts +7 -2
  798. package/src/{layer1 → detect/secrets}/config-mcp-audit.ts +8 -3
  799. package/src/{layer1 → detect/secrets}/entropy.ts +23 -11
  800. package/src/{layer1 → detect/secrets}/index.ts +31 -30
  801. package/src/{layer1 → detect/secrets}/patterns.ts +10 -3
  802. package/src/{layer1 → detect/secrets}/weak-crypto.ts +7 -2
  803. package/src/{layer2/auth-antipatterns.ts → detect/structural/auth-patterns.ts} +23 -11
  804. package/src/{layer2 → detect/structural}/dangerous-functions/dom-xss.ts +1 -1
  805. package/src/{layer2 → detect/structural}/dangerous-functions/index.ts +47 -24
  806. package/src/{layer2 → detect/structural}/dangerous-functions/json-parse.ts +10 -2
  807. package/src/{layer2 → detect/structural}/dangerous-functions/math-random.ts +2 -2
  808. package/src/{layer2 → detect/structural}/dangerous-functions/patterns.ts +1 -1
  809. package/src/{layer2 → detect/structural}/dangerous-functions/request-validation.ts +10 -2
  810. package/src/{layer2 → detect/structural}/dangerous-functions/utils/control-flow.ts +2 -2
  811. package/src/{layer2 → detect/structural}/data-exposure.ts +11 -3
  812. package/src/{layer2 → detect/structural}/framework-checks.ts +10 -11
  813. package/src/{layer2 → detect/structural}/index.ts +80 -77
  814. package/src/detect/structural/log-injection.ts +254 -0
  815. package/src/{layer2 → detect/structural}/logic-gates.ts +13 -5
  816. package/src/{layer2 → detect/structural}/risky-imports.ts +7 -3
  817. package/src/detect/structural/security-headers.ts +231 -0
  818. package/src/detect/structural/ssrf-detection.ts +300 -0
  819. package/src/{layer2 → detect/structural}/variables.ts +7 -3
  820. package/src/detect/structural/xxe-detection.ts +295 -0
  821. package/src/index.ts +39 -1291
  822. package/src/{utils → model}/auth-helper-detector.ts +1 -1
  823. package/src/model/cross-file-taint.ts +374 -0
  824. package/src/model/framework-models/django.ts +82 -0
  825. package/src/model/framework-models/express.ts +54 -0
  826. package/src/model/framework-models/index.ts +116 -0
  827. package/src/model/framework-models/nextjs.ts +69 -0
  828. package/src/model/framework-models/prisma.ts +57 -0
  829. package/src/model/framework-models/react.ts +63 -0
  830. package/src/model/framework-models/sequelize.ts +63 -0
  831. package/src/model/framework-models/types.ts +46 -0
  832. package/src/model/function-classifier.ts +184 -0
  833. package/src/model/import-resolver.ts +453 -0
  834. package/src/{utils → model}/imported-auth-detector.ts +21 -85
  835. package/src/model/index.ts +353 -0
  836. package/src/{utils → model}/middleware-detector.ts +156 -17
  837. package/src/model/module-graph.ts +254 -0
  838. package/src/{utils → model}/oauth-flow-detector.ts +1 -1
  839. package/src/{utils/project-context-builder.ts → model/project-context.ts} +1 -1
  840. package/src/model/route-auth-resolver.ts +216 -0
  841. package/src/model/route-discovery/express.ts +251 -0
  842. package/src/model/route-discovery/index.ts +83 -0
  843. package/src/model/route-discovery/nextjs.ts +216 -0
  844. package/src/model/route-discovery/python.ts +214 -0
  845. package/src/model/route-discovery/types.ts +48 -0
  846. package/src/model/route-discovery/utils.ts +54 -0
  847. package/src/model/sanitiser-detection.ts +268 -0
  848. package/src/model/sink-matcher.ts +178 -0
  849. package/src/model/sink-patterns.ts +109 -0
  850. package/src/model/source-discovery.ts +209 -0
  851. package/src/model/taint-tracker.ts +333 -0
  852. package/src/model/taint-types.ts +149 -0
  853. package/src/{utils → model}/trpc-analyzer.ts +1 -1
  854. package/src/{utils/context-helpers.ts → parse/file-classifier.ts} +54 -0
  855. package/src/{utils → parse}/path-exclusions.ts +1 -1
  856. package/src/pipeline/config.ts +81 -0
  857. package/src/pipeline/index.ts +437 -0
  858. package/src/{modes → pipeline/modes}/incremental.ts +5 -5
  859. package/src/postprocess/aggregation.ts +74 -0
  860. package/src/postprocess/contradictions.ts +128 -0
  861. package/src/postprocess/dedup.ts +62 -0
  862. package/src/{filtering → postprocess/filtering}/__tests__/pipeline.test.ts +1 -1
  863. package/src/{filtering → postprocess/filtering}/context-adjustments.ts +2 -2
  864. package/src/{filtering → postprocess/filtering}/pipeline.ts +2 -2
  865. package/src/postprocess/index.ts +118 -0
  866. package/src/{suppression → postprocess/suppression}/config-loader.ts +1 -1
  867. package/src/{suppression → postprocess/suppression}/hash.ts +1 -1
  868. package/src/{suppression → postprocess/suppression}/inline-parser.ts +1 -1
  869. package/src/{suppression → postprocess/suppression}/manager.ts +1 -1
  870. package/src/{suppression → postprocess/suppression}/types.ts +2 -2
  871. package/src/postprocess/validation-cap.ts +66 -0
  872. package/src/report/build-result.ts +94 -0
  873. package/src/report/enrichment.ts +52 -0
  874. package/src/{formatters → report/formatters}/ai-context.ts +1 -1
  875. package/src/{formatters → report/formatters}/cli-terminal.ts +11 -11
  876. package/src/{formatters → report/formatters}/github-comment.ts +1 -1
  877. package/src/{formatters → report/formatters}/grouping.ts +8 -8
  878. package/src/{formatters → report/formatters}/ide/claude-code.ts +1 -1
  879. package/src/{formatters → report/formatters}/ide/cursor.ts +1 -1
  880. package/src/{formatters → report/formatters}/ide/windsurf.ts +1 -1
  881. package/src/{formatters → report/formatters}/vscode-diagnostic.ts +1 -1
  882. package/src/report/summary.ts +70 -0
  883. package/src/score/adjustments.ts +387 -0
  884. package/src/{layer3/anthropic → score}/auto-dismiss.ts +15 -14
  885. package/src/score/confidence.ts +66 -0
  886. package/src/score/index.ts +316 -0
  887. package/src/score/types.ts +187 -0
  888. package/src/{baseline → shared/baseline}/__tests__/diff.test.ts +2 -2
  889. package/src/{baseline → shared/baseline}/diff.ts +1 -1
  890. package/src/{baseline → shared/baseline}/manager.ts +1 -1
  891. package/src/{category-filter.ts → shared/category-filter.ts} +1 -1
  892. package/src/{utils → shared}/code-analysis.ts +1 -1
  893. package/src/{rules → shared/rules}/__tests__/metadata.test.ts +7 -0
  894. package/src/{rules → shared/rules}/framework-fixes.ts +1 -1
  895. package/src/{rules → shared/rules}/metadata.ts +94 -0
  896. package/src/{types.ts → shared/types.ts} +22 -5
  897. package/src/tiers.ts +18 -1
  898. package/src/validate/__tests__/context-extractor.test.ts +191 -0
  899. package/src/validate/__tests__/prompt-assembly.test.ts +233 -0
  900. package/src/validate/__tests__/request-builder.test.ts +347 -0
  901. package/src/{layer3/anthropic → validate}/index.ts +8 -7
  902. package/src/{layer3/anthropic → validate}/prompts/index.ts +2 -0
  903. package/src/validate/prompts/modules/ai-patterns.ts +153 -0
  904. package/src/validate/prompts/modules/auth-access.ts +22 -0
  905. package/src/validate/prompts/modules/common.ts +183 -0
  906. package/src/validate/prompts/modules/index.ts +204 -0
  907. package/src/validate/prompts/modules/owasp-classic.ts +81 -0
  908. package/src/validate/prompts/modules/secrets-crypto.ts +65 -0
  909. package/src/validate/prompts/modules/xss-prompt.ts +19 -0
  910. package/src/validate/prompts/validation.ts +20 -0
  911. package/src/{layer3/anthropic → validate}/providers/anthropic.ts +28 -27
  912. package/src/validate/providers/index.ts +8 -0
  913. package/src/{layer3/anthropic → validate}/providers/openai.ts +30 -25
  914. package/src/validate/request-builder.ts +448 -0
  915. package/src/{layer3/anthropic → validate}/types.ts +1 -1
  916. package/src/validate/utils/context-extractor.ts +220 -0
  917. package/src/{layer3/anthropic → validate}/utils/index.ts +10 -0
  918. package/src/{layer3/anthropic → validate}/utils/response-parser.ts +2 -1
  919. package/src/layer3/anthropic/prompts/validation.ts +0 -419
  920. package/src/layer3/anthropic/providers/index.ts +0 -8
  921. package/src/layer3/anthropic/request-builder.ts +0 -150
  922. package/src/layer3/index.ts +0 -168
  923. /package/src/{layer3 → detect/config}/__tests__/osv-check.test.ts +0 -0
  924. /package/src/{layer2 → detect/structural}/__tests__/math-random-enhanced.test.ts +0 -0
  925. /package/src/{layer2 → detect/structural}/dangerous-functions/child-process.ts +0 -0
  926. /package/src/{layer2 → detect/structural}/dangerous-functions/utils/helpers.ts +0 -0
  927. /package/src/{layer2 → detect/structural}/dangerous-functions/utils/index.ts +0 -0
  928. /package/src/{layer2 → detect/structural}/dangerous-functions/utils/schema-validation.ts +0 -0
  929. /package/src/{utils → model}/route-hierarchy.ts +0 -0
  930. /package/src/{filtering → postprocess/filtering}/index.ts +0 -0
  931. /package/src/{suppression → postprocess/suppression}/__tests__/config-loader.test.ts +0 -0
  932. /package/src/{suppression → postprocess/suppression}/__tests__/hash.test.ts +0 -0
  933. /package/src/{suppression → postprocess/suppression}/__tests__/inline-parser.test.ts +0 -0
  934. /package/src/{suppression → postprocess/suppression}/__tests__/manager.test.ts +0 -0
  935. /package/src/{suppression → postprocess/suppression}/index.ts +0 -0
  936. /package/src/{formatters → report/formatters}/__tests__/ai-context.test.ts +0 -0
  937. /package/src/{formatters → report/formatters}/ide/__tests__/ide.test.ts +0 -0
  938. /package/src/{formatters → report/formatters}/ide/index.ts +0 -0
  939. /package/src/{formatters → report/formatters}/index.ts +0 -0
  940. /package/src/{utils → shared}/__tests__/code-analysis.test.ts +0 -0
  941. /package/src/{utils → shared}/__tests__/parsed-file.test.ts +0 -0
  942. /package/src/{ai-context → shared/ai-context}/__tests__/manager.test.ts +0 -0
  943. /package/src/{ai-context → shared/ai-context}/index.ts +0 -0
  944. /package/src/{ai-context → shared/ai-context}/manager.ts +0 -0
  945. /package/src/{baseline → shared/baseline}/__tests__/manager.test.ts +0 -0
  946. /package/src/{baseline → shared/baseline}/index.ts +0 -0
  947. /package/src/{baseline → shared/baseline}/types.ts +0 -0
  948. /package/src/{utils → shared}/comment-analyzer.ts +0 -0
  949. /package/src/{utils → shared}/diff-detector.ts +0 -0
  950. /package/src/{utils → shared}/diff-parser.ts +0 -0
  951. /package/src/{utils → shared}/environment-context.ts +0 -0
  952. /package/src/{utils → shared}/intent-detector.ts +0 -0
  953. /package/src/{utils → shared}/parsed-file.ts +0 -0
  954. /package/src/{utils → shared}/registry-clients.ts +0 -0
  955. /package/src/{rules → shared/rules}/__tests__/framework-fixes.test.ts +0 -0
  956. /package/src/{rules → shared/rules}/index.ts +0 -0
  957. /package/src/{utils → shared}/schema-semantics.ts +0 -0
  958. /package/src/{layer3/anthropic → validate}/clients.ts +0 -0
  959. /package/src/{layer3/anthropic → validate}/prompts/semantic-analysis.ts +0 -0
  960. /package/src/{layer3/anthropic → validate}/utils/path-helpers.ts +0 -0
  961. /package/src/{layer3/anthropic → validate}/utils/retry.ts +0 -0
@@ -0,0 +1,841 @@
1
+ "use strict";
2
+ /**
3
+ * Layer 2: AI Package Hallucination Detection
4
+ * Detects AI-hallucinated and potentially fake package names in imports
5
+ *
6
+ * Background: USENIX research shows ~20% of AI-generated code references
7
+ * packages that don't exist, creating supply chain attack vectors. Attackers
8
+ * can register these fake package names and inject malicious code.
9
+ *
10
+ * Detection Strategy:
11
+ * 1. Known hallucinations database (verified fake packages)
12
+ * 2. Heuristic patterns (suspicious naming conventions)
13
+ * 3. Generic unscoped names that are too vague to be real
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.detectAIPackageHallucination = detectAIPackageHallucination;
17
+ const file_classifier_1 = require("../../parse/file-classifier");
18
+ const BASE_CONFIDENCE = 0.55;
19
+ // ============================================================================
20
+ // Known Hallucinated Package Database
21
+ // ============================================================================
22
+ /**
23
+ * Verified fake package names from research and real-world observations
24
+ * These are packages that LLMs frequently suggest but don't exist (or are typosquats)
25
+ */
26
+ const KNOWN_HALLUCINATED_PACKAGES = new Set([
27
+ // JavaScript/TypeScript - from USENIX research and observation
28
+ 'react-charts', // Real: recharts, react-chartjs-2
29
+ 'mongo-client', // Real: mongodb
30
+ 'postgres-client', // Real: pg, postgres
31
+ 'fast-json', // Real: fast-json-stringify
32
+ 'node-helpers', // Doesn't exist
33
+ 'node-utils', // Doesn't exist
34
+ 'easy-utils', // Doesn't exist
35
+ 'simple-tools', // Doesn't exist
36
+ 'csv-parser-pro', // Real: csv-parser, papaparse
37
+ 'express-jwt-auth', // Real: express-jwt, passport-jwt
38
+ 'mongoose-connect', // Real: mongoose
39
+ 'redis-connect', // Real: redis, ioredis
40
+ 'graphql-tools-schema', // Real: @graphql-tools/schema
41
+ 'aws-s3-client', // Real: @aws-sdk/client-s3
42
+ 'google-cloud-storage', // Real: @google-cloud/storage (scoped)
43
+ 'firebase-auth-client', // Real: firebase, firebase-admin
44
+ 'stripe-payments', // Real: stripe
45
+ 'twilio-sms', // Real: twilio
46
+ 'sendgrid-email', // Real: @sendgrid/mail
47
+ 'mailchimp-api', // Real: @mailchimp/mailchimp_marketing
48
+ 'slack-bot', // Real: @slack/bolt, @slack/web-api
49
+ 'discord-bot', // Real: discord.js
50
+ 'telegram-bot', // Real: telegraf, node-telegram-bot-api
51
+ 'jwt-decode-verify', // Real: jsonwebtoken, jose
52
+ 'bcrypt-hash', // Real: bcrypt, bcryptjs
53
+ 'uuid-generate', // Real: uuid
54
+ 'date-formatter', // Real: date-fns, dayjs, moment
55
+ 'image-resize', // Real: sharp, jimp
56
+ 'pdf-generator', // Real: pdfkit, pdf-lib
57
+ 'excel-parser', // Real: xlsx, exceljs
58
+ 'xml-parser-pro', // Real: fast-xml-parser, xml2js
59
+ 'yaml-parser', // Real: js-yaml, yaml
60
+ // Python hallucinated packages
61
+ 'easy-flask', // Real: flask
62
+ 'simple-api', // Real: fastapi, flask
63
+ 'fast-db', // Real: sqlalchemy, databases
64
+ 'python-helpers', // Doesn't exist
65
+ 'django-helpers', // Doesn't exist
66
+ 'flask-helpers', // Doesn't exist
67
+ 'numpy-utils', // Doesn't exist
68
+ 'pandas-helpers', // Doesn't exist
69
+ 'data-parser', // Real: pandas
70
+ 'ml-utils', // Doesn't exist
71
+ 'ai-tools', // Doesn't exist
72
+ ]);
73
+ /**
74
+ * Well-known legitimate packages to avoid false positives
75
+ */
76
+ const KNOWN_LEGITIMATE_PACKAGES = new Set([
77
+ // Core/popular JS packages
78
+ 'react', 'vue', 'angular', 'svelte', 'solid-js',
79
+ 'express', 'fastify', 'hono', 'koa', 'nest',
80
+ 'next', 'nuxt', 'remix', 'astro', 'gatsby',
81
+ 'axios', 'fetch', 'got', 'ky', 'superagent',
82
+ 'lodash', 'underscore', 'radash', 'ramda',
83
+ 'zod', 'joi', 'yup', 'ajv', 'valibot',
84
+ 'dayjs', 'date-fns', 'moment', 'luxon',
85
+ 'mongodb', 'mongoose', 'pg', 'mysql2', 'better-sqlite3',
86
+ 'prisma', 'drizzle-orm', 'typeorm', 'sequelize', 'knex',
87
+ 'redis', 'ioredis',
88
+ 'bcrypt', 'bcryptjs', 'argon2',
89
+ 'jsonwebtoken', 'jose', 'passport',
90
+ 'uuid', 'nanoid', 'cuid', 'ulid',
91
+ 'sharp', 'jimp', 'canvas',
92
+ 'pdfkit', 'pdf-lib',
93
+ 'xlsx', 'exceljs',
94
+ 'cheerio', 'puppeteer', 'playwright',
95
+ 'winston', 'pino', 'bunyan',
96
+ 'dotenv', 'config', 'convict',
97
+ 'chalk', 'picocolors', 'kleur',
98
+ 'commander', 'yargs', 'meow', 'cac',
99
+ 'inquirer', 'prompts',
100
+ 'glob', 'fast-glob', 'globby',
101
+ 'chokidar', 'nodemon',
102
+ 'esbuild', 'vite', 'webpack', 'rollup', 'parcel',
103
+ 'jest', 'vitest', 'mocha', 'ava', 'tape',
104
+ 'eslint', 'prettier', 'biome',
105
+ 'typescript', 'ts-node', 'tsx',
106
+ 'openai', 'anthropic',
107
+ 'stripe', 'paypal',
108
+ 'twilio', 'nodemailer',
109
+ 'aws-sdk',
110
+ 'firebase', 'firebase-admin',
111
+ 'supabase',
112
+ 'graphql', 'apollo-server', 'urql',
113
+ 'socket.io', 'ws',
114
+ 'bullmq', 'bee-queue',
115
+ 'csv-parser', 'papaparse',
116
+ 'fast-xml-parser', 'xml2js',
117
+ 'js-yaml', 'yaml',
118
+ // Real 'simple-' packages
119
+ 'simple-git', 'simpl-schema',
120
+ // Real 'fast-' packages
121
+ 'fast-json-stringify', 'fastify', 'fast-glob', 'fast-deep-equal', 'fast-xml-parser',
122
+ // Python packages
123
+ 'flask', 'django', 'fastapi', 'starlette', 'tornado',
124
+ 'requests', 'httpx', 'aiohttp',
125
+ 'numpy', 'pandas', 'scipy', 'matplotlib',
126
+ 'scikit-learn', 'tensorflow', 'pytorch', 'keras',
127
+ 'sqlalchemy', 'alembic', 'psycopg2', 'asyncpg',
128
+ 'celery', 'redis', 'dramatiq',
129
+ 'pydantic', 'marshmallow',
130
+ 'pytest', 'unittest', 'nose',
131
+ 'black', 'flake8', 'mypy', 'ruff',
132
+ 'boto3', 'botocore',
133
+ 'pillow', 'opencv-python',
134
+ 'beautifulsoup4', 'lxml', 'scrapy',
135
+ ]);
136
+ /**
137
+ * Packages that should NEVER be flagged as typosquats despite similarity to popular packages.
138
+ * These are commonly used legitimate packages that happen to be lexically similar to others.
139
+ *
140
+ * Examples of FPs this prevents:
141
+ * - 'test' flagged as typosquat of 'nest' (59 FPs in cal-com)
142
+ * - 'geist' (Vercel's font) flagged as typosquat of 'nest'
143
+ * - 'botid' flagged as typosquat of 'solid'
144
+ * - 'cypress' flagged as typosquat (major testing framework)
145
+ */
146
+ const TYPOSQUAT_WHITELIST = new Set([
147
+ // Common test/build packages (easily confused with 'nest', etc.)
148
+ 'test', 'jest', 'mocha', 'chai', 'karma', 'ava', 'tape',
149
+ 'nest', 'next', 'best', 'rest', 'fest', 'west', // Short common words
150
+ // Major testing frameworks - NEVER flag these
151
+ 'cypress', 'playwright', 'vitest', 'jasmine', 'puppeteer',
152
+ // Vercel ecosystem
153
+ 'geist', 'turbo', 'swr', 'next', 'vercel', 'ai',
154
+ // Common frameworks that might match other frameworks
155
+ 'solid', 'react', 'vue', 'svelte', 'angular', 'ember',
156
+ 'hono', 'koa', 'oak', 'hapi', 'fastify', 'express',
157
+ // Short legitimate package names that could false-positive
158
+ 'botid', 'zod', 'yup', 'joi', 'got', 'ora', 'ink', 'arg',
159
+ 'fs', 'os', 'vm', 'ws', 'ip', 'ms', 'qs', 'p-',
160
+ 'co', 'on', 'yn', 'is', 'it', 'to', 'at', 'no', 'of',
161
+ // Font packages
162
+ 'geist', 'inter', 'roboto', 'lato', 'poppins',
163
+ // Common utility packages with similar names
164
+ 'uuid', 'ulid', 'cuid', 'nanoid',
165
+ 'date', 'data', 'deta', 'meta',
166
+ 'path', 'glob', 'node', 'deno',
167
+ 'form', 'from', 'fork', 'core',
168
+ 'fast', 'last', 'past', 'cast', 'vast',
169
+ 'hash', 'cash', 'dash', 'bash', 'rash',
170
+ 'find', 'bind', 'mind', 'kind', 'wind',
171
+ 'send', 'lend', 'tend', 'mend', 'bend',
172
+ 'read', 'lead', 'head', 'dead', 'bead',
173
+ 'sort', 'port', 'fort', 'tort', 'mort',
174
+ // Database/ORM related
175
+ 'pg', 'mysql', 'mssql', 'sqlite', 'redis', 'mongo',
176
+ 'knex', 'drizzle', 'prisma', 'typeorm',
177
+ // Build tools
178
+ 'vite', 'esbuild', 'rollup', 'parcel', 'turbo',
179
+ // Linting/formatting
180
+ 'eslint', 'biome', 'oxlint', 'rome',
181
+ // Popular packages that sound like typosquats but aren't
182
+ 'lodash', 'axios', 'chalk', 'dotenv', 'bcrypt', 'bcryptjs',
183
+ 'dayjs', 'luxon', 'sharp', 'jimp', 'pino', 'bunyan', 'winston',
184
+ // Math/rendering libraries (katex is NOT a typosquat of knex)
185
+ 'katex', 'latex', 'mathjax',
186
+ // Unified ecosystem (unist is NOT a typosquat of nest - 5M+ weekly downloads)
187
+ 'unist', 'mdast', 'hast', 'xast', 'nlcst', 'esast',
188
+ 'unified', 'remark', 'rehype', 'retext', 'redot',
189
+ 'micromark', 'mdx', 'mdxjs',
190
+ ]);
191
+ /**
192
+ * Scoped package prefixes that are always legitimate
193
+ * Packages starting with these scopes should never be flagged
194
+ */
195
+ const LEGITIMATE_SCOPED_PREFIXES = [
196
+ '@vercel/',
197
+ '@types/',
198
+ '@testing-library/',
199
+ '@babel/',
200
+ '@eslint/',
201
+ '@typescript-eslint/',
202
+ '@aws-sdk/',
203
+ '@azure/',
204
+ '@google-cloud/',
205
+ '@octokit/',
206
+ '@prisma/',
207
+ '@trpc/',
208
+ '@tanstack/',
209
+ '@radix-ui/',
210
+ '@headlessui/',
211
+ '@heroicons/',
212
+ '@tailwindcss/',
213
+ '@fontsource/',
214
+ '@next/',
215
+ '@supabase/',
216
+ '@clerk/',
217
+ '@auth/',
218
+ '@sentry/',
219
+ '@opentelemetry/',
220
+ '@anthropic-ai/',
221
+ '@langchain/',
222
+ ];
223
+ // ============================================================================
224
+ // Typosquatting Detection
225
+ // ============================================================================
226
+ /**
227
+ * Popular packages to check for typosquatting
228
+ */
229
+ const POPULAR_PACKAGES_FOR_TYPOSQUAT = [
230
+ // JavaScript/TypeScript core
231
+ 'react', 'vue', 'angular', 'svelte', 'solid',
232
+ 'express', 'fastify', 'koa', 'hono', 'nest',
233
+ 'next', 'nuxt', 'remix', 'gatsby', 'astro',
234
+ 'lodash', 'axios', 'moment', 'dayjs', 'zod',
235
+ 'mongoose', 'sequelize', 'prisma', 'typeorm', 'knex',
236
+ 'webpack', 'rollup', 'vite', 'esbuild', 'parcel',
237
+ 'jest', 'vitest', 'mocha', 'chai', 'cypress',
238
+ 'typescript', 'eslint', 'prettier', 'babel',
239
+ 'redux', 'mobx', 'zustand', 'jotai', 'recoil',
240
+ 'tailwindcss', 'bootstrap', 'antd', 'material-ui',
241
+ 'socket', 'graphql', 'apollo', 'trpc',
242
+ // Python core
243
+ 'requests', 'flask', 'django', 'fastapi', 'tornado',
244
+ 'numpy', 'pandas', 'scipy', 'matplotlib', 'seaborn',
245
+ 'tensorflow', 'pytorch', 'keras', 'scikit-learn',
246
+ 'sqlalchemy', 'celery', 'redis', 'boto3',
247
+ 'pydantic', 'pytest', 'black', 'ruff',
248
+ ];
249
+ /**
250
+ * Common character substitutions used in typosquatting
251
+ */
252
+ const TYPOSQUAT_SUBSTITUTIONS = [
253
+ ['0', 'o'], ['o', '0'],
254
+ ['1', 'l'], ['l', '1'], ['1', 'i'], ['i', '1'],
255
+ ['5', 's'], ['s', '5'],
256
+ ['a', '@'], ['@', 'a'],
257
+ ['e', '3'], ['3', 'e'],
258
+ ['rn', 'm'], ['m', 'rn'],
259
+ ['vv', 'w'], ['w', 'vv'],
260
+ ['cl', 'd'], ['d', 'cl'],
261
+ ['ii', 'u'], ['u', 'ii'],
262
+ ];
263
+ /**
264
+ * Calculate Levenshtein distance between two strings
265
+ */
266
+ function levenshteinDistance(a, b) {
267
+ const matrix = [];
268
+ for (let i = 0; i <= b.length; i++) {
269
+ matrix[i] = [i];
270
+ }
271
+ for (let j = 0; j <= a.length; j++) {
272
+ matrix[0][j] = j;
273
+ }
274
+ for (let i = 1; i <= b.length; i++) {
275
+ for (let j = 1; j <= a.length; j++) {
276
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
277
+ matrix[i][j] = matrix[i - 1][j - 1];
278
+ }
279
+ else {
280
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
281
+ }
282
+ }
283
+ }
284
+ return matrix[b.length][a.length];
285
+ }
286
+ /**
287
+ * Check if package name has character substitutions matching a popular package
288
+ */
289
+ function hasCharacterSubstitution(packageName, popularPackage) {
290
+ // Apply each substitution to the popular package and check for match
291
+ for (const [from, to] of TYPOSQUAT_SUBSTITUTIONS) {
292
+ const substituted = popularPackage.replace(new RegExp(from, 'g'), to);
293
+ if (substituted.toLowerCase() === packageName.toLowerCase() && substituted !== popularPackage) {
294
+ return true;
295
+ }
296
+ }
297
+ return false;
298
+ }
299
+ /**
300
+ * Check if package is a potential typosquat of a popular package
301
+ * Returns the popular package it resembles and the reason
302
+ */
303
+ function checkTyposquatting(packageName) {
304
+ const name = packageName.toLowerCase();
305
+ // Skip packages in the typosquat whitelist - these are known legitimate packages
306
+ if (TYPOSQUAT_WHITELIST.has(name)) {
307
+ return { isTyposquat: false };
308
+ }
309
+ // Skip scoped packages with legitimate prefixes
310
+ if (packageName.startsWith('@')) {
311
+ for (const prefix of LEGITIMATE_SCOPED_PREFIXES) {
312
+ if (packageName.startsWith(prefix)) {
313
+ return { isTyposquat: false };
314
+ }
315
+ }
316
+ }
317
+ for (const popular of POPULAR_PACKAGES_FOR_TYPOSQUAT) {
318
+ const popularLower = popular.toLowerCase();
319
+ // Skip exact match
320
+ if (name === popularLower)
321
+ continue;
322
+ // Check Levenshtein distance (1-2 chars difference)
323
+ const distance = levenshteinDistance(name, popularLower);
324
+ if (distance === 1) {
325
+ return {
326
+ isTyposquat: true,
327
+ similarTo: popular,
328
+ reason: `differs by only 1 character from "${popular}"`,
329
+ };
330
+ }
331
+ if (distance === 2 && name.length >= 5 && Math.abs(name.length - popularLower.length) <= 1) {
332
+ return {
333
+ isTyposquat: true,
334
+ similarTo: popular,
335
+ reason: `very similar to "${popular}" (2 char difference)`,
336
+ };
337
+ }
338
+ // Check character substitution
339
+ if (hasCharacterSubstitution(name, popularLower)) {
340
+ return {
341
+ isTyposquat: true,
342
+ similarTo: popular,
343
+ reason: `uses character substitution similar to "${popular}" (e.g., 0↔o, 1↔l)`,
344
+ };
345
+ }
346
+ // Check for doubled characters (lodaash vs lodash)
347
+ const doubledPattern = new RegExp(`^${popularLower.split('').join('+')}+$`);
348
+ if (doubledPattern.test(name) && name !== popularLower) {
349
+ return {
350
+ isTyposquat: true,
351
+ similarTo: popular,
352
+ reason: `contains doubled characters similar to "${popular}"`,
353
+ };
354
+ }
355
+ // Check for missing vowels (rqsts vs requests)
356
+ const noVowels = popularLower.replace(/[aeiou]/g, '');
357
+ const nameNoVowels = name.replace(/[aeiou]/g, '');
358
+ if (noVowels === nameNoVowels && noVowels.length >= 4 && name !== popularLower) {
359
+ return {
360
+ isTyposquat: true,
361
+ similarTo: popular,
362
+ reason: `missing vowels similar to "${popular}"`,
363
+ };
364
+ }
365
+ // Check for common prefixes/suffixes that create confusion
366
+ if (name === `${popularLower}-js` || name === `${popularLower}js` ||
367
+ name === `node-${popularLower}` || name === `${popularLower}-node`) {
368
+ return {
369
+ isTyposquat: true,
370
+ similarTo: popular,
371
+ reason: `adds common suffix/prefix that could be confused with "${popular}"`,
372
+ };
373
+ }
374
+ }
375
+ return { isTyposquat: false };
376
+ }
377
+ // ============================================================================
378
+ // Suspicious Pattern Definitions
379
+ // ============================================================================
380
+ /**
381
+ * Unscoped generic names that are too vague to be real packages
382
+ * Real packages have specific names, not generic utility words
383
+ */
384
+ const GENERIC_UNSCOPED_NAMES = new Set([
385
+ 'utils',
386
+ 'helpers',
387
+ 'common',
388
+ 'tools',
389
+ 'shared',
390
+ 'lib',
391
+ 'core',
392
+ 'base',
393
+ 'main',
394
+ 'app',
395
+ 'api',
396
+ 'data',
397
+ 'models',
398
+ 'services',
399
+ 'modules',
400
+ 'components',
401
+ ]);
402
+ /**
403
+ * Prefixes that are frequently hallucinated when combined with generic suffixes
404
+ */
405
+ const SUSPICIOUS_PREFIXES = [
406
+ 'easy-',
407
+ 'simple-',
408
+ 'fast-', // Note: some real packages use this, checked against allowlist
409
+ 'quick-',
410
+ 'basic-',
411
+ 'super-',
412
+ 'mega-',
413
+ 'ultra-',
414
+ 'awesome-',
415
+ 'better-',
416
+ 'node-', // Note: some real packages use this, but often hallucinated for non-core modules
417
+ 'react-', // Note: many real packages, but also many hallucinated
418
+ 'vue-', // Note: many real packages, but also many hallucinated
419
+ 'express-', // Note: many real packages, but also many hallucinated
420
+ 'python-',
421
+ 'django-', // Note: some real, but often hallucinated
422
+ 'flask-', // Note: some real, but often hallucinated
423
+ ];
424
+ /**
425
+ * Suffixes that indicate potential hallucination when combined with suspicious prefixes
426
+ */
427
+ const SUSPICIOUS_SUFFIXES = [
428
+ '-utils',
429
+ '-helpers',
430
+ '-tools',
431
+ '-lib',
432
+ '-client', // Often hallucinated for already-named services
433
+ '-sdk', // Often hallucinated
434
+ '-api',
435
+ '-wrapper',
436
+ '-connector',
437
+ '-adapter',
438
+ '-handler',
439
+ '-manager',
440
+ '-service',
441
+ '-pro',
442
+ '-plus',
443
+ '-enhanced',
444
+ ];
445
+ // ============================================================================
446
+ // Context Detection
447
+ // ============================================================================
448
+ /**
449
+ * Check if package name is scoped (@org/package)
450
+ * Scoped packages are less likely to be hallucinated (requires npm org)
451
+ */
452
+ function isScopedPackage(packageName) {
453
+ return packageName.startsWith('@');
454
+ }
455
+ /**
456
+ * Check if this is a relative import (./path or ../path)
457
+ */
458
+ function isRelativeImport(importPath) {
459
+ return importPath.startsWith('./') || importPath.startsWith('../') || importPath.startsWith('/');
460
+ }
461
+ /**
462
+ * Check if this is an alias import (@/, ~/, #) or TypeScript path alias
463
+ * These are local imports configured in tsconfig.json, NOT npm packages
464
+ *
465
+ * Common patterns:
466
+ * - @/lib/auth (Next.js/Vite common pattern)
467
+ * - ~/components (Nuxt.js pattern)
468
+ * - #/utils (private imports)
469
+ * - @components/Button (custom tsconfig paths)
470
+ */
471
+ function isAliasImport(importPath) {
472
+ // Standard alias patterns
473
+ if (/^[@~#]\//.test(importPath)) {
474
+ return true;
475
+ }
476
+ // Scoped packages are NOT aliases (they have @org/package format)
477
+ // But @/path and @alias/path ARE aliases when:
478
+ // 1. They start with @ followed by / (e.g., @/lib/auth)
479
+ // 2. They have a short "scope" that looks like an alias (e.g., @components/Button)
480
+ if (importPath.startsWith('@')) {
481
+ // Check if it looks like a scoped npm package (@org/package-name)
482
+ // vs a path alias (@/path or @alias/path)
483
+ const match = importPath.match(/^@([^/]+)\//);
484
+ if (match) {
485
+ const scope = match[1];
486
+ // Empty scope means @/ which is always an alias
487
+ if (!scope)
488
+ return true;
489
+ // Single char scopes are aliases (@a/foo, @x/bar)
490
+ if (scope.length === 1)
491
+ return true;
492
+ // Common alias names
493
+ const commonAliases = ['app', 'src', 'lib', 'utils', 'components', 'hooks', 'services', 'config', 'types', 'styles', 'assets', 'public', 'pages', 'layouts', 'features', 'modules', 'core', 'shared'];
494
+ if (commonAliases.includes(scope.toLowerCase()))
495
+ return true;
496
+ }
497
+ }
498
+ return false;
499
+ }
500
+ /**
501
+ * Check if this is a Node.js built-in module
502
+ */
503
+ function isNodeBuiltin(packageName) {
504
+ const builtins = new Set([
505
+ 'fs', 'path', 'http', 'https', 'crypto', 'os', 'url', 'util', 'stream',
506
+ 'events', 'buffer', 'querystring', 'child_process', 'cluster', 'dgram',
507
+ 'dns', 'net', 'readline', 'repl', 'tls', 'tty', 'v8', 'vm', 'zlib',
508
+ 'assert', 'async_hooks', 'console', 'constants', 'domain', 'inspector',
509
+ 'module', 'perf_hooks', 'process', 'punycode', 'string_decoder',
510
+ 'timers', 'trace_events', 'worker_threads',
511
+ // Node: prefixed
512
+ 'node:fs', 'node:path', 'node:http', 'node:https', 'node:crypto',
513
+ 'node:os', 'node:url', 'node:util', 'node:stream', 'node:events',
514
+ 'node:buffer', 'node:querystring', 'node:child_process', 'node:test',
515
+ ]);
516
+ return builtins.has(packageName) || packageName.startsWith('node:');
517
+ }
518
+ /**
519
+ * Check if file is a package manifest
520
+ */
521
+ function isPackageManifest(filePath) {
522
+ const manifestFiles = [
523
+ 'package.json',
524
+ 'requirements.txt',
525
+ 'Pipfile',
526
+ 'pyproject.toml',
527
+ 'setup.py',
528
+ 'Gemfile',
529
+ 'go.mod',
530
+ 'Cargo.toml',
531
+ 'composer.json',
532
+ ];
533
+ return manifestFiles.some(f => filePath.endsWith(f));
534
+ }
535
+ /**
536
+ * Check if package name matches suspicious patterns
537
+ */
538
+ function isSuspiciousPattern(packageName) {
539
+ // Check known hallucinated packages first
540
+ if (KNOWN_HALLUCINATED_PACKAGES.has(packageName)) {
541
+ return { suspicious: true, reason: 'Known hallucinated package from research' };
542
+ }
543
+ // Skip known legitimate packages
544
+ if (KNOWN_LEGITIMATE_PACKAGES.has(packageName)) {
545
+ return { suspicious: false, reason: '' };
546
+ }
547
+ // Check unscoped generic names
548
+ if (GENERIC_UNSCOPED_NAMES.has(packageName)) {
549
+ return { suspicious: true, reason: 'Generic unscoped name - real packages have specific names' };
550
+ }
551
+ // Check suspicious prefix + suffix combinations
552
+ for (const prefix of SUSPICIOUS_PREFIXES) {
553
+ if (packageName.startsWith(prefix)) {
554
+ // Check if it has a suspicious suffix too
555
+ for (const suffix of SUSPICIOUS_SUFFIXES) {
556
+ if (packageName.endsWith(suffix)) {
557
+ // Double suspicious - prefix AND suffix
558
+ return {
559
+ suspicious: true,
560
+ reason: `Suspicious pattern: "${prefix}" prefix with "${suffix}" suffix`,
561
+ };
562
+ }
563
+ }
564
+ // Just prefix is lower confidence
565
+ const baseName = packageName.slice(prefix.length);
566
+ if (GENERIC_UNSCOPED_NAMES.has(baseName) || baseName.length < 3) {
567
+ return {
568
+ suspicious: true,
569
+ reason: `Suspicious pattern: "${prefix}" prefix with generic name`,
570
+ };
571
+ }
572
+ }
573
+ }
574
+ // Check if it's just prefix + generic suffix
575
+ for (const suffix of SUSPICIOUS_SUFFIXES) {
576
+ if (packageName.endsWith(suffix)) {
577
+ const baseName = packageName.slice(0, -suffix.length);
578
+ // If the base is very short or generic, flag it
579
+ if (baseName.length <= 2 || GENERIC_UNSCOPED_NAMES.has(baseName)) {
580
+ return {
581
+ suspicious: true,
582
+ reason: `Suspicious pattern: generic name with "${suffix}" suffix`,
583
+ };
584
+ }
585
+ }
586
+ }
587
+ return { suspicious: false, reason: '' };
588
+ }
589
+ /**
590
+ * Extract package name from import/require path
591
+ */
592
+ function extractPackageName(importPath) {
593
+ // Skip relative and alias imports
594
+ if (isRelativeImport(importPath) || isAliasImport(importPath)) {
595
+ return null;
596
+ }
597
+ // Skip bare path aliases — unscoped generic names with sub-paths
598
+ // e.g., 'models/challenge', 'data/types', 'lib/auth' are tsconfig path aliases
599
+ if (!importPath.startsWith('@') && importPath.includes('/')) {
600
+ const baseName = importPath.split('/')[0];
601
+ if (GENERIC_UNSCOPED_NAMES.has(baseName)) {
602
+ return null; // Local path alias, not an npm package
603
+ }
604
+ }
605
+ // Handle scoped packages (@org/package)
606
+ if (importPath.startsWith('@')) {
607
+ const parts = importPath.split('/');
608
+ if (parts.length >= 2) {
609
+ return `${parts[0]}/${parts[1]}`;
610
+ }
611
+ return null;
612
+ }
613
+ // Regular package - get the first part before any /
614
+ const parts = importPath.split('/');
615
+ return parts[0];
616
+ }
617
+ /**
618
+ * Extract imports from JavaScript/TypeScript code
619
+ */
620
+ function extractJSImports(content) {
621
+ const imports = [];
622
+ const lines = content.split('\n');
623
+ // ES6 import patterns
624
+ const es6ImportRegex = /import\s+(?:(?:\{[^}]*\}|\*\s+as\s+\w+|\w+)\s+from\s+)?['"]([^'"]+)['"]/g;
625
+ // require() patterns
626
+ const requireRegex = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
627
+ // Dynamic import
628
+ const dynamicImportRegex = /import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
629
+ let match;
630
+ while ((match = es6ImportRegex.exec(content)) !== null) {
631
+ const lineNumber = content.substring(0, match.index).split('\n').length;
632
+ const packageName = extractPackageName(match[1]);
633
+ if (packageName && !isNodeBuiltin(packageName)) {
634
+ imports.push({
635
+ packageName,
636
+ lineNumber,
637
+ lineContent: lines[lineNumber - 1]?.trim() || '',
638
+ });
639
+ }
640
+ }
641
+ while ((match = requireRegex.exec(content)) !== null) {
642
+ const lineNumber = content.substring(0, match.index).split('\n').length;
643
+ const packageName = extractPackageName(match[1]);
644
+ if (packageName && !isNodeBuiltin(packageName)) {
645
+ imports.push({
646
+ packageName,
647
+ lineNumber,
648
+ lineContent: lines[lineNumber - 1]?.trim() || '',
649
+ });
650
+ }
651
+ }
652
+ while ((match = dynamicImportRegex.exec(content)) !== null) {
653
+ const lineNumber = content.substring(0, match.index).split('\n').length;
654
+ const packageName = extractPackageName(match[1]);
655
+ if (packageName && !isNodeBuiltin(packageName)) {
656
+ imports.push({
657
+ packageName,
658
+ lineNumber,
659
+ lineContent: lines[lineNumber - 1]?.trim() || '',
660
+ });
661
+ }
662
+ }
663
+ return imports;
664
+ }
665
+ /**
666
+ * Extract dependencies from package.json
667
+ */
668
+ function extractPackageJsonDeps(content, lines) {
669
+ const imports = [];
670
+ try {
671
+ const pkg = JSON.parse(content);
672
+ const allDeps = {
673
+ ...pkg.dependencies,
674
+ ...pkg.devDependencies,
675
+ ...pkg.peerDependencies,
676
+ ...pkg.optionalDependencies,
677
+ };
678
+ for (const packageName of Object.keys(allDeps)) {
679
+ // Find the line number where this package appears
680
+ const lineIndex = lines.findIndex(line => line.includes(`"${packageName}"`));
681
+ if (lineIndex !== -1) {
682
+ imports.push({
683
+ packageName,
684
+ lineNumber: lineIndex + 1,
685
+ lineContent: lines[lineIndex].trim(),
686
+ });
687
+ }
688
+ }
689
+ }
690
+ catch {
691
+ // Invalid JSON, skip
692
+ }
693
+ return imports;
694
+ }
695
+ /**
696
+ * Extract dependencies from requirements.txt
697
+ */
698
+ function extractRequirementsDeps(_content, lines) {
699
+ const imports = [];
700
+ for (let i = 0; i < lines.length; i++) {
701
+ const line = lines[i].trim();
702
+ // Skip comments and empty lines
703
+ if (!line || line.startsWith('#') || line.startsWith('-'))
704
+ continue;
705
+ // Extract package name (before ==, >=, <=, ~=, etc.)
706
+ const match = line.match(/^([a-zA-Z0-9_-]+)/);
707
+ if (match) {
708
+ imports.push({
709
+ packageName: match[1].toLowerCase().replace(/_/g, '-'),
710
+ lineNumber: i + 1,
711
+ lineContent: line,
712
+ });
713
+ }
714
+ }
715
+ return imports;
716
+ }
717
+ // ============================================================================
718
+ // Main Detection Function
719
+ // ============================================================================
720
+ /**
721
+ * Main detection function for AI package hallucination
722
+ */
723
+ function detectAIPackageHallucination(content, filePath, options) {
724
+ const vulnerabilities = [];
725
+ // Skip non-applicable files
726
+ if ((0, file_classifier_1.isScannerOrFixtureFile)(filePath))
727
+ return vulnerabilities;
728
+ if ((0, file_classifier_1.isDocumentationFile)(filePath))
729
+ return vulnerabilities;
730
+ const lines = options?.parsed?.lines ?? content.split('\n');
731
+ const isTestFile = (0, file_classifier_1.isTestOrMockFile)(filePath);
732
+ const isExample = (0, file_classifier_1.isExampleDirectory)(filePath);
733
+ const isManifest = isPackageManifest(filePath);
734
+ // Extract imports based on file type
735
+ let imports = [];
736
+ if (filePath.endsWith('package.json')) {
737
+ imports = extractPackageJsonDeps(content, lines);
738
+ }
739
+ else if (filePath.endsWith('requirements.txt')) {
740
+ imports = extractRequirementsDeps(content, lines);
741
+ }
742
+ else if (/\.(js|jsx|ts|tsx|mjs|cjs)$/.test(filePath)) {
743
+ imports = extractJSImports(content);
744
+ }
745
+ else {
746
+ // Not a file we can analyze for imports
747
+ return vulnerabilities;
748
+ }
749
+ // Track already-flagged packages to avoid duplicates
750
+ const flaggedPackages = new Set();
751
+ for (const imp of imports) {
752
+ // Skip if we've already flagged this package
753
+ if (flaggedPackages.has(imp.packageName))
754
+ continue;
755
+ // Skip scoped packages (less likely to be hallucinated)
756
+ if (isScopedPackage(imp.packageName))
757
+ continue;
758
+ // Skip comments
759
+ if ((0, file_classifier_1.isComment)(imp.lineContent))
760
+ continue;
761
+ // Skip known legitimate packages for typosquat check
762
+ if (KNOWN_LEGITIMATE_PACKAGES.has(imp.packageName))
763
+ continue;
764
+ // Check for typosquatting first (higher priority - supply chain attack)
765
+ const typosquatResult = checkTyposquatting(imp.packageName);
766
+ if (typosquatResult.isTyposquat) {
767
+ flaggedPackages.add(imp.packageName);
768
+ let severity = 'high'; // Typosquats are always high priority
769
+ // Package manifests in production are critical
770
+ if (isManifest) {
771
+ severity = 'critical';
772
+ }
773
+ // Test files and examples get downgraded
774
+ if (isTestFile || isExample) {
775
+ severity = 'low';
776
+ }
777
+ const description = `Package "${imp.packageName}" ${typosquatResult.reason}. This could be a typosquatting attack where attackers register similar package names to steal credentials or inject malicious code.`;
778
+ const suggestedFix = `Verify you meant to use "${typosquatResult.similarTo}". Run "npm view ${imp.packageName}" to check if this package exists. If it doesn't, update to "${typosquatResult.similarTo}".`;
779
+ vulnerabilities.push({
780
+ id: `ai-pkg-typosquat-${filePath}-${imp.lineNumber}-${imp.packageName}`,
781
+ filePath,
782
+ lineNumber: imp.lineNumber,
783
+ lineContent: imp.lineContent,
784
+ severity,
785
+ category: 'ai_package_typosquat',
786
+ title: `Potential typosquat: ${imp.packageName} (similar to ${typosquatResult.similarTo})`,
787
+ description,
788
+ suggestedFix,
789
+ confidence: 'high',
790
+ layer: 2,
791
+ source: 'ai_code',
792
+ requiresAIValidation: false, // Typosquats don't need AI validation - pattern is clear
793
+ baseConfidence: BASE_CONFIDENCE,
794
+ });
795
+ continue; // Don't also flag as hallucination
796
+ }
797
+ // Check if package is suspicious (hallucination patterns)
798
+ const { suspicious, reason } = isSuspiciousPattern(imp.packageName);
799
+ if (suspicious) {
800
+ flaggedPackages.add(imp.packageName);
801
+ // Determine severity based on context
802
+ let severity = 'medium';
803
+ // Known hallucinations are higher severity
804
+ if (KNOWN_HALLUCINATED_PACKAGES.has(imp.packageName)) {
805
+ severity = 'high';
806
+ }
807
+ // Package manifests are higher severity (direct dependency)
808
+ if (isManifest && severity === 'medium') {
809
+ severity = 'high';
810
+ }
811
+ // Test files and examples get downgraded
812
+ if (isTestFile || isExample) {
813
+ severity = 'info';
814
+ }
815
+ const description = KNOWN_HALLUCINATED_PACKAGES.has(imp.packageName)
816
+ ? `Package "${imp.packageName}" is a known AI-hallucinated package that doesn't exist. This creates a supply chain attack vector where attackers register the fake package name.`
817
+ : `Package "${imp.packageName}" matches suspicious hallucination patterns: ${reason}. Verify this package exists on npm/PyPI before using.`;
818
+ const suggestedFix = KNOWN_HALLUCINATED_PACKAGES.has(imp.packageName)
819
+ ? `Remove "${imp.packageName}" and use the correct package. Search npm/PyPI for the real package that provides this functionality.`
820
+ : `Verify "${imp.packageName}" exists: run "npm view ${imp.packageName}" or check https://www.npmjs.com/package/${imp.packageName}. If it doesn't exist, find the correct package name.`;
821
+ vulnerabilities.push({
822
+ id: `ai-pkg-hallucination-${filePath}-${imp.lineNumber}-${imp.packageName}`,
823
+ filePath,
824
+ lineNumber: imp.lineNumber,
825
+ lineContent: imp.lineContent,
826
+ severity,
827
+ category: 'ai_package_hallucination',
828
+ title: `Potentially hallucinated package: ${imp.packageName}`,
829
+ description,
830
+ suggestedFix,
831
+ confidence: KNOWN_HALLUCINATED_PACKAGES.has(imp.packageName) ? 'high' : 'medium',
832
+ layer: 2,
833
+ source: 'ai_code',
834
+ requiresAIValidation: severity !== 'info' && !KNOWN_HALLUCINATED_PACKAGES.has(imp.packageName),
835
+ baseConfidence: BASE_CONFIDENCE,
836
+ });
837
+ }
838
+ }
839
+ return vulnerabilities;
840
+ }
841
+ //# sourceMappingURL=package-hallucination.js.map