@allocator-one/rcl 4.4.19

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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1415 -0
  3. package/dist/ci.d.ts +16 -0
  4. package/dist/ci.js +42 -0
  5. package/dist/ci.js.map +1 -0
  6. package/dist/config/data-dir.d.ts +6 -0
  7. package/dist/config/data-dir.js +12 -0
  8. package/dist/config/data-dir.js.map +1 -0
  9. package/dist/config/defaults.d.ts +82 -0
  10. package/dist/config/defaults.js +89 -0
  11. package/dist/config/defaults.js.map +1 -0
  12. package/dist/config/harness.d.ts +40 -0
  13. package/dist/config/harness.js +151 -0
  14. package/dist/config/harness.js.map +1 -0
  15. package/dist/config/loader.d.ts +13 -0
  16. package/dist/config/loader.js +131 -0
  17. package/dist/config/loader.js.map +1 -0
  18. package/dist/config/provider-concurrency.d.ts +4 -0
  19. package/dist/config/provider-concurrency.js +6 -0
  20. package/dist/config/provider-concurrency.js.map +1 -0
  21. package/dist/config/providers.d.ts +3 -0
  22. package/dist/config/providers.js +9 -0
  23. package/dist/config/providers.js.map +1 -0
  24. package/dist/config/schema.d.ts +179 -0
  25. package/dist/config/schema.js +115 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/consensus/claim-contract.d.ts +9 -0
  28. package/dist/consensus/claim-contract.js +307 -0
  29. package/dist/consensus/claim-contract.js.map +1 -0
  30. package/dist/consensus/claim-identity.d.ts +5 -0
  31. package/dist/consensus/claim-identity.js +39 -0
  32. package/dist/consensus/claim-identity.js.map +1 -0
  33. package/dist/consensus/deduper.d.ts +43 -0
  34. package/dist/consensus/deduper.js +1052 -0
  35. package/dist/consensus/deduper.js.map +1 -0
  36. package/dist/consensus/finding-identity.d.ts +20 -0
  37. package/dist/consensus/finding-identity.js +49 -0
  38. package/dist/consensus/finding-identity.js.map +1 -0
  39. package/dist/consensus/gating.d.ts +215 -0
  40. package/dist/consensus/gating.js +699 -0
  41. package/dist/consensus/gating.js.map +1 -0
  42. package/dist/consensus/parser.d.ts +22 -0
  43. package/dist/consensus/parser.js +255 -0
  44. package/dist/consensus/parser.js.map +1 -0
  45. package/dist/consensus/semantic-deduper.d.ts +10 -0
  46. package/dist/consensus/semantic-deduper.js +70 -0
  47. package/dist/consensus/semantic-deduper.js.map +1 -0
  48. package/dist/consensus/types.d.ts +196 -0
  49. package/dist/consensus/types.js +2 -0
  50. package/dist/consensus/types.js.map +1 -0
  51. package/dist/consensus/verification-contract.d.ts +8 -0
  52. package/dist/consensus/verification-contract.js +95 -0
  53. package/dist/consensus/verification-contract.js.map +1 -0
  54. package/dist/consensus/voter.d.ts +29 -0
  55. package/dist/consensus/voter.js +394 -0
  56. package/dist/consensus/voter.js.map +1 -0
  57. package/dist/converge/attempt-budget.d.ts +88 -0
  58. package/dist/converge/attempt-budget.js +717 -0
  59. package/dist/converge/attempt-budget.js.map +1 -0
  60. package/dist/converge/bound-fix-recovery-source.d.ts +24 -0
  61. package/dist/converge/bound-fix-recovery-source.js +25 -0
  62. package/dist/converge/bound-fix-recovery-source.js.map +1 -0
  63. package/dist/converge/bound-fix-recovery.d.ts +15 -0
  64. package/dist/converge/bound-fix-recovery.js +65 -0
  65. package/dist/converge/bound-fix-recovery.js.map +1 -0
  66. package/dist/converge/correction-anchors.d.ts +1 -0
  67. package/dist/converge/correction-anchors.js +2 -0
  68. package/dist/converge/correction-anchors.js.map +1 -0
  69. package/dist/converge/cycle-remote.d.ts +6 -0
  70. package/dist/converge/cycle-remote.js +41 -0
  71. package/dist/converge/cycle-remote.js.map +1 -0
  72. package/dist/converge/delivery-reconciliation.d.ts +17 -0
  73. package/dist/converge/delivery-reconciliation.js +53 -0
  74. package/dist/converge/delivery-reconciliation.js.map +1 -0
  75. package/dist/converge/finding-identity.d.ts +6 -0
  76. package/dist/converge/finding-identity.js +7 -0
  77. package/dist/converge/finding-identity.js.map +1 -0
  78. package/dist/converge/fresh-review.d.ts +37 -0
  79. package/dist/converge/fresh-review.js +351 -0
  80. package/dist/converge/fresh-review.js.map +1 -0
  81. package/dist/converge/launch-guard.d.ts +55 -0
  82. package/dist/converge/launch-guard.js +363 -0
  83. package/dist/converge/launch-guard.js.map +1 -0
  84. package/dist/converge/launch-preflight.d.ts +5 -0
  85. package/dist/converge/launch-preflight.js +41 -0
  86. package/dist/converge/launch-preflight.js.map +1 -0
  87. package/dist/converge/launch-record.d.ts +136 -0
  88. package/dist/converge/launch-record.js +86 -0
  89. package/dist/converge/launch-record.js.map +1 -0
  90. package/dist/converge/legacy-launch-health.d.ts +311 -0
  91. package/dist/converge/legacy-launch-health.js +159 -0
  92. package/dist/converge/legacy-launch-health.js.map +1 -0
  93. package/dist/converge/legacy-roster.d.ts +29 -0
  94. package/dist/converge/legacy-roster.js +268 -0
  95. package/dist/converge/legacy-roster.js.map +1 -0
  96. package/dist/converge/native-lock.d.ts +18 -0
  97. package/dist/converge/native-lock.js +122 -0
  98. package/dist/converge/native-lock.js.map +1 -0
  99. package/dist/converge/ordinary-pending-export.d.ts +67 -0
  100. package/dist/converge/ordinary-pending-export.js +175 -0
  101. package/dist/converge/ordinary-pending-export.js.map +1 -0
  102. package/dist/converge/ordinary-pending-package.d.ts +28 -0
  103. package/dist/converge/ordinary-pending-package.js +36 -0
  104. package/dist/converge/ordinary-pending-package.js.map +1 -0
  105. package/dist/converge/pending-legacy-resume.d.ts +119 -0
  106. package/dist/converge/pending-legacy-resume.js +720 -0
  107. package/dist/converge/pending-legacy-resume.js.map +1 -0
  108. package/dist/converge/pending-recovery-source.d.ts +131 -0
  109. package/dist/converge/pending-recovery-source.js +71 -0
  110. package/dist/converge/pending-recovery-source.js.map +1 -0
  111. package/dist/converge/recovery-launch.d.ts +66 -0
  112. package/dist/converge/recovery-launch.js +518 -0
  113. package/dist/converge/recovery-launch.js.map +1 -0
  114. package/dist/converge/retained-report.d.ts +29 -0
  115. package/dist/converge/retained-report.js +218 -0
  116. package/dist/converge/retained-report.js.map +1 -0
  117. package/dist/converge/retry-source.d.ts +25 -0
  118. package/dist/converge/retry-source.js +13 -0
  119. package/dist/converge/retry-source.js.map +1 -0
  120. package/dist/converge/review-cycle.d.ts +49 -0
  121. package/dist/converge/review-cycle.js +26 -0
  122. package/dist/converge/review-cycle.js.map +1 -0
  123. package/dist/converge/round-gap-schema.d.ts +66 -0
  124. package/dist/converge/round-gap-schema.js +51 -0
  125. package/dist/converge/round-gap-schema.js.map +1 -0
  126. package/dist/converge/round-gap.d.ts +38 -0
  127. package/dist/converge/round-gap.js +334 -0
  128. package/dist/converge/round-gap.js.map +1 -0
  129. package/dist/converge/run-state.d.ts +224 -0
  130. package/dist/converge/run-state.js +564 -0
  131. package/dist/converge/run-state.js.map +1 -0
  132. package/dist/converge/stale-report-schema.d.ts +42 -0
  133. package/dist/converge/stale-report-schema.js +79 -0
  134. package/dist/converge/stale-report-schema.js.map +1 -0
  135. package/dist/converge/stale-report-storage.d.ts +47 -0
  136. package/dist/converge/stale-report-storage.js +172 -0
  137. package/dist/converge/stale-report-storage.js.map +1 -0
  138. package/dist/converge/stale-report.d.ts +14 -0
  139. package/dist/converge/stale-report.js +213 -0
  140. package/dist/converge/stale-report.js.map +1 -0
  141. package/dist/converge/target-ownership.d.ts +29 -0
  142. package/dist/converge/target-ownership.js +95 -0
  143. package/dist/converge/target-ownership.js.map +1 -0
  144. package/dist/converge/terminal-rejection-schema.d.ts +42 -0
  145. package/dist/converge/terminal-rejection-schema.js +39 -0
  146. package/dist/converge/terminal-rejection-schema.js.map +1 -0
  147. package/dist/converge/terminal-rejection.d.ts +13 -0
  148. package/dist/converge/terminal-rejection.js +275 -0
  149. package/dist/converge/terminal-rejection.js.map +1 -0
  150. package/dist/coordination/registry-lock.d.ts +82 -0
  151. package/dist/coordination/registry-lock.js +498 -0
  152. package/dist/coordination/registry-lock.js.map +1 -0
  153. package/dist/discuss.d.ts +53 -0
  154. package/dist/discuss.js +112 -0
  155. package/dist/discuss.js.map +1 -0
  156. package/dist/dispatch/adapter.d.ts +32 -0
  157. package/dist/dispatch/adapter.js +2 -0
  158. package/dist/dispatch/adapter.js.map +1 -0
  159. package/dist/dispatch/anthropic.d.ts +10 -0
  160. package/dist/dispatch/anthropic.js +235 -0
  161. package/dist/dispatch/anthropic.js.map +1 -0
  162. package/dist/dispatch/async-lane.d.ts +127 -0
  163. package/dist/dispatch/async-lane.js +414 -0
  164. package/dist/dispatch/async-lane.js.map +1 -0
  165. package/dist/dispatch/capture-council.d.ts +63 -0
  166. package/dist/dispatch/capture-council.js +137 -0
  167. package/dist/dispatch/capture-council.js.map +1 -0
  168. package/dist/dispatch/captured-async.d.ts +67 -0
  169. package/dist/dispatch/captured-async.js +40 -0
  170. package/dist/dispatch/captured-async.js.map +1 -0
  171. package/dist/dispatch/captured-inputs.d.ts +50 -0
  172. package/dist/dispatch/captured-inputs.js +190 -0
  173. package/dist/dispatch/captured-inputs.js.map +1 -0
  174. package/dist/dispatch/checkpoint-async-context.d.ts +27 -0
  175. package/dist/dispatch/checkpoint-async-context.js +51 -0
  176. package/dist/dispatch/checkpoint-async-context.js.map +1 -0
  177. package/dist/dispatch/checkpoint-async-execution.d.ts +22 -0
  178. package/dist/dispatch/checkpoint-async-execution.js +130 -0
  179. package/dist/dispatch/checkpoint-async-execution.js.map +1 -0
  180. package/dist/dispatch/checkpoint-async-store.d.ts +134 -0
  181. package/dist/dispatch/checkpoint-async-store.js +534 -0
  182. package/dist/dispatch/checkpoint-async-store.js.map +1 -0
  183. package/dist/dispatch/checkpoint-async-unknown.d.ts +19 -0
  184. package/dist/dispatch/checkpoint-async-unknown.js +46 -0
  185. package/dist/dispatch/checkpoint-async-unknown.js.map +1 -0
  186. package/dist/dispatch/checkpoint-async.d.ts +252 -0
  187. package/dist/dispatch/checkpoint-async.js +270 -0
  188. package/dist/dispatch/checkpoint-async.js.map +1 -0
  189. package/dist/dispatch/checkpoint-gating-execution.d.ts +26 -0
  190. package/dist/dispatch/checkpoint-gating-execution.js +84 -0
  191. package/dist/dispatch/checkpoint-gating-execution.js.map +1 -0
  192. package/dist/dispatch/checkpoint-phase-limits.d.ts +5 -0
  193. package/dist/dispatch/checkpoint-phase-limits.js +11 -0
  194. package/dist/dispatch/checkpoint-phase-limits.js.map +1 -0
  195. package/dist/dispatch/checkpoint-verification-context.d.ts +15 -0
  196. package/dist/dispatch/checkpoint-verification-context.js +48 -0
  197. package/dist/dispatch/checkpoint-verification-context.js.map +1 -0
  198. package/dist/dispatch/checkpoint-verification.d.ts +213 -0
  199. package/dist/dispatch/checkpoint-verification.js +381 -0
  200. package/dist/dispatch/checkpoint-verification.js.map +1 -0
  201. package/dist/dispatch/checkpoint.d.ts +329 -0
  202. package/dist/dispatch/checkpoint.js +1418 -0
  203. package/dist/dispatch/checkpoint.js.map +1 -0
  204. package/dist/dispatch/google.d.ts +10 -0
  205. package/dist/dispatch/google.js +158 -0
  206. package/dist/dispatch/google.js.map +1 -0
  207. package/dist/dispatch/late-audit.d.ts +23 -0
  208. package/dist/dispatch/late-audit.js +133 -0
  209. package/dist/dispatch/late-audit.js.map +1 -0
  210. package/dist/dispatch/merge.d.ts +29 -0
  211. package/dist/dispatch/merge.js +112 -0
  212. package/dist/dispatch/merge.js.map +1 -0
  213. package/dist/dispatch/openai-compat.d.ts +30 -0
  214. package/dist/dispatch/openai-compat.js +166 -0
  215. package/dist/dispatch/openai-compat.js.map +1 -0
  216. package/dist/dispatch/openai.d.ts +10 -0
  217. package/dist/dispatch/openai.js +159 -0
  218. package/dist/dispatch/openai.js.map +1 -0
  219. package/dist/dispatch/original-execution.d.ts +30 -0
  220. package/dist/dispatch/original-execution.js +91 -0
  221. package/dist/dispatch/original-execution.js.map +1 -0
  222. package/dist/dispatch/original-launch.d.ts +37 -0
  223. package/dist/dispatch/original-launch.js +117 -0
  224. package/dist/dispatch/original-launch.js.map +1 -0
  225. package/dist/dispatch/quorum.d.ts +15 -0
  226. package/dist/dispatch/quorum.js +33 -0
  227. package/dist/dispatch/quorum.js.map +1 -0
  228. package/dist/dispatch/recovery-operation.d.ts +44 -0
  229. package/dist/dispatch/recovery-operation.js +146 -0
  230. package/dist/dispatch/recovery-operation.js.map +1 -0
  231. package/dist/dispatch/recovery-policy.d.ts +54 -0
  232. package/dist/dispatch/recovery-policy.js +157 -0
  233. package/dist/dispatch/recovery-policy.js.map +1 -0
  234. package/dist/dispatch/recovery.d.ts +78 -0
  235. package/dist/dispatch/recovery.js +299 -0
  236. package/dist/dispatch/recovery.js.map +1 -0
  237. package/dist/dispatch/retained-async.d.ts +13 -0
  238. package/dist/dispatch/retained-async.js +101 -0
  239. package/dist/dispatch/retained-async.js.map +1 -0
  240. package/dist/dispatch/reviewer-identity.d.ts +10 -0
  241. package/dist/dispatch/reviewer-identity.js +19 -0
  242. package/dist/dispatch/reviewer-identity.js.map +1 -0
  243. package/dist/dispatch/runner.d.ts +76 -0
  244. package/dist/dispatch/runner.js +415 -0
  245. package/dist/dispatch/runner.js.map +1 -0
  246. package/dist/dispatch/utils.d.ts +159 -0
  247. package/dist/dispatch/utils.js +381 -0
  248. package/dist/dispatch/utils.js.map +1 -0
  249. package/dist/dispatch/verification-execution.d.ts +48 -0
  250. package/dist/dispatch/verification-execution.js +252 -0
  251. package/dist/dispatch/verification-execution.js.map +1 -0
  252. package/dist/dispatch/verification-late-audit.d.ts +17 -0
  253. package/dist/dispatch/verification-late-audit.js +117 -0
  254. package/dist/dispatch/verification-late-audit.js.map +1 -0
  255. package/dist/evidence/claim-recovery/authenticated-carrier-projection.d.ts +30 -0
  256. package/dist/evidence/claim-recovery/authenticated-carrier-projection.js +100 -0
  257. package/dist/evidence/claim-recovery/authenticated-carrier-projection.js.map +1 -0
  258. package/dist/evidence/claim-recovery/authenticated-receipts.d.ts +46 -0
  259. package/dist/evidence/claim-recovery/authenticated-receipts.js +120 -0
  260. package/dist/evidence/claim-recovery/authenticated-receipts.js.map +1 -0
  261. package/dist/evidence/claim-recovery/carrier-inventory.d.ts +49 -0
  262. package/dist/evidence/claim-recovery/carrier-inventory.js +340 -0
  263. package/dist/evidence/claim-recovery/carrier-inventory.js.map +1 -0
  264. package/dist/evidence/claim-recovery/claim-index.d.ts +12 -0
  265. package/dist/evidence/claim-recovery/claim-index.js +56 -0
  266. package/dist/evidence/claim-recovery/claim-index.js.map +1 -0
  267. package/dist/evidence/claim-recovery/confirmation.d.ts +53 -0
  268. package/dist/evidence/claim-recovery/confirmation.js +151 -0
  269. package/dist/evidence/claim-recovery/confirmation.js.map +1 -0
  270. package/dist/evidence/claim-recovery/context.d.ts +15 -0
  271. package/dist/evidence/claim-recovery/context.js +40 -0
  272. package/dist/evidence/claim-recovery/context.js.map +1 -0
  273. package/dist/evidence/claim-recovery/proof-storage.d.ts +6 -0
  274. package/dist/evidence/claim-recovery/proof-storage.js +97 -0
  275. package/dist/evidence/claim-recovery/proof-storage.js.map +1 -0
  276. package/dist/evidence/claim-recovery/validation/anchors.d.ts +20 -0
  277. package/dist/evidence/claim-recovery/validation/anchors.js +22 -0
  278. package/dist/evidence/claim-recovery/validation/anchors.js.map +1 -0
  279. package/dist/evidence/claim-recovery/validation/carrier-projection.d.ts +9 -0
  280. package/dist/evidence/claim-recovery/validation/carrier-projection.js +364 -0
  281. package/dist/evidence/claim-recovery/validation/carrier-projection.js.map +1 -0
  282. package/dist/evidence/claim-recovery/validation/carrier-types.d.ts +83 -0
  283. package/dist/evidence/claim-recovery/validation/carrier-types.js +2 -0
  284. package/dist/evidence/claim-recovery/validation/carrier-types.js.map +1 -0
  285. package/dist/evidence/claim-recovery/validation/claim-split.d.ts +57 -0
  286. package/dist/evidence/claim-recovery/validation/claim-split.js +209 -0
  287. package/dist/evidence/claim-recovery/validation/claim-split.js.map +1 -0
  288. package/dist/evidence/claim-recovery/validation/claims.d.ts +20 -0
  289. package/dist/evidence/claim-recovery/validation/claims.js +108 -0
  290. package/dist/evidence/claim-recovery/validation/claims.js.map +1 -0
  291. package/dist/evidence/claim-recovery/validation/current-projection.d.ts +36 -0
  292. package/dist/evidence/claim-recovery/validation/current-projection.js +424 -0
  293. package/dist/evidence/claim-recovery/validation/current-projection.js.map +1 -0
  294. package/dist/evidence/claim-recovery/validation/lexical.d.ts +18 -0
  295. package/dist/evidence/claim-recovery/validation/lexical.js +91 -0
  296. package/dist/evidence/claim-recovery/validation/lexical.js.map +1 -0
  297. package/dist/evidence/claim-recovery/validation/materials.d.ts +19 -0
  298. package/dist/evidence/claim-recovery/validation/materials.js +160 -0
  299. package/dist/evidence/claim-recovery/validation/materials.js.map +1 -0
  300. package/dist/evidence/claim-recovery/validation/native-material.d.ts +27 -0
  301. package/dist/evidence/claim-recovery/validation/native-material.js +35 -0
  302. package/dist/evidence/claim-recovery/validation/native-material.js.map +1 -0
  303. package/dist/evidence/claim-recovery/validation/native-occurrences.d.ts +79 -0
  304. package/dist/evidence/claim-recovery/validation/native-occurrences.js +187 -0
  305. package/dist/evidence/claim-recovery/validation/native-occurrences.js.map +1 -0
  306. package/dist/evidence/claim-recovery/validation/native-state.d.ts +45 -0
  307. package/dist/evidence/claim-recovery/validation/native-state.js +385 -0
  308. package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -0
  309. package/dist/evidence/claim-recovery/validation/obligations.d.ts +15 -0
  310. package/dist/evidence/claim-recovery/validation/obligations.js +65 -0
  311. package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -0
  312. package/dist/evidence/claim-recovery/validation/occurrence-source.d.ts +45 -0
  313. package/dist/evidence/claim-recovery/validation/occurrence-source.js +208 -0
  314. package/dist/evidence/claim-recovery/validation/occurrence-source.js.map +1 -0
  315. package/dist/evidence/claim-recovery/validation/occurrence-types.d.ts +101 -0
  316. package/dist/evidence/claim-recovery/validation/occurrence-types.js +2 -0
  317. package/dist/evidence/claim-recovery/validation/occurrence-types.js.map +1 -0
  318. package/dist/evidence/claim-recovery/validation/occurrence.d.ts +30 -0
  319. package/dist/evidence/claim-recovery/validation/occurrence.js +227 -0
  320. package/dist/evidence/claim-recovery/validation/occurrence.js.map +1 -0
  321. package/dist/evidence/claim-recovery/validation/primitives.d.ts +11 -0
  322. package/dist/evidence/claim-recovery/validation/primitives.js +41 -0
  323. package/dist/evidence/claim-recovery/validation/primitives.js.map +1 -0
  324. package/dist/evidence/claim-recovery/validation/receipts.d.ts +37 -0
  325. package/dist/evidence/claim-recovery/validation/receipts.js +83 -0
  326. package/dist/evidence/claim-recovery/validation/receipts.js.map +1 -0
  327. package/dist/evidence/claim-recovery/validation/recovery-json.d.ts +8 -0
  328. package/dist/evidence/claim-recovery/validation/recovery-json.js +42 -0
  329. package/dist/evidence/claim-recovery/validation/recovery-json.js.map +1 -0
  330. package/dist/evidence/claim-recovery/validation/semantic-cache.d.ts +3 -0
  331. package/dist/evidence/claim-recovery/validation/semantic-cache.js +22 -0
  332. package/dist/evidence/claim-recovery/validation/semantic-cache.js.map +1 -0
  333. package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +9 -0
  334. package/dist/evidence/claim-recovery/validation/semantic-validation.js +347 -0
  335. package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -0
  336. package/dist/evidence/claim-recovery/validation/sighting.d.ts +2 -0
  337. package/dist/evidence/claim-recovery/validation/sighting.js +15 -0
  338. package/dist/evidence/claim-recovery/validation/sighting.js.map +1 -0
  339. package/dist/evidence/claim-recovery/validation/sources.d.ts +15 -0
  340. package/dist/evidence/claim-recovery/validation/sources.js +2 -0
  341. package/dist/evidence/claim-recovery/validation/sources.js.map +1 -0
  342. package/dist/evidence/claim-recovery/validation/types.d.ts +126 -0
  343. package/dist/evidence/claim-recovery/validation/types.js +2 -0
  344. package/dist/evidence/claim-recovery/validation/types.js.map +1 -0
  345. package/dist/evidence/claim-split.d.ts +1 -0
  346. package/dist/evidence/claim-split.js +2 -0
  347. package/dist/evidence/claim-split.js.map +1 -0
  348. package/dist/evidence/event-receipts.d.ts +16 -0
  349. package/dist/evidence/event-receipts.js +41 -0
  350. package/dist/evidence/event-receipts.js.map +1 -0
  351. package/dist/evidence/finding-recovery.d.ts +23 -0
  352. package/dist/evidence/finding-recovery.js +74 -0
  353. package/dist/evidence/finding-recovery.js.map +1 -0
  354. package/dist/evidence/finding-retriage.d.ts +14 -0
  355. package/dist/evidence/finding-retriage.js +57 -0
  356. package/dist/evidence/finding-retriage.js.map +1 -0
  357. package/dist/evidence/format.d.ts +18 -0
  358. package/dist/evidence/format.js +152 -0
  359. package/dist/evidence/format.js.map +1 -0
  360. package/dist/evidence/original-run/decode.d.ts +30 -0
  361. package/dist/evidence/original-run/decode.js +208 -0
  362. package/dist/evidence/original-run/decode.js.map +1 -0
  363. package/dist/evidence/original-run/journal.d.ts +31 -0
  364. package/dist/evidence/original-run/journal.js +157 -0
  365. package/dist/evidence/original-run/journal.js.map +1 -0
  366. package/dist/evidence/original-run/lock-path.d.ts +17 -0
  367. package/dist/evidence/original-run/lock-path.js +116 -0
  368. package/dist/evidence/original-run/lock-path.js.map +1 -0
  369. package/dist/evidence/original-run/lock-scope.d.ts +21 -0
  370. package/dist/evidence/original-run/lock-scope.js +61 -0
  371. package/dist/evidence/original-run/lock-scope.js.map +1 -0
  372. package/dist/evidence/original-run/lock.d.ts +33 -0
  373. package/dist/evidence/original-run/lock.js +259 -0
  374. package/dist/evidence/original-run/lock.js.map +1 -0
  375. package/dist/evidence/original-run/remote.d.ts +23 -0
  376. package/dist/evidence/original-run/remote.js +110 -0
  377. package/dist/evidence/original-run/remote.js.map +1 -0
  378. package/dist/evidence/original-run/source.d.ts +61 -0
  379. package/dist/evidence/original-run/source.js +267 -0
  380. package/dist/evidence/original-run/source.js.map +1 -0
  381. package/dist/evidence/reads.d.ts +11 -0
  382. package/dist/evidence/reads.js +16 -0
  383. package/dist/evidence/reads.js.map +1 -0
  384. package/dist/evidence/recover-finding.d.ts +17 -0
  385. package/dist/evidence/recover-finding.js +65 -0
  386. package/dist/evidence/recover-finding.js.map +1 -0
  387. package/dist/evidence/recover-run.d.ts +26 -0
  388. package/dist/evidence/recover-run.js +180 -0
  389. package/dist/evidence/recover-run.js.map +1 -0
  390. package/dist/evidence/retained-time-budget.d.ts +9 -0
  391. package/dist/evidence/retained-time-budget.js +14 -0
  392. package/dist/evidence/retained-time-budget.js.map +1 -0
  393. package/dist/evidence/retriage-finding.d.ts +12 -0
  394. package/dist/evidence/retriage-finding.js +67 -0
  395. package/dist/evidence/retriage-finding.js.map +1 -0
  396. package/dist/evidence/reviewer-lineage.d.ts +35 -0
  397. package/dist/evidence/reviewer-lineage.js +293 -0
  398. package/dist/evidence/reviewer-lineage.js.map +1 -0
  399. package/dist/evidence/reviewer-original.d.ts +67 -0
  400. package/dist/evidence/reviewer-original.js +148 -0
  401. package/dist/evidence/reviewer-original.js.map +1 -0
  402. package/dist/evidence/reviewer-recovery.d.ts +74 -0
  403. package/dist/evidence/reviewer-recovery.js +179 -0
  404. package/dist/evidence/reviewer-recovery.js.map +1 -0
  405. package/dist/evidence/reviewer-status.d.ts +145 -0
  406. package/dist/evidence/reviewer-status.js +302 -0
  407. package/dist/evidence/reviewer-status.js.map +1 -0
  408. package/dist/evidence/show.d.ts +10 -0
  409. package/dist/evidence/show.js +41 -0
  410. package/dist/evidence/show.js.map +1 -0
  411. package/dist/evidence/status.d.ts +38 -0
  412. package/dist/evidence/status.js +73 -0
  413. package/dist/evidence/status.js.map +1 -0
  414. package/dist/evidence/target.d.ts +17 -0
  415. package/dist/evidence/target.js +74 -0
  416. package/dist/evidence/target.js.map +1 -0
  417. package/dist/evidence/types.d.ts +176 -0
  418. package/dist/evidence/types.js +109 -0
  419. package/dist/evidence/types.js.map +1 -0
  420. package/dist/index.d.ts +2 -0
  421. package/dist/index.js +2688 -0
  422. package/dist/index.js.map +1 -0
  423. package/dist/models/seed.d.ts +44 -0
  424. package/dist/models/seed.js +175 -0
  425. package/dist/models/seed.js.map +1 -0
  426. package/dist/models/server-stats.d.ts +80 -0
  427. package/dist/models/server-stats.js +109 -0
  428. package/dist/models/server-stats.js.map +1 -0
  429. package/dist/models/stats-store.d.ts +84 -0
  430. package/dist/models/stats-store.js +572 -0
  431. package/dist/models/stats-store.js.map +1 -0
  432. package/dist/output/artifacts.d.ts +16 -0
  433. package/dist/output/artifacts.js +29 -0
  434. package/dist/output/artifacts.js.map +1 -0
  435. package/dist/output/assembly-refusal.d.ts +8 -0
  436. package/dist/output/assembly-refusal.js +14 -0
  437. package/dist/output/assembly-refusal.js.map +1 -0
  438. package/dist/output/github.d.ts +12 -0
  439. package/dist/output/github.js +214 -0
  440. package/dist/output/github.js.map +1 -0
  441. package/dist/output/json.d.ts +3 -0
  442. package/dist/output/json.js +8 -0
  443. package/dist/output/json.js.map +1 -0
  444. package/dist/output/markdown.d.ts +3 -0
  445. package/dist/output/markdown.js +281 -0
  446. package/dist/output/markdown.js.map +1 -0
  447. package/dist/output/progress.d.ts +55 -0
  448. package/dist/output/progress.js +180 -0
  449. package/dist/output/progress.js.map +1 -0
  450. package/dist/output/sanitize.d.ts +18 -0
  451. package/dist/output/sanitize.js +46 -0
  452. package/dist/output/sanitize.js.map +1 -0
  453. package/dist/output/terminal.d.ts +2 -0
  454. package/dist/output/terminal.js +172 -0
  455. package/dist/output/terminal.js.map +1 -0
  456. package/dist/prepare/chunker.d.ts +18 -0
  457. package/dist/prepare/chunker.js +325 -0
  458. package/dist/prepare/chunker.js.map +1 -0
  459. package/dist/prepare/language.d.ts +1 -0
  460. package/dist/prepare/language.js +99 -0
  461. package/dist/prepare/language.js.map +1 -0
  462. package/dist/prepare/prompt-builder.d.ts +44 -0
  463. package/dist/prepare/prompt-builder.js +102 -0
  464. package/dist/prepare/prompt-builder.js.map +1 -0
  465. package/dist/prepare/unified-diff.d.ts +40 -0
  466. package/dist/prepare/unified-diff.js +135 -0
  467. package/dist/prepare/unified-diff.js.map +1 -0
  468. package/dist/prompts/base.d.ts +3 -0
  469. package/dist/prompts/base.js +53 -0
  470. package/dist/prompts/base.js.map +1 -0
  471. package/dist/prompts/hardening.d.ts +19 -0
  472. package/dist/prompts/hardening.js +67 -0
  473. package/dist/prompts/hardening.js.map +1 -0
  474. package/dist/prompts/languages/elixir.d.ts +1 -0
  475. package/dist/prompts/languages/elixir.js +13 -0
  476. package/dist/prompts/languages/elixir.js.map +1 -0
  477. package/dist/prompts/languages/generic.d.ts +1 -0
  478. package/dist/prompts/languages/generic.js +11 -0
  479. package/dist/prompts/languages/generic.js.map +1 -0
  480. package/dist/prompts/languages/python.d.ts +1 -0
  481. package/dist/prompts/languages/python.js +14 -0
  482. package/dist/prompts/languages/python.js.map +1 -0
  483. package/dist/prompts/languages/typescript.d.ts +1 -0
  484. package/dist/prompts/languages/typescript.js +13 -0
  485. package/dist/prompts/languages/typescript.js.map +1 -0
  486. package/dist/prompts/plan.d.ts +15 -0
  487. package/dist/prompts/plan.js +55 -0
  488. package/dist/prompts/plan.js.map +1 -0
  489. package/dist/report/aggregation-inputs.d.ts +52 -0
  490. package/dist/report/aggregation-inputs.js +114 -0
  491. package/dist/report/aggregation-inputs.js.map +1 -0
  492. package/dist/report/assembly.d.ts +43 -0
  493. package/dist/report/assembly.js +133 -0
  494. package/dist/report/assembly.js.map +1 -0
  495. package/dist/report/blocking-health.d.ts +64 -0
  496. package/dist/report/blocking-health.js +156 -0
  497. package/dist/report/blocking-health.js.map +1 -0
  498. package/dist/report/checkpoint-assembly.d.ts +10 -0
  499. package/dist/report/checkpoint-assembly.js +17 -0
  500. package/dist/report/checkpoint-assembly.js.map +1 -0
  501. package/dist/report/checkpoint-consensus.d.ts +59 -0
  502. package/dist/report/checkpoint-consensus.js +197 -0
  503. package/dist/report/checkpoint-consensus.js.map +1 -0
  504. package/dist/report/checkpoint-gating.d.ts +36 -0
  505. package/dist/report/checkpoint-gating.js +110 -0
  506. package/dist/report/checkpoint-gating.js.map +1 -0
  507. package/dist/report/checkpoint-projection.d.ts +76 -0
  508. package/dist/report/checkpoint-projection.js +122 -0
  509. package/dist/report/checkpoint-projection.js.map +1 -0
  510. package/dist/report/consensus-assembly.d.ts +37 -0
  511. package/dist/report/consensus-assembly.js +33 -0
  512. package/dist/report/consensus-assembly.js.map +1 -0
  513. package/dist/report/recovery-source.d.ts +7 -0
  514. package/dist/report/recovery-source.js +7 -0
  515. package/dist/report/recovery-source.js.map +1 -0
  516. package/dist/report/reviewer-artifact.d.ts +118 -0
  517. package/dist/report/reviewer-artifact.js +381 -0
  518. package/dist/report/reviewer-artifact.js.map +1 -0
  519. package/dist/report/reviewer-evidence-schema.d.ts +42 -0
  520. package/dist/report/reviewer-evidence-schema.js +28 -0
  521. package/dist/report/reviewer-evidence-schema.js.map +1 -0
  522. package/dist/report/reviewer-evidence.d.ts +54 -0
  523. package/dist/report/reviewer-evidence.js +229 -0
  524. package/dist/report/reviewer-evidence.js.map +1 -0
  525. package/dist/report/reviewer-health.d.ts +62 -0
  526. package/dist/report/reviewer-health.js +105 -0
  527. package/dist/report/reviewer-health.js.map +1 -0
  528. package/dist/report/run-header.d.ts +219 -0
  529. package/dist/report/run-header.js +307 -0
  530. package/dist/report/run-header.js.map +1 -0
  531. package/dist/report/supplemental-async.d.ts +19 -0
  532. package/dist/report/supplemental-async.js +85 -0
  533. package/dist/report/supplemental-async.js.map +1 -0
  534. package/dist/report/uuid.d.ts +16 -0
  535. package/dist/report/uuid.js +41 -0
  536. package/dist/report/uuid.js.map +1 -0
  537. package/dist/resolver/git.d.ts +16 -0
  538. package/dist/resolver/git.js +77 -0
  539. package/dist/resolver/git.js.map +1 -0
  540. package/dist/resolver/github-client.d.ts +82 -0
  541. package/dist/resolver/github-client.js +27 -0
  542. package/dist/resolver/github-client.js.map +1 -0
  543. package/dist/resolver/github.d.ts +29 -0
  544. package/dist/resolver/github.js +166 -0
  545. package/dist/resolver/github.js.map +1 -0
  546. package/dist/resolver/local.d.ts +3 -0
  547. package/dist/resolver/local.js +75 -0
  548. package/dist/resolver/local.js.map +1 -0
  549. package/dist/resolver/plan.d.ts +8 -0
  550. package/dist/resolver/plan.js +44 -0
  551. package/dist/resolver/plan.js.map +1 -0
  552. package/dist/resolver/target.d.ts +35 -0
  553. package/dist/resolver/target.js +112 -0
  554. package/dist/resolver/target.js.map +1 -0
  555. package/dist/resolver/types.d.ts +43 -0
  556. package/dist/resolver/types.js +2 -0
  557. package/dist/resolver/types.js.map +1 -0
  558. package/dist/roles/builtin.d.ts +4 -0
  559. package/dist/roles/builtin.js +282 -0
  560. package/dist/roles/builtin.js.map +1 -0
  561. package/dist/roles/dispatcher.d.ts +26 -0
  562. package/dist/roles/dispatcher.js +96 -0
  563. package/dist/roles/dispatcher.js.map +1 -0
  564. package/dist/roles/legacy-4.1.10.d.ts +2 -0
  565. package/dist/roles/legacy-4.1.10.js +320 -0
  566. package/dist/roles/legacy-4.1.10.js.map +1 -0
  567. package/dist/roles/legacy-4.4.9.d.ts +4 -0
  568. package/dist/roles/legacy-4.4.9.js +282 -0
  569. package/dist/roles/legacy-4.4.9.js.map +1 -0
  570. package/dist/roles/loader.d.ts +10 -0
  571. package/dist/roles/loader.js +104 -0
  572. package/dist/roles/loader.js.map +1 -0
  573. package/dist/roles/types.d.ts +13 -0
  574. package/dist/roles/types.js +2 -0
  575. package/dist/roles/types.js.map +1 -0
  576. package/dist/telemetry/abort-signal.d.ts +13 -0
  577. package/dist/telemetry/abort-signal.js +40 -0
  578. package/dist/telemetry/abort-signal.js.map +1 -0
  579. package/dist/telemetry/attest.d.ts +98 -0
  580. package/dist/telemetry/attest.js +331 -0
  581. package/dist/telemetry/attest.js.map +1 -0
  582. package/dist/telemetry/attested-retry.d.ts +79 -0
  583. package/dist/telemetry/attested-retry.js +195 -0
  584. package/dist/telemetry/attested-retry.js.map +1 -0
  585. package/dist/telemetry/attested-reviewer-delivery.d.ts +58 -0
  586. package/dist/telemetry/attested-reviewer-delivery.js +238 -0
  587. package/dist/telemetry/attested-reviewer-delivery.js.map +1 -0
  588. package/dist/telemetry/backfill.d.ts +95 -0
  589. package/dist/telemetry/backfill.js +460 -0
  590. package/dist/telemetry/backfill.js.map +1 -0
  591. package/dist/telemetry/credentials.d.ts +44 -0
  592. package/dist/telemetry/credentials.js +87 -0
  593. package/dist/telemetry/credentials.js.map +1 -0
  594. package/dist/telemetry/deliver.d.ts +152 -0
  595. package/dist/telemetry/deliver.js +662 -0
  596. package/dist/telemetry/deliver.js.map +1 -0
  597. package/dist/telemetry/envelope-validation.d.ts +13 -0
  598. package/dist/telemetry/envelope-validation.js +196 -0
  599. package/dist/telemetry/envelope-validation.js.map +1 -0
  600. package/dist/telemetry/envelope.d.ts +159 -0
  601. package/dist/telemetry/envelope.js +288 -0
  602. package/dist/telemetry/envelope.js.map +1 -0
  603. package/dist/telemetry/events.d.ts +68 -0
  604. package/dist/telemetry/events.js +79 -0
  605. package/dist/telemetry/events.js.map +1 -0
  606. package/dist/telemetry/notice.d.ts +15 -0
  607. package/dist/telemetry/notice.js +67 -0
  608. package/dist/telemetry/notice.js.map +1 -0
  609. package/dist/telemetry/outbox.d.ts +166 -0
  610. package/dist/telemetry/outbox.js +741 -0
  611. package/dist/telemetry/outbox.js.map +1 -0
  612. package/dist/telemetry/quarantine.d.ts +105 -0
  613. package/dist/telemetry/quarantine.js +224 -0
  614. package/dist/telemetry/quarantine.js.map +1 -0
  615. package/dist/telemetry/read-sink.d.ts +31 -0
  616. package/dist/telemetry/read-sink.js +25 -0
  617. package/dist/telemetry/read-sink.js.map +1 -0
  618. package/dist/telemetry/recovery/command.d.ts +16 -0
  619. package/dist/telemetry/recovery/command.js +70 -0
  620. package/dist/telemetry/recovery/command.js.map +1 -0
  621. package/dist/telemetry/recovery/discovery.d.ts +8 -0
  622. package/dist/telemetry/recovery/discovery.js +277 -0
  623. package/dist/telemetry/recovery/discovery.js.map +1 -0
  624. package/dist/telemetry/recovery/files.d.ts +20 -0
  625. package/dist/telemetry/recovery/files.js +123 -0
  626. package/dist/telemetry/recovery/files.js.map +1 -0
  627. package/dist/telemetry/recovery/plan.d.ts +10 -0
  628. package/dist/telemetry/recovery/plan.js +325 -0
  629. package/dist/telemetry/recovery/plan.js.map +1 -0
  630. package/dist/telemetry/recovery/source.d.ts +328 -0
  631. package/dist/telemetry/recovery/source.js +253 -0
  632. package/dist/telemetry/recovery/source.js.map +1 -0
  633. package/dist/telemetry/recovery/types.d.ts +100 -0
  634. package/dist/telemetry/recovery/types.js +2 -0
  635. package/dist/telemetry/recovery/types.js.map +1 -0
  636. package/dist/telemetry/recovery-request-budget.d.ts +39 -0
  637. package/dist/telemetry/recovery-request-budget.js +102 -0
  638. package/dist/telemetry/recovery-request-budget.js.map +1 -0
  639. package/dist/telemetry/report-consistency.d.ts +11 -0
  640. package/dist/telemetry/report-consistency.js +111 -0
  641. package/dist/telemetry/report-consistency.js.map +1 -0
  642. package/dist/telemetry/reviewer-delivery.d.ts +39 -0
  643. package/dist/telemetry/reviewer-delivery.js +279 -0
  644. package/dist/telemetry/reviewer-delivery.js.map +1 -0
  645. package/dist/telemetry/reviewer-preflight.d.ts +13 -0
  646. package/dist/telemetry/reviewer-preflight.js +56 -0
  647. package/dist/telemetry/reviewer-preflight.js.map +1 -0
  648. package/dist/telemetry/scrub.d.ts +53 -0
  649. package/dist/telemetry/scrub.js +205 -0
  650. package/dist/telemetry/scrub.js.map +1 -0
  651. package/dist/telemetry/sink.d.ts +212 -0
  652. package/dist/telemetry/sink.js +813 -0
  653. package/dist/telemetry/sink.js.map +1 -0
  654. package/dist/telemetry/terminal-reviewer-delivery.d.ts +18 -0
  655. package/dist/telemetry/terminal-reviewer-delivery.js +27 -0
  656. package/dist/telemetry/terminal-reviewer-delivery.js.map +1 -0
  657. package/dist/telemetry/transient-input.d.ts +2 -0
  658. package/dist/telemetry/transient-input.js +37 -0
  659. package/dist/telemetry/transient-input.js.map +1 -0
  660. package/dist/telemetry/verification.d.ts +9 -0
  661. package/dist/telemetry/verification.js +12 -0
  662. package/dist/telemetry/verification.js.map +1 -0
  663. package/package.json +73 -0
