@oculum/scanner 1.0.9 → 1.0.11

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 (365) hide show
  1. package/dist/baseline/diff.d.ts +32 -0
  2. package/dist/baseline/diff.d.ts.map +1 -0
  3. package/dist/baseline/diff.js +119 -0
  4. package/dist/baseline/diff.js.map +1 -0
  5. package/dist/baseline/index.d.ts +9 -0
  6. package/dist/baseline/index.d.ts.map +1 -0
  7. package/dist/baseline/index.js +19 -0
  8. package/dist/baseline/index.js.map +1 -0
  9. package/dist/baseline/manager.d.ts +67 -0
  10. package/dist/baseline/manager.d.ts.map +1 -0
  11. package/dist/baseline/manager.js +180 -0
  12. package/dist/baseline/manager.js.map +1 -0
  13. package/dist/baseline/types.d.ts +91 -0
  14. package/dist/baseline/types.d.ts.map +1 -0
  15. package/dist/baseline/types.js +12 -0
  16. package/dist/baseline/types.js.map +1 -0
  17. package/dist/formatters/cli-terminal.d.ts +38 -0
  18. package/dist/formatters/cli-terminal.d.ts.map +1 -1
  19. package/dist/formatters/cli-terminal.js +365 -42
  20. package/dist/formatters/cli-terminal.js.map +1 -1
  21. package/dist/formatters/github-comment.d.ts +1 -1
  22. package/dist/formatters/github-comment.d.ts.map +1 -1
  23. package/dist/formatters/github-comment.js +75 -11
  24. package/dist/formatters/github-comment.js.map +1 -1
  25. package/dist/formatters/index.d.ts +1 -1
  26. package/dist/formatters/index.d.ts.map +1 -1
  27. package/dist/formatters/index.js +4 -1
  28. package/dist/formatters/index.js.map +1 -1
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +155 -16
  32. package/dist/index.js.map +1 -1
  33. package/dist/layer1/config-audit.d.ts.map +1 -1
  34. package/dist/layer1/config-audit.js +20 -3
  35. package/dist/layer1/config-audit.js.map +1 -1
  36. package/dist/layer1/config-mcp-audit.d.ts +20 -0
  37. package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
  38. package/dist/layer1/config-mcp-audit.js +239 -0
  39. package/dist/layer1/config-mcp-audit.js.map +1 -0
  40. package/dist/layer1/index.d.ts +1 -0
  41. package/dist/layer1/index.d.ts.map +1 -1
  42. package/dist/layer1/index.js +9 -1
  43. package/dist/layer1/index.js.map +1 -1
  44. package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
  45. package/dist/layer2/ai-agent-tools.js +303 -0
  46. package/dist/layer2/ai-agent-tools.js.map +1 -1
  47. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
  48. package/dist/layer2/ai-endpoint-protection.js +17 -3
  49. package/dist/layer2/ai-endpoint-protection.js.map +1 -1
  50. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
  51. package/dist/layer2/ai-execution-sinks.js +462 -12
  52. package/dist/layer2/ai-execution-sinks.js.map +1 -1
  53. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
  54. package/dist/layer2/ai-fingerprinting.js +3 -0
  55. package/dist/layer2/ai-fingerprinting.js.map +1 -1
  56. package/dist/layer2/ai-mcp-security.d.ts +17 -0
  57. package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
  58. package/dist/layer2/ai-mcp-security.js +679 -0
  59. package/dist/layer2/ai-mcp-security.js.map +1 -0
  60. package/dist/layer2/ai-package-hallucination.d.ts +19 -0
  61. package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
  62. package/dist/layer2/ai-package-hallucination.js +696 -0
  63. package/dist/layer2/ai-package-hallucination.js.map +1 -0
  64. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
  65. package/dist/layer2/ai-prompt-hygiene.js +495 -9
  66. package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
  67. package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
  68. package/dist/layer2/ai-rag-safety.js +372 -1
  69. package/dist/layer2/ai-rag-safety.js.map +1 -1
  70. package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
  71. package/dist/layer2/auth-antipatterns.js +4 -0
  72. package/dist/layer2/auth-antipatterns.js.map +1 -1
  73. package/dist/layer2/byok-patterns.d.ts.map +1 -1
  74. package/dist/layer2/byok-patterns.js +3 -0
  75. package/dist/layer2/byok-patterns.js.map +1 -1
  76. package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
  77. package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
  78. package/dist/layer2/dangerous-functions/child-process.js +74 -0
  79. package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
  80. package/dist/layer2/dangerous-functions/dom-xss.d.ts +29 -0
  81. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
  82. package/dist/layer2/dangerous-functions/dom-xss.js +179 -0
  83. package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
  84. package/dist/layer2/dangerous-functions/index.d.ts +13 -0
  85. package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
  86. package/dist/layer2/dangerous-functions/index.js +621 -0
  87. package/dist/layer2/dangerous-functions/index.js.map +1 -0
  88. package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
  89. package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
  90. package/dist/layer2/dangerous-functions/json-parse.js +319 -0
  91. package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
  92. package/dist/layer2/dangerous-functions/math-random.d.ts +61 -0
  93. package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
  94. package/dist/layer2/dangerous-functions/math-random.js +459 -0
  95. package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
  96. package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
  97. package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
  98. package/dist/layer2/dangerous-functions/patterns.js +161 -0
  99. package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
  100. package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
  101. package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
  102. package/dist/layer2/dangerous-functions/request-validation.js +119 -0
  103. package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
  104. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +23 -0
  105. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  106. package/dist/layer2/dangerous-functions/utils/control-flow.js +149 -0
  107. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
  108. package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
  109. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
  110. package/dist/layer2/dangerous-functions/utils/helpers.js +124 -0
  111. package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
  112. package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
  113. package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
  114. package/dist/layer2/dangerous-functions/utils/index.js +23 -0
  115. package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
  116. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
  117. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  118. package/dist/layer2/dangerous-functions/utils/schema-validation.js +89 -0
  119. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
  120. package/dist/layer2/data-exposure.d.ts.map +1 -1
  121. package/dist/layer2/data-exposure.js +3 -0
  122. package/dist/layer2/data-exposure.js.map +1 -1
  123. package/dist/layer2/framework-checks.d.ts.map +1 -1
  124. package/dist/layer2/framework-checks.js +3 -0
  125. package/dist/layer2/framework-checks.js.map +1 -1
  126. package/dist/layer2/index.d.ts +3 -0
  127. package/dist/layer2/index.d.ts.map +1 -1
  128. package/dist/layer2/index.js +61 -2
  129. package/dist/layer2/index.js.map +1 -1
  130. package/dist/layer2/logic-gates.d.ts.map +1 -1
  131. package/dist/layer2/logic-gates.js +4 -0
  132. package/dist/layer2/logic-gates.js.map +1 -1
  133. package/dist/layer2/model-supply-chain.d.ts +20 -0
  134. package/dist/layer2/model-supply-chain.d.ts.map +1 -0
  135. package/dist/layer2/model-supply-chain.js +376 -0
  136. package/dist/layer2/model-supply-chain.js.map +1 -0
  137. package/dist/layer2/risky-imports.d.ts.map +1 -1
  138. package/dist/layer2/risky-imports.js +4 -0
  139. package/dist/layer2/risky-imports.js.map +1 -1
  140. package/dist/layer2/variables.d.ts.map +1 -1
  141. package/dist/layer2/variables.js +4 -0
  142. package/dist/layer2/variables.js.map +1 -1
  143. package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
  144. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
  145. package/dist/layer3/anthropic/auto-dismiss.js +188 -0
  146. package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
  147. package/dist/layer3/anthropic/clients.d.ts +44 -0
  148. package/dist/layer3/anthropic/clients.d.ts.map +1 -0
  149. package/dist/layer3/anthropic/clients.js +81 -0
  150. package/dist/layer3/anthropic/clients.js.map +1 -0
  151. package/dist/layer3/anthropic/index.d.ts +41 -0
  152. package/dist/layer3/anthropic/index.d.ts.map +1 -0
  153. package/dist/layer3/anthropic/index.js +141 -0
  154. package/dist/layer3/anthropic/index.js.map +1 -0
  155. package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
  156. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
  157. package/dist/layer3/anthropic/prompts/index.js +14 -0
  158. package/dist/layer3/anthropic/prompts/index.js.map +1 -0
  159. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
  160. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
  161. package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
  162. package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
  163. package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
  164. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
  165. package/dist/layer3/anthropic/prompts/validation.js +421 -0
  166. package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
  167. package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
  168. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
  169. package/dist/layer3/anthropic/providers/anthropic.js +266 -0
  170. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
  171. package/dist/layer3/anthropic/providers/index.d.ts +8 -0
  172. package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
  173. package/dist/layer3/anthropic/providers/index.js +15 -0
  174. package/dist/layer3/anthropic/providers/index.js.map +1 -0
  175. package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
  176. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
  177. package/dist/layer3/anthropic/providers/openai.js +340 -0
  178. package/dist/layer3/anthropic/providers/openai.js.map +1 -0
  179. package/dist/layer3/anthropic/request-builder.d.ts +20 -0
  180. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
  181. package/dist/layer3/anthropic/request-builder.js +134 -0
  182. package/dist/layer3/anthropic/request-builder.js.map +1 -0
  183. package/dist/layer3/anthropic/types.d.ts +88 -0
  184. package/dist/layer3/anthropic/types.d.ts.map +1 -0
  185. package/dist/layer3/anthropic/types.js +38 -0
  186. package/dist/layer3/anthropic/types.js.map +1 -0
  187. package/dist/layer3/anthropic/utils/index.d.ts +9 -0
  188. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
  189. package/dist/layer3/anthropic/utils/index.js +24 -0
  190. package/dist/layer3/anthropic/utils/index.js.map +1 -0
  191. package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
  192. package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
  193. package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
  194. package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
  195. package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
  196. package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
  197. package/dist/layer3/anthropic/utils/response-parser.js +285 -0
  198. package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
  199. package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
  200. package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
  201. package/dist/layer3/anthropic/utils/retry.js +62 -0
  202. package/dist/layer3/anthropic/utils/retry.js.map +1 -0
  203. package/dist/layer3/index.d.ts +1 -0
  204. package/dist/layer3/index.d.ts.map +1 -1
  205. package/dist/layer3/index.js +16 -6
  206. package/dist/layer3/index.js.map +1 -1
  207. package/dist/layer3/osv-check.d.ts +75 -0
  208. package/dist/layer3/osv-check.d.ts.map +1 -0
  209. package/dist/layer3/osv-check.js +308 -0
  210. package/dist/layer3/osv-check.js.map +1 -0
  211. package/dist/rules/framework-fixes.d.ts +48 -0
  212. package/dist/rules/framework-fixes.d.ts.map +1 -0
  213. package/dist/rules/framework-fixes.js +439 -0
  214. package/dist/rules/framework-fixes.js.map +1 -0
  215. package/dist/rules/index.d.ts +8 -0
  216. package/dist/rules/index.d.ts.map +1 -0
  217. package/dist/rules/index.js +18 -0
  218. package/dist/rules/index.js.map +1 -0
  219. package/dist/rules/metadata.d.ts +43 -0
  220. package/dist/rules/metadata.d.ts.map +1 -0
  221. package/dist/rules/metadata.js +734 -0
  222. package/dist/rules/metadata.js.map +1 -0
  223. package/dist/suppression/config-loader.d.ts +74 -0
  224. package/dist/suppression/config-loader.d.ts.map +1 -0
  225. package/dist/suppression/config-loader.js +424 -0
  226. package/dist/suppression/config-loader.js.map +1 -0
  227. package/dist/suppression/hash.d.ts +48 -0
  228. package/dist/suppression/hash.d.ts.map +1 -0
  229. package/dist/suppression/hash.js +88 -0
  230. package/dist/suppression/hash.js.map +1 -0
  231. package/dist/suppression/index.d.ts +11 -0
  232. package/dist/suppression/index.d.ts.map +1 -0
  233. package/dist/suppression/index.js +39 -0
  234. package/dist/suppression/index.js.map +1 -0
  235. package/dist/suppression/inline-parser.d.ts +39 -0
  236. package/dist/suppression/inline-parser.d.ts.map +1 -0
  237. package/dist/suppression/inline-parser.js +218 -0
  238. package/dist/suppression/inline-parser.js.map +1 -0
  239. package/dist/suppression/manager.d.ts +94 -0
  240. package/dist/suppression/manager.d.ts.map +1 -0
  241. package/dist/suppression/manager.js +292 -0
  242. package/dist/suppression/manager.js.map +1 -0
  243. package/dist/suppression/types.d.ts +151 -0
  244. package/dist/suppression/types.d.ts.map +1 -0
  245. package/dist/suppression/types.js +28 -0
  246. package/dist/suppression/types.js.map +1 -0
  247. package/dist/tiers.d.ts +1 -1
  248. package/dist/tiers.d.ts.map +1 -1
  249. package/dist/tiers.js +27 -0
  250. package/dist/tiers.js.map +1 -1
  251. package/dist/types.d.ts +62 -1
  252. package/dist/types.d.ts.map +1 -1
  253. package/dist/types.js.map +1 -1
  254. package/dist/utils/context-helpers.d.ts +4 -0
  255. package/dist/utils/context-helpers.d.ts.map +1 -1
  256. package/dist/utils/context-helpers.js +13 -9
  257. package/dist/utils/context-helpers.js.map +1 -1
  258. package/package.json +4 -2
  259. package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
  260. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
  261. package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
  262. package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
  263. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
  264. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
  265. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
  266. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
  267. package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
  268. package/src/__tests__/benchmark/fixtures/layer2/index.ts +18 -0
  269. package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
  270. package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
  271. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +758 -0
  272. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
  273. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
  274. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
  275. package/src/baseline/__tests__/diff.test.ts +261 -0
  276. package/src/baseline/__tests__/manager.test.ts +225 -0
  277. package/src/baseline/diff.ts +135 -0
  278. package/src/baseline/index.ts +29 -0
  279. package/src/baseline/manager.ts +230 -0
  280. package/src/baseline/types.ts +97 -0
  281. package/src/formatters/cli-terminal.ts +444 -41
  282. package/src/formatters/github-comment.ts +79 -11
  283. package/src/formatters/index.ts +4 -0
  284. package/src/index.ts +197 -14
  285. package/src/layer1/config-audit.ts +24 -3
  286. package/src/layer1/config-mcp-audit.ts +276 -0
  287. package/src/layer1/index.ts +16 -6
  288. package/src/layer2/ai-agent-tools.ts +336 -0
  289. package/src/layer2/ai-endpoint-protection.ts +16 -3
  290. package/src/layer2/ai-execution-sinks.ts +516 -12
  291. package/src/layer2/ai-fingerprinting.ts +5 -1
  292. package/src/layer2/ai-mcp-security.ts +730 -0
  293. package/src/layer2/ai-package-hallucination.ts +791 -0
  294. package/src/layer2/ai-prompt-hygiene.ts +547 -9
  295. package/src/layer2/ai-rag-safety.ts +382 -3
  296. package/src/layer2/auth-antipatterns.ts +5 -0
  297. package/src/layer2/byok-patterns.ts +5 -1
  298. package/src/layer2/dangerous-functions/child-process.ts +98 -0
  299. package/src/layer2/dangerous-functions/dom-xss.ts +220 -0
  300. package/src/layer2/dangerous-functions/index.ts +949 -0
  301. package/src/layer2/dangerous-functions/json-parse.ts +385 -0
  302. package/src/layer2/dangerous-functions/math-random.ts +537 -0
  303. package/src/layer2/dangerous-functions/patterns.ts +174 -0
  304. package/src/layer2/dangerous-functions/request-validation.ts +145 -0
  305. package/src/layer2/dangerous-functions/utils/control-flow.ts +162 -0
  306. package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
  307. package/src/layer2/dangerous-functions/utils/index.ts +25 -0
  308. package/src/layer2/dangerous-functions/utils/schema-validation.ts +91 -0
  309. package/src/layer2/data-exposure.ts +5 -1
  310. package/src/layer2/framework-checks.ts +5 -0
  311. package/src/layer2/index.ts +63 -1
  312. package/src/layer2/logic-gates.ts +5 -0
  313. package/src/layer2/model-supply-chain.ts +456 -0
  314. package/src/layer2/risky-imports.ts +5 -0
  315. package/src/layer2/variables.ts +5 -0
  316. package/src/layer3/__tests__/osv-check.test.ts +384 -0
  317. package/src/layer3/anthropic/auto-dismiss.ts +212 -0
  318. package/src/layer3/anthropic/clients.ts +84 -0
  319. package/src/layer3/anthropic/index.ts +170 -0
  320. package/src/layer3/anthropic/prompts/index.ts +14 -0
  321. package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
  322. package/src/layer3/anthropic/prompts/validation.ts +419 -0
  323. package/src/layer3/anthropic/providers/anthropic.ts +310 -0
  324. package/src/layer3/anthropic/providers/index.ts +8 -0
  325. package/src/layer3/anthropic/providers/openai.ts +384 -0
  326. package/src/layer3/anthropic/request-builder.ts +150 -0
  327. package/src/layer3/anthropic/types.ts +148 -0
  328. package/src/layer3/anthropic/utils/index.ts +26 -0
  329. package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
  330. package/src/layer3/anthropic/utils/response-parser.ts +322 -0
  331. package/src/layer3/anthropic/utils/retry.ts +75 -0
  332. package/src/layer3/index.ts +18 -5
  333. package/src/layer3/osv-check.ts +420 -0
  334. package/src/rules/__tests__/framework-fixes.test.ts +689 -0
  335. package/src/rules/__tests__/metadata.test.ts +218 -0
  336. package/src/rules/framework-fixes.ts +470 -0
  337. package/src/rules/index.ts +21 -0
  338. package/src/rules/metadata.ts +831 -0
  339. package/src/suppression/__tests__/config-loader.test.ts +382 -0
  340. package/src/suppression/__tests__/hash.test.ts +166 -0
  341. package/src/suppression/__tests__/inline-parser.test.ts +212 -0
  342. package/src/suppression/__tests__/manager.test.ts +415 -0
  343. package/src/suppression/config-loader.ts +462 -0
  344. package/src/suppression/hash.ts +95 -0
  345. package/src/suppression/index.ts +51 -0
  346. package/src/suppression/inline-parser.ts +273 -0
  347. package/src/suppression/manager.ts +379 -0
  348. package/src/suppression/types.ts +174 -0
  349. package/src/tiers.ts +36 -0
  350. package/src/types.ts +90 -0
  351. package/src/utils/context-helpers.ts +13 -9
  352. package/dist/layer2/dangerous-functions.d.ts +0 -7
  353. package/dist/layer2/dangerous-functions.d.ts.map +0 -1
  354. package/dist/layer2/dangerous-functions.js +0 -1701
  355. package/dist/layer2/dangerous-functions.js.map +0 -1
  356. package/dist/layer3/anthropic.d.ts +0 -87
  357. package/dist/layer3/anthropic.d.ts.map +0 -1
  358. package/dist/layer3/anthropic.js +0 -1948
  359. package/dist/layer3/anthropic.js.map +0 -1
  360. package/dist/layer3/openai.d.ts +0 -25
  361. package/dist/layer3/openai.d.ts.map +0 -1
  362. package/dist/layer3/openai.js +0 -238
  363. package/dist/layer3/openai.js.map +0 -1
  364. package/src/layer2/dangerous-functions.ts +0 -1940
  365. package/src/layer3/anthropic.ts +0 -2257
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+ /**
3
+ * Framework-Aware Fix Suggestions Registry (PRO-83)
4
+ *
5
+ * Provides framework-specific fix suggestions that transform generic advice
6
+ * into actionable guidance based on the user's detected tech stack.
7
+ *
8
+ * When a Next.js + Prisma project has a SQL injection finding, this registry
9
+ * provides Prisma-specific fixes instead of generic SQL advice.
10
+ *
11
+ * Falls back gracefully to generic fixes (from metadata.ts) when no match.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.FRAMEWORK_FIX_REGISTRY = void 0;
15
+ exports.getFrameworkFix = getFrameworkFix;
16
+ // ============================================================================
17
+ // Framework Fix Registry
18
+ // ============================================================================
19
+ /**
20
+ * Registry mapping vulnerability categories to framework-specific fixes.
21
+ *
22
+ * Structure: category -> framework -> fix
23
+ *
24
+ * Priority categories (Tier 1):
25
+ * - sql_injection: Fixes vary dramatically by ORM
26
+ * - missing_auth: Framework-specific middleware patterns
27
+ * - xss: React/Vue/vanilla have different approaches
28
+ * - hardcoded_secret: Framework-specific env handling
29
+ * - cors_misconfiguration: Very framework-specific
30
+ */
31
+ exports.FRAMEWORK_FIX_REGISTRY = {
32
+ // ==========================================================================
33
+ // SQL Injection - Fixes vary dramatically by ORM
34
+ // ==========================================================================
35
+ sql_injection: {
36
+ prisma: {
37
+ fixSteps: [
38
+ 'Use Prisma query methods: prisma.user.findUnique({ where: { id } })',
39
+ 'For raw SQL, use Prisma.$queryRaw with template literals (auto-parameterized)',
40
+ 'Never concatenate user input into query strings',
41
+ 'Validate input with Zod before passing to queries',
42
+ ],
43
+ codeExample: `// Safe: Prisma parameterized query
44
+ const user = await prisma.user.findUnique({
45
+ where: { email: userInput }
46
+ })
47
+
48
+ // Safe: Raw query with parameters
49
+ await prisma.$queryRaw\`SELECT * FROM users WHERE id = \${userId}\``,
50
+ },
51
+ drizzle: {
52
+ fixSteps: [
53
+ 'Use Drizzle query builder with eq(), and(), or() operators',
54
+ 'For raw SQL, use sql`` template literal (auto-parameterized)',
55
+ 'Never concatenate user input into query strings',
56
+ 'Validate input with Zod before passing to queries',
57
+ ],
58
+ codeExample: `// Safe: Drizzle query builder
59
+ const users = await db.select().from(usersTable)
60
+ .where(eq(usersTable.email, userInput))
61
+
62
+ // Safe: Raw query with parameters
63
+ await db.execute(sql\`SELECT * FROM users WHERE id = \${userId}\`)`,
64
+ },
65
+ supabase: {
66
+ fixSteps: [
67
+ 'Use Supabase client methods: supabase.from("users").select().eq("id", userId)',
68
+ 'Rely on Row Level Security (RLS) for access control',
69
+ 'For complex queries, use stored procedures with parameters',
70
+ 'Never use .rpc() with string concatenation for query building',
71
+ ],
72
+ codeExample: `// Safe: Supabase client with RLS
73
+ const { data } = await supabase
74
+ .from('users')
75
+ .select('*')
76
+ .eq('email', userInput)
77
+ .single()`,
78
+ },
79
+ mongoose: {
80
+ fixSteps: [
81
+ 'Use Mongoose query methods with conditions object: User.find({ email: userInput })',
82
+ 'Avoid $where with user input - it allows JavaScript execution',
83
+ 'Validate ObjectIds before querying: mongoose.Types.ObjectId.isValid(id)',
84
+ 'Use schema validation to ensure expected data types',
85
+ ],
86
+ codeExample: `// Safe: Mongoose query with conditions
87
+ const user = await User.findOne({ email: userInput })
88
+
89
+ // Validate ObjectId before use
90
+ if (!mongoose.Types.ObjectId.isValid(id)) {
91
+ throw new Error('Invalid ID')
92
+ }`,
93
+ },
94
+ knex: {
95
+ fixSteps: [
96
+ 'Use Knex query builder: knex("users").where({ email: userInput })',
97
+ 'For raw SQL, use knex.raw() with parameter binding: knex.raw("SELECT * FROM users WHERE id = ?", [userId])',
98
+ 'Never use string concatenation in queries',
99
+ 'Validate input types before passing to queries',
100
+ ],
101
+ codeExample: `// Safe: Knex query builder
102
+ const user = await knex('users')
103
+ .where({ email: userInput })
104
+ .first()
105
+
106
+ // Safe: Raw query with parameters
107
+ await knex.raw('SELECT * FROM users WHERE id = ?', [userId])`,
108
+ },
109
+ },
110
+ // ==========================================================================
111
+ // Missing Authentication - Framework-specific middleware patterns
112
+ // ==========================================================================
113
+ missing_auth: {
114
+ nextjs: {
115
+ fixSteps: [
116
+ 'Add auth check in middleware.ts with matcher config for protected routes',
117
+ 'Call auth() or getServerSession() at the start of route handlers',
118
+ 'Return 401/redirect for unauthenticated requests',
119
+ 'Use throwing auth helpers (getCurrentUserId) that guarantee authenticated context',
120
+ ],
121
+ codeExample: `// middleware.ts
122
+ export { auth as middleware } from '@/auth'
123
+ export const config = { matcher: ['/dashboard/:path*', '/api/:path*'] }
124
+
125
+ // In route handler
126
+ import { auth } from '@/auth'
127
+
128
+ export async function GET() {
129
+ const session = await auth()
130
+ if (!session) {
131
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
132
+ }
133
+ // ... authenticated code
134
+ }`,
135
+ },
136
+ express: {
137
+ fixSteps: [
138
+ 'Use authentication middleware (passport, express-session, or custom)',
139
+ 'Apply middleware to routes: app.use("/api", authMiddleware)',
140
+ 'Verify JWT tokens or session cookies in middleware',
141
+ 'Return 401 status for unauthenticated requests',
142
+ ],
143
+ codeExample: `// authMiddleware.js
144
+ const authMiddleware = (req, res, next) => {
145
+ const token = req.headers.authorization?.split(' ')[1]
146
+ if (!token) {
147
+ return res.status(401).json({ error: 'Unauthorized' })
148
+ }
149
+ try {
150
+ req.user = jwt.verify(token, process.env.JWT_SECRET)
151
+ next()
152
+ } catch {
153
+ return res.status(401).json({ error: 'Invalid token' })
154
+ }
155
+ }
156
+
157
+ // Apply to routes
158
+ app.use('/api', authMiddleware)`,
159
+ },
160
+ fastify: {
161
+ fixSteps: [
162
+ 'Use @fastify/auth or @fastify/jwt for authentication',
163
+ 'Register auth plugin and apply to routes with onRequest hook',
164
+ 'Decorate request with user info after authentication',
165
+ 'Return 401 status for unauthenticated requests',
166
+ ],
167
+ codeExample: `// Register JWT plugin
168
+ await fastify.register(fastifyJwt, { secret: process.env.JWT_SECRET })
169
+
170
+ // Auth decorator
171
+ fastify.decorate('authenticate', async (request, reply) => {
172
+ try {
173
+ await request.jwtVerify()
174
+ } catch (err) {
175
+ reply.code(401).send({ error: 'Unauthorized' })
176
+ }
177
+ })
178
+
179
+ // Protected route
180
+ fastify.get('/api/data', { onRequest: [fastify.authenticate] }, handler)`,
181
+ },
182
+ nestjs: {
183
+ fixSteps: [
184
+ 'Use @nestjs/passport with Guards for authentication',
185
+ 'Apply AuthGuard to controllers or routes with @UseGuards()',
186
+ 'Implement custom guards for role-based access control',
187
+ 'Use @Public() decorator for intentionally public endpoints',
188
+ ],
189
+ codeExample: `// auth.guard.ts
190
+ @Injectable()
191
+ export class JwtAuthGuard extends AuthGuard('jwt') {}
192
+
193
+ // controller.ts
194
+ @Controller('api')
195
+ @UseGuards(JwtAuthGuard)
196
+ export class ApiController {
197
+ @Get('data')
198
+ getData(@Request() req) {
199
+ return this.service.getData(req.user.id)
200
+ }
201
+ }`,
202
+ },
203
+ },
204
+ // ==========================================================================
205
+ // XSS - React/Vue/vanilla have different approaches
206
+ // ==========================================================================
207
+ xss: {
208
+ react: {
209
+ fixSteps: [
210
+ 'Use JSX expressions {variable} - React auto-escapes by default',
211
+ 'Avoid dangerouslySetInnerHTML unless absolutely necessary',
212
+ 'If you must use dangerouslySetInnerHTML, sanitize with DOMPurify first',
213
+ 'Validate and sanitize user input on the server side as well',
214
+ ],
215
+ codeExample: `// Safe: JSX auto-escapes
216
+ function Comment({ text }) {
217
+ return <div>{text}</div> // Safe - auto-escaped
218
+ }
219
+
220
+ // If HTML is required, sanitize first
221
+ import DOMPurify from 'dompurify'
222
+
223
+ function RichContent({ html }) {
224
+ const clean = DOMPurify.sanitize(html)
225
+ return <div dangerouslySetInnerHTML={{ __html: clean }} />
226
+ }`,
227
+ },
228
+ vue: {
229
+ fixSteps: [
230
+ 'Use v-text or {{ }} interpolation - Vue auto-escapes by default',
231
+ 'Avoid v-html with user-controlled content',
232
+ 'If you must use v-html, sanitize with DOMPurify first',
233
+ 'Use Content Security Policy headers as additional protection',
234
+ ],
235
+ codeExample: `<!-- Safe: Vue interpolation auto-escapes -->
236
+ <template>
237
+ <div>{{ userContent }}</div>
238
+ </template>
239
+
240
+ <!-- If HTML is required, sanitize first -->
241
+ <script setup>
242
+ import DOMPurify from 'dompurify'
243
+ const sanitizedHtml = computed(() => DOMPurify.sanitize(props.html))
244
+ </script>
245
+
246
+ <template>
247
+ <div v-html="sanitizedHtml"></div>
248
+ </template>`,
249
+ },
250
+ },
251
+ // ==========================================================================
252
+ // Hardcoded Secrets - Framework-specific env handling
253
+ // ==========================================================================
254
+ hardcoded_secret: {
255
+ nextjs: {
256
+ fixSteps: [
257
+ 'Store secrets in .env.local (gitignored by default)',
258
+ 'Access via process.env.SECRET_NAME in server components/API routes',
259
+ 'Only use NEXT_PUBLIC_ prefix for intentionally client-exposed values',
260
+ 'Use Vercel Environment Variables for production deployments',
261
+ ],
262
+ codeExample: `// .env.local
263
+ DATABASE_URL=postgres://...
264
+ API_SECRET=your-secret-here
265
+
266
+ // Server-side code (API route, server component)
267
+ const secret = process.env.API_SECRET
268
+
269
+ // Client-safe public values only
270
+ // NEXT_PUBLIC_ANALYTICS_ID=xxx`,
271
+ },
272
+ express: {
273
+ fixSteps: [
274
+ 'Use dotenv package to load from .env files',
275
+ 'Add .env to .gitignore immediately',
276
+ 'Access secrets via process.env.SECRET_NAME',
277
+ 'Use different .env files per environment (.env.production)',
278
+ ],
279
+ codeExample: `// At app entry point
280
+ import 'dotenv/config'
281
+
282
+ // .env (gitignored)
283
+ DATABASE_URL=postgres://...
284
+ JWT_SECRET=your-secret-here
285
+
286
+ // Access in code
287
+ const jwtSecret = process.env.JWT_SECRET
288
+ if (!jwtSecret) throw new Error('JWT_SECRET required')`,
289
+ },
290
+ },
291
+ // ==========================================================================
292
+ // CORS Misconfiguration - Very framework-specific
293
+ // ==========================================================================
294
+ cors_misconfiguration: {
295
+ nextjs: {
296
+ fixSteps: [
297
+ 'Configure CORS in next.config.js headers or middleware',
298
+ 'Specify exact allowed origins instead of wildcard "*"',
299
+ 'Use environment variables for origin configuration',
300
+ 'Consider using middleware for dynamic origin validation',
301
+ ],
302
+ codeExample: `// next.config.js
303
+ module.exports = {
304
+ async headers() {
305
+ return [{
306
+ source: '/api/:path*',
307
+ headers: [
308
+ { key: 'Access-Control-Allow-Origin', value: process.env.ALLOWED_ORIGIN },
309
+ { key: 'Access-Control-Allow-Methods', value: 'GET,POST,PUT,DELETE' },
310
+ { key: 'Access-Control-Allow-Headers', value: 'Content-Type,Authorization' },
311
+ ],
312
+ }]
313
+ },
314
+ }
315
+
316
+ // Or in middleware.ts for dynamic validation
317
+ const allowedOrigins = ['https://app.example.com', 'https://admin.example.com']`,
318
+ },
319
+ express: {
320
+ fixSteps: [
321
+ 'Use the cors package with specific origin configuration',
322
+ 'Replace origin: "*" with an allowlist of origins',
323
+ 'Use a function for dynamic origin validation',
324
+ 'Disable credentials for cross-origin requests unless necessary',
325
+ ],
326
+ codeExample: `import cors from 'cors'
327
+
328
+ const allowedOrigins = ['https://app.example.com', 'https://admin.example.com']
329
+
330
+ app.use(cors({
331
+ origin: (origin, callback) => {
332
+ if (!origin || allowedOrigins.includes(origin)) {
333
+ callback(null, true)
334
+ } else {
335
+ callback(new Error('Not allowed by CORS'))
336
+ }
337
+ },
338
+ credentials: true, // Only if you need cookies/auth headers
339
+ }))`,
340
+ },
341
+ fastify: {
342
+ fixSteps: [
343
+ 'Use @fastify/cors with specific origin configuration',
344
+ 'Specify allowed origins instead of true/wildcard',
345
+ 'Use a function for dynamic origin validation',
346
+ 'Configure allowed methods and headers explicitly',
347
+ ],
348
+ codeExample: `import cors from '@fastify/cors'
349
+
350
+ const allowedOrigins = ['https://app.example.com']
351
+
352
+ await fastify.register(cors, {
353
+ origin: (origin, cb) => {
354
+ if (!origin || allowedOrigins.includes(origin)) {
355
+ cb(null, true)
356
+ } else {
357
+ cb(new Error('Not allowed'), false)
358
+ }
359
+ },
360
+ credentials: true,
361
+ })`,
362
+ },
363
+ },
364
+ // ==========================================================================
365
+ // Dangerous Function (eval, innerHTML) - Context-specific
366
+ // ==========================================================================
367
+ dangerous_function: {
368
+ react: {
369
+ fixSteps: [
370
+ 'Replace innerHTML with React JSX (auto-escapes content)',
371
+ 'Use textContent or innerText for plain text updates',
372
+ 'If dynamic HTML is required, use DOMPurify before dangerouslySetInnerHTML',
373
+ 'Consider using a markdown renderer (react-markdown) for rich content',
374
+ ],
375
+ codeExample: `// Instead of innerHTML
376
+ const element = document.getElementById('content')
377
+ element.innerHTML = userInput // Dangerous!
378
+
379
+ // Use React JSX
380
+ function SafeContent({ content }) {
381
+ return <div>{content}</div> // Safe - auto-escaped
382
+ }`,
383
+ },
384
+ vue: {
385
+ fixSteps: [
386
+ 'Use Vue template interpolation {{ }} instead of v-html',
387
+ 'If HTML rendering is required, sanitize with DOMPurify first',
388
+ 'Consider component-based approaches for dynamic content',
389
+ 'Validate and sanitize on the server before sending to client',
390
+ ],
391
+ },
392
+ },
393
+ };
394
+ // ============================================================================
395
+ // Lookup Function
396
+ // ============================================================================
397
+ /**
398
+ * Get framework-specific fix for a vulnerability category.
399
+ *
400
+ * Priority order for ORM-related categories (sql_injection):
401
+ * 1. ORM (prisma, drizzle, supabase, mongoose, knex)
402
+ * 2. Backend framework (nextjs, express, fastify, nestjs)
403
+ *
404
+ * Priority order for other categories:
405
+ * 1. Frontend framework for XSS (react, vue)
406
+ * 2. Backend framework for auth/cors/secrets
407
+ *
408
+ * @returns FrameworkFix if a match is found, undefined otherwise (falls back to generic)
409
+ */
410
+ function getFrameworkFix(category, frameworks, dataAccess) {
411
+ const categoryFixes = exports.FRAMEWORK_FIX_REGISTRY[category];
412
+ if (!categoryFixes) {
413
+ return undefined;
414
+ }
415
+ // For SQL injection, prioritize ORM-specific fixes
416
+ if (category === 'sql_injection' && dataAccess?.orm) {
417
+ const ormFix = categoryFixes[dataAccess.orm];
418
+ if (ormFix) {
419
+ return ormFix;
420
+ }
421
+ }
422
+ // For XSS and dangerous_function, prioritize frontend framework
423
+ if ((category === 'xss' || category === 'dangerous_function') && frameworks.frontend) {
424
+ const frontendFix = categoryFixes[frameworks.frontend];
425
+ if (frontendFix) {
426
+ return frontendFix;
427
+ }
428
+ }
429
+ // For other categories, try backend framework
430
+ if (frameworks.primary) {
431
+ const backendFix = categoryFixes[frameworks.primary];
432
+ if (backendFix) {
433
+ return backendFix;
434
+ }
435
+ }
436
+ // No framework-specific fix found
437
+ return undefined;
438
+ }
439
+ //# sourceMappingURL=framework-fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-fixes.js","sourceRoot":"","sources":["../../src/rules/framework-fixes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Rules Module
3
+ *
4
+ * Provides access to rule metadata for actionable finding output.
5
+ */
6
+ export { RULE_REGISTRY, getRuleMetadata, getAllCategories, hasMetadata, type RuleMetadata, } from './metadata';
7
+ export { FRAMEWORK_FIX_REGISTRY, getFrameworkFix, type FrameworkKey, type FrameworkFix, } from './framework-fixes';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,KAAK,YAAY,GAClB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * Rules Module
4
+ *
5
+ * Provides access to rule metadata for actionable finding output.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getFrameworkFix = exports.FRAMEWORK_FIX_REGISTRY = exports.hasMetadata = exports.getAllCategories = exports.getRuleMetadata = exports.RULE_REGISTRY = void 0;
9
+ var metadata_1 = require("./metadata");
10
+ Object.defineProperty(exports, "RULE_REGISTRY", { enumerable: true, get: function () { return metadata_1.RULE_REGISTRY; } });
11
+ Object.defineProperty(exports, "getRuleMetadata", { enumerable: true, get: function () { return metadata_1.getRuleMetadata; } });
12
+ Object.defineProperty(exports, "getAllCategories", { enumerable: true, get: function () { return metadata_1.getAllCategories; } });
13
+ Object.defineProperty(exports, "hasMetadata", { enumerable: true, get: function () { return metadata_1.hasMetadata; } });
14
+ // Framework-aware fix suggestions (PRO-83)
15
+ var framework_fixes_1 = require("./framework-fixes");
16
+ Object.defineProperty(exports, "FRAMEWORK_FIX_REGISTRY", { enumerable: true, get: function () { return framework_fixes_1.FRAMEWORK_FIX_REGISTRY; } });
17
+ Object.defineProperty(exports, "getFrameworkFix", { enumerable: true, get: function () { return framework_fixes_1.getFrameworkFix; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uCAMmB;AALjB,yGAAA,aAAa,OAAA;AACb,2GAAA,eAAe,OAAA;AACf,4GAAA,gBAAgB,OAAA;AAChB,uGAAA,WAAW,OAAA;AAIb,2CAA2C;AAC3C,qDAK0B;AAJxB,yHAAA,sBAAsB,OAAA;AACtB,kHAAA,eAAe,OAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Rule Metadata Registry
3
+ *
4
+ * Provides comprehensive metadata for all vulnerability categories including:
5
+ * - whyItMatters: Business impact explanation
6
+ * - fixSteps: Step-by-step remediation guidance
7
+ * - evidence: What triggers this finding
8
+ * - references: OWASP/CWE documentation links
9
+ *
10
+ * This metadata enables actionable output for every finding,
11
+ * regardless of whether AI validation is used.
12
+ */
13
+ import type { VulnerabilityCategory } from '../types';
14
+ export interface RuleMetadata {
15
+ /** Human-readable rule name */
16
+ name: string;
17
+ /** 1-2 sentence explanation of why this matters (business impact) */
18
+ whyItMatters: string;
19
+ /** Step-by-step fix instructions */
20
+ fixSteps: string[];
21
+ /** What triggers this finding */
22
+ evidence: string;
23
+ /** OWASP/CWE reference links */
24
+ references: string[];
25
+ }
26
+ /**
27
+ * Comprehensive metadata registry for all vulnerability categories
28
+ */
29
+ export declare const RULE_REGISTRY: Record<VulnerabilityCategory, RuleMetadata>;
30
+ /**
31
+ * Get metadata for a vulnerability category
32
+ * Returns undefined if category is not in registry (shouldn't happen for valid categories)
33
+ */
34
+ export declare function getRuleMetadata(category: VulnerabilityCategory): RuleMetadata | undefined;
35
+ /**
36
+ * Get all available rule categories
37
+ */
38
+ export declare function getAllCategories(): VulnerabilityCategory[];
39
+ /**
40
+ * Check if a category has metadata
41
+ */
42
+ export declare function hasMetadata(category: VulnerabilityCategory): boolean;
43
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/rules/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAErD,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE,YAAY,CAywBrE,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAEzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAEpE"}