@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,223 @@
1
+ /**
2
+ * Signal Handling Module
3
+ *
4
+ * Provides graceful shutdown handling for SIGINT (Ctrl+C) and SIGTERM signals.
5
+ * Ensures partial results are reported when execution is interrupted.
6
+ *
7
+ * @module cli/signals
8
+ */
9
+ // =============================================================================
10
+ // State
11
+ // =============================================================================
12
+ let shutdownState = {
13
+ triggered: false,
14
+ };
15
+ let registeredCleanup;
16
+ let registeredOptions = {};
17
+ // Track registered handlers for cleanup
18
+ let sigintHandler;
19
+ let sigtermHandler;
20
+ // =============================================================================
21
+ // Core Functions
22
+ // =============================================================================
23
+ /**
24
+ * Check if shutdown has been triggered
25
+ *
26
+ * Use this in long-running loops to check if the user has requested shutdown.
27
+ *
28
+ * @returns true if shutdown has been triggered
29
+ */
30
+ export function isShutdownTriggered() {
31
+ return shutdownState.triggered;
32
+ }
33
+ /**
34
+ * Get the current shutdown state
35
+ *
36
+ * @returns Current shutdown state object
37
+ */
38
+ export function getShutdownState() {
39
+ return { ...shutdownState };
40
+ }
41
+ /**
42
+ * Reset shutdown state
43
+ *
44
+ * Primarily used for testing. Clears the shutdown state and removes handlers.
45
+ */
46
+ export function resetShutdownState() {
47
+ shutdownState = { triggered: false };
48
+ removeSignalHandlers();
49
+ }
50
+ /**
51
+ * Remove registered signal handlers
52
+ *
53
+ * Called during reset or when handlers need to be replaced.
54
+ */
55
+ function removeSignalHandlers() {
56
+ if (sigintHandler) {
57
+ process.removeListener('SIGINT', sigintHandler);
58
+ sigintHandler = undefined;
59
+ }
60
+ if (sigtermHandler) {
61
+ process.removeListener('SIGTERM', sigtermHandler);
62
+ sigtermHandler = undefined;
63
+ }
64
+ registeredCleanup = undefined;
65
+ registeredOptions = {};
66
+ }
67
+ /**
68
+ * Create a signal handler for the given signal type
69
+ *
70
+ * @param signal - The signal type
71
+ * @returns Signal handler function
72
+ */
73
+ function createSignalHandler(signal) {
74
+ return async () => {
75
+ const logger = registeredOptions.logger ?? console;
76
+ // Prevent multiple shutdown triggers
77
+ if (shutdownState.triggered) {
78
+ logger.warn('\nForce quit requested. Exiting immediately.');
79
+ process.exit(130); // 128 + 2 (SIGINT)
80
+ }
81
+ // Mark shutdown as triggered
82
+ shutdownState = {
83
+ triggered: true,
84
+ signal,
85
+ timestamp: Date.now(),
86
+ };
87
+ if (signal === 'SIGINT') {
88
+ // User pressed Ctrl+C
89
+ if (registeredOptions.showPartialResultsMessage !== false) {
90
+ logger.log('\n\nReceived interrupt signal. Shutting down gracefully...');
91
+ }
92
+ }
93
+ else {
94
+ // SIGTERM - typically from process manager
95
+ logger.log('\nReceived termination signal. Shutting down...');
96
+ }
97
+ // Run cleanup if registered
98
+ if (registeredCleanup) {
99
+ try {
100
+ await registeredCleanup();
101
+ }
102
+ catch (error) {
103
+ const errorMsg = error instanceof Error ? error.message : String(error);
104
+ logger.warn(`Cleanup error: ${errorMsg}`);
105
+ }
106
+ }
107
+ // Exit with appropriate code if exitOnSignal is true (default)
108
+ // 128 + signal number: SIGINT = 2, SIGTERM = 15
109
+ if (registeredOptions.exitOnSignal !== false) {
110
+ const exitCode = signal === 'SIGINT' ? 130 : 143;
111
+ process.exit(exitCode);
112
+ }
113
+ // When exitOnSignal is false, the main function is responsible for checking
114
+ // isShutdownTriggered() and handling graceful exit
115
+ };
116
+ }
117
+ /**
118
+ * Setup signal handlers for graceful shutdown
119
+ *
120
+ * Registers handlers for SIGINT (Ctrl+C) and SIGTERM that:
121
+ * 1. Set the shutdown state
122
+ * 2. Call the optional cleanup function
123
+ * 3. Exit with appropriate code (130 for SIGINT, 143 for SIGTERM)
124
+ *
125
+ * On second SIGINT (force quit), exits immediately without cleanup.
126
+ *
127
+ * @param options - Signal handler options
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * setupSignalHandlers({
132
+ * cleanup: async () => {
133
+ * // Report partial results
134
+ * await reportPartialResults();
135
+ * },
136
+ * showPartialResultsMessage: true,
137
+ * });
138
+ * ```
139
+ */
140
+ export function setupSignalHandlers(options = {}) {
141
+ // Remove existing handlers first
142
+ removeSignalHandlers();
143
+ // Store options and cleanup function
144
+ registeredCleanup = options.cleanup;
145
+ registeredOptions = options;
146
+ // Reset shutdown state
147
+ shutdownState = { triggered: false };
148
+ // Create and register handlers
149
+ sigintHandler = createSignalHandler('SIGINT');
150
+ sigtermHandler = createSignalHandler('SIGTERM');
151
+ process.on('SIGINT', sigintHandler);
152
+ process.on('SIGTERM', sigtermHandler);
153
+ }
154
+ /**
155
+ * Legacy function signature for backward compatibility
156
+ *
157
+ * @param cleanup - Cleanup function to call during shutdown
158
+ */
159
+ export function setupSignalHandlersLegacy(cleanup) {
160
+ setupSignalHandlers({ cleanup });
161
+ }
162
+ let partialResultsContext;
163
+ /**
164
+ * Set the partial results context for progress tracking
165
+ *
166
+ * Call this when starting agent execution to enable accurate
167
+ * completion percentage in shutdown messages.
168
+ *
169
+ * @param context - Partial results tracking context
170
+ */
171
+ export function setPartialResultsContext(context) {
172
+ partialResultsContext = context;
173
+ }
174
+ /**
175
+ * Update the partial results context
176
+ *
177
+ * Call this after each agent completes to update progress.
178
+ *
179
+ * @param update - Partial update to apply
180
+ */
181
+ export function updatePartialResultsContext(update) {
182
+ if (partialResultsContext) {
183
+ partialResultsContext = { ...partialResultsContext, ...update };
184
+ }
185
+ }
186
+ /**
187
+ * Get the current partial results context
188
+ *
189
+ * @returns Current context or undefined if not set
190
+ */
191
+ export function getPartialResultsContext() {
192
+ return partialResultsContext ? { ...partialResultsContext } : undefined;
193
+ }
194
+ /**
195
+ * Clear the partial results context
196
+ *
197
+ * Call this after execution completes normally.
198
+ */
199
+ export function clearPartialResultsContext() {
200
+ partialResultsContext = undefined;
201
+ }
202
+ /**
203
+ * Format a shutdown message with partial results information
204
+ *
205
+ * @param context - Partial results context
206
+ * @returns Formatted message lines
207
+ */
208
+ export function formatPartialResultsMessage(context) {
209
+ const lines = [];
210
+ const completionPercent = context.totalAgents > 0 ? Math.round((context.completedAgents / context.totalAgents) * 100) : 0;
211
+ lines.push(`📊 SUMMARY [interrupted at ${completionPercent}%]`);
212
+ lines.push('');
213
+ if (context.completedAgentNames.length > 0) {
214
+ const completedList = context.completedAgentNames.map((name) => `${name} ✓`).join(', ');
215
+ lines.push(`Agents: ${context.completedAgents}/${context.totalAgents} completed`);
216
+ lines.push(` (${completedList}${context.currentAgent ? `, ${context.currentAgent} ✗ interrupted` : ''})`);
217
+ }
218
+ else {
219
+ lines.push(`Agents: 0/${context.totalAgents} completed (interrupted before any completed)`);
220
+ }
221
+ return lines;
222
+ }
223
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Validation Report Module
3
+ *
4
+ * Feature 015: Config Wizard & Validation
5
+ * Converts PreflightResult to structured ValidationReport with severity categorization.
6
+ * Provides formatted console output for validation results.
7
+ *
8
+ * Exit code semantics (per spec FR-015):
9
+ * - Exit 1: Errors present (validation failed)
10
+ * - Exit 0: Warnings only (validation passed with notes)
11
+ * - Exit 0: Success (validation passed)
12
+ *
13
+ * @module validation-report
14
+ * @see {@link ../../../specs/015-config-wizard-validate/spec.md} Feature specification
15
+ */
16
+ import type { PreflightResult } from '../phases/preflight.js';
17
+ import type { ResolvedConfigTuple } from '../config/providers.js';
18
+ /**
19
+ * Structured validation report with severity categorization.
20
+ *
21
+ * Categorizes preflight check messages into three severity levels:
22
+ * - **errors**: Critical issues that prevent execution (exit 1)
23
+ * - **warnings**: Non-blocking issues that should be reviewed (exit 0)
24
+ * - **info**: Informational messages for context (exit 0)
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const report: ValidationReport = {
29
+ * errors: ['Missing OPENAI_API_KEY'],
30
+ * warnings: ['WARNING: Legacy key format detected'],
31
+ * info: [],
32
+ * resolved: { provider: 'openai', model: 'gpt-4o', ... },
33
+ * valid: false,
34
+ * };
35
+ * ```
36
+ */
37
+ export interface ValidationReport {
38
+ /** Errors that block execution (exit code 1) */
39
+ errors: string[];
40
+ /** Warnings that should be reviewed but don't block (exit code 0) */
41
+ warnings: string[];
42
+ /** Informational messages for context (exit code 0) */
43
+ info: string[];
44
+ /** Resolved configuration tuple on success (provider, model, key source) */
45
+ resolved?: ResolvedConfigTuple;
46
+ /** Overall validation status - true if no errors (warnings allowed) */
47
+ valid: boolean;
48
+ }
49
+ /**
50
+ * Convert PreflightResult to ValidationReport with severity categorization.
51
+ *
52
+ * Categorizes messages based on source:
53
+ * - result.errors → errors array
54
+ * - result.warnings → warnings array
55
+ *
56
+ * The `valid` field is true only when there are no errors (warnings are allowed).
57
+ *
58
+ * @param result - PreflightResult from runPreflightChecks()
59
+ * @returns ValidationReport with categorized messages and resolved config tuple
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const preflight = runPreflightChecks(config, context, env);
64
+ * const report = formatValidationReport(preflight);
65
+ *
66
+ * if (report.valid) {
67
+ * console.log('Config is valid');
68
+ * } else {
69
+ * console.log(`${report.errors.length} errors found`);
70
+ * }
71
+ * ```
72
+ */
73
+ export declare function formatValidationReport(result: PreflightResult): ValidationReport;
74
+ /**
75
+ * Print validation report to console with formatted output.
76
+ *
77
+ * Output format and destinations:
78
+ * - Errors: "✗ ERROR: <message>" → stderr
79
+ * - Warnings: "⚠ WARNING: <message>" → stderr
80
+ * - Success: "✓ Configuration valid" → stdout
81
+ * - Resolved tuple details (provider, model, key source) → stdout
82
+ *
83
+ * When validation fails (errors present), shows error count in summary.
84
+ * When validation passes with warnings, shows "(with warnings)" suffix.
85
+ *
86
+ * @param report - ValidationReport to print
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * const report = formatValidationReport(preflightResult);
91
+ * printValidationReport(report);
92
+ *
93
+ * // Output on success:
94
+ * // ✓ Configuration valid
95
+ * // Provider: openai
96
+ * // Model: gpt-4o
97
+ * // Key source: OPENAI_API_KEY
98
+ * // Config source: .ai-review.yml
99
+ *
100
+ * // Output on failure:
101
+ * // ✗ ERROR: Missing OPENAI_API_KEY
102
+ * // Validation failed with 1 error(s).
103
+ * ```
104
+ */
105
+ export declare function printValidationReport(report: ValidationReport): void;
106
+ //# sourceMappingURL=validation-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-report.d.ts","sourceRoot":"","sources":["../../src/cli/validation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uDAAuD;IACvD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,uEAAuE;IACvE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAWhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA4BpE"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Validation Report Module
3
+ *
4
+ * Feature 015: Config Wizard & Validation
5
+ * Converts PreflightResult to structured ValidationReport with severity categorization.
6
+ * Provides formatted console output for validation results.
7
+ *
8
+ * Exit code semantics (per spec FR-015):
9
+ * - Exit 1: Errors present (validation failed)
10
+ * - Exit 0: Warnings only (validation passed with notes)
11
+ * - Exit 0: Success (validation passed)
12
+ *
13
+ * @module validation-report
14
+ * @see {@link ../../../specs/015-config-wizard-validate/spec.md} Feature specification
15
+ */
16
+ /**
17
+ * Convert PreflightResult to ValidationReport with severity categorization.
18
+ *
19
+ * Categorizes messages based on source:
20
+ * - result.errors → errors array
21
+ * - result.warnings → warnings array
22
+ *
23
+ * The `valid` field is true only when there are no errors (warnings are allowed).
24
+ *
25
+ * @param result - PreflightResult from runPreflightChecks()
26
+ * @returns ValidationReport with categorized messages and resolved config tuple
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const preflight = runPreflightChecks(config, context, env);
31
+ * const report = formatValidationReport(preflight);
32
+ *
33
+ * if (report.valid) {
34
+ * console.log('Config is valid');
35
+ * } else {
36
+ * console.log(`${report.errors.length} errors found`);
37
+ * }
38
+ * ```
39
+ */
40
+ export function formatValidationReport(result) {
41
+ const errors = [...result.errors];
42
+ const warnings = result.warnings ? [...result.warnings] : [];
43
+ return {
44
+ errors,
45
+ warnings,
46
+ info: [],
47
+ resolved: result.resolved,
48
+ valid: errors.length === 0,
49
+ };
50
+ }
51
+ /**
52
+ * Print validation report to console with formatted output.
53
+ *
54
+ * Output format and destinations:
55
+ * - Errors: "✗ ERROR: <message>" → stderr
56
+ * - Warnings: "⚠ WARNING: <message>" → stderr
57
+ * - Success: "✓ Configuration valid" → stdout
58
+ * - Resolved tuple details (provider, model, key source) → stdout
59
+ *
60
+ * When validation fails (errors present), shows error count in summary.
61
+ * When validation passes with warnings, shows "(with warnings)" suffix.
62
+ *
63
+ * @param report - ValidationReport to print
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const report = formatValidationReport(preflightResult);
68
+ * printValidationReport(report);
69
+ *
70
+ * // Output on success:
71
+ * // ✓ Configuration valid
72
+ * // Provider: openai
73
+ * // Model: gpt-4o
74
+ * // Key source: OPENAI_API_KEY
75
+ * // Config source: .ai-review.yml
76
+ *
77
+ * // Output on failure:
78
+ * // ✗ ERROR: Missing OPENAI_API_KEY
79
+ * // Validation failed with 1 error(s).
80
+ * ```
81
+ */
82
+ export function printValidationReport(report) {
83
+ // Print errors to stderr
84
+ for (const err of report.errors) {
85
+ console.error(`✗ ERROR: ${err}`);
86
+ }
87
+ // Print warnings to stderr
88
+ for (const warn of report.warnings) {
89
+ console.error(`⚠ WARNING: ${warn}`);
90
+ }
91
+ // Print status and resolved tuple
92
+ if (report.valid) {
93
+ const status = report.warnings.length > 0
94
+ ? '✓ Configuration valid (with warnings)'
95
+ : '✓ Configuration valid';
96
+ console.log(status);
97
+ if (report.resolved) {
98
+ console.log(` Provider: ${report.resolved.provider ?? 'none'}`);
99
+ console.log(` Model: ${report.resolved.model}`);
100
+ console.log(` Key source: ${report.resolved.keySource ?? '(not set)'}`);
101
+ console.log(` Config source: ${report.resolved.configSource}`);
102
+ }
103
+ }
104
+ else {
105
+ console.error(`\nValidation failed with ${report.errors.length} error(s).`);
106
+ }
107
+ }
108
+ //# sourceMappingURL=validation-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-report.js","sourceRoot":"","sources":["../../src/cli/validation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqCH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,OAAO;QACL,MAAM;QACN,QAAQ;QACR,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,yBAAyB;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,uBAAuB,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Config Module
3
+ *
4
+ * Re-exports from schemas and providers for clean imports.
5
+ */
6
+ export { ConfigSchema, PassSchema, LimitsSchema, ModelsSchema, AgentSchema, ProviderSchema, type Config, type Pass, type Limits, type Models, type AgentId, type Provider, } from './schemas.js';
7
+ export { type LlmProvider, type ResolvedConfigTuple, RESOLVED_CONFIG_SCHEMA_VERSION, RESOLVED_CONFIG_RESOLUTION_VERSION, isCompletionsOnlyModel, inferProviderFromModel, resolveEffectiveModel, resolveProvider, resolveKeySource, resolveConfigSource, buildResolvedConfigTuple, } from './providers.js';
8
+ export { type ProviderDetectionResult, type ZeroConfigResult, type NoCredentialsResult, type GenerateZeroConfigResult, ZERO_CONFIG_LIMITS, ZERO_CONFIG_PASS_NAME, detectProvider, detectProviderWithDetails, generateZeroConfigDefaults, isZeroConfigSuccess, formatZeroConfigMessage, getZeroConfigDescription, } from './zero-config.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Config Module
3
+ *
4
+ * Re-exports from schemas and providers for clean imports.
5
+ */
6
+ // Re-export all schemas and types
7
+ export { ConfigSchema, PassSchema, LimitsSchema, ModelsSchema, AgentSchema, ProviderSchema, } from './schemas.js';
8
+ // Re-export provider types and functions
9
+ export { RESOLVED_CONFIG_SCHEMA_VERSION, RESOLVED_CONFIG_RESOLUTION_VERSION, isCompletionsOnlyModel, inferProviderFromModel, resolveEffectiveModel, resolveProvider, resolveKeySource, resolveConfigSource, buildResolvedConfigTuple, } from './providers.js';
10
+ // Re-export zero-config types and functions
11
+ export { ZERO_CONFIG_LIMITS, ZERO_CONFIG_PASS_NAME, detectProvider, detectProviderWithDetails, generateZeroConfigDefaults, isZeroConfigSuccess, formatZeroConfigMessage, getZeroConfigDescription, } from './zero-config.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kCAAkC;AAClC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,GAOf,MAAM,cAAc,CAAC;AAEtB,yCAAyC;AACzC,OAAO,EAGL,8BAA8B,EAC9B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EAKL,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,94 @@
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 { type MitigationPattern, type PatternOverride, type ControlFlowConfig } from '../agents/control_flow/types.js';
13
+ /**
14
+ * Result of pattern validation.
15
+ */
16
+ export interface PatternValidationResult {
17
+ valid: boolean;
18
+ errors: PatternValidationError[];
19
+ warnings: PatternValidationWarning[];
20
+ }
21
+ /**
22
+ * Pattern validation error.
23
+ */
24
+ export interface PatternValidationError {
25
+ code: string;
26
+ path: string[];
27
+ message: string;
28
+ }
29
+ /**
30
+ * Pattern validation warning.
31
+ */
32
+ export interface PatternValidationWarning {
33
+ code: string;
34
+ path: string[];
35
+ message: string;
36
+ }
37
+ /**
38
+ * Result of config parsing.
39
+ */
40
+ export interface ConfigParseResult {
41
+ success: boolean;
42
+ config?: ControlFlowConfig;
43
+ errors: PatternValidationError[];
44
+ warnings: PatternValidationWarning[];
45
+ }
46
+ /**
47
+ * Validate that a pattern is declarative and side-effect-free per FR-015.
48
+ *
49
+ * Patterns must only contain:
50
+ * - Function name matching (exact or regex)
51
+ * - Parameter constraints
52
+ * - Return value assertions
53
+ * - Module specifications
54
+ *
55
+ * No executable code, callbacks, or side effects are allowed.
56
+ */
57
+ export declare function validatePatternIsDeclarative(pattern: MitigationPattern): PatternValidationResult;
58
+ /**
59
+ * Validate a pattern override.
60
+ */
61
+ export declare function validatePatternOverride(override: PatternOverride): PatternValidationResult;
62
+ /**
63
+ * Parse and validate a control flow configuration.
64
+ *
65
+ * This function:
66
+ * 1. Parses the config using Zod schema
67
+ * 2. Validates each custom pattern is declarative (FR-015)
68
+ * 3. Validates pattern overrides
69
+ * 4. Checks for conflicts and issues
70
+ */
71
+ export declare function parseControlFlowConfig(rawConfig: unknown): ConfigParseResult;
72
+ /**
73
+ * Apply pattern overrides to a set of patterns.
74
+ *
75
+ * Returns a new array with overrides applied.
76
+ */
77
+ export declare function applyPatternOverrides(patterns: MitigationPattern[], overrides: PatternOverride[]): MitigationPattern[];
78
+ /**
79
+ * Filter out disabled patterns.
80
+ */
81
+ export declare function filterDisabledPatterns(patterns: MitigationPattern[], disabledIds: string[]): MitigationPattern[];
82
+ /**
83
+ * Get effective patterns after applying overrides and filtering disabled.
84
+ */
85
+ export declare function getEffectivePatterns(builtInPatterns: MitigationPattern[], customPatterns: MitigationPattern[], overrides: PatternOverride[], disabledIds: string[]): MitigationPattern[];
86
+ /**
87
+ * Format validation errors for display.
88
+ */
89
+ export declare function formatValidationErrors(errors: PatternValidationError[]): string;
90
+ /**
91
+ * Format validation warnings for display.
92
+ */
93
+ export declare function formatValidationWarnings(warnings: PatternValidationWarning[]): string;
94
+ //# sourceMappingURL=mitigation-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mitigation-config.d.ts","sourceRoot":"","sources":["../../src/config/mitigation-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEvB,MAAM,iCAAiC,CAAC;AAMzC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAwCD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,iBAAiB,GAAG,uBAAuB,CAyHhG;AAwBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,uBAAuB,CAmC1F;AAMD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,CA+I5E;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,SAAS,EAAE,eAAe,EAAE,GAC3B,iBAAiB,EAAE,CAmBrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,WAAW,EAAE,MAAM,EAAE,GACpB,iBAAiB,EAAE,CAGrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,iBAAiB,EAAE,EACpC,cAAc,EAAE,iBAAiB,EAAE,EACnC,SAAS,EAAE,eAAe,EAAE,EAC5B,WAAW,EAAE,MAAM,EAAE,GACpB,iBAAiB,EAAE,CAYrB;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAM/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAMrF"}