package/dist/ci.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { ReviewResult } from './consensus/types.js';
2
+ import { type ReviewerHealth } from './report/reviewer-health.js';
3
+ export interface CiVerdict {
4
+ exitCode: number;
5
+ message?: string;
6
+ }
7
+ /**
8
+ * Decide the CI exit status for a completed review.
9
+ *
10
+ * A run where every reviewer errored produces zero findings — which without
11
+ * this check looks identical to "clean" and exits 0, greenlighting code that
12
+ * was never actually reviewed. That case fails first; blocking findings fail
13
+ * second. New proof-bearing reports pass a validated frozen-matrix health
14
+ * projection; legacy callers retain the original zero-success rule.
15
+ */
16
+ export declare function evaluateCiGate(result: ReviewResult, health?: ReviewerHealth): CiVerdict;
package/dist/ci.js ADDED
@@ -0,0 +1,42 @@
1
+ import { assertReviewerHealth } from './report/reviewer-health.js';
2
+ /**
3
+ * Decide the CI exit status for a completed review.
4
+ *
5
+ * A run where every reviewer errored produces zero findings — which without
6
+ * this check looks identical to "clean" and exits 0, greenlighting code that
7
+ * was never actually reviewed. That case fails first; blocking findings fail
8
+ * second. New proof-bearing reports pass a validated frozen-matrix health
9
+ * projection; legacy callers retain the original zero-success rule.
10
+ */
11
+ export function evaluateCiGate(result, health) {
12
+ if (health !== undefined) {
13
+ assertReviewerHealth(health);
14
+ if (!health.conclusive) {
15
+ return {
16
+ exitCode: 1,
17
+ message: `CI: ${health.successfulSeats.length}/${health.policy.seatCount} blocking reviewers completed every required chunk; ${health.policy.minimumSuccessful} required. Reviewer health is inconclusive. Exiting with code 1.`,
18
+ };
19
+ }
20
+ }
21
+ if (result.stats.successfulReviews === 0) {
22
+ return {
23
+ exitCode: 1,
24
+ message: `CI: 0/${result.stats.totalReviews} reviewers succeeded — nothing was reviewed. Exiting with code 1.`,
25
+ };
26
+ }
27
+ // Gating-annotated findings (RCL-23) block on their gating reason —
28
+ // consensus, critical, or verified — so a refuted single-model claim no
29
+ // longer fails CI. Legacy reports without annotations keep the pure
30
+ // severity gate.
31
+ const blocking = result.findings.filter((f) => f.gating
32
+ ? f.gating.reason !== 'none'
33
+ : f.severity === 'critical' || f.severity === 'important');
34
+ if (blocking.length > 0) {
35
+ return {
36
+ exitCode: 1,
37
+ message: `CI: ${blocking.length} blocking finding(s) found. Exiting with code 1.`,
38
+ };
39
+ }
40
+ return { exitCode: 0 };
41
+ }
42
+ //# sourceMappingURL=ci.js.map
package/dist/ci.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,6BAA6B,CAAC;AAOxF;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,MAAuB;IAC1E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,uDAAuD,MAAM,CAAC,MAAM,CAAC,iBAAiB,kEAAkE;aACjO,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,YAAY,mEAAmE;SAC/G,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,wEAAwE;IACxE,oEAAoE;IACpE,iBAAiB;IACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,MAAM;QACN,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM;QAC5B,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,CAC5D,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,QAAQ,CAAC,MAAM,kDAAkD;SAClF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Where rcl keeps its per-machine state (model stats, the telemetry outbox,
3
+ * the consent notice): `RCL_DATA_DIR`, or `~/.rcl`. Shared here so no
4
+ * feature module depends on another for the location.
5
+ */
6
+ export declare function resolveDataDir(env?: NodeJS.ProcessEnv): string;
@@ -0,0 +1,12 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Where rcl keeps its per-machine state (model stats, the telemetry outbox,
5
+ * the consent notice): `RCL_DATA_DIR`, or `~/.rcl`. Shared here so no
6
+ * feature module depends on another for the location.
7
+ */
8
+ export function resolveDataDir(env = process.env) {
9
+ const override = env['RCL_DATA_DIR']?.trim();
10
+ return override && override.length > 0 ? override : join(homedir(), '.rcl');
11
+ }
12
+ //# sourceMappingURL=data-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-dir.js","sourceRoot":"","sources":["../../src/config/data-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IAC7C,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Primary council — general reviewers; specialists also use secondary models.
3
+ * Direct-API models only: the RCL-21 audit (922 rounds, 15,268 calls) found
4
+ * the OpenRouter wing at p50 7–9.5 min per call with 19–39% dead calls,
5
+ * last-finisher in 97.6% of rounds; the audited direct trio answered in
6
+ * 45–70 s with ~0% dead calls. Replaying the corpus with that direct-provider
7
+ * topology drops the median round from 14.4 to 2.0 min while 91% of
8
+ * multi-model findings still surface.
9
+ */
10
+ export declare const DEFAULT_MODELS: readonly ["anthropic/claude-opus-5-5", "openai/gpt-6-sol"];
11
+ /**
12
+ * Async bonus reviewers — fired with the round but never awaited; whatever
13
+ * has arrived by the NEXT round's dedup is merged then, marked async in the
14
+ * report. kimi-k3 keeps a seat here because it has the council's best
15
+ * corroboration rate (62%) but is ~6× slower than the core trio.
16
+ */
17
+ export declare const DEFAULT_ASYNC_MODELS: readonly ["openrouter/moonshotai/kimi-k3"];
18
+ /** Gemini contributes specialist reviews without adding a general-review seat. */
19
+ export declare const DEFAULT_SECONDARY_MODELS: readonly ["google/gemini-3.8-flash"];
20
+ export declare const DEFAULT_THRESHOLDS: {
21
+ readonly minConsensusScore: 0.4;
22
+ readonly minConfidence: 0.2;
23
+ readonly dedupeLineWindow: 5;
24
+ /**
25
+ * Threshold for the weighted title+description similarity
26
+ * (0.6 * title + 0.4 * description). Calibrated against the fixture
27
+ * corpus: genuine cross-model duplicates score 0.29-0.55 (descriptions
28
+ * diverge heavily across models), so higher thresholds split real
29
+ * duplicates. The strictness gain over the old max(title, desc) check
30
+ * comes from the formula: a title-only match now needs 0.5+ title
31
+ * overlap to merge instead of 0.3.
32
+ */
33
+ readonly jaccardThreshold: 0.3;
34
+ };
35
+ /**
36
+ * Blocking-path per-call timeout. The RCL-21 corpus put every direct-API
37
+ * model's p90 under 260 s, but the 2.0.0 rollout (RCL-29) showed heavier
38
+ * reasoning defaults pushing real calls past 300 s; losing a reviewer costs
39
+ * more than waiting, so the blocking path now gets 540 s. Slow-by-design
40
+ * models still belong in the async lane, which has its own cap below.
41
+ */
42
+ export declare const DEFAULT_TIMEOUT_MS = 540000;
43
+ /**
44
+ * Quorum round closure (RCL-26): a round closes once this fraction of its
45
+ * planned calls has completed; outstanding non-core calls are canceled and
46
+ * recorded. ⅔ matches the converge reviewer-health threshold, so a round
47
+ * closed exactly at quorum can still be conclusive. Corpus replay: −51%
48
+ * total review wall even with the pre-RCL-25 roster. Set to 1 to disable.
49
+ */
50
+ export declare const DEFAULT_QUORUM_FRACTION: number;
51
+ /**
52
+ * Per-call timeout for the async (non-blocking) lane. Async reviewers are
53
+ * slow by definition — kimi-k3's p50 is 7–9.5 min — and nothing waits on
54
+ * them, so they get more headroom than the blocking council.
55
+ */
56
+ export declare const DEFAULT_ASYNC_TIMEOUT_MS = 900000;
57
+ export declare const DEFAULT_MAX_RETRIES = 3;
58
+ /**
59
+ * Reasoning budget for OpenRouter-hosted models. Unbounded, they spend the
60
+ * whole completion budget (and many minutes) thinking before emitting any
61
+ * findings. Kimi K3, the default async model, supports low/high/max, not
62
+ * medium. Use the supported low level while retaining the output/time caps;
63
+ * explicit configuration can still select another effort for other models.
64
+ */
65
+ export declare const DEFAULT_REASONING_EFFORT = "low";
66
+ export declare const DEFAULT_CONCURRENCY = 9;
67
+ /**
68
+ * Provider admission limits inside the blocking runner. The default prevents
69
+ * the observed five-seat high-effort Anthropic burst while preserving the
70
+ * existing per-call deadline. Providers absent from this map remain bounded
71
+ * only by the global concurrency limit.
72
+ */
73
+ export declare const DEFAULT_PROVIDER_CONCURRENCY: {
74
+ readonly anthropic: 2;
75
+ };
76
+ export declare const DEFAULT_SEVERITY_ORDER: readonly ["critical", "important", "minor", "nitpick"];
77
+ export declare const CONFIDENCE_THRESHOLDS: {
78
+ readonly veryHigh: 0.8;
79
+ readonly high: 0.6;
80
+ readonly medium: 0.4;
81
+ readonly low: 0.2;
82
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Primary council — general reviewers; specialists also use secondary models.
3
+ * Direct-API models only: the RCL-21 audit (922 rounds, 15,268 calls) found
4
+ * the OpenRouter wing at p50 7–9.5 min per call with 19–39% dead calls,
5
+ * last-finisher in 97.6% of rounds; the audited direct trio answered in
6
+ * 45–70 s with ~0% dead calls. Replaying the corpus with that direct-provider
7
+ * topology drops the median round from 14.4 to 2.0 min while 91% of
8
+ * multi-model findings still surface.
9
+ */
10
+ export const DEFAULT_MODELS = [
11
+ 'anthropic/claude-opus-5-5',
12
+ 'openai/gpt-6-sol',
13
+ ];
14
+ /**
15
+ * Async bonus reviewers — fired with the round but never awaited; whatever
16
+ * has arrived by the NEXT round's dedup is merged then, marked async in the
17
+ * report. kimi-k3 keeps a seat here because it has the council's best
18
+ * corroboration rate (62%) but is ~6× slower than the core trio.
19
+ */
20
+ export const DEFAULT_ASYNC_MODELS = ['openrouter/moonshotai/kimi-k3'];
21
+ /** Gemini contributes specialist reviews without adding a general-review seat. */
22
+ export const DEFAULT_SECONDARY_MODELS = ['google/gemini-3.8-flash'];
23
+ export const DEFAULT_THRESHOLDS = {
24
+ minConsensusScore: 0.4,
25
+ minConfidence: 0.2,
26
+ dedupeLineWindow: 5,
27
+ /**
28
+ * Threshold for the weighted title+description similarity
29
+ * (0.6 * title + 0.4 * description). Calibrated against the fixture
30
+ * corpus: genuine cross-model duplicates score 0.29-0.55 (descriptions
31
+ * diverge heavily across models), so higher thresholds split real
32
+ * duplicates. The strictness gain over the old max(title, desc) check
33
+ * comes from the formula: a title-only match now needs 0.5+ title
34
+ * overlap to merge instead of 0.3.
35
+ */
36
+ jaccardThreshold: 0.3,
37
+ };
38
+ /**
39
+ * Blocking-path per-call timeout. The RCL-21 corpus put every direct-API
40
+ * model's p90 under 260 s, but the 2.0.0 rollout (RCL-29) showed heavier
41
+ * reasoning defaults pushing real calls past 300 s; losing a reviewer costs
42
+ * more than waiting, so the blocking path now gets 540 s. Slow-by-design
43
+ * models still belong in the async lane, which has its own cap below.
44
+ */
45
+ export const DEFAULT_TIMEOUT_MS = 540_000;
46
+ /**
47
+ * Quorum round closure (RCL-26): a round closes once this fraction of its
48
+ * planned calls has completed; outstanding non-core calls are canceled and
49
+ * recorded. ⅔ matches the converge reviewer-health threshold, so a round
50
+ * closed exactly at quorum can still be conclusive. Corpus replay: −51%
51
+ * total review wall even with the pre-RCL-25 roster. Set to 1 to disable.
52
+ */
53
+ export const DEFAULT_QUORUM_FRACTION = 2 / 3;
54
+ /**
55
+ * Per-call timeout for the async (non-blocking) lane. Async reviewers are
56
+ * slow by definition — kimi-k3's p50 is 7–9.5 min — and nothing waits on
57
+ * them, so they get more headroom than the blocking council.
58
+ */
59
+ export const DEFAULT_ASYNC_TIMEOUT_MS = 900_000;
60
+ export const DEFAULT_MAX_RETRIES = 3;
61
+ /**
62
+ * Reasoning budget for OpenRouter-hosted models. Unbounded, they spend the
63
+ * whole completion budget (and many minutes) thinking before emitting any
64
+ * findings. Kimi K3, the default async model, supports low/high/max, not
65
+ * medium. Use the supported low level while retaining the output/time caps;
66
+ * explicit configuration can still select another effort for other models.
67
+ */
68
+ export const DEFAULT_REASONING_EFFORT = 'low';
69
+ export const DEFAULT_CONCURRENCY = 9;
70
+ /**
71
+ * Provider admission limits inside the blocking runner. The default prevents
72
+ * the observed five-seat high-effort Anthropic burst while preserving the
73
+ * existing per-call deadline. Providers absent from this map remain bounded
74
+ * only by the global concurrency limit.
75
+ */
76
+ export const DEFAULT_PROVIDER_CONCURRENCY = { anthropic: 2 };
77
+ export const DEFAULT_SEVERITY_ORDER = [
78
+ 'critical',
79
+ 'important',
80
+ 'minor',
81
+ 'nitpick',
82
+ ];
83
+ export const CONFIDENCE_THRESHOLDS = {
84
+ veryHigh: 0.8,
85
+ high: 0.6,
86
+ medium: 0.4,
87
+ low: 0.2,
88
+ };
89
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,2BAA2B;IAC3B,kBAAkB;CACV,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,+BAA+B,CAAU,CAAC;AAE/E,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,yBAAyB,CAAU,CAAC;AAE7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,CAAC;IACnB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,SAAS,EAAE,CAAC,EAAW,CAAC;AAEtE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,WAAW;IACX,OAAO;IACP,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACA,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface HarnessKeyResult {
2
+ /** Providers whose keys were injected into the env. */
3
+ injected: string[];
4
+ /** One human-readable line worth showing, when there is something to say. */
5
+ note?: string;
6
+ }
7
+ export interface HarnessKeyOptions {
8
+ cwd?: string;
9
+ /** Injectable for tests; defaults to process.env and is MUTATED on inject. */
10
+ env?: Record<string, string | undefined>;
11
+ credentialsPath?: string;
12
+ fetchImpl?: typeof fetch;
13
+ /**
14
+ * A credential already in hand — the run-bound one `rcl review --attest`
15
+ * minted (RCL-40). Used instead of the stored login, and the attestation
16
+ * stands in for the repository's `.harness-cli/config.json`.
17
+ */
18
+ credential?: {
19
+ url: string;
20
+ token: string;
21
+ };
22
+ }
23
+ /** Walk up from `startDir` looking for `.harness-cli/config.json`. */
24
+ export declare function findHarnessRepoConfig(startDir: string): string | null;
25
+ /**
26
+ * The credential `harness login` stores. The format is frozen on the
27
+ * harness-cli side (exactly {url, token}) — see its core/credentials.ts.
28
+ */
29
+ export declare function defaultCredentialsPath(env: Record<string, string | undefined>): string;
30
+ export declare function readStoredCredentials(path: string): Promise<{
31
+ url: string;
32
+ token: string;
33
+ } | null>;
34
+ export declare function missingProviders(env: Record<string, string | undefined>): string[];
35
+ /**
36
+ * The one entry point: called before config loading (default-model
37
+ * degradation for a missing OPENROUTER_API_KEY happens there, so the key
38
+ * must exist earlier). No-op unless keys are missing AND the repo opted in.
39
+ */
40
+ export declare function applyHarnessModelKeys(options?: HarnessKeyOptions): Promise<HarnessKeyResult>;
@@ -0,0 +1,151 @@
1
+ import { accessSync } from 'fs';
2
+ import { readFile } from 'fs/promises';
3
+ import { homedir } from 'os';
4
+ import { dirname, isAbsolute, join, parse } from 'path';
5
+ /**
6
+ * Key distribution via Harness. When the repo under review carries a
7
+ * committed `.harness-cli/config.json` (the "this repo belongs to the org"
8
+ * signal, discovered git-style by walking up from the working directory)
9
+ * and the user has run `harness login`, provider API keys missing from the
10
+ * environment are fetched from the Harness backend
11
+ * (GET /api/v1/model-keys) and injected into the process environment.
12
+ *
13
+ * Rules this module must never break:
14
+ * - The environment always wins: only keys absent from the env are injected.
15
+ * - The stored {url, token} credential pair is indivisible: the token is
16
+ * only ever sent to the host that minted it — NEVER to a URL named by the
17
+ * repo's own config, which is attacker-controlled input in a cloned repo.
18
+ * - Every failure degrades silently to today's behavior (missing keys warn
19
+ * or fail exactly as before); the fetch runs under a short timeout so an
20
+ * offline machine never hangs a review.
21
+ * - Keys land in the (injected) env only — never on disk, never in logs.
22
+ */
23
+ /** Provider names the backend may serve, mapped to the env var rcl reads. */
24
+ const PROVIDER_ENV_VARS = {
25
+ anthropic: 'ANTHROPIC_API_KEY',
26
+ openai: 'OPENAI_API_KEY',
27
+ google: 'GEMINI_API_KEY',
28
+ openrouter: 'OPENROUTER_API_KEY',
29
+ };
30
+ /** Long enough for a healthy backend, short enough to never stall a review. */
31
+ const FETCH_TIMEOUT_MS = 3_000;
32
+ /** Walk up from `startDir` looking for `.harness-cli/config.json`. */
33
+ export function findHarnessRepoConfig(startDir) {
34
+ let dir = startDir;
35
+ const { root } = parse(startDir);
36
+ for (;;) {
37
+ const candidate = join(dir, '.harness-cli', 'config.json');
38
+ try {
39
+ // Presence is the signal; the file's contents (team, url) are not
40
+ // trusted for anything here.
41
+ accessSync(candidate);
42
+ return candidate;
43
+ }
44
+ catch {
45
+ // keep walking
46
+ }
47
+ if (dir === root)
48
+ return null;
49
+ dir = dirname(dir);
50
+ }
51
+ }
52
+ /**
53
+ * The credential `harness login` stores. The format is frozen on the
54
+ * harness-cli side (exactly {url, token}) — see its core/credentials.ts.
55
+ */
56
+ export function defaultCredentialsPath(env) {
57
+ const xdg = env['XDG_CONFIG_HOME'];
58
+ const base = xdg !== undefined && xdg !== '' && isAbsolute(xdg) ? xdg : join(homedir(), '.config');
59
+ return join(base, 'harness', 'credentials.json');
60
+ }
61
+ export async function readStoredCredentials(path) {
62
+ try {
63
+ const parsed = JSON.parse(await readFile(path, 'utf-8'));
64
+ if (typeof parsed === 'object' && parsed !== null) {
65
+ const { url, token } = parsed;
66
+ if (typeof url === 'string' && typeof token === 'string' && url !== '' && token !== '') {
67
+ return { url: url.replace(/\/+$/, ''), token };
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Missing or malformed reads as "not logged in".
73
+ }
74
+ return null;
75
+ }
76
+ async function fetchModelKeys(baseUrl, token, fetchImpl) {
77
+ try {
78
+ const response = await fetchImpl(`${baseUrl}/api/v1/model-keys`, {
79
+ headers: { authorization: `Bearer ${token}` },
80
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
81
+ });
82
+ if (!response.ok)
83
+ return null;
84
+ const body = await response.json();
85
+ const keys = body?.data?.keys;
86
+ if (typeof keys !== 'object' || keys === null)
87
+ return null;
88
+ const out = {};
89
+ for (const [provider, key] of Object.entries(keys)) {
90
+ if (typeof key === 'string' && key !== '')
91
+ out[provider] = key;
92
+ }
93
+ return out;
94
+ }
95
+ catch {
96
+ // Timeout, offline, older backend without the endpoint — all read as
97
+ // "no keys from Harness".
98
+ return null;
99
+ }
100
+ }
101
+ export function missingProviders(env) {
102
+ const isSet = (name) => (env[name] ?? '').trim() !== '';
103
+ return Object.entries(PROVIDER_ENV_VARS)
104
+ .filter(([provider, envVar]) => {
105
+ // The Google adapter reads either variable; respect both.
106
+ if (provider === 'google' && isSet('GOOGLE_API_KEY'))
107
+ return false;
108
+ return !isSet(envVar);
109
+ })
110
+ .map(([provider]) => provider);
111
+ }
112
+ /**
113
+ * The one entry point: called before config loading (default-model
114
+ * degradation for a missing OPENROUTER_API_KEY happens there, so the key
115
+ * must exist earlier). No-op unless keys are missing AND the repo opted in.
116
+ */
117
+ export async function applyHarnessModelKeys(options = {}) {
118
+ const env = options.env ?? process.env;
119
+ if ((env['RCL_NO_HARNESS_KEYS'] ?? '') !== '')
120
+ return { injected: [] };
121
+ const missing = missingProviders(env);
122
+ if (missing.length === 0)
123
+ return { injected: [] };
124
+ if (options.credential === undefined && findHarnessRepoConfig(options.cwd ?? process.cwd()) === null)
125
+ return { injected: [] };
126
+ const credentials = options.credential ??
127
+ (await readStoredCredentials(options.credentialsPath ?? defaultCredentialsPath(env)));
128
+ if (credentials === null) {
129
+ return {
130
+ injected: [],
131
+ note: `Missing ${missing.map((p) => PROVIDER_ENV_VARS[p]).join(', ')} — this repo is Harness-managed; run \`harness login\` and rcl will fetch the keys for you.`,
132
+ };
133
+ }
134
+ const keys = await fetchModelKeys(credentials.url, credentials.token, options.fetchImpl ?? fetch);
135
+ if (keys === null) {
136
+ return { injected: [], note: `Could not fetch model keys from ${credentials.url} — continuing with the environment as-is.` };
137
+ }
138
+ const injected = [];
139
+ for (const provider of missing) {
140
+ const key = keys[provider];
141
+ if (key !== undefined) {
142
+ env[PROVIDER_ENV_VARS[provider]] = key;
143
+ injected.push(provider);
144
+ }
145
+ }
146
+ return {
147
+ injected,
148
+ note: injected.length > 0 ? `Using ${injected.join(', ')} key(s) from Harness (${credentials.url}).` : undefined,
149
+ };
150
+ }
151
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/config/harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type Config } from './schema.js';
2
+ /**
3
+ * A config file was found but could not be used. Never silently recover
4
+ * from this: falling back to defaults would send code to cloud providers
5
+ * the user may have explicitly configured away from.
6
+ */
7
+ export declare class ConfigError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare const SEARCH_PLACES: string[];
11
+ export declare function loadConfig(configPath?: string, searchFrom?: string, options?: {
12
+ preserveDefaultRoster?: boolean;
13
+ }): Promise<Config>;
@@ -0,0 +1,131 @@
1
+ import { cosmiconfig } from 'cosmiconfig';
2
+ import { ConfigSchema } from './schema.js';
3
+ import { DEFAULT_MODELS, DEFAULT_SECONDARY_MODELS, DEFAULT_ASYNC_MODELS, DEFAULT_THRESHOLDS, DEFAULT_TIMEOUT_MS, DEFAULT_ASYNC_TIMEOUT_MS, DEFAULT_QUORUM_FRACTION, DEFAULT_MAX_RETRIES, DEFAULT_CONCURRENCY, DEFAULT_REASONING_EFFORT, } from './defaults.js';
4
+ /**
5
+ * A config file was found but could not be used. Never silently recover
6
+ * from this: falling back to defaults would send code to cloud providers
7
+ * the user may have explicitly configured away from.
8
+ */
9
+ export class ConfigError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'ConfigError';
13
+ }
14
+ }
15
+ // Declarative formats only. Executable config (.js/.cjs) is deliberately
16
+ // unsupported for discovery: rcl is routinely run inside untrusted
17
+ // checkouts, and search-loading attacker-controlled JS would execute it
18
+ // with the user's API keys in env.
19
+ export const SEARCH_PLACES = [
20
+ '.review-council.yml',
21
+ '.review-council.yaml',
22
+ '.review-council.json',
23
+ ];
24
+ export async function loadConfig(configPath, searchFrom, options = {}) {
25
+ const cwd = searchFrom ?? process.cwd();
26
+ const explorer = cosmiconfig('review-council', {
27
+ searchPlaces: SEARCH_PLACES,
28
+ // 'none' searches only the starting directory — no parent-directory walk
29
+ // and no global (~/.config) dir, which would otherwise be probed with
30
+ // cosmiconfig's default executable-config loaders. (stopDir is rejected
31
+ // alongside a non-'global' strategy, and is unnecessary here.)
32
+ searchStrategy: 'none',
33
+ });
34
+ let result;
35
+ try {
36
+ result = configPath
37
+ ? await explorer.load(configPath)
38
+ : await explorer.search(cwd);
39
+ }
40
+ catch (err) {
41
+ const source = configPath ?? 'discovered config';
42
+ throw new ConfigError(`Failed to load config from ${source}: ${String(err)}`);
43
+ }
44
+ if (!result || result.isEmpty) {
45
+ return buildDefaultConfig(options.preserveDefaultRoster);
46
+ }
47
+ const parsed = ConfigSchema.safeParse(result.config);
48
+ if (!parsed.success) {
49
+ const issues = parsed.error.issues
50
+ .map((issue) => ` ${issue.path.join('.') || '(root)'}: ${issue.message}`)
51
+ .join('\n');
52
+ throw new ConfigError(`Invalid config at ${result.filepath}:\n${issues}`);
53
+ }
54
+ return mergeWithDefaults(parsed.data, options.preserveDefaultRoster);
55
+ }
56
+ /**
57
+ * The default fleet includes openrouter/ models. When OPENROUTER_API_KEY is
58
+ * absent those voters would fail on every run (the runner refuses to fall
59
+ * back to OPENAI_API_KEY), silently breaking upgrades from pre-OpenRouter
60
+ * versions whose users only hold the big-three keys. Defaults therefore
61
+ * degrade gracefully: openrouter/ entries are dropped with a warning.
62
+ * Models the user configured explicitly are never filtered — those still
63
+ * fail loudly per review.
64
+ */
65
+ function dropOpenRouterDefaultsWithoutKey(models, listName, preserveDefaultRoster = false) {
66
+ if (preserveDefaultRoster || process.env['OPENROUTER_API_KEY']?.trim())
67
+ return [...models];
68
+ const kept = models.filter((m) => !m.startsWith('openrouter/'));
69
+ const dropped = models.length - kept.length;
70
+ if (dropped > 0) {
71
+ // Name the resulting fleet, not just the count: the default secondary
72
+ // list is entirely openrouter/, so without the key it degrades to
73
+ // empty and every specialist role falls back to the primary models.
74
+ const remaining = kept.length > 0 ? kept.join(', ') : '(none)';
75
+ console.warn(`OPENROUTER_API_KEY is not set — dropping ${dropped} openrouter/ model(s) from the default ${listName}; remaining: ${remaining}. Set the key to run the full default fleet.`);
76
+ }
77
+ return kept;
78
+ }
79
+ function buildDefaultConfig(preserveDefaultRoster = false) {
80
+ return {
81
+ models: dropOpenRouterDefaultsWithoutKey(DEFAULT_MODELS, 'models', preserveDefaultRoster),
82
+ secondaryModels: dropOpenRouterDefaultsWithoutKey(DEFAULT_SECONDARY_MODELS, 'secondary models', preserveDefaultRoster),
83
+ asyncModels: dropOpenRouterDefaultsWithoutKey(DEFAULT_ASYNC_MODELS, 'async models', preserveDefaultRoster),
84
+ thresholds: { ...DEFAULT_THRESHOLDS },
85
+ timeout: DEFAULT_TIMEOUT_MS,
86
+ asyncTimeout: DEFAULT_ASYNC_TIMEOUT_MS,
87
+ quorumFraction: DEFAULT_QUORUM_FRACTION,
88
+ maxRetries: DEFAULT_MAX_RETRIES,
89
+ concurrency: DEFAULT_CONCURRENCY,
90
+ reasoningEffort: DEFAULT_REASONING_EFFORT,
91
+ };
92
+ }
93
+ function mergeWithDefaults(config, preserveDefaultRoster = false) {
94
+ return {
95
+ models: config.models ?? dropOpenRouterDefaultsWithoutKey(DEFAULT_MODELS, 'models', preserveDefaultRoster),
96
+ secondaryModels: config.secondaryModels ??
97
+ (config.models
98
+ ? []
99
+ : dropOpenRouterDefaultsWithoutKey(DEFAULT_SECONDARY_MODELS, 'secondary models', preserveDefaultRoster)),
100
+ // Same containment rule as secondaryModels: an explicit `models` list
101
+ // means "send code to exactly these providers" — default async reviewers
102
+ // must not leak the diff to a provider the user configured away from.
103
+ asyncModels: config.asyncModels ??
104
+ (config.models
105
+ ? []
106
+ : dropOpenRouterDefaultsWithoutKey(DEFAULT_ASYNC_MODELS, 'async models', preserveDefaultRoster)),
107
+ roles: config.roles,
108
+ reviewers: config.reviewers,
109
+ customRoles: config.customRoles,
110
+ thresholds: {
111
+ ...DEFAULT_THRESHOLDS,
112
+ ...config.thresholds,
113
+ },
114
+ // Resolved (and validated) at use by resolveGatingConfig.
115
+ gating: config.gating,
116
+ output: config.output,
117
+ timeout: config.timeout ?? DEFAULT_TIMEOUT_MS,
118
+ asyncTimeout: config.asyncTimeout ?? DEFAULT_ASYNC_TIMEOUT_MS,
119
+ quorumFraction: config.quorumFraction ?? DEFAULT_QUORUM_FRACTION,
120
+ maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,
121
+ concurrency: config.concurrency ?? DEFAULT_CONCURRENCY,
122
+ providerConcurrency: config.providerConcurrency ? { ...config.providerConcurrency } : undefined,
123
+ reasoningEffort: config.reasoningEffort ?? DEFAULT_REASONING_EFFORT,
124
+ githubToken: config.githubToken ?? process.env['GITHUB_TOKEN'],
125
+ context: config.context,
126
+ spec: config.spec,
127
+ focus: config.focus,
128
+ harness: config.harness,
129
+ };
130
+ }
131
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from './schema.js';
2
+ export type ProviderConcurrency = NonNullable<Config['providerConcurrency']>;
3
+ /** Version-owned defaults plus source-bound project overrides. */
4
+ export declare function resolveProviderConcurrency(configured?: Readonly<ProviderConcurrency>): ProviderConcurrency;
@@ -0,0 +1,6 @@
1
+ import { DEFAULT_PROVIDER_CONCURRENCY } from './defaults.js';
2
+ /** Version-owned defaults plus source-bound project overrides. */
3
+ export function resolveProviderConcurrency(configured) {
4
+ return { ...DEFAULT_PROVIDER_CONCURRENCY, ...configured };
5
+ }
6
+ //# sourceMappingURL=provider-concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-concurrency.js","sourceRoot":"","sources":["../../src/config/provider-concurrency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAK7D,kEAAkE;AAClE,MAAM,UAAU,0BAA0B,CACxC,UAA0C;IAE1C,OAAO,EAAE,GAAG,4BAA4B,EAAE,GAAG,UAAU,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const MODEL_PROVIDERS: readonly ["anthropic", "openai", "google", "openrouter", "openai-compat"];
2
+ export type ModelProvider = (typeof MODEL_PROVIDERS)[number];
3
+ export declare const MODEL_PROVIDER_SET: ReadonlySet<string>;