@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,430 @@
1
+ /**
2
+ * Mitigation Configuration Parser
3
+ *
4
+ * Parses and validates custom mitigation pattern configuration.
5
+ * Implements:
6
+ * - T052: Config parser using Zod schemas
7
+ * - T053: Pattern validation ensuring declarative/side-effect-free per FR-015
8
+ * - T054: Pattern override support (confidence, deprecated)
9
+ * - T055: Pattern disable list support
10
+ * - FR-016: Validate patterns at configuration time with clear error messages
11
+ */
12
+ import { ControlFlowConfigSchema, } from '../agents/control_flow/types.js';
13
+ // =============================================================================
14
+ // FR-015: Declarative Pattern Validation
15
+ // =============================================================================
16
+ /**
17
+ * Reserved words that cannot be used in pattern names (security measure).
18
+ */
19
+ const RESERVED_PATTERN_WORDS = [
20
+ 'eval',
21
+ 'Function',
22
+ 'setTimeout',
23
+ 'setInterval',
24
+ 'exec',
25
+ 'spawn',
26
+ 'require',
27
+ 'import',
28
+ ];
29
+ /**
30
+ * Maximum allowed pattern name/namePattern length.
31
+ */
32
+ const MAX_PATTERN_NAME_LENGTH = 256;
33
+ /**
34
+ * Maximum allowed patterns in a single configuration.
35
+ */
36
+ const MAX_CUSTOM_PATTERNS = 100;
37
+ /**
38
+ * Maximum allowed overrides in a single configuration.
39
+ */
40
+ const MAX_PATTERN_OVERRIDES = 200;
41
+ /**
42
+ * Maximum allowed disabled patterns in a single configuration.
43
+ */
44
+ const MAX_DISABLED_PATTERNS = 200;
45
+ /**
46
+ * Validate that a pattern is declarative and side-effect-free per FR-015.
47
+ *
48
+ * Patterns must only contain:
49
+ * - Function name matching (exact or regex)
50
+ * - Parameter constraints
51
+ * - Return value assertions
52
+ * - Module specifications
53
+ *
54
+ * No executable code, callbacks, or side effects are allowed.
55
+ */
56
+ export function validatePatternIsDeclarative(pattern) {
57
+ const errors = [];
58
+ const warnings = [];
59
+ // Check pattern ID is valid
60
+ if (!pattern.id || pattern.id.trim().length === 0) {
61
+ errors.push({
62
+ code: 'EMPTY_PATTERN_ID',
63
+ path: ['id'],
64
+ message: 'Pattern ID cannot be empty',
65
+ });
66
+ }
67
+ // Check for reserved words in pattern name matching
68
+ if (pattern.match.name) {
69
+ for (const reserved of RESERVED_PATTERN_WORDS) {
70
+ if (pattern.match.name === reserved) {
71
+ errors.push({
72
+ code: 'RESERVED_PATTERN_NAME',
73
+ path: ['match', 'name'],
74
+ message: `Pattern name "${reserved}" is reserved and cannot be used`,
75
+ });
76
+ }
77
+ }
78
+ }
79
+ // Validate namePattern is a valid regex
80
+ if (pattern.match.namePattern) {
81
+ if (pattern.match.namePattern.length > MAX_PATTERN_NAME_LENGTH) {
82
+ errors.push({
83
+ code: 'PATTERN_TOO_LONG',
84
+ path: ['match', 'namePattern'],
85
+ message: `Pattern regex exceeds maximum length of ${MAX_PATTERN_NAME_LENGTH} characters`,
86
+ });
87
+ }
88
+ try {
89
+ // Trust: REPO_CONFIG - Pattern from repository configuration, validated at config load time
90
+ // Control: Try-catch validates syntax before use. See docs/security/regex-threat-model.md
91
+ // eslint-disable-next-line security/detect-non-literal-regexp -- Validated config pattern
92
+ new RegExp(pattern.match.namePattern);
93
+ }
94
+ catch (e) {
95
+ errors.push({
96
+ code: 'INVALID_REGEX',
97
+ path: ['match', 'namePattern'],
98
+ message: `Invalid regex pattern: ${e.message}`,
99
+ });
100
+ }
101
+ // Check for overly complex/dangerous regex patterns
102
+ if (hasExponentialRegex(pattern.match.namePattern)) {
103
+ warnings.push({
104
+ code: 'COMPLEX_REGEX',
105
+ path: ['match', 'namePattern'],
106
+ message: 'Pattern contains potentially slow regex. Consider simplifying.',
107
+ });
108
+ }
109
+ }
110
+ // Either name or namePattern should be specified for function/method calls
111
+ if ((pattern.match.type === 'function_call' || pattern.match.type === 'method_call') &&
112
+ !pattern.match.name &&
113
+ !pattern.match.namePattern) {
114
+ errors.push({
115
+ code: 'MISSING_MATCH_CRITERIA',
116
+ path: ['match'],
117
+ message: 'Function/method call patterns must specify either name or namePattern',
118
+ });
119
+ }
120
+ // Validate parameter constraints are reasonable
121
+ if (pattern.match.parameters) {
122
+ const seenIndices = new Set();
123
+ for (let i = 0; i < pattern.match.parameters.length; i++) {
124
+ const param = pattern.match.parameters[i];
125
+ if (!param)
126
+ continue;
127
+ if (seenIndices.has(param.index)) {
128
+ errors.push({
129
+ code: 'DUPLICATE_PARAM_INDEX',
130
+ path: ['match', 'parameters', i.toString()],
131
+ message: `Duplicate parameter index: ${param.index}`,
132
+ });
133
+ }
134
+ seenIndices.add(param.index);
135
+ if (param.index < 0 || param.index > 10) {
136
+ warnings.push({
137
+ code: 'UNUSUAL_PARAM_INDEX',
138
+ path: ['match', 'parameters', i.toString()],
139
+ message: `Parameter index ${param.index} is unusual. Most functions have fewer than 10 parameters.`,
140
+ });
141
+ }
142
+ }
143
+ }
144
+ // Check that mitigates contains at least one entry
145
+ if (!pattern.mitigates || pattern.mitigates.length === 0) {
146
+ errors.push({
147
+ code: 'EMPTY_MITIGATES',
148
+ path: ['mitigates'],
149
+ message: 'Pattern must mitigate at least one vulnerability type',
150
+ });
151
+ }
152
+ // Warn about deprecated patterns without reason
153
+ if (pattern.deprecated && !pattern.deprecationReason) {
154
+ warnings.push({
155
+ code: 'DEPRECATED_NO_REASON',
156
+ path: ['deprecationReason'],
157
+ message: 'Deprecated patterns should include a deprecation reason',
158
+ });
159
+ }
160
+ return {
161
+ valid: errors.length === 0,
162
+ errors,
163
+ warnings,
164
+ };
165
+ }
166
+ /**
167
+ * Check if a regex pattern might have exponential backtracking.
168
+ * This is a simple heuristic check, not a complete analysis.
169
+ */
170
+ function hasExponentialRegex(pattern) {
171
+ // Check for nested quantifiers like (a+)+ or (a*)*
172
+ if (/\([^)]*[+*]\)[+*]/.test(pattern)) {
173
+ return true;
174
+ }
175
+ // Check for overlapping alternatives with quantifiers
176
+ if (/\([^|)]*\|[^)]*\)[+*]/.test(pattern)) {
177
+ return true;
178
+ }
179
+ return false;
180
+ }
181
+ // =============================================================================
182
+ // Pattern Override Validation
183
+ // =============================================================================
184
+ /**
185
+ * Validate a pattern override.
186
+ */
187
+ export function validatePatternOverride(override) {
188
+ const errors = [];
189
+ const warnings = [];
190
+ if (!override.patternId || override.patternId.trim().length === 0) {
191
+ errors.push({
192
+ code: 'EMPTY_PATTERN_ID',
193
+ path: ['patternId'],
194
+ message: 'Override must specify a pattern ID',
195
+ });
196
+ }
197
+ // Warn if override has no actual changes
198
+ if (override.confidence === undefined && override.deprecated === undefined) {
199
+ warnings.push({
200
+ code: 'NO_OVERRIDE_CHANGES',
201
+ path: [],
202
+ message: 'Override has no changes specified (confidence or deprecated)',
203
+ });
204
+ }
205
+ // Warn about deprecation without reason
206
+ if (override.deprecated && !override.deprecationReason) {
207
+ warnings.push({
208
+ code: 'DEPRECATED_NO_REASON',
209
+ path: ['deprecationReason'],
210
+ message: 'Deprecated overrides should include a deprecation reason',
211
+ });
212
+ }
213
+ return {
214
+ valid: errors.length === 0,
215
+ errors,
216
+ warnings,
217
+ };
218
+ }
219
+ // =============================================================================
220
+ // Configuration Parsing
221
+ // =============================================================================
222
+ /**
223
+ * Parse and validate a control flow configuration.
224
+ *
225
+ * This function:
226
+ * 1. Parses the config using Zod schema
227
+ * 2. Validates each custom pattern is declarative (FR-015)
228
+ * 3. Validates pattern overrides
229
+ * 4. Checks for conflicts and issues
230
+ */
231
+ export function parseControlFlowConfig(rawConfig) {
232
+ const errors = [];
233
+ const warnings = [];
234
+ // Step 1: Parse with Zod schema
235
+ const parseResult = ControlFlowConfigSchema.safeParse(rawConfig);
236
+ if (!parseResult.success) {
237
+ for (const issue of parseResult.error.issues) {
238
+ errors.push({
239
+ code: 'SCHEMA_VALIDATION',
240
+ path: issue.path.map(String),
241
+ message: issue.message,
242
+ });
243
+ }
244
+ return { success: false, errors, warnings };
245
+ }
246
+ const config = parseResult.data;
247
+ // Step 2: Validate custom patterns count
248
+ if (config.mitigationPatterns.length > MAX_CUSTOM_PATTERNS) {
249
+ errors.push({
250
+ code: 'TOO_MANY_PATTERNS',
251
+ path: ['mitigationPatterns'],
252
+ message: `Too many custom patterns. Maximum is ${MAX_CUSTOM_PATTERNS}, got ${config.mitigationPatterns.length}`,
253
+ });
254
+ }
255
+ // Step 3: Validate each custom pattern
256
+ const patternIds = new Set();
257
+ for (let i = 0; i < config.mitigationPatterns.length; i++) {
258
+ const pattern = config.mitigationPatterns[i];
259
+ if (!pattern)
260
+ continue;
261
+ // Check for duplicate IDs
262
+ if (patternIds.has(pattern.id)) {
263
+ errors.push({
264
+ code: 'DUPLICATE_PATTERN_ID',
265
+ path: ['mitigationPatterns', i.toString()],
266
+ message: `Duplicate pattern ID: ${pattern.id}`,
267
+ });
268
+ }
269
+ patternIds.add(pattern.id);
270
+ // Validate pattern is declarative
271
+ const patternResult = validatePatternIsDeclarative(pattern);
272
+ for (const error of patternResult.errors) {
273
+ errors.push({
274
+ ...error,
275
+ path: ['mitigationPatterns', i.toString(), ...error.path],
276
+ });
277
+ }
278
+ for (const warning of patternResult.warnings) {
279
+ warnings.push({
280
+ ...warning,
281
+ path: ['mitigationPatterns', i.toString(), ...warning.path],
282
+ });
283
+ }
284
+ }
285
+ // Step 4: Validate overrides count
286
+ if (config.patternOverrides.length > MAX_PATTERN_OVERRIDES) {
287
+ errors.push({
288
+ code: 'TOO_MANY_OVERRIDES',
289
+ path: ['patternOverrides'],
290
+ message: `Too many pattern overrides. Maximum is ${MAX_PATTERN_OVERRIDES}, got ${config.patternOverrides.length}`,
291
+ });
292
+ }
293
+ // Step 5: Validate each override
294
+ const overrideIds = new Set();
295
+ for (let i = 0; i < config.patternOverrides.length; i++) {
296
+ const override = config.patternOverrides[i];
297
+ if (!override)
298
+ continue;
299
+ // Check for duplicate override IDs
300
+ if (overrideIds.has(override.patternId)) {
301
+ warnings.push({
302
+ code: 'DUPLICATE_OVERRIDE',
303
+ path: ['patternOverrides', i.toString()],
304
+ message: `Multiple overrides for pattern: ${override.patternId}. Only the last one will apply.`,
305
+ });
306
+ }
307
+ overrideIds.add(override.patternId);
308
+ // Validate override
309
+ const overrideResult = validatePatternOverride(override);
310
+ for (const error of overrideResult.errors) {
311
+ errors.push({
312
+ ...error,
313
+ path: ['patternOverrides', i.toString(), ...error.path],
314
+ });
315
+ }
316
+ for (const warning of overrideResult.warnings) {
317
+ warnings.push({
318
+ ...warning,
319
+ path: ['patternOverrides', i.toString(), ...warning.path],
320
+ });
321
+ }
322
+ }
323
+ // Step 6: Validate disabled patterns count
324
+ if (config.disabledPatterns.length > MAX_DISABLED_PATTERNS) {
325
+ errors.push({
326
+ code: 'TOO_MANY_DISABLED',
327
+ path: ['disabledPatterns'],
328
+ message: `Too many disabled patterns. Maximum is ${MAX_DISABLED_PATTERNS}, got ${config.disabledPatterns.length}`,
329
+ });
330
+ }
331
+ // Step 7: Check for duplicates in disabled patterns
332
+ const disabledSet = new Set();
333
+ for (let i = 0; i < config.disabledPatterns.length; i++) {
334
+ const id = config.disabledPatterns[i];
335
+ if (!id)
336
+ continue;
337
+ if (disabledSet.has(id)) {
338
+ warnings.push({
339
+ code: 'DUPLICATE_DISABLED',
340
+ path: ['disabledPatterns', i.toString()],
341
+ message: `Pattern "${id}" is listed multiple times in disabled patterns`,
342
+ });
343
+ }
344
+ disabledSet.add(id);
345
+ }
346
+ // Step 8: Check for conflicts between overrides and disabled
347
+ for (const override of config.patternOverrides) {
348
+ if (config.disabledPatterns.includes(override.patternId)) {
349
+ warnings.push({
350
+ code: 'OVERRIDE_DISABLED_CONFLICT',
351
+ path: ['patternOverrides'],
352
+ message: `Pattern "${override.patternId}" has an override but is also disabled. The pattern will be disabled.`,
353
+ });
354
+ }
355
+ }
356
+ return {
357
+ success: errors.length === 0,
358
+ config: errors.length === 0 ? config : undefined,
359
+ errors,
360
+ warnings,
361
+ };
362
+ }
363
+ // =============================================================================
364
+ // Pattern Application
365
+ // =============================================================================
366
+ /**
367
+ * Apply pattern overrides to a set of patterns.
368
+ *
369
+ * Returns a new array with overrides applied.
370
+ */
371
+ export function applyPatternOverrides(patterns, overrides) {
372
+ const overrideMap = new Map();
373
+ for (const override of overrides) {
374
+ overrideMap.set(override.patternId, override);
375
+ }
376
+ return patterns.map((pattern) => {
377
+ const override = overrideMap.get(pattern.id);
378
+ if (!override) {
379
+ return pattern;
380
+ }
381
+ return {
382
+ ...pattern,
383
+ confidence: override.confidence ?? pattern.confidence,
384
+ deprecated: override.deprecated ?? pattern.deprecated,
385
+ deprecationReason: override.deprecationReason ?? pattern.deprecationReason,
386
+ };
387
+ });
388
+ }
389
+ /**
390
+ * Filter out disabled patterns.
391
+ */
392
+ export function filterDisabledPatterns(patterns, disabledIds) {
393
+ const disabledSet = new Set(disabledIds);
394
+ return patterns.filter((p) => !disabledSet.has(p.id));
395
+ }
396
+ /**
397
+ * Get effective patterns after applying overrides and filtering disabled.
398
+ */
399
+ export function getEffectivePatterns(builtInPatterns, customPatterns, overrides, disabledIds) {
400
+ // Combine built-in and custom patterns
401
+ const allPatterns = [...builtInPatterns, ...customPatterns];
402
+ // Apply overrides
403
+ const withOverrides = applyPatternOverrides(allPatterns, overrides);
404
+ // Filter disabled
405
+ const filtered = filterDisabledPatterns(withOverrides, disabledIds);
406
+ // Filter deprecated
407
+ return filtered.filter((p) => !p.deprecated);
408
+ }
409
+ // =============================================================================
410
+ // Error Formatting
411
+ // =============================================================================
412
+ /**
413
+ * Format validation errors for display.
414
+ */
415
+ export function formatValidationErrors(errors) {
416
+ if (errors.length === 0) {
417
+ return 'No errors';
418
+ }
419
+ return errors.map((e) => `[${e.code}] ${e.path.join('.')}: ${e.message}`).join('\n');
420
+ }
421
+ /**
422
+ * Format validation warnings for display.
423
+ */
424
+ export function formatValidationWarnings(warnings) {
425
+ if (warnings.length === 0) {
426
+ return 'No warnings';
427
+ }
428
+ return warnings.map((w) => `[${w.code}] ${w.path.join('.')}: ${w.message}`).join('\n');
429
+ }
430
+ //# sourceMappingURL=mitigation-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mitigation-config.js","sourceRoot":"","sources":["../../src/config/mitigation-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Provider Resolution Module
3
+ *
4
+ * Handles LLM provider resolution with strict precedence rules.
5
+ * Extracted from config.ts to improve modularity.
6
+ */
7
+ import type { Config, AgentId } from './schemas.js';
8
+ /**
9
+ * Check if model is a completions-only model (not chat-compatible).
10
+ * Used for preflight validation to prevent 404 errors.
11
+ *
12
+ * @param model - Model name to check
13
+ * @returns true if model is completions-only and NOT compatible with chat API
14
+ */
15
+ export declare function isCompletionsOnlyModel(model: string): boolean;
16
+ /**
17
+ * Provider type for LLM agents.
18
+ * Router resolves provider once; agents use this without guessing.
19
+ */
20
+ export type LlmProvider = 'anthropic' | 'openai' | 'azure-openai' | 'ollama';
21
+ /**
22
+ * Resolved configuration tuple for logging and reproducibility (FR-011).
23
+ * Captures the fully resolved state at preflight time.
24
+ *
25
+ * INVARIANT: This tuple is logged at preflight and locked for the entire run.
26
+ * INVARIANT: keySource logs env var name, never the actual secret value.
27
+ */
28
+ export interface ResolvedConfigTuple {
29
+ /** Resolved LLM provider */
30
+ provider: LlmProvider | null;
31
+ /** Effective model name (may be auto-applied default for single-key setups) */
32
+ model: string;
33
+ /** Source of API key, e.g., "env:OPENAI_API_KEY" */
34
+ keySource: string | null;
35
+ /** Source of config: "file" (from .ai-review.yml), "defaults" (built-in), "merged" (both) */
36
+ configSource: 'file' | 'defaults' | 'merged';
37
+ /** Path to config file if file source */
38
+ configPath?: string;
39
+ /** Tuple format version - increment when fields are added/changed */
40
+ schemaVersion: number;
41
+ /** Resolution logic version - increment when resolution behavior changes */
42
+ resolutionVersion: number;
43
+ }
44
+ /** Current schema version for ResolvedConfigTuple */
45
+ export declare const RESOLVED_CONFIG_SCHEMA_VERSION = 1;
46
+ /** Current resolution logic version */
47
+ export declare const RESOLVED_CONFIG_RESOLUTION_VERSION = 1;
48
+ /**
49
+ * Resolve the key source string for a provider (FR-011 logging).
50
+ *
51
+ * INVARIANT: Returns env var name, NEVER the actual secret value.
52
+ * INVARIANT: For Azure, returns first present key (API_KEY takes precedence).
53
+ *
54
+ * @param provider - The resolved provider
55
+ * @param env - Environment variables to check
56
+ * @returns Key source string like "env:OPENAI_API_KEY" or null if no key found
57
+ */
58
+ export declare function resolveKeySource(provider: LlmProvider, env: Record<string, string | undefined>): string | null;
59
+ /**
60
+ * Resolve the config source based on whether config came from file or defaults.
61
+ *
62
+ * @param config - The resolved configuration
63
+ * @param configPath - Path to config file, or undefined if no file loaded
64
+ * @returns Config source: 'file', 'defaults', or 'merged'
65
+ */
66
+ export declare function resolveConfigSource(config: Config, configPath: string | undefined): 'file' | 'defaults' | 'merged';
67
+ /**
68
+ * Infer provider from model name (heuristic, not contract).
69
+ * Used for preflight validation to catch provider/model mismatches early.
70
+ *
71
+ * @param model - Model name to classify
72
+ * @returns Inferred provider or 'unknown' if can't determine
73
+ */
74
+ export declare function inferProviderFromModel(model: string): 'anthropic' | 'openai' | 'unknown';
75
+ /**
76
+ * Resolve effective model using precedence order:
77
+ * 1. MODEL env var (user override)
78
+ * 2. config.models.default (repo config)
79
+ *
80
+ * INVARIANT: Router owns model resolution. Agents receive the resolved model.
81
+ * INVARIANT: No hardcoded fallbacks. Misconfiguration fails preflight.
82
+ */
83
+ export declare function resolveEffectiveModel(config: Config, env: Record<string, string | undefined>): string;
84
+ /**
85
+ * Resolve the effective LLM provider for an agent.
86
+ *
87
+ * PRECEDENCE ORDER:
88
+ * 1. Explicit config.provider field (user override - T010)
89
+ * 2. Anthropic wins if agent supports it and key is present
90
+ * 3. Azure only for Azure-capable agents
91
+ * 4. OpenAI as fallback
92
+ *
93
+ * INVARIANT: Explicit provider bypasses auto-detection.
94
+ * INVARIANT: Azure only for Azure-capable agents.
95
+ * INVARIANT: No silent fallback. Missing keys = preflight failure.
96
+ *
97
+ * @param agentId - The agent to resolve provider for
98
+ * @param env - Environment variables to check for keys
99
+ * @param explicitProvider - Optional explicit provider from config.provider field
100
+ * @returns Provider to use, or null if no valid provider available
101
+ */
102
+ export declare function resolveProvider(agentId: AgentId, env: Record<string, string | undefined>, explicitProvider?: LlmProvider): LlmProvider | null;
103
+ /**
104
+ * Build the resolved configuration tuple for logging (FR-011).
105
+ *
106
+ * INVARIANT: This tuple captures the fully resolved state at preflight time.
107
+ * INVARIANT: keySource logs env var name, NEVER the actual secret value.
108
+ * INVARIANT: Tuple is immutable after construction.
109
+ *
110
+ * @param provider - Resolved provider (may be null for static-only runs)
111
+ * @param model - Effective model name
112
+ * @param env - Environment variables for key source resolution
113
+ * @param config - Configuration for config source resolution
114
+ * @param configPath - Path to config file, or undefined if no file loaded
115
+ * @returns Fully populated ResolvedConfigTuple
116
+ */
117
+ export declare function buildResolvedConfigTuple(provider: LlmProvider | null, model: string, env: Record<string, string | undefined>, config: Config, configPath: string | undefined): ResolvedConfigTuple;
118
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAkBpD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,6FAA6F;IAC7F,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAE7C,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IAEtB,4EAA4E;IAC5E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qDAAqD;AACrD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,kCAAkC,IAAI,CAAC;AAapD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,GAAG,IAAI,CAYf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,UAAU,GAAG,QAAQ,CAoBhC;AAcD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAIxF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,CAeR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,gBAAgB,CAAC,EAAE,WAAW,GAC7B,WAAW,GAAG,IAAI,CAkDpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,mBAAmB,CAmBrB"}