@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,144 @@
1
+ /**
2
+ * Timeout-Protected Regex Evaluation
3
+ *
4
+ * Provides timeout protection for regex pattern evaluation to prevent
5
+ * denial-of-service from malicious or poorly-constructed patterns.
6
+ *
7
+ * Implements:
8
+ * - FR-001: Maximum execution time for pattern evaluation
9
+ * - FR-002: Continue analysis when pattern times out
10
+ * - FR-005: Configurable timeout limit (10-1000ms)
11
+ */
12
+ import type { PatternEvaluationResult, PatternValidationResult, ValidationError } from './types.js';
13
+ import { type PatternValidatorConfig } from './pattern-validator.js';
14
+ /**
15
+ * Options for TimeoutRegex construction.
16
+ */
17
+ export interface TimeoutRegexOptions {
18
+ /** Timeout in milliseconds for pattern execution */
19
+ timeoutMs?: number;
20
+ /** Whether to validate pattern for ReDoS before use */
21
+ validatePattern?: boolean;
22
+ /** Configuration for pattern validation */
23
+ validationConfig?: Partial<PatternValidatorConfig>;
24
+ }
25
+ /**
26
+ * Result of creating a TimeoutRegex with validation.
27
+ */
28
+ export interface TimeoutRegexCreationResult {
29
+ /** The created TimeoutRegex instance (null if validation failed) */
30
+ regex: TimeoutRegex | null;
31
+ /** Validation result if validation was performed */
32
+ validationResult?: PatternValidationResult;
33
+ /** Whether creation was successful */
34
+ success: boolean;
35
+ /** Error if creation failed */
36
+ error?: ValidationError;
37
+ }
38
+ /**
39
+ * Provides timeout-protected regex pattern evaluation.
40
+ *
41
+ * Uses process.hrtime.bigint() for high-resolution time tracking.
42
+ * Patterns that exceed the timeout are treated as non-matching (conservative).
43
+ */
44
+ export declare class TimeoutRegex {
45
+ private pattern;
46
+ private patternId;
47
+ private timeoutMs;
48
+ private validationResult?;
49
+ constructor(pattern: RegExp | string, patternId: string, timeoutMs?: number);
50
+ /**
51
+ * Get the validation result if pattern was validated during creation.
52
+ */
53
+ getValidationResult(): PatternValidationResult | undefined;
54
+ /**
55
+ * Set validation result (internal use by factory functions).
56
+ */
57
+ setValidationResult(result: PatternValidationResult): void;
58
+ /**
59
+ * Validate and clamp timeout to allowed range.
60
+ */
61
+ private validateTimeout;
62
+ /**
63
+ * Test if input matches the pattern with timeout protection.
64
+ *
65
+ * @param input The string to test against the pattern
66
+ * @returns PatternEvaluationResult with match status and timing info
67
+ */
68
+ test(input: string): PatternEvaluationResult;
69
+ /**
70
+ * Execute pattern matching and return match result or null if input exceeds length limit.
71
+ *
72
+ * @param input The string to match against the pattern
73
+ * @returns Match result with evaluation info, or null if input too long
74
+ */
75
+ exec(input: string): {
76
+ match: RegExpExecArray | null;
77
+ result: PatternEvaluationResult;
78
+ };
79
+ /**
80
+ * Get the pattern ID.
81
+ */
82
+ getPatternId(): string;
83
+ /**
84
+ * Get the configured timeout in milliseconds.
85
+ */
86
+ getTimeoutMs(): number;
87
+ }
88
+ /**
89
+ * Check if an input string exceeds the maximum allowed length.
90
+ *
91
+ * @param input The string to check
92
+ * @returns true if input exceeds MAX_INPUT_LENGTH
93
+ */
94
+ export declare function exceedsInputLengthLimit(input: string): boolean;
95
+ /**
96
+ * Get the maximum allowed input length.
97
+ */
98
+ export declare function getMaxInputLength(): number;
99
+ /**
100
+ * Validate a timeout value is within allowed bounds.
101
+ *
102
+ * @param timeoutMs The timeout value to validate
103
+ * @returns true if timeout is within MIN_TIMEOUT_MS and MAX_TIMEOUT_MS
104
+ */
105
+ export declare function isValidTimeout(timeoutMs: number): boolean;
106
+ /**
107
+ * Create a TimeoutRegex instance for pattern evaluation.
108
+ *
109
+ * @param pattern The regex pattern (string or RegExp)
110
+ * @param patternId Identifier for the pattern (used in results)
111
+ * @param timeoutMs Timeout in milliseconds (default: 100ms)
112
+ * @returns TimeoutRegex instance
113
+ */
114
+ export declare function createTimeoutRegex(pattern: RegExp | string, patternId: string, timeoutMs?: number): TimeoutRegex;
115
+ /**
116
+ * Evaluate a pattern against input with timeout protection.
117
+ *
118
+ * Convenience function for one-shot pattern evaluation.
119
+ *
120
+ * @param pattern The regex pattern (string or RegExp)
121
+ * @param patternId Identifier for the pattern
122
+ * @param input The string to test
123
+ * @param timeoutMs Timeout in milliseconds (default: 100ms)
124
+ * @returns PatternEvaluationResult
125
+ */
126
+ export declare function evaluatePatternWithTimeout(pattern: RegExp | string, patternId: string, input: string, timeoutMs?: number): PatternEvaluationResult;
127
+ /**
128
+ * Create a TimeoutRegex with optional pattern validation.
129
+ *
130
+ * This is the recommended way to create TimeoutRegex instances when
131
+ * using user-provided patterns, as it validates for ReDoS vulnerabilities
132
+ * before creating the regex.
133
+ *
134
+ * @param pattern The regex pattern (string or RegExp)
135
+ * @param patternId Identifier for the pattern
136
+ * @param options Creation options including validation settings
137
+ * @returns TimeoutRegexCreationResult with regex instance or error
138
+ */
139
+ export declare function createValidatedTimeoutRegex(pattern: RegExp | string, patternId: string, options?: TimeoutRegexOptions): TimeoutRegexCreationResult;
140
+ /**
141
+ * Helper to create a ValidationError from an exception.
142
+ */
143
+ export declare function createValidationError(errorType: 'compilation' | 'validation' | 'timeout' | 'resource', patternId: string, message: string, details?: Record<string, unknown>): ValidationError;
144
+ //# sourceMappingURL=timeout-regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-regex.d.ts","sourceRoot":"","sources":["../../../src/agents/control_flow/timeout-regex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAsB7F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAA0B;gBAEvC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,MAA2B;IAU/F;;OAEG;IACH,mBAAmB,IAAI,uBAAuB,GAAG,SAAS;IAI1D;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAI1D;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB;IAqD5C;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAA;KAAE;IAsDvF;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAA2B,GACrC,YAAY,CAEd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAA2B,GACrC,uBAAuB,CAGzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,0BAA0B,CAmF5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,EAChE,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,eAAe,CASjB"}
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Timeout-Protected Regex Evaluation
3
+ *
4
+ * Provides timeout protection for regex pattern evaluation to prevent
5
+ * denial-of-service from malicious or poorly-constructed patterns.
6
+ *
7
+ * Implements:
8
+ * - FR-001: Maximum execution time for pattern evaluation
9
+ * - FR-002: Continue analysis when pattern times out
10
+ * - FR-005: Configurable timeout limit (10-1000ms)
11
+ */
12
+ import { createPatternValidator } from './pattern-validator.js';
13
+ // =============================================================================
14
+ // Constants
15
+ // =============================================================================
16
+ /** Maximum input length to evaluate (10KB) */
17
+ const MAX_INPUT_LENGTH = 10_000;
18
+ /** Default timeout in milliseconds */
19
+ const DEFAULT_TIMEOUT_MS = 100;
20
+ /** Minimum allowed timeout */
21
+ const MIN_TIMEOUT_MS = 10;
22
+ /** Maximum allowed timeout */
23
+ const MAX_TIMEOUT_MS = 1000;
24
+ /**
25
+ * Provides timeout-protected regex pattern evaluation.
26
+ *
27
+ * Uses process.hrtime.bigint() for high-resolution time tracking.
28
+ * Patterns that exceed the timeout are treated as non-matching (conservative).
29
+ */
30
+ export class TimeoutRegex {
31
+ pattern;
32
+ patternId;
33
+ timeoutMs;
34
+ validationResult;
35
+ constructor(pattern, patternId, timeoutMs = DEFAULT_TIMEOUT_MS) {
36
+ // Trust: REPO_CONFIG - Pattern from validated repository configuration
37
+ // Control: TimeoutRegex enforces execution timeout preventing CPU exhaustion
38
+ // See docs/security/regex-threat-model.md
39
+ // eslint-disable-next-line security/detect-non-literal-regexp -- Validated config with timeout
40
+ this.pattern = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
41
+ this.patternId = patternId;
42
+ this.timeoutMs = this.validateTimeout(timeoutMs);
43
+ }
44
+ /**
45
+ * Get the validation result if pattern was validated during creation.
46
+ */
47
+ getValidationResult() {
48
+ return this.validationResult;
49
+ }
50
+ /**
51
+ * Set validation result (internal use by factory functions).
52
+ */
53
+ setValidationResult(result) {
54
+ this.validationResult = result;
55
+ }
56
+ /**
57
+ * Validate and clamp timeout to allowed range.
58
+ */
59
+ validateTimeout(timeoutMs) {
60
+ if (timeoutMs < MIN_TIMEOUT_MS)
61
+ return MIN_TIMEOUT_MS;
62
+ if (timeoutMs > MAX_TIMEOUT_MS)
63
+ return MAX_TIMEOUT_MS;
64
+ return Math.floor(timeoutMs);
65
+ }
66
+ /**
67
+ * Test if input matches the pattern with timeout protection.
68
+ *
69
+ * @param input The string to test against the pattern
70
+ * @returns PatternEvaluationResult with match status and timing info
71
+ */
72
+ test(input) {
73
+ const inputLength = input.length;
74
+ // First defense: input length check (FR-001)
75
+ if (inputLength > MAX_INPUT_LENGTH) {
76
+ return {
77
+ patternId: this.patternId,
78
+ matched: false,
79
+ timedOut: false,
80
+ elapsedMs: 0,
81
+ inputLength,
82
+ };
83
+ }
84
+ // Track execution time with high-resolution timer
85
+ const startTime = process.hrtime.bigint();
86
+ try {
87
+ // Execute regex match
88
+ const matched = this.pattern.test(input);
89
+ // Calculate elapsed time in milliseconds
90
+ const endTime = process.hrtime.bigint();
91
+ const elapsedNs = Number(endTime - startTime);
92
+ const elapsedMs = elapsedNs / 1_000_000;
93
+ // Check if we exceeded timeout (post-hoc check)
94
+ // Note: JavaScript regex is synchronous, so we can only detect timeout after completion
95
+ const timedOut = elapsedMs > this.timeoutMs;
96
+ return {
97
+ patternId: this.patternId,
98
+ matched: timedOut ? false : matched, // Treat timeout as non-match (conservative)
99
+ timedOut,
100
+ elapsedMs,
101
+ inputLength,
102
+ };
103
+ }
104
+ catch {
105
+ // Handle regex errors (e.g., catastrophic backtracking caught by engine)
106
+ const endTime = process.hrtime.bigint();
107
+ const elapsedNs = Number(endTime - startTime);
108
+ const elapsedMs = elapsedNs / 1_000_000;
109
+ return {
110
+ patternId: this.patternId,
111
+ matched: false,
112
+ timedOut: true,
113
+ elapsedMs,
114
+ inputLength,
115
+ };
116
+ }
117
+ }
118
+ /**
119
+ * Execute pattern matching and return match result or null if input exceeds length limit.
120
+ *
121
+ * @param input The string to match against the pattern
122
+ * @returns Match result with evaluation info, or null if input too long
123
+ */
124
+ exec(input) {
125
+ const inputLength = input.length;
126
+ // First defense: input length check
127
+ if (inputLength > MAX_INPUT_LENGTH) {
128
+ return {
129
+ match: null,
130
+ result: {
131
+ patternId: this.patternId,
132
+ matched: false,
133
+ timedOut: false,
134
+ elapsedMs: 0,
135
+ inputLength,
136
+ },
137
+ };
138
+ }
139
+ const startTime = process.hrtime.bigint();
140
+ try {
141
+ const match = this.pattern.exec(input);
142
+ const endTime = process.hrtime.bigint();
143
+ const elapsedNs = Number(endTime - startTime);
144
+ const elapsedMs = elapsedNs / 1_000_000;
145
+ const timedOut = elapsedMs > this.timeoutMs;
146
+ return {
147
+ match: timedOut ? null : match,
148
+ result: {
149
+ patternId: this.patternId,
150
+ matched: timedOut ? false : match !== null,
151
+ timedOut,
152
+ elapsedMs,
153
+ inputLength,
154
+ },
155
+ };
156
+ }
157
+ catch {
158
+ const endTime = process.hrtime.bigint();
159
+ const elapsedNs = Number(endTime - startTime);
160
+ const elapsedMs = elapsedNs / 1_000_000;
161
+ return {
162
+ match: null,
163
+ result: {
164
+ patternId: this.patternId,
165
+ matched: false,
166
+ timedOut: true,
167
+ elapsedMs,
168
+ inputLength,
169
+ },
170
+ };
171
+ }
172
+ }
173
+ /**
174
+ * Get the pattern ID.
175
+ */
176
+ getPatternId() {
177
+ return this.patternId;
178
+ }
179
+ /**
180
+ * Get the configured timeout in milliseconds.
181
+ */
182
+ getTimeoutMs() {
183
+ return this.timeoutMs;
184
+ }
185
+ }
186
+ // =============================================================================
187
+ // Utility Functions
188
+ // =============================================================================
189
+ /**
190
+ * Check if an input string exceeds the maximum allowed length.
191
+ *
192
+ * @param input The string to check
193
+ * @returns true if input exceeds MAX_INPUT_LENGTH
194
+ */
195
+ export function exceedsInputLengthLimit(input) {
196
+ return input.length > MAX_INPUT_LENGTH;
197
+ }
198
+ /**
199
+ * Get the maximum allowed input length.
200
+ */
201
+ export function getMaxInputLength() {
202
+ return MAX_INPUT_LENGTH;
203
+ }
204
+ /**
205
+ * Validate a timeout value is within allowed bounds.
206
+ *
207
+ * @param timeoutMs The timeout value to validate
208
+ * @returns true if timeout is within MIN_TIMEOUT_MS and MAX_TIMEOUT_MS
209
+ */
210
+ export function isValidTimeout(timeoutMs) {
211
+ return timeoutMs >= MIN_TIMEOUT_MS && timeoutMs <= MAX_TIMEOUT_MS;
212
+ }
213
+ /**
214
+ * Create a TimeoutRegex instance for pattern evaluation.
215
+ *
216
+ * @param pattern The regex pattern (string or RegExp)
217
+ * @param patternId Identifier for the pattern (used in results)
218
+ * @param timeoutMs Timeout in milliseconds (default: 100ms)
219
+ * @returns TimeoutRegex instance
220
+ */
221
+ export function createTimeoutRegex(pattern, patternId, timeoutMs = DEFAULT_TIMEOUT_MS) {
222
+ return new TimeoutRegex(pattern, patternId, timeoutMs);
223
+ }
224
+ /**
225
+ * Evaluate a pattern against input with timeout protection.
226
+ *
227
+ * Convenience function for one-shot pattern evaluation.
228
+ *
229
+ * @param pattern The regex pattern (string or RegExp)
230
+ * @param patternId Identifier for the pattern
231
+ * @param input The string to test
232
+ * @param timeoutMs Timeout in milliseconds (default: 100ms)
233
+ * @returns PatternEvaluationResult
234
+ */
235
+ export function evaluatePatternWithTimeout(pattern, patternId, input, timeoutMs = DEFAULT_TIMEOUT_MS) {
236
+ const regex = new TimeoutRegex(pattern, patternId, timeoutMs);
237
+ return regex.test(input);
238
+ }
239
+ /**
240
+ * Create a TimeoutRegex with optional pattern validation.
241
+ *
242
+ * This is the recommended way to create TimeoutRegex instances when
243
+ * using user-provided patterns, as it validates for ReDoS vulnerabilities
244
+ * before creating the regex.
245
+ *
246
+ * @param pattern The regex pattern (string or RegExp)
247
+ * @param patternId Identifier for the pattern
248
+ * @param options Creation options including validation settings
249
+ * @returns TimeoutRegexCreationResult with regex instance or error
250
+ */
251
+ export function createValidatedTimeoutRegex(pattern, patternId, options = {}) {
252
+ const { timeoutMs = DEFAULT_TIMEOUT_MS, validatePattern: shouldValidate = true, validationConfig, } = options;
253
+ const patternString = typeof pattern === 'string' ? pattern : pattern.source;
254
+ // Validate pattern if requested
255
+ if (shouldValidate) {
256
+ const validator = createPatternValidator(validationConfig);
257
+ const validationResult = validator.validatePattern(patternString, patternId);
258
+ if (!validationResult.isValid) {
259
+ return {
260
+ regex: null,
261
+ validationResult,
262
+ success: false,
263
+ error: {
264
+ errorType: 'validation',
265
+ patternId,
266
+ message: validationResult.rejectionReasons.join('; ') || 'Pattern validation failed',
267
+ details: {
268
+ pattern: patternString,
269
+ riskLevel: validationResult.redosRisk,
270
+ reasons: validationResult.rejectionReasons,
271
+ },
272
+ recoverable: true,
273
+ timestamp: Date.now(),
274
+ },
275
+ };
276
+ }
277
+ // Create regex with stored validation result
278
+ try {
279
+ const regex = new TimeoutRegex(pattern, patternId, timeoutMs);
280
+ regex.setValidationResult(validationResult);
281
+ return {
282
+ regex,
283
+ validationResult,
284
+ success: true,
285
+ };
286
+ }
287
+ catch (error) {
288
+ return {
289
+ regex: null,
290
+ validationResult,
291
+ success: false,
292
+ error: {
293
+ errorType: 'compilation',
294
+ patternId,
295
+ message: error instanceof Error ? error.message : 'Failed to compile pattern',
296
+ details: { pattern: patternString },
297
+ recoverable: true,
298
+ timestamp: Date.now(),
299
+ },
300
+ };
301
+ }
302
+ }
303
+ // No validation - just create the regex
304
+ try {
305
+ const regex = new TimeoutRegex(pattern, patternId, timeoutMs);
306
+ return {
307
+ regex,
308
+ success: true,
309
+ };
310
+ }
311
+ catch (error) {
312
+ return {
313
+ regex: null,
314
+ success: false,
315
+ error: {
316
+ errorType: 'compilation',
317
+ patternId,
318
+ message: error instanceof Error ? error.message : 'Failed to compile pattern',
319
+ details: { pattern: patternString },
320
+ recoverable: true,
321
+ timestamp: Date.now(),
322
+ },
323
+ };
324
+ }
325
+ }
326
+ /**
327
+ * Helper to create a ValidationError from an exception.
328
+ */
329
+ export function createValidationError(errorType, patternId, message, details) {
330
+ return {
331
+ errorType,
332
+ patternId,
333
+ message,
334
+ details,
335
+ recoverable: errorType !== 'resource',
336
+ timestamp: Date.now(),
337
+ };
338
+ }
339
+ //# sourceMappingURL=timeout-regex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-regex.js","sourceRoot":"","sources":["../../../src/agents/control_flow/timeout-regex.ts"],"names":[],"mappings":"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"}