@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,127 @@
1
+ /**
2
+ * Agent Types Module
3
+ *
4
+ * Shared types for the agent system. Extracted from agents/index.ts
5
+ * to break circular dependencies between agent implementations and the registry.
6
+ *
7
+ * AgentResult Discriminated Union (011-agent-result-unions):
8
+ * - AgentResult is a discriminated union with status: 'success' | 'failure' | 'skipped'
9
+ * - Use constructor helpers: AgentSuccess(), AgentFailure(), AgentSkipped()
10
+ * - Handle all variants with switch + assertNever in default
11
+ */
12
+ import { z } from 'zod';
13
+ // ============================================================================
14
+ // Constructor Helpers (FR-002, FR-012)
15
+ // Use these instead of object literals to ensure valid field combinations
16
+ // ============================================================================
17
+ /**
18
+ * Create a successful agent result.
19
+ */
20
+ export function AgentSuccess(params) {
21
+ return { status: 'success', ...params };
22
+ }
23
+ /**
24
+ * Create a failed agent result.
25
+ */
26
+ export function AgentFailure(params) {
27
+ return {
28
+ status: 'failure',
29
+ agentId: params.agentId,
30
+ error: params.error,
31
+ failureStage: params.failureStage,
32
+ partialFindings: params.partialFindings ?? [],
33
+ metrics: params.metrics,
34
+ };
35
+ }
36
+ /**
37
+ * Create a skipped agent result.
38
+ */
39
+ export function AgentSkipped(params) {
40
+ return { status: 'skipped', ...params };
41
+ }
42
+ // ============================================================================
43
+ // Type Guards (FR-001)
44
+ // ============================================================================
45
+ /**
46
+ * Type guard for success results.
47
+ */
48
+ export function isSuccess(result) {
49
+ return result.status === 'success';
50
+ }
51
+ /**
52
+ * Type guard for failure results.
53
+ */
54
+ export function isFailure(result) {
55
+ return result.status === 'failure';
56
+ }
57
+ /**
58
+ * Type guard for skipped results.
59
+ */
60
+ export function isSkipped(result) {
61
+ return result.status === 'skipped';
62
+ }
63
+ // ============================================================================
64
+ // Zod Serialization Schema (FR-025)
65
+ // Required for cache round-trip safety in cache/store.ts
66
+ // ============================================================================
67
+ /** Zod schema for AgentMetrics */
68
+ export const AgentMetricsSchema = z.object({
69
+ durationMs: z.number(),
70
+ filesProcessed: z.number(),
71
+ tokensUsed: z.number().optional(),
72
+ estimatedCostUsd: z.number().optional(),
73
+ });
74
+ /** Zod schema for Finding */
75
+ export const FindingSchema = z.object({
76
+ severity: z.enum(['error', 'warning', 'info']),
77
+ file: z.string(),
78
+ line: z.number().optional(),
79
+ endLine: z.number().optional(),
80
+ message: z.string(),
81
+ suggestion: z.string().optional(),
82
+ ruleId: z.string().optional(),
83
+ sourceAgent: z.string(),
84
+ fingerprint: z.string().optional(),
85
+ metadata: z.record(z.string(), z.unknown()).optional(),
86
+ provenance: z.enum(['complete', 'partial']).optional(),
87
+ });
88
+ /** Zod schema for AgentResultSuccess */
89
+ export const AgentResultSuccessSchema = z.object({
90
+ status: z.literal('success'),
91
+ agentId: z.string(),
92
+ findings: z.array(FindingSchema),
93
+ metrics: AgentMetricsSchema,
94
+ });
95
+ /** Zod schema for AgentResultFailure */
96
+ export const AgentResultFailureSchema = z.object({
97
+ status: z.literal('failure'),
98
+ agentId: z.string(),
99
+ error: z.string(),
100
+ failureStage: z.enum(['preflight', 'exec', 'postprocess']),
101
+ partialFindings: z.array(FindingSchema),
102
+ metrics: AgentMetricsSchema,
103
+ });
104
+ /** Zod schema for AgentResultSkipped */
105
+ export const AgentResultSkippedSchema = z.object({
106
+ status: z.literal('skipped'),
107
+ agentId: z.string(),
108
+ reason: z.string(),
109
+ metrics: AgentMetricsSchema,
110
+ });
111
+ /** Discriminated union schema - validates exact shape */
112
+ export const AgentResultSchema = z.discriminatedUnion('status', [
113
+ AgentResultSuccessSchema,
114
+ AgentResultFailureSchema,
115
+ AgentResultSkippedSchema,
116
+ ]);
117
+ /**
118
+ * Cache schema version - bump when AgentResultSchema changes shape.
119
+ * Included in cache keys to invalidate legacy entries.
120
+ * (012-fix-agent-result-regressions, FR-005)
121
+ *
122
+ * History:
123
+ * - v1: Original format (success: boolean, no status field) - DEPRECATED
124
+ * - v2: Discriminated union (status: 'success'|'failure'|'skipped')
125
+ */
126
+ export const CACHE_SCHEMA_VERSION = 2;
127
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Budget Module
3
+ * Enforces per-PR and monthly cost limits
4
+ */
5
+ import type { Limits } from './config.js';
6
+ export interface BudgetContext {
7
+ /** Number of files changed in the PR */
8
+ fileCount: number;
9
+ /** Total lines changed (additions + deletions) */
10
+ diffLines: number;
11
+ /** Estimated tokens for LLM input */
12
+ estimatedTokens: number;
13
+ }
14
+ export interface BudgetCheck {
15
+ allowed: boolean;
16
+ reason?: string;
17
+ /** Suggested reduced scope if over budget */
18
+ reducedScope?: {
19
+ maxFiles?: number;
20
+ maxLines?: number;
21
+ };
22
+ }
23
+ export interface CostEstimate {
24
+ /** Estimated USD cost for LLM calls */
25
+ estimatedUsd: number;
26
+ /** Breakdown by agent */
27
+ breakdown: Record<string, number>;
28
+ }
29
+ /**
30
+ * Pricing constants for GPT-4o-mini model
31
+ * These MUST stay in sync with the hardcoded values in agents (pr_agent.ts, ai_semantic_review.ts)
32
+ * See test: "should use consistent pricing with budget module" in budget.test.ts
33
+ */
34
+ export declare const COST_PER_1K_TOKENS_INPUT = 0.00015;
35
+ export declare const COST_PER_1K_TOKENS_OUTPUT = 0.0006;
36
+ export declare const ESTIMATED_OUTPUT_RATIO = 0.2;
37
+ /**
38
+ * Check if the PR is within budget limits
39
+ */
40
+ export declare function checkBudget(context: BudgetContext, limits: Limits): BudgetCheck;
41
+ /**
42
+ * Estimate cost based on token count
43
+ */
44
+ export declare function estimateCost(tokens: number): CostEstimate;
45
+ /**
46
+ * Estimate token count from diff content
47
+ * Rough approximation: 1 token ≈ 4 characters
48
+ */
49
+ export declare function estimateTokens(diffContent: string): number;
50
+ /**
51
+ * Track monthly spending (stub - would use persistent storage in production)
52
+ */
53
+ export interface MonthlyUsage {
54
+ month: string;
55
+ totalUsd: number;
56
+ prCount: number;
57
+ }
58
+ export declare function checkMonthlyBudget(currentUsage: MonthlyUsage, estimatedCost: number, monthlyLimit: number): BudgetCheck;
59
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAChD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAqC/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAYzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,WAAW,CAWb"}
package/dist/budget.js ADDED
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Budget Module
3
+ * Enforces per-PR and monthly cost limits
4
+ */
5
+ /**
6
+ * Pricing constants for GPT-4o-mini model
7
+ * These MUST stay in sync with the hardcoded values in agents (pr_agent.ts, ai_semantic_review.ts)
8
+ * See test: "should use consistent pricing with budget module" in budget.test.ts
9
+ */
10
+ export const COST_PER_1K_TOKENS_INPUT = 0.00015;
11
+ export const COST_PER_1K_TOKENS_OUTPUT = 0.0006;
12
+ export const ESTIMATED_OUTPUT_RATIO = 0.2; // Output is typically 20% of input
13
+ /**
14
+ * Check if the PR is within budget limits
15
+ */
16
+ export function checkBudget(context, limits) {
17
+ // Check file count limit
18
+ if (context.fileCount > limits.max_files) {
19
+ return {
20
+ allowed: false,
21
+ reason: `PR has ${context.fileCount} files, exceeds limit of ${limits.max_files}`,
22
+ reducedScope: { maxFiles: limits.max_files },
23
+ };
24
+ }
25
+ // Check diff lines limit
26
+ if (context.diffLines > limits.max_diff_lines) {
27
+ return {
28
+ allowed: false,
29
+ reason: `PR has ${context.diffLines} changed lines, exceeds limit of ${limits.max_diff_lines}`,
30
+ reducedScope: { maxLines: limits.max_diff_lines },
31
+ };
32
+ }
33
+ // Check token limit
34
+ if (context.estimatedTokens > limits.max_tokens_per_pr) {
35
+ return {
36
+ allowed: false,
37
+ reason: `Estimated ${context.estimatedTokens} tokens, exceeds limit of ${limits.max_tokens_per_pr}`,
38
+ };
39
+ }
40
+ // Check estimated cost
41
+ const estimate = estimateCost(context.estimatedTokens);
42
+ if (estimate.estimatedUsd > limits.max_usd_per_pr) {
43
+ return {
44
+ allowed: false,
45
+ reason: `Estimated cost $${estimate.estimatedUsd.toFixed(2)} exceeds limit of $${limits.max_usd_per_pr.toFixed(2)}`,
46
+ };
47
+ }
48
+ return { allowed: true };
49
+ }
50
+ /**
51
+ * Estimate cost based on token count
52
+ */
53
+ export function estimateCost(tokens) {
54
+ const inputCost = (tokens / 1000) * COST_PER_1K_TOKENS_INPUT;
55
+ const outputTokens = tokens * ESTIMATED_OUTPUT_RATIO;
56
+ const outputCost = (outputTokens / 1000) * COST_PER_1K_TOKENS_OUTPUT;
57
+ return {
58
+ estimatedUsd: inputCost + outputCost,
59
+ breakdown: {
60
+ input: inputCost,
61
+ output: outputCost,
62
+ },
63
+ };
64
+ }
65
+ /**
66
+ * Estimate token count from diff content
67
+ * Rough approximation: 1 token ≈ 4 characters
68
+ */
69
+ export function estimateTokens(diffContent) {
70
+ return Math.ceil(diffContent.length / 4);
71
+ }
72
+ export function checkMonthlyBudget(currentUsage, estimatedCost, monthlyLimit) {
73
+ const projectedTotal = currentUsage.totalUsd + estimatedCost;
74
+ if (projectedTotal > monthlyLimit) {
75
+ return {
76
+ allowed: false,
77
+ reason: `Monthly budget exhausted. Current: $${currentUsage.totalUsd.toFixed(2)}, Limit: $${monthlyLimit.toFixed(2)}`,
78
+ };
79
+ }
80
+ return { allowed: true };
81
+ }
82
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Cache Key Module
3
+ * Generates deterministic cache keys for review results
4
+ *
5
+ * (012-fix-agent-result-regressions) - Cache keys now include CACHE_SCHEMA_VERSION
6
+ * to automatically invalidate legacy cache entries when schema changes.
7
+ */
8
+ /** Cache key prefix for namespacing (includes version for automatic invalidation) */
9
+ export declare const CACHE_KEY_PREFIX = "ai-review-v2";
10
+ /** Default cache directory path */
11
+ export declare const AI_REVIEW_CACHE_PATH = ".ai-review-cache";
12
+ export interface CacheKeyInputs {
13
+ prNumber: number;
14
+ headSha: string;
15
+ configHash: string;
16
+ agentId: string;
17
+ }
18
+ /**
19
+ * Generate a cache key for a review run
20
+ * Format: ai-review-{prNumber}-{headSha}-{configHash}-{agentId}
21
+ */
22
+ export declare function generateCacheKey(inputs: CacheKeyInputs): string;
23
+ /**
24
+ * Generate a restore key prefix for partial cache matches
25
+ * This allows fallback to older cached results for the same PR
26
+ */
27
+ export declare function generateRestoreKeyPrefix(prNumber: number): string;
28
+ /**
29
+ * Generate a hash of the configuration
30
+ * Used for cache invalidation when config changes
31
+ */
32
+ export declare function hashConfig(config: unknown): string;
33
+ /**
34
+ * Generate a hash of file contents for cache invalidation
35
+ */
36
+ export declare function hashContent(content: string): string;
37
+ /**
38
+ * Parse a cache key to extract components
39
+ *
40
+ * (012-fix-agent-result-regressions) - Updated to handle versioned key format
41
+ * Supports both legacy format (ai-review-{prNumber}-{hash}) and new format
42
+ * (ai-review-v{version}-{prNumber}-{hash}) for backwards compatibility in parsing.
43
+ */
44
+ export declare function parseCacheKey(key: string): {
45
+ prNumber: number;
46
+ hash: string;
47
+ version?: number;
48
+ } | null;
49
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/cache/key.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,iBAAuC,CAAC;AAErE,mCAAmC;AACnC,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,GACV;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB7D"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Cache Key Module
3
+ * Generates deterministic cache keys for review results
4
+ *
5
+ * (012-fix-agent-result-regressions) - Cache keys now include CACHE_SCHEMA_VERSION
6
+ * to automatically invalidate legacy cache entries when schema changes.
7
+ */
8
+ import { createHash } from 'crypto';
9
+ import { CACHE_SCHEMA_VERSION } from '../agents/types.js';
10
+ /** Cache key prefix for namespacing (includes version for automatic invalidation) */
11
+ export const CACHE_KEY_PREFIX = `ai-review-v${CACHE_SCHEMA_VERSION}`;
12
+ /** Default cache directory path */
13
+ export const AI_REVIEW_CACHE_PATH = '.ai-review-cache';
14
+ /**
15
+ * Generate a cache key for a review run
16
+ * Format: ai-review-{prNumber}-{headSha}-{configHash}-{agentId}
17
+ */
18
+ export function generateCacheKey(inputs) {
19
+ const data = `${inputs.prNumber}:${inputs.headSha}:${inputs.configHash}:${inputs.agentId}`;
20
+ const hash = createHash('sha256').update(data).digest('hex').slice(0, 16);
21
+ return `${CACHE_KEY_PREFIX}-${inputs.prNumber}-${hash}`;
22
+ }
23
+ /**
24
+ * Generate a restore key prefix for partial cache matches
25
+ * This allows fallback to older cached results for the same PR
26
+ */
27
+ export function generateRestoreKeyPrefix(prNumber) {
28
+ return `${CACHE_KEY_PREFIX}-${prNumber}-`;
29
+ }
30
+ /**
31
+ * Generate a hash of the configuration
32
+ * Used for cache invalidation when config changes
33
+ */
34
+ export function hashConfig(config) {
35
+ const json = JSON.stringify(config, Object.keys(config).sort());
36
+ return createHash('sha256').update(json).digest('hex').slice(0, 16);
37
+ }
38
+ /**
39
+ * Generate a hash of file contents for cache invalidation
40
+ */
41
+ export function hashContent(content) {
42
+ return createHash('sha256').update(content).digest('hex').slice(0, 16);
43
+ }
44
+ /**
45
+ * Parse a cache key to extract components
46
+ *
47
+ * (012-fix-agent-result-regressions) - Updated to handle versioned key format
48
+ * Supports both legacy format (ai-review-{prNumber}-{hash}) and new format
49
+ * (ai-review-v{version}-{prNumber}-{hash}) for backwards compatibility in parsing.
50
+ */
51
+ export function parseCacheKey(key) {
52
+ // Try new versioned format first
53
+ const versionedMatch = key.match(/^ai-review-v(\d+)-(\d+)-([a-f0-9]+)$/);
54
+ if (versionedMatch && versionedMatch[1] && versionedMatch[2] && versionedMatch[3]) {
55
+ return {
56
+ version: parseInt(versionedMatch[1], 10),
57
+ prNumber: parseInt(versionedMatch[2], 10),
58
+ hash: versionedMatch[3],
59
+ };
60
+ }
61
+ // Fall back to legacy format (for parsing only - new keys always use versioned format)
62
+ const legacyMatch = key.match(/^ai-review-(\d+)-([a-f0-9]+)$/);
63
+ if (legacyMatch && legacyMatch[1] && legacyMatch[2]) {
64
+ return {
65
+ prNumber: parseInt(legacyMatch[1], 10),
66
+ hash: legacyMatch[2],
67
+ };
68
+ }
69
+ return null;
70
+ }
71
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/cache/key.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,oBAAoB,EAAE,CAAC;AAErE,mCAAmC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AASvD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,gBAAgB,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,GAAG,gBAAgB,IAAI,QAAQ,GAAG,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW;IAEX,iCAAiC;IACjC,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzE,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACxC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Cache Store Module
3
+ * Stores and retrieves cached review results
4
+ * Uses GitHub Actions cache in CI, file-based cache locally
5
+ */
6
+ import type { AgentResult } from '../agents/index.js';
7
+ export interface CacheEntry {
8
+ key: string;
9
+ result: AgentResult;
10
+ createdAt: string;
11
+ expiresAt: string;
12
+ }
13
+ /**
14
+ * Get a cached result
15
+ */
16
+ export declare function getCached(key: string): Promise<AgentResult | null>;
17
+ /**
18
+ * Store a result in the cache
19
+ */
20
+ export declare function setCache(key: string, result: AgentResult, ttlSeconds?: number): Promise<void>;
21
+ /**
22
+ * Clear the cache
23
+ */
24
+ export declare function clearCache(): Promise<void>;
25
+ /**
26
+ * Clean up expired cache entries
27
+ */
28
+ export declare function cleanupExpired(): Promise<number>;
29
+ /**
30
+ * Find cached result for a PR (even with different SHA)
31
+ * Used for fallback when exact cache miss
32
+ *
33
+ * (012-fix-agent-result-regressions) - Now validates results through validateCachedResult()
34
+ * to ensure legacy/malformed entries are treated as cache misses.
35
+ */
36
+ export declare function findCachedForPR(prNumber: number): Promise<AgentResult | null>;
37
+ /**
38
+ * Save cache for GitHub Actions
39
+ * Call this at the end of a CI run to persist cache
40
+ */
41
+ export declare function saveGitHubActionsCache(key: string): Promise<boolean>;
42
+ /**
43
+ * Restore cache from GitHub Actions
44
+ * Call this at the start of a CI run
45
+ */
46
+ export declare function restoreGitHubActionsCache(primaryKey: string, restoreKeys: string[]): Promise<string | undefined>;
47
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8GD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkDxE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,EACnB,UAAU,SAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAoCtD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqCnF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB1E;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB7B"}