@oddessentials/odd-ai-reviewers 1.0.0

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 (370) hide show
  1. package/README.md +190 -0
  2. package/dist/__tests__/hermetic-setup.d.ts +55 -0
  3. package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
  4. package/dist/__tests__/hermetic-setup.js +62 -0
  5. package/dist/__tests__/hermetic-setup.js.map +1 -0
  6. package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
  7. package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
  8. package/dist/__tests__/test-utils/hermetic.js +147 -0
  9. package/dist/__tests__/test-utils/hermetic.js.map +1 -0
  10. package/dist/agents/ai_semantic_review.d.ts +12 -0
  11. package/dist/agents/ai_semantic_review.d.ts.map +1 -0
  12. package/dist/agents/ai_semantic_review.js +317 -0
  13. package/dist/agents/ai_semantic_review.js.map +1 -0
  14. package/dist/agents/control_flow/budget.d.ts +162 -0
  15. package/dist/agents/control_flow/budget.d.ts.map +1 -0
  16. package/dist/agents/control_flow/budget.js +331 -0
  17. package/dist/agents/control_flow/budget.js.map +1 -0
  18. package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
  19. package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
  20. package/dist/agents/control_flow/cfg-builder.js +776 -0
  21. package/dist/agents/control_flow/cfg-builder.js.map +1 -0
  22. package/dist/agents/control_flow/cfg-types.d.ts +186 -0
  23. package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
  24. package/dist/agents/control_flow/cfg-types.js +114 -0
  25. package/dist/agents/control_flow/cfg-types.js.map +1 -0
  26. package/dist/agents/control_flow/finding-generator.d.ts +118 -0
  27. package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
  28. package/dist/agents/control_flow/finding-generator.js +354 -0
  29. package/dist/agents/control_flow/finding-generator.js.map +1 -0
  30. package/dist/agents/control_flow/index.d.ts +39 -0
  31. package/dist/agents/control_flow/index.d.ts.map +1 -0
  32. package/dist/agents/control_flow/index.js +270 -0
  33. package/dist/agents/control_flow/index.js.map +1 -0
  34. package/dist/agents/control_flow/logger.d.ts +333 -0
  35. package/dist/agents/control_flow/logger.d.ts.map +1 -0
  36. package/dist/agents/control_flow/logger.js +607 -0
  37. package/dist/agents/control_flow/logger.js.map +1 -0
  38. package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
  39. package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
  40. package/dist/agents/control_flow/mitigation-detector.js +625 -0
  41. package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
  42. package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
  43. package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
  44. package/dist/agents/control_flow/mitigation-patterns.js +620 -0
  45. package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
  46. package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
  47. package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
  48. package/dist/agents/control_flow/path-analyzer.js +695 -0
  49. package/dist/agents/control_flow/path-analyzer.js.map +1 -0
  50. package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
  51. package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
  52. package/dist/agents/control_flow/pattern-validator.js +420 -0
  53. package/dist/agents/control_flow/pattern-validator.js.map +1 -0
  54. package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
  55. package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
  56. package/dist/agents/control_flow/timeout-regex.js +339 -0
  57. package/dist/agents/control_flow/timeout-regex.js.map +1 -0
  58. package/dist/agents/control_flow/types.d.ts +782 -0
  59. package/dist/agents/control_flow/types.d.ts.map +1 -0
  60. package/dist/agents/control_flow/types.js +428 -0
  61. package/dist/agents/control_flow/types.js.map +1 -0
  62. package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
  63. package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
  64. package/dist/agents/control_flow/vulnerability-detector.js +493 -0
  65. package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
  66. package/dist/agents/date-utils.d.ts +19 -0
  67. package/dist/agents/date-utils.d.ts.map +1 -0
  68. package/dist/agents/date-utils.js +29 -0
  69. package/dist/agents/date-utils.js.map +1 -0
  70. package/dist/agents/index.d.ts +25 -0
  71. package/dist/agents/index.d.ts.map +1 -0
  72. package/dist/agents/index.js +50 -0
  73. package/dist/agents/index.js.map +1 -0
  74. package/dist/agents/json-utils.d.ts +34 -0
  75. package/dist/agents/json-utils.d.ts.map +1 -0
  76. package/dist/agents/json-utils.js +62 -0
  77. package/dist/agents/json-utils.js.map +1 -0
  78. package/dist/agents/local_llm.d.ts +24 -0
  79. package/dist/agents/local_llm.d.ts.map +1 -0
  80. package/dist/agents/local_llm.js +566 -0
  81. package/dist/agents/local_llm.js.map +1 -0
  82. package/dist/agents/metadata.d.ts +57 -0
  83. package/dist/agents/metadata.d.ts.map +1 -0
  84. package/dist/agents/metadata.js +45 -0
  85. package/dist/agents/metadata.js.map +1 -0
  86. package/dist/agents/opencode.d.ts +18 -0
  87. package/dist/agents/opencode.d.ts.map +1 -0
  88. package/dist/agents/opencode.js +364 -0
  89. package/dist/agents/opencode.js.map +1 -0
  90. package/dist/agents/path-filter.d.ts +25 -0
  91. package/dist/agents/path-filter.d.ts.map +1 -0
  92. package/dist/agents/path-filter.js +43 -0
  93. package/dist/agents/path-filter.js.map +1 -0
  94. package/dist/agents/pr_agent.d.ts +3 -0
  95. package/dist/agents/pr_agent.d.ts.map +1 -0
  96. package/dist/agents/pr_agent.js +312 -0
  97. package/dist/agents/pr_agent.js.map +1 -0
  98. package/dist/agents/retry.d.ts +12 -0
  99. package/dist/agents/retry.d.ts.map +1 -0
  100. package/dist/agents/retry.js +65 -0
  101. package/dist/agents/retry.js.map +1 -0
  102. package/dist/agents/reviewdog.d.ts +24 -0
  103. package/dist/agents/reviewdog.d.ts.map +1 -0
  104. package/dist/agents/reviewdog.js +259 -0
  105. package/dist/agents/reviewdog.js.map +1 -0
  106. package/dist/agents/security.d.ts +49 -0
  107. package/dist/agents/security.d.ts.map +1 -0
  108. package/dist/agents/security.js +302 -0
  109. package/dist/agents/security.js.map +1 -0
  110. package/dist/agents/semgrep.d.ts +8 -0
  111. package/dist/agents/semgrep.d.ts.map +1 -0
  112. package/dist/agents/semgrep.js +157 -0
  113. package/dist/agents/semgrep.js.map +1 -0
  114. package/dist/agents/types.d.ts +450 -0
  115. package/dist/agents/types.d.ts.map +1 -0
  116. package/dist/agents/types.js +127 -0
  117. package/dist/agents/types.js.map +1 -0
  118. package/dist/budget.d.ts +59 -0
  119. package/dist/budget.d.ts.map +1 -0
  120. package/dist/budget.js +82 -0
  121. package/dist/budget.js.map +1 -0
  122. package/dist/cache/key.d.ts +49 -0
  123. package/dist/cache/key.d.ts.map +1 -0
  124. package/dist/cache/key.js +71 -0
  125. package/dist/cache/key.js.map +1 -0
  126. package/dist/cache/store.d.ts +47 -0
  127. package/dist/cache/store.d.ts.map +1 -0
  128. package/dist/cache/store.js +328 -0
  129. package/dist/cache/store.js.map +1 -0
  130. package/dist/cli/commands/check.d.ts +60 -0
  131. package/dist/cli/commands/check.d.ts.map +1 -0
  132. package/dist/cli/commands/check.js +163 -0
  133. package/dist/cli/commands/check.js.map +1 -0
  134. package/dist/cli/commands/index.d.ts +12 -0
  135. package/dist/cli/commands/index.d.ts.map +1 -0
  136. package/dist/cli/commands/index.js +12 -0
  137. package/dist/cli/commands/index.js.map +1 -0
  138. package/dist/cli/commands/local-review.d.ts +149 -0
  139. package/dist/cli/commands/local-review.d.ts.map +1 -0
  140. package/dist/cli/commands/local-review.js +755 -0
  141. package/dist/cli/commands/local-review.js.map +1 -0
  142. package/dist/cli/config-wizard.d.ts +87 -0
  143. package/dist/cli/config-wizard.d.ts.map +1 -0
  144. package/dist/cli/config-wizard.js +240 -0
  145. package/dist/cli/config-wizard.js.map +1 -0
  146. package/dist/cli/dependencies/catalog.d.ts +44 -0
  147. package/dist/cli/dependencies/catalog.d.ts.map +1 -0
  148. package/dist/cli/dependencies/catalog.js +89 -0
  149. package/dist/cli/dependencies/catalog.js.map +1 -0
  150. package/dist/cli/dependencies/checker.d.ts +42 -0
  151. package/dist/cli/dependencies/checker.d.ts.map +1 -0
  152. package/dist/cli/dependencies/checker.js +240 -0
  153. package/dist/cli/dependencies/checker.js.map +1 -0
  154. package/dist/cli/dependencies/index.d.ts +16 -0
  155. package/dist/cli/dependencies/index.d.ts.map +1 -0
  156. package/dist/cli/dependencies/index.js +16 -0
  157. package/dist/cli/dependencies/index.js.map +1 -0
  158. package/dist/cli/dependencies/messages.d.ts +58 -0
  159. package/dist/cli/dependencies/messages.d.ts.map +1 -0
  160. package/dist/cli/dependencies/messages.js +183 -0
  161. package/dist/cli/dependencies/messages.js.map +1 -0
  162. package/dist/cli/dependencies/platform.d.ts +25 -0
  163. package/dist/cli/dependencies/platform.d.ts.map +1 -0
  164. package/dist/cli/dependencies/platform.js +42 -0
  165. package/dist/cli/dependencies/platform.js.map +1 -0
  166. package/dist/cli/dependencies/schemas.d.ts +65 -0
  167. package/dist/cli/dependencies/schemas.d.ts.map +1 -0
  168. package/dist/cli/dependencies/schemas.js +42 -0
  169. package/dist/cli/dependencies/schemas.js.map +1 -0
  170. package/dist/cli/dependencies/types.d.ts +112 -0
  171. package/dist/cli/dependencies/types.d.ts.map +1 -0
  172. package/dist/cli/dependencies/types.js +6 -0
  173. package/dist/cli/dependencies/types.js.map +1 -0
  174. package/dist/cli/dependencies/version.d.ts +67 -0
  175. package/dist/cli/dependencies/version.d.ts.map +1 -0
  176. package/dist/cli/dependencies/version.js +125 -0
  177. package/dist/cli/dependencies/version.js.map +1 -0
  178. package/dist/cli/git-context.d.ts +105 -0
  179. package/dist/cli/git-context.d.ts.map +1 -0
  180. package/dist/cli/git-context.js +313 -0
  181. package/dist/cli/git-context.js.map +1 -0
  182. package/dist/cli/interactive-prompts.d.ts +126 -0
  183. package/dist/cli/interactive-prompts.d.ts.map +1 -0
  184. package/dist/cli/interactive-prompts.js +128 -0
  185. package/dist/cli/interactive-prompts.js.map +1 -0
  186. package/dist/cli/options/index.d.ts +7 -0
  187. package/dist/cli/options/index.d.ts.map +1 -0
  188. package/dist/cli/options/index.js +11 -0
  189. package/dist/cli/options/index.js.map +1 -0
  190. package/dist/cli/options/local-review-options.d.ts +221 -0
  191. package/dist/cli/options/local-review-options.d.ts.map +1 -0
  192. package/dist/cli/options/local-review-options.js +332 -0
  193. package/dist/cli/options/local-review-options.js.map +1 -0
  194. package/dist/cli/output/colors.d.ts +154 -0
  195. package/dist/cli/output/colors.d.ts.map +1 -0
  196. package/dist/cli/output/colors.js +255 -0
  197. package/dist/cli/output/colors.js.map +1 -0
  198. package/dist/cli/output/errors.d.ts +157 -0
  199. package/dist/cli/output/errors.d.ts.map +1 -0
  200. package/dist/cli/output/errors.js +266 -0
  201. package/dist/cli/output/errors.js.map +1 -0
  202. package/dist/cli/output/index.d.ts +12 -0
  203. package/dist/cli/output/index.d.ts.map +1 -0
  204. package/dist/cli/output/index.js +15 -0
  205. package/dist/cli/output/index.js.map +1 -0
  206. package/dist/cli/output/progress.d.ts +237 -0
  207. package/dist/cli/output/progress.d.ts.map +1 -0
  208. package/dist/cli/output/progress.js +405 -0
  209. package/dist/cli/output/progress.js.map +1 -0
  210. package/dist/cli/signals.d.ts +145 -0
  211. package/dist/cli/signals.d.ts.map +1 -0
  212. package/dist/cli/signals.js +223 -0
  213. package/dist/cli/signals.js.map +1 -0
  214. package/dist/cli/validation-report.d.ts +106 -0
  215. package/dist/cli/validation-report.d.ts.map +1 -0
  216. package/dist/cli/validation-report.js +108 -0
  217. package/dist/cli/validation-report.js.map +1 -0
  218. package/dist/config/index.d.ts +9 -0
  219. package/dist/config/index.d.ts.map +1 -0
  220. package/dist/config/index.js +12 -0
  221. package/dist/config/index.js.map +1 -0
  222. package/dist/config/mitigation-config.d.ts +94 -0
  223. package/dist/config/mitigation-config.d.ts.map +1 -0
  224. package/dist/config/mitigation-config.js +430 -0
  225. package/dist/config/mitigation-config.js.map +1 -0
  226. package/dist/config/providers.d.ts +118 -0
  227. package/dist/config/providers.d.ts.map +1 -0
  228. package/dist/config/providers.js +229 -0
  229. package/dist/config/providers.js.map +1 -0
  230. package/dist/config/schemas.d.ts +278 -0
  231. package/dist/config/schemas.d.ts.map +1 -0
  232. package/dist/config/schemas.js +111 -0
  233. package/dist/config/schemas.js.map +1 -0
  234. package/dist/config/zero-config.d.ts +126 -0
  235. package/dist/config/zero-config.d.ts.map +1 -0
  236. package/dist/config/zero-config.js +243 -0
  237. package/dist/config/zero-config.js.map +1 -0
  238. package/dist/config.d.ts +110 -0
  239. package/dist/config.d.ts.map +1 -0
  240. package/dist/config.js +302 -0
  241. package/dist/config.js.map +1 -0
  242. package/dist/diff.d.ts +224 -0
  243. package/dist/diff.d.ts.map +1 -0
  244. package/dist/diff.js +832 -0
  245. package/dist/diff.js.map +1 -0
  246. package/dist/git-validators.d.ts +106 -0
  247. package/dist/git-validators.d.ts.map +1 -0
  248. package/dist/git-validators.js +224 -0
  249. package/dist/git-validators.js.map +1 -0
  250. package/dist/main.d.ts +61 -0
  251. package/dist/main.d.ts.map +1 -0
  252. package/dist/main.js +704 -0
  253. package/dist/main.js.map +1 -0
  254. package/dist/phases/execute.d.ts +60 -0
  255. package/dist/phases/execute.d.ts.map +1 -0
  256. package/dist/phases/execute.js +168 -0
  257. package/dist/phases/execute.js.map +1 -0
  258. package/dist/phases/index.d.ts +9 -0
  259. package/dist/phases/index.d.ts.map +1 -0
  260. package/dist/phases/index.js +9 -0
  261. package/dist/phases/index.js.map +1 -0
  262. package/dist/phases/preflight.d.ts +40 -0
  263. package/dist/phases/preflight.d.ts.map +1 -0
  264. package/dist/phases/preflight.js +122 -0
  265. package/dist/phases/preflight.js.map +1 -0
  266. package/dist/phases/report.d.ts +51 -0
  267. package/dist/phases/report.d.ts.map +1 -0
  268. package/dist/phases/report.js +152 -0
  269. package/dist/phases/report.js.map +1 -0
  270. package/dist/policy.d.ts +33 -0
  271. package/dist/policy.d.ts.map +1 -0
  272. package/dist/policy.js +34 -0
  273. package/dist/policy.js.map +1 -0
  274. package/dist/preflight.d.ts +181 -0
  275. package/dist/preflight.d.ts.map +1 -0
  276. package/dist/preflight.js +627 -0
  277. package/dist/preflight.js.map +1 -0
  278. package/dist/report/ado.d.ts +53 -0
  279. package/dist/report/ado.d.ts.map +1 -0
  280. package/dist/report/ado.js +411 -0
  281. package/dist/report/ado.js.map +1 -0
  282. package/dist/report/agent-icons.d.ts +36 -0
  283. package/dist/report/agent-icons.d.ts.map +1 -0
  284. package/dist/report/agent-icons.js +46 -0
  285. package/dist/report/agent-icons.js.map +1 -0
  286. package/dist/report/base.d.ts +30 -0
  287. package/dist/report/base.d.ts.map +1 -0
  288. package/dist/report/base.js +64 -0
  289. package/dist/report/base.js.map +1 -0
  290. package/dist/report/formats.d.ts +206 -0
  291. package/dist/report/formats.d.ts.map +1 -0
  292. package/dist/report/formats.js +481 -0
  293. package/dist/report/formats.js.map +1 -0
  294. package/dist/report/github.d.ts +44 -0
  295. package/dist/report/github.d.ts.map +1 -0
  296. package/dist/report/github.js +409 -0
  297. package/dist/report/github.js.map +1 -0
  298. package/dist/report/line-resolver.d.ts +208 -0
  299. package/dist/report/line-resolver.d.ts.map +1 -0
  300. package/dist/report/line-resolver.js +578 -0
  301. package/dist/report/line-resolver.js.map +1 -0
  302. package/dist/report/resolution.d.ts +158 -0
  303. package/dist/report/resolution.d.ts.map +1 -0
  304. package/dist/report/resolution.js +272 -0
  305. package/dist/report/resolution.js.map +1 -0
  306. package/dist/report/sanitize.d.ts +32 -0
  307. package/dist/report/sanitize.d.ts.map +1 -0
  308. package/dist/report/sanitize.js +84 -0
  309. package/dist/report/sanitize.js.map +1 -0
  310. package/dist/report/terminal.d.ts +440 -0
  311. package/dist/report/terminal.d.ts.map +1 -0
  312. package/dist/report/terminal.js +840 -0
  313. package/dist/report/terminal.js.map +1 -0
  314. package/dist/reviewignore.d.ts +125 -0
  315. package/dist/reviewignore.d.ts.map +1 -0
  316. package/dist/reviewignore.js +335 -0
  317. package/dist/reviewignore.js.map +1 -0
  318. package/dist/security-logger.d.ts +178 -0
  319. package/dist/security-logger.d.ts.map +1 -0
  320. package/dist/security-logger.js +256 -0
  321. package/dist/security-logger.js.map +1 -0
  322. package/dist/telemetry/backends/console.d.ts +24 -0
  323. package/dist/telemetry/backends/console.d.ts.map +1 -0
  324. package/dist/telemetry/backends/console.js +54 -0
  325. package/dist/telemetry/backends/console.js.map +1 -0
  326. package/dist/telemetry/backends/jsonl.d.ts +31 -0
  327. package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
  328. package/dist/telemetry/backends/jsonl.js +121 -0
  329. package/dist/telemetry/backends/jsonl.js.map +1 -0
  330. package/dist/telemetry/emitter.d.ts +43 -0
  331. package/dist/telemetry/emitter.d.ts.map +1 -0
  332. package/dist/telemetry/emitter.js +83 -0
  333. package/dist/telemetry/emitter.js.map +1 -0
  334. package/dist/telemetry/hook.d.ts +53 -0
  335. package/dist/telemetry/hook.d.ts.map +1 -0
  336. package/dist/telemetry/hook.js +118 -0
  337. package/dist/telemetry/hook.js.map +1 -0
  338. package/dist/telemetry/index.d.ts +58 -0
  339. package/dist/telemetry/index.d.ts.map +1 -0
  340. package/dist/telemetry/index.js +143 -0
  341. package/dist/telemetry/index.js.map +1 -0
  342. package/dist/telemetry/types.d.ts +139 -0
  343. package/dist/telemetry/types.d.ts.map +1 -0
  344. package/dist/telemetry/types.js +133 -0
  345. package/dist/telemetry/types.js.map +1 -0
  346. package/dist/trust.d.ts +65 -0
  347. package/dist/trust.d.ts.map +1 -0
  348. package/dist/trust.js +78 -0
  349. package/dist/trust.js.map +1 -0
  350. package/dist/types/assert-never.d.ts +30 -0
  351. package/dist/types/assert-never.d.ts.map +1 -0
  352. package/dist/types/assert-never.js +32 -0
  353. package/dist/types/assert-never.js.map +1 -0
  354. package/dist/types/branded.d.ts +172 -0
  355. package/dist/types/branded.d.ts.map +1 -0
  356. package/dist/types/branded.js +262 -0
  357. package/dist/types/branded.js.map +1 -0
  358. package/dist/types/errors.d.ts +320 -0
  359. package/dist/types/errors.d.ts.map +1 -0
  360. package/dist/types/errors.js +551 -0
  361. package/dist/types/errors.js.map +1 -0
  362. package/dist/types/index.d.ts +37 -0
  363. package/dist/types/index.d.ts.map +1 -0
  364. package/dist/types/index.js +77 -0
  365. package/dist/types/index.js.map +1 -0
  366. package/dist/types/result.d.ts +323 -0
  367. package/dist/types/result.d.ts.map +1 -0
  368. package/dist/types/result.js +423 -0
  369. package/dist/types/result.js.map +1 -0
  370. package/package.json +63 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Built-in Mitigation Patterns
3
+ *
4
+ * Defines patterns for recognizing common security mitigations.
5
+ * These patterns are matched against AST nodes during CFG construction.
6
+ *
7
+ * Per FR-006: Each pattern maps to specific vulnerability types it mitigates.
8
+ * Per FR-015: All patterns are declarative and side-effect-free.
9
+ */
10
+ import type { MitigationPattern } from './types.js';
11
+ export declare const inputValidationPatterns: MitigationPattern[];
12
+ export declare const nullSafetyPatterns: MitigationPattern[];
13
+ export declare const authCheckPatterns: MitigationPattern[];
14
+ export declare const outputEncodingPatterns: MitigationPattern[];
15
+ export declare const pathTraversalPatterns: MitigationPattern[];
16
+ /**
17
+ * All built-in mitigation patterns.
18
+ * Organized by category for easy reference and testing.
19
+ */
20
+ export declare const BUILTIN_PATTERNS: MitigationPattern[];
21
+ /**
22
+ * Pattern lookup by ID for fast access.
23
+ */
24
+ export declare const PATTERN_BY_ID: Map<string, {
25
+ id: string;
26
+ name: string;
27
+ description: string;
28
+ mitigates: ("injection" | "null_deref" | "auth_bypass" | "xss" | "path_traversal" | "prototype_pollution" | "ssrf")[];
29
+ match: {
30
+ type: "function_call" | "method_call" | "type_guard" | "assignment" | "typeof_check" | "instanceof_check";
31
+ name?: string | undefined;
32
+ namePattern?: string | undefined;
33
+ module?: string | undefined;
34
+ parameters?: {
35
+ index: number;
36
+ constraint: "string" | "any" | "tainted_source";
37
+ }[] | undefined;
38
+ returnConstraint?: "truthy" | "defined" | "sanitized" | undefined;
39
+ };
40
+ confidence: "high" | "medium" | "low";
41
+ isBuiltIn?: boolean | undefined;
42
+ deprecated?: boolean | undefined;
43
+ deprecationReason?: string | undefined;
44
+ }>;
45
+ /**
46
+ * Get patterns that mitigate a specific vulnerability type.
47
+ */
48
+ export declare function getPatternsForVulnerability(vulnType: string): MitigationPattern[];
49
+ /**
50
+ * Get pattern by ID.
51
+ */
52
+ export declare function getPatternById(id: string): MitigationPattern | undefined;
53
+ //# sourceMappingURL=mitigation-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mitigation-patterns.d.ts","sourceRoot":"","sources":["../../../src/agents/control_flow/mitigation-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,EAqItD,CAAC;AAOF,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAwHjD,CAAC;AAOF,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,EAyIhD,CAAC;AAOF,eAAO,MAAM,sBAAsB,EAAE,iBAAiB,EAoIrD,CAAC;AAOF,eAAO,MAAM,qBAAqB,EAAE,iBAAiB,EAqDpD,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAM/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;EAEzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAExE"}
@@ -0,0 +1,620 @@
1
+ /**
2
+ * Built-in Mitigation Patterns
3
+ *
4
+ * Defines patterns for recognizing common security mitigations.
5
+ * These patterns are matched against AST nodes during CFG construction.
6
+ *
7
+ * Per FR-006: Each pattern maps to specific vulnerability types it mitigates.
8
+ * Per FR-015: All patterns are declarative and side-effect-free.
9
+ */
10
+ // =============================================================================
11
+ // Input Validation Patterns (T021)
12
+ // Mitigates: injection, xss, path_traversal, ssrf
13
+ // =============================================================================
14
+ export const inputValidationPatterns = [
15
+ // Zod validation
16
+ {
17
+ id: 'zod-parse',
18
+ name: 'Zod Schema Parse',
19
+ description: 'Validates input against a Zod schema, throwing on invalid input',
20
+ mitigates: ['injection', 'xss', 'path_traversal'],
21
+ match: {
22
+ type: 'method_call',
23
+ namePattern: '^parse$',
24
+ module: 'zod',
25
+ returnConstraint: 'sanitized',
26
+ },
27
+ confidence: 'high',
28
+ isBuiltIn: true,
29
+ },
30
+ {
31
+ id: 'zod-safeParse',
32
+ name: 'Zod Safe Parse',
33
+ description: 'Validates input against a Zod schema, returning result object',
34
+ mitigates: ['injection', 'xss', 'path_traversal'],
35
+ match: {
36
+ type: 'method_call',
37
+ namePattern: '^safeParse$',
38
+ module: 'zod',
39
+ returnConstraint: 'sanitized',
40
+ },
41
+ confidence: 'high',
42
+ isBuiltIn: true,
43
+ },
44
+ // Joi validation
45
+ {
46
+ id: 'joi-validate',
47
+ name: 'Joi Schema Validate',
48
+ description: 'Validates input against a Joi schema',
49
+ mitigates: ['injection', 'xss', 'path_traversal'],
50
+ match: {
51
+ type: 'method_call',
52
+ namePattern: '^validate$',
53
+ module: 'joi',
54
+ returnConstraint: 'sanitized',
55
+ },
56
+ confidence: 'high',
57
+ isBuiltIn: true,
58
+ },
59
+ {
60
+ id: 'joi-validateAsync',
61
+ name: 'Joi Async Validate',
62
+ description: 'Validates input asynchronously against a Joi schema',
63
+ mitigates: ['injection', 'xss', 'path_traversal'],
64
+ match: {
65
+ type: 'method_call',
66
+ namePattern: '^validateAsync$',
67
+ module: 'joi',
68
+ returnConstraint: 'sanitized',
69
+ },
70
+ confidence: 'high',
71
+ isBuiltIn: true,
72
+ },
73
+ // Validator.js
74
+ {
75
+ id: 'validator-escape',
76
+ name: 'Validator.js Escape',
77
+ description: 'Escapes HTML characters to prevent XSS',
78
+ mitigates: ['xss'],
79
+ match: {
80
+ type: 'function_call',
81
+ namePattern: '^escape$',
82
+ module: 'validator',
83
+ returnConstraint: 'sanitized',
84
+ },
85
+ confidence: 'high',
86
+ isBuiltIn: true,
87
+ },
88
+ {
89
+ id: 'validator-isEmail',
90
+ name: 'Validator.js Email Check',
91
+ description: 'Validates email format',
92
+ mitigates: ['injection'],
93
+ match: {
94
+ type: 'function_call',
95
+ namePattern: '^isEmail$',
96
+ module: 'validator',
97
+ returnConstraint: 'truthy',
98
+ },
99
+ confidence: 'medium',
100
+ isBuiltIn: true,
101
+ },
102
+ {
103
+ id: 'validator-isURL',
104
+ name: 'Validator.js URL Check',
105
+ description: 'Validates URL format',
106
+ mitigates: ['ssrf', 'injection'],
107
+ match: {
108
+ type: 'function_call',
109
+ namePattern: '^isURL$',
110
+ module: 'validator',
111
+ returnConstraint: 'truthy',
112
+ },
113
+ confidence: 'medium',
114
+ isBuiltIn: true,
115
+ },
116
+ {
117
+ id: 'validator-isAlphanumeric',
118
+ name: 'Validator.js Alphanumeric Check',
119
+ description: 'Validates input is alphanumeric only',
120
+ mitigates: ['injection', 'path_traversal'],
121
+ match: {
122
+ type: 'function_call',
123
+ namePattern: '^isAlphanumeric$',
124
+ module: 'validator',
125
+ returnConstraint: 'truthy',
126
+ },
127
+ confidence: 'high',
128
+ isBuiltIn: true,
129
+ },
130
+ // Parameterized queries (implicit mitigation)
131
+ {
132
+ id: 'sql-parameterized',
133
+ name: 'SQL Parameterized Query',
134
+ description: 'Uses parameterized query with placeholders ($1, ?, :param)',
135
+ mitigates: ['injection'],
136
+ match: {
137
+ type: 'method_call',
138
+ namePattern: '^(query|execute|run|prepare)$',
139
+ parameters: [{ index: 1, constraint: 'any' }], // Second param = values array
140
+ },
141
+ confidence: 'high',
142
+ isBuiltIn: true,
143
+ },
144
+ ];
145
+ // =============================================================================
146
+ // Null Safety Patterns (T022)
147
+ // Mitigates: null_deref
148
+ // =============================================================================
149
+ export const nullSafetyPatterns = [
150
+ // Optional chaining
151
+ {
152
+ id: 'optional-chaining',
153
+ name: 'Optional Chaining',
154
+ description: 'Uses ?. operator for safe property access',
155
+ mitigates: ['null_deref'],
156
+ match: {
157
+ type: 'type_guard',
158
+ namePattern: '^\\?\\.', // Regex to match ?. operator
159
+ },
160
+ confidence: 'high',
161
+ isBuiltIn: true,
162
+ },
163
+ // Nullish coalescing
164
+ {
165
+ id: 'nullish-coalescing',
166
+ name: 'Nullish Coalescing',
167
+ description: 'Uses ?? operator to provide default value',
168
+ mitigates: ['null_deref'],
169
+ match: {
170
+ type: 'assignment',
171
+ namePattern: '^\\?\\?', // Regex to match ?? operator
172
+ },
173
+ confidence: 'high',
174
+ isBuiltIn: true,
175
+ },
176
+ // Nullish assignment
177
+ {
178
+ id: 'nullish-assignment',
179
+ name: 'Nullish Assignment',
180
+ description: 'Uses ??= operator for conditional assignment',
181
+ mitigates: ['null_deref'],
182
+ match: {
183
+ type: 'assignment',
184
+ namePattern: '^\\?\\?=', // Regex to match ??= operator
185
+ },
186
+ confidence: 'high',
187
+ isBuiltIn: true,
188
+ },
189
+ // Typeof check
190
+ {
191
+ id: 'typeof-check',
192
+ name: 'Typeof Check',
193
+ description: 'Uses typeof to check value type before access',
194
+ mitigates: ['null_deref'],
195
+ match: {
196
+ type: 'typeof_check',
197
+ },
198
+ confidence: 'high',
199
+ isBuiltIn: true,
200
+ },
201
+ // Instanceof check
202
+ {
203
+ id: 'instanceof-check',
204
+ name: 'Instanceof Check',
205
+ description: 'Uses instanceof to verify object type',
206
+ mitigates: ['null_deref'],
207
+ match: {
208
+ type: 'instanceof_check',
209
+ },
210
+ confidence: 'high',
211
+ isBuiltIn: true,
212
+ },
213
+ // Explicit null/undefined checks
214
+ {
215
+ id: 'null-check-strict',
216
+ name: 'Strict Null Check',
217
+ description: 'Checks value against null with strict equality',
218
+ mitigates: ['null_deref'],
219
+ match: {
220
+ type: 'type_guard',
221
+ namePattern: '^(!==?\\s*null|===?\\s*null)', // x !== null or x === null
222
+ },
223
+ confidence: 'high',
224
+ isBuiltIn: true,
225
+ },
226
+ {
227
+ id: 'undefined-check-strict',
228
+ name: 'Strict Undefined Check',
229
+ description: 'Checks value against undefined with strict equality',
230
+ mitigates: ['null_deref'],
231
+ match: {
232
+ type: 'type_guard',
233
+ namePattern: '^(!==?\\s*undefined|===?\\s*undefined)',
234
+ },
235
+ confidence: 'high',
236
+ isBuiltIn: true,
237
+ },
238
+ {
239
+ id: 'nullish-check',
240
+ name: 'Nullish Check (== null)',
241
+ description: 'Checks value for null or undefined using loose equality',
242
+ mitigates: ['null_deref'],
243
+ match: {
244
+ type: 'type_guard',
245
+ namePattern: '^(!=\\s*null|==\\s*null)', // x != null (catches both null and undefined)
246
+ },
247
+ confidence: 'high',
248
+ isBuiltIn: true,
249
+ },
250
+ // Assertion functions
251
+ {
252
+ id: 'assert-defined',
253
+ name: 'Assert Defined',
254
+ description: 'Assertion function that throws if value is null/undefined',
255
+ mitigates: ['null_deref'],
256
+ match: {
257
+ type: 'function_call',
258
+ namePattern: '^(assertDefined|assertNotNull|assertNotNullish|assert)$',
259
+ },
260
+ confidence: 'medium',
261
+ isBuiltIn: true,
262
+ },
263
+ ];
264
+ // =============================================================================
265
+ // Auth Check Patterns (T023)
266
+ // Mitigates: auth_bypass
267
+ // =============================================================================
268
+ export const authCheckPatterns = [
269
+ // JWT verification
270
+ {
271
+ id: 'jwt-verify',
272
+ name: 'JWT Verify',
273
+ description: 'Verifies JWT token signature and claims',
274
+ mitigates: ['auth_bypass'],
275
+ match: {
276
+ type: 'method_call',
277
+ namePattern: '^verify$',
278
+ module: 'jsonwebtoken',
279
+ },
280
+ confidence: 'high',
281
+ isBuiltIn: true,
282
+ },
283
+ {
284
+ id: 'jwt-decode-verify',
285
+ name: 'JWT Decode with Verify',
286
+ description: 'Decodes and verifies JWT token',
287
+ mitigates: ['auth_bypass'],
288
+ match: {
289
+ type: 'function_call',
290
+ namePattern: '^(jwtVerify|verifyToken|verifyJwt)$',
291
+ },
292
+ confidence: 'medium',
293
+ isBuiltIn: true,
294
+ },
295
+ // Passport.js
296
+ {
297
+ id: 'passport-authenticate',
298
+ name: 'Passport Authenticate',
299
+ description: 'Passport.js authentication middleware',
300
+ mitigates: ['auth_bypass'],
301
+ match: {
302
+ type: 'method_call',
303
+ namePattern: '^authenticate$',
304
+ module: 'passport',
305
+ },
306
+ confidence: 'high',
307
+ isBuiltIn: true,
308
+ },
309
+ {
310
+ id: 'passport-isAuthenticated',
311
+ name: 'Passport isAuthenticated',
312
+ description: 'Checks if user is authenticated via Passport session',
313
+ mitigates: ['auth_bypass'],
314
+ match: {
315
+ type: 'method_call',
316
+ namePattern: '^isAuthenticated$',
317
+ returnConstraint: 'truthy',
318
+ },
319
+ confidence: 'high',
320
+ isBuiltIn: true,
321
+ },
322
+ // Session checks
323
+ {
324
+ id: 'session-user-check',
325
+ name: 'Session User Check',
326
+ description: 'Checks for user object in session',
327
+ mitigates: ['auth_bypass'],
328
+ match: {
329
+ type: 'type_guard',
330
+ namePattern: '^(session\\.user|req\\.session\\.user|session\\?.user)',
331
+ },
332
+ confidence: 'medium',
333
+ isBuiltIn: true,
334
+ },
335
+ {
336
+ id: 'session-id-check',
337
+ name: 'Session ID Check',
338
+ description: 'Checks for user ID in session',
339
+ mitigates: ['auth_bypass'],
340
+ match: {
341
+ type: 'type_guard',
342
+ namePattern: '^(session\\.userId|req\\.session\\.userId|session\\?.userId)',
343
+ },
344
+ confidence: 'medium',
345
+ isBuiltIn: true,
346
+ },
347
+ // Role/permission checks
348
+ {
349
+ id: 'role-check',
350
+ name: 'Role Check',
351
+ description: 'Checks user role for authorization',
352
+ mitigates: ['auth_bypass'],
353
+ match: {
354
+ type: 'type_guard',
355
+ namePattern: '^(user\\.role|req\\.user\\.role|\\.role\\s*===)',
356
+ },
357
+ confidence: 'medium',
358
+ isBuiltIn: true,
359
+ },
360
+ {
361
+ id: 'permission-check',
362
+ name: 'Permission Check',
363
+ description: 'Checks user permissions for authorization',
364
+ mitigates: ['auth_bypass'],
365
+ match: {
366
+ type: 'function_call',
367
+ namePattern: '^(hasPermission|checkPermission|can|authorize)$',
368
+ returnConstraint: 'truthy',
369
+ },
370
+ confidence: 'medium',
371
+ isBuiltIn: true,
372
+ },
373
+ // OAuth token verification
374
+ {
375
+ id: 'oauth-verify',
376
+ name: 'OAuth Token Verify',
377
+ description: 'Verifies OAuth access token',
378
+ mitigates: ['auth_bypass'],
379
+ match: {
380
+ type: 'method_call',
381
+ namePattern: '^(verifyAccessToken|validateToken|introspect)$',
382
+ },
383
+ confidence: 'medium',
384
+ isBuiltIn: true,
385
+ },
386
+ // API key validation
387
+ {
388
+ id: 'api-key-validate',
389
+ name: 'API Key Validation',
390
+ description: 'Validates API key for authentication',
391
+ mitigates: ['auth_bypass'],
392
+ match: {
393
+ type: 'function_call',
394
+ namePattern: '^(validateApiKey|verifyApiKey|isValidApiKey)$',
395
+ returnConstraint: 'truthy',
396
+ },
397
+ confidence: 'medium',
398
+ isBuiltIn: true,
399
+ },
400
+ ];
401
+ // =============================================================================
402
+ // Output Encoding Patterns (T024)
403
+ // Mitigates: xss
404
+ // =============================================================================
405
+ export const outputEncodingPatterns = [
406
+ // DOMPurify
407
+ {
408
+ id: 'dompurify-sanitize',
409
+ name: 'DOMPurify Sanitize',
410
+ description: 'Sanitizes HTML to prevent XSS',
411
+ mitigates: ['xss'],
412
+ match: {
413
+ type: 'method_call',
414
+ namePattern: '^sanitize$',
415
+ module: 'dompurify',
416
+ returnConstraint: 'sanitized',
417
+ },
418
+ confidence: 'high',
419
+ isBuiltIn: true,
420
+ },
421
+ // Built-in encoding functions
422
+ {
423
+ id: 'encodeURI',
424
+ name: 'encodeURI',
425
+ description: 'Encodes a URI',
426
+ mitigates: ['xss', 'injection'],
427
+ match: {
428
+ type: 'function_call',
429
+ name: 'encodeURI',
430
+ returnConstraint: 'sanitized',
431
+ },
432
+ confidence: 'medium',
433
+ isBuiltIn: true,
434
+ },
435
+ {
436
+ id: 'encodeURIComponent',
437
+ name: 'encodeURIComponent',
438
+ description: 'Encodes a URI component',
439
+ mitigates: ['xss', 'injection'],
440
+ match: {
441
+ type: 'function_call',
442
+ name: 'encodeURIComponent',
443
+ returnConstraint: 'sanitized',
444
+ },
445
+ confidence: 'high',
446
+ isBuiltIn: true,
447
+ },
448
+ // HTML entity encoding
449
+ {
450
+ id: 'he-encode',
451
+ name: 'he.encode',
452
+ description: 'Encodes HTML entities using he library',
453
+ mitigates: ['xss'],
454
+ match: {
455
+ type: 'method_call',
456
+ namePattern: '^encode$',
457
+ module: 'he',
458
+ returnConstraint: 'sanitized',
459
+ },
460
+ confidence: 'high',
461
+ isBuiltIn: true,
462
+ },
463
+ {
464
+ id: 'he-escape',
465
+ name: 'he.escape',
466
+ description: 'Escapes HTML entities using he library',
467
+ mitigates: ['xss'],
468
+ match: {
469
+ type: 'method_call',
470
+ namePattern: '^escape$',
471
+ module: 'he',
472
+ returnConstraint: 'sanitized',
473
+ },
474
+ confidence: 'high',
475
+ isBuiltIn: true,
476
+ },
477
+ // lodash/underscore escape
478
+ {
479
+ id: 'lodash-escape',
480
+ name: 'Lodash Escape',
481
+ description: 'Escapes HTML using lodash/underscore',
482
+ mitigates: ['xss'],
483
+ match: {
484
+ type: 'method_call',
485
+ namePattern: '^escape$',
486
+ module: 'lodash',
487
+ returnConstraint: 'sanitized',
488
+ },
489
+ confidence: 'high',
490
+ isBuiltIn: true,
491
+ },
492
+ // React automatic escaping (JSX)
493
+ {
494
+ id: 'react-jsx-escape',
495
+ name: 'React JSX Escape',
496
+ description: 'React automatically escapes JSX content',
497
+ mitigates: ['xss'],
498
+ match: {
499
+ type: 'assignment',
500
+ namePattern: '^<[A-Z]', // JSX element assignment
501
+ },
502
+ confidence: 'high',
503
+ isBuiltIn: true,
504
+ },
505
+ // textContent (safe DOM assignment)
506
+ {
507
+ id: 'textContent-assignment',
508
+ name: 'textContent Assignment',
509
+ description: 'Assigning to textContent is safe from XSS',
510
+ mitigates: ['xss'],
511
+ match: {
512
+ type: 'assignment',
513
+ namePattern: '\\.textContent\\s*=',
514
+ },
515
+ confidence: 'high',
516
+ isBuiltIn: true,
517
+ },
518
+ // createTextNode (safe DOM method)
519
+ {
520
+ id: 'createTextNode',
521
+ name: 'createTextNode',
522
+ description: 'Creating text node is safe from XSS',
523
+ mitigates: ['xss'],
524
+ match: {
525
+ type: 'method_call',
526
+ name: 'createTextNode',
527
+ },
528
+ confidence: 'high',
529
+ isBuiltIn: true,
530
+ },
531
+ ];
532
+ // =============================================================================
533
+ // Path Traversal Patterns
534
+ // Mitigates: path_traversal
535
+ // =============================================================================
536
+ export const pathTraversalPatterns = [
537
+ {
538
+ id: 'path-resolve',
539
+ name: 'Path Resolve',
540
+ description: 'Resolves path segments to absolute path',
541
+ mitigates: ['path_traversal'],
542
+ match: {
543
+ type: 'method_call',
544
+ namePattern: '^resolve$',
545
+ module: 'path',
546
+ },
547
+ confidence: 'medium',
548
+ isBuiltIn: true,
549
+ },
550
+ {
551
+ id: 'path-normalize',
552
+ name: 'Path Normalize',
553
+ description: 'Normalizes path by resolving . and ..',
554
+ mitigates: ['path_traversal'],
555
+ match: {
556
+ type: 'method_call',
557
+ namePattern: '^normalize$',
558
+ module: 'path',
559
+ },
560
+ confidence: 'low', // normalize alone doesn't prevent traversal
561
+ isBuiltIn: true,
562
+ },
563
+ {
564
+ id: 'path-basename',
565
+ name: 'Path Basename',
566
+ description: 'Extracts filename only, preventing directory traversal',
567
+ mitigates: ['path_traversal'],
568
+ match: {
569
+ type: 'method_call',
570
+ namePattern: '^basename$',
571
+ module: 'path',
572
+ },
573
+ confidence: 'high',
574
+ isBuiltIn: true,
575
+ },
576
+ {
577
+ id: 'startsWith-check',
578
+ name: 'Path Prefix Check',
579
+ description: 'Verifies path starts with allowed directory',
580
+ mitigates: ['path_traversal'],
581
+ match: {
582
+ type: 'method_call',
583
+ namePattern: '^startsWith$',
584
+ returnConstraint: 'truthy',
585
+ },
586
+ confidence: 'medium',
587
+ isBuiltIn: true,
588
+ },
589
+ ];
590
+ // =============================================================================
591
+ // Aggregate Exports
592
+ // =============================================================================
593
+ /**
594
+ * All built-in mitigation patterns.
595
+ * Organized by category for easy reference and testing.
596
+ */
597
+ export const BUILTIN_PATTERNS = [
598
+ ...inputValidationPatterns,
599
+ ...nullSafetyPatterns,
600
+ ...authCheckPatterns,
601
+ ...outputEncodingPatterns,
602
+ ...pathTraversalPatterns,
603
+ ];
604
+ /**
605
+ * Pattern lookup by ID for fast access.
606
+ */
607
+ export const PATTERN_BY_ID = new Map(BUILTIN_PATTERNS.map((p) => [p.id, p]));
608
+ /**
609
+ * Get patterns that mitigate a specific vulnerability type.
610
+ */
611
+ export function getPatternsForVulnerability(vulnType) {
612
+ return BUILTIN_PATTERNS.filter((p) => p.mitigates.includes(vulnType));
613
+ }
614
+ /**
615
+ * Get pattern by ID.
616
+ */
617
+ export function getPatternById(id) {
618
+ return PATTERN_BY_ID.get(id);
619
+ }
620
+ //# sourceMappingURL=mitigation-patterns.js.map