@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
@@ -0,0 +1,104 @@
1
+ import { access } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { BUILTIN_ROLES, getRoleByName } from './builtin.js';
4
+ const PROJECT_RULES_FILES = [
5
+ 'AGENTS.md',
6
+ 'CLAUDE.md',
7
+ 'CONTRIBUTING.md',
8
+ '.github/CONTRIBUTING.md',
9
+ 'DEVELOPMENT.md',
10
+ 'docs/CONTRIBUTING.md',
11
+ ];
12
+ export async function findProjectRulesFile(cwd = process.cwd()) {
13
+ for (const filename of PROJECT_RULES_FILES) {
14
+ const fullPath = join(cwd, filename);
15
+ try {
16
+ await access(fullPath);
17
+ return fullPath;
18
+ }
19
+ catch {
20
+ // not found, try next
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ export function buildCustomRole(config) {
26
+ // If it extends a builtin, start from that base. Dispatch-relevant fields
27
+ // inherit from the base: forcing isSpecialized on an override of `general`
28
+ // would silently remove the baseline pass from all primary models. Matched
29
+ // case-insensitively so "Security-Auditor" overrides the builtin rather
30
+ // than coexisting with it as a duplicate reviewer.
31
+ const base = getRoleByName(config.name) ?? getRoleByName(config.name.toLowerCase());
32
+ return {
33
+ // Canonical builtin name when overriding, so the override replaces the
34
+ // builtin under one map key instead of coexisting as a duplicate.
35
+ name: base?.name ?? config.name,
36
+ description: base?.description ?? `Custom role: ${config.name}`,
37
+ isSpecialized: base?.isSpecialized ?? true,
38
+ focus: config.focus ?? base?.focus ?? ['best-practices'],
39
+ severityBias: config.severityBias ?? base?.severityBias,
40
+ systemPrompt: config.systemPrompt ??
41
+ base?.systemPrompt ??
42
+ `You are a code reviewer with focus on: ${config.focus?.join(', ') ?? 'general quality'}.`,
43
+ };
44
+ }
45
+ export async function resolveRoles(config, requestedRoles, specContent) {
46
+ const roles = new Map();
47
+ // Add all builtin roles
48
+ for (const role of BUILTIN_ROLES) {
49
+ roles.set(role.name, role);
50
+ }
51
+ // Add custom roles from config (override builtins of the same name,
52
+ // case-insensitively — key by the built role's canonical name)
53
+ if (config.customRoles) {
54
+ for (const customConfig of config.customRoles) {
55
+ const role = buildCustomRole(customConfig);
56
+ roles.set(role.name, role);
57
+ }
58
+ }
59
+ // Augment spec-compliance role with actual spec content
60
+ if (specContent) {
61
+ const specRole = roles.get('spec-compliance');
62
+ roles.set('spec-compliance', {
63
+ ...specRole,
64
+ systemPrompt: specRole.systemPrompt +
65
+ '\n\n## Specification Content\n\n' +
66
+ specContent,
67
+ });
68
+ }
69
+ // Content-dependent roles without their content burn a model call and
70
+ // invite hallucinated "violations" against imagined rules. They are
71
+ // dropped from default/'all' expansion and kept (with a warning) only
72
+ // when requested by name.
73
+ const missingContent = new Set();
74
+ if (!specContent)
75
+ missingContent.add('spec-compliance');
76
+ // Determine which roles to use
77
+ const requested = requestedRoles ?? config.roles;
78
+ if (requested && requested.length > 0) {
79
+ const hasAll = requested.some((r) => r.toLowerCase() === 'all');
80
+ if (hasAll) {
81
+ if (requested.length > 1) {
82
+ throw new Error(`'all' cannot be combined with other roles. Got: ${requested.join(', ')}`);
83
+ }
84
+ return Array.from(roles.values()).filter((r) => !missingContent.has(r.name));
85
+ }
86
+ const result = [];
87
+ for (const name of requested) {
88
+ const role = roles.get(name) ?? roles.get(name.toLowerCase());
89
+ if (!role) {
90
+ console.warn(`Warning: unknown role "${name}", skipping`);
91
+ continue;
92
+ }
93
+ if (missingContent.has(role.name)) {
94
+ console.warn(`Warning: role "${role.name}" was requested but no spec file was found — it will run without that content`);
95
+ }
96
+ result.push(role);
97
+ }
98
+ return result;
99
+ }
100
+ // Default: general + all specialized (minus content-dependent roles
101
+ // whose content is absent)
102
+ return Array.from(roles.values()).filter((r) => !missingContent.has(r.name));
103
+ }
104
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/roles/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface Role {
2
+ name: string;
3
+ systemPrompt: string;
4
+ focus: string[];
5
+ severityBias?: Record<string, number>;
6
+ description: string;
7
+ isSpecialized: boolean;
8
+ }
9
+ export interface ReviewAssignment {
10
+ model: string;
11
+ role: Role;
12
+ provider: string;
13
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/roles/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ /** A composed signal plus the cleanup required when its operation settles. */
2
+ export interface AbortSignalLease {
3
+ signal: AbortSignal;
4
+ dispose: () => void;
5
+ }
6
+ /**
7
+ * Bound one operation by an optional parent cancellation and a timeout.
8
+ *
9
+ * Node 18.0–18.16 does not provide `AbortSignal.any`. Owning the controller
10
+ * here also lets callers remove the parent listener and timer when a request
11
+ * completes before either boundary fires.
12
+ */
13
+ export declare function abortSignalWithTimeout(parent: AbortSignal | undefined, timeoutMs: number): AbortSignalLease;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Bound one operation by an optional parent cancellation and a timeout.
3
+ *
4
+ * Node 18.0–18.16 does not provide `AbortSignal.any`. Owning the controller
5
+ * here also lets callers remove the parent listener and timer when a request
6
+ * completes before either boundary fires.
7
+ */
8
+ export function abortSignalWithTimeout(parent, timeoutMs) {
9
+ const controller = new AbortController();
10
+ let timer;
11
+ let disposed = false;
12
+ const abortFromParent = () => controller.abort(parent?.reason);
13
+ const dispose = () => {
14
+ if (disposed)
15
+ return;
16
+ disposed = true;
17
+ if (timer !== undefined)
18
+ clearTimeout(timer);
19
+ parent?.removeEventListener('abort', abortFromParent);
20
+ };
21
+ controller.signal.addEventListener('abort', dispose, { once: true });
22
+ if (parent?.aborted) {
23
+ controller.abort(parent.reason);
24
+ return { signal: controller.signal, dispose };
25
+ }
26
+ parent?.addEventListener('abort', abortFromParent, { once: true });
27
+ // Node turns an overflowing delay into one millisecond. Keep long operation
28
+ // deadlines intact by waking in supported intervals on the monotonic clock.
29
+ const maximumTimerMs = 2 ** 31 - 1;
30
+ const deadline = performance.now() + timeoutMs;
31
+ const schedule = (remainingMs) => {
32
+ const duration = Math.max(1, Math.floor(remainingMs));
33
+ timer = setTimeout(duration > maximumTimerMs
34
+ ? () => schedule(deadline - performance.now())
35
+ : () => controller.abort(new DOMException('The operation was aborted due to timeout', 'TimeoutError')), Math.min(duration, maximumTimerMs));
36
+ };
37
+ schedule(timeoutMs);
38
+ return { signal: controller.signal, dispose };
39
+ }
40
+ //# sourceMappingURL=abort-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-signal.js","sourceRoot":"","sources":["../../src/telemetry/abort-signal.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA+B,EAAE,SAAiB;IACvF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,KAAgD,CAAC;IACrD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,eAAe,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAQ,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACtD,KAAK,GAAG,UAAU,CAChB,QAAQ,GAAG,cAAc;YACvB,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9C,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,0CAA0C,EAAE,cAAc,CAAC,CAAC,EACxG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CACnC,CAAC;IACJ,CAAC,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEpB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { type HarnessCredential } from './credentials.js';
2
+ import type { ReviewerRecoverySource } from './envelope.js';
3
+ /**
4
+ * `rcl review --attest` (epic IO-12475, sections 4.1 and 8.5; RCL-40): inside
5
+ * the organization's gate workflow on GitHub Actions, the job's OIDC token —
6
+ * requested from the runner with the Harness origin as audience — is
7
+ * exchanged at `POST /api/v1/reviews/attest` for a run-bound credential:
8
+ * good for one rcl run id, thirty minutes, while the Actions run is in
9
+ * progress. Every request of that run — the envelope, its artifacts, the
10
+ * model keys and the model stats — then travels under it, and the server
11
+ * stamps the run `attested`, the tier the enforced gate reads.
12
+ *
13
+ * Rules this module must never break:
14
+ * - It fails loudly. Outside Actions (the runner sets
15
+ * `ACTIONS_ID_TOKEN_REQUEST_URL` and `_TOKEN` only for a job that grants
16
+ * `id-token: write`), without `HARNESS_API_URL`, or when the exchange is
17
+ * refused, the review does not start. There is no fallback to
18
+ * `HARNESS_API_TOKEN` or the stored login: a review asked to be attested
19
+ * is attested or it does not run.
20
+ * - The runner's request token goes to the runner's URL only, the OIDC
21
+ * token to the Harness origin only, both over TLS; neither is logged.
22
+ * - The credential never outlives the workflow run, so nothing recorded
23
+ * under it is ever spooled for a later flush.
24
+ * - A review may outlast the credential (thirty minutes): before delivery
25
+ * it is minted again for the same run id — allowed while the run is not
26
+ * yet recorded — when little of it remains (`renewAttestation`).
27
+ */
28
+ /** One request's bound; the exchange reads GitHub twice (installation, run). */
29
+ export declare const ATTEST_TIMEOUT_MS = 10000;
30
+ /** Retries of the exchange when Harness or GitHub behind it is unavailable. */
31
+ export declare const ATTEST_RETRIES = 2;
32
+ /** Renew the credential before delivery when less than this remains of it. */
33
+ export declare const RENEW_BEFORE_MS: number;
34
+ export type AttestErrorCode = 'not_in_actions' | 'missing_host' | 'oidc_request_failed' | 'invalid_attestation' | 'attestation_refused' | 'run_exists' | 'harness_unavailable' | 'malformed_response' | 'attest_failed';
35
+ export declare class AttestError extends Error {
36
+ readonly code: AttestErrorCode;
37
+ constructor(code: AttestErrorCode, message: string);
38
+ }
39
+ export interface AttestOptions {
40
+ /** The rcl run id this review will record — minted before the review, bound by the credential. */
41
+ runId: string;
42
+ rclVersion: string;
43
+ /** Exact immediate parent requested from the server; never an ancestor list or client authority. */
44
+ reviewerRecovery?: ReviewerAttestationRequest;
45
+ env?: Record<string, string | undefined>;
46
+ fetchImpl?: typeof fetch;
47
+ /** Injected by tests; the pause between exchange retries. */
48
+ sleep?: (ms: number) => Promise<void>;
49
+ }
50
+ export interface Attestation {
51
+ /** The run-bound credential (`rbc_…`), its Harness base URL, `source: 'attest'`. */
52
+ credential: HarnessCredential;
53
+ runId: string;
54
+ /** ISO 8601, as the server states it. */
55
+ expiresAt: string;
56
+ /** The OIDC audience requested: the Harness origin. */
57
+ audience: string;
58
+ /** The immutable request binding; the opaque credential carries the server's authorization. */
59
+ reviewerRecovery?: ReviewerAttestationRequest;
60
+ }
61
+ export interface ReviewerAttestationRequest {
62
+ readonly version: 1;
63
+ readonly source: Readonly<ReviewerRecoverySource>;
64
+ }
65
+ /** Validate and snapshot only the exact-parent request, without asserting a signed grant. */
66
+ export declare function snapshotReviewerAttestation(runId: string, value: ReviewerAttestationRequest): ReviewerAttestationRequest;
67
+ /** One ephemeral first-delivery permission from an unchanged actual exchange, never restorable from disk. */
68
+ export declare function consumeFreshAttestation(value: Attestation): boolean;
69
+ /**
70
+ * Request the job's OIDC token for the Harness origin and exchange it for
71
+ * the run-bound credential of `runId`. Throws an `AttestError` — the review
72
+ * must not start — on every failure; an unavailable Harness (or GitHub
73
+ * behind it) is retried a bounded number of times first.
74
+ */
75
+ export declare function attestRun(options: AttestOptions): Promise<Attestation>;
76
+ export interface RenewOptions extends Omit<AttestOptions, 'runId'> {
77
+ /** Injected by tests: the clock the remaining lifetime is measured against. */
78
+ now?: () => number;
79
+ }
80
+ export interface Renewal {
81
+ attestation: Attestation;
82
+ renewed: boolean;
83
+ /** Why a renewal that was due did not happen; the credential in hand is kept. */
84
+ failure?: string;
85
+ }
86
+ /**
87
+ * The credential to deliver with: the one in hand while more than
88
+ * `RENEW_BEFORE_MS` of it remains, else a fresh one for the same run id (the
89
+ * server mints again for a run not yet recorded). A failed renewal keeps the
90
+ * credential in hand — the delivery then reports what the server says.
91
+ */
92
+ export declare function renewAttestation(current: Attestation, options: RenewOptions): Promise<Renewal>;
93
+ /**
94
+ * Decode a bounded internal transfer, never new mint authority. The resulting
95
+ * unbranded session requires scoped server preflight/own-run readback; it cannot
96
+ * create an unknown run on restart or authorize a new deadline.
97
+ */
98
+ export declare function parseTransferredAttestation(bytes: string, runId: string, expectedSource?: ReviewerAttestationRequest): Attestation;
@@ -0,0 +1,331 @@
1
+ import { normalizeUrl } from './credentials.js';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { z } from 'zod';
4
+ import { parseAttestedExpiry } from './attested-retry.js';
5
+ import { scrubText } from './scrub.js';
6
+ import { readBounded } from './sink.js';
7
+ /**
8
+ * `rcl review --attest` (epic IO-12475, sections 4.1 and 8.5; RCL-40): inside
9
+ * the organization's gate workflow on GitHub Actions, the job's OIDC token —
10
+ * requested from the runner with the Harness origin as audience — is
11
+ * exchanged at `POST /api/v1/reviews/attest` for a run-bound credential:
12
+ * good for one rcl run id, thirty minutes, while the Actions run is in
13
+ * progress. Every request of that run — the envelope, its artifacts, the
14
+ * model keys and the model stats — then travels under it, and the server
15
+ * stamps the run `attested`, the tier the enforced gate reads.
16
+ *
17
+ * Rules this module must never break:
18
+ * - It fails loudly. Outside Actions (the runner sets
19
+ * `ACTIONS_ID_TOKEN_REQUEST_URL` and `_TOKEN` only for a job that grants
20
+ * `id-token: write`), without `HARNESS_API_URL`, or when the exchange is
21
+ * refused, the review does not start. There is no fallback to
22
+ * `HARNESS_API_TOKEN` or the stored login: a review asked to be attested
23
+ * is attested or it does not run.
24
+ * - The runner's request token goes to the runner's URL only, the OIDC
25
+ * token to the Harness origin only, both over TLS; neither is logged.
26
+ * - The credential never outlives the workflow run, so nothing recorded
27
+ * under it is ever spooled for a later flush.
28
+ * - A review may outlast the credential (thirty minutes): before delivery
29
+ * it is minted again for the same run id — allowed while the run is not
30
+ * yet recorded — when little of it remains (`renewAttestation`).
31
+ */
32
+ /** One request's bound; the exchange reads GitHub twice (installation, run). */
33
+ export const ATTEST_TIMEOUT_MS = 10_000;
34
+ /** Retries of the exchange when Harness or GitHub behind it is unavailable. */
35
+ export const ATTEST_RETRIES = 2;
36
+ const RETRY_PAUSE_MS = 2_000;
37
+ /** A credential answer is a few hundred bytes; anything past this is not one. */
38
+ const MAX_RESPONSE_BYTES = 64 * 1024;
39
+ /** Renew the credential before delivery when less than this remains of it. */
40
+ export const RENEW_BEFORE_MS = 10 * 60_000;
41
+ export class AttestError extends Error {
42
+ code;
43
+ constructor(code, message) {
44
+ super(message);
45
+ this.name = 'AttestError';
46
+ this.code = code;
47
+ }
48
+ }
49
+ const reviewerRequestSchema = z.object({ version: z.literal(1), source: z.object({
50
+ run_id: z.string().regex(/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}(?![\s\S])/i),
51
+ report_sha256: z.string().regex(/^[0-9a-f]{64}(?![\s\S])/),
52
+ reviewer_artifact_sha256: z.string().regex(/^[0-9a-f]{64}(?![\s\S])/),
53
+ }).strict() }).strict();
54
+ const freshAttestations = new WeakMap();
55
+ /** Validate and snapshot only the exact-parent request, without asserting a signed grant. */
56
+ export function snapshotReviewerAttestation(runId, value) {
57
+ const result = reviewerRequestSchema.safeParse(value);
58
+ if (!result.success || !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}(?![\s\S])/i.test(runId) ||
59
+ result.data.source.run_id.toLowerCase() === runId.toLowerCase()) {
60
+ throw new AttestError('invalid_attestation', 'Invalid reviewer recovery attestation request');
61
+ }
62
+ return Object.freeze({ version: 1, source: Object.freeze(result.data.source) });
63
+ }
64
+ /** One ephemeral first-delivery permission from an unchanged actual exchange, never restorable from disk. */
65
+ export function consumeFreshAttestation(value) {
66
+ const original = freshAttestations.get(value);
67
+ freshAttestations.delete(value);
68
+ return original !== undefined && isDeepStrictEqual(value, original);
69
+ }
70
+ /** What Harness says when it refuses, worded for the workflow log. */
71
+ const REFUSAL_HINTS = {
72
+ repository_not_installed: 'the Harness GitHub App is not installed on this repository',
73
+ ambiguous_installation: 'more than one Harness organization claims this repository',
74
+ reviews_disabled: 'Review Council evidence is not enabled for the organization',
75
+ wrong_event: 'the gate workflow must run on workflow_dispatch',
76
+ workflow_not_allowed: 'this workflow file is not on the organization allow-list of gate workflows at its default branch',
77
+ run_not_in_progress: 'GitHub does not report this workflow run (attempt) as in progress',
78
+ actions_permission_missing: 'the Harness GitHub App lacks the actions: read permission on this installation',
79
+ };
80
+ /** Server and runner text, bounded and scrubbed, with this run's own tokens blanked wherever they appear. */
81
+ function bounded(text, secrets, max = 200) {
82
+ let out = text;
83
+ for (const secret of secrets) {
84
+ if (secret !== '')
85
+ out = out.split(secret).join('[redacted]');
86
+ }
87
+ return scrubText(out, max);
88
+ }
89
+ /** The runner's token endpoint and request token, present only under `id-token: write`. */
90
+ function actionsOidcRequest(env) {
91
+ const url = (env['ACTIONS_ID_TOKEN_REQUEST_URL'] ?? '').trim();
92
+ const token = (env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'] ?? '').trim();
93
+ const secure = url !== '' && isHttps(url);
94
+ if (!secure || token === '') {
95
+ throw new AttestError('not_in_actions', '--attest needs GitHub Actions with `id-token: write`: ACTIONS_ID_TOKEN_REQUEST_URL and ACTIONS_ID_TOKEN_REQUEST_TOKEN are not set (or the URL is not https). Grant the permission in the gate workflow, or run without --attest.');
96
+ }
97
+ return { url, token };
98
+ }
99
+ function isHttps(raw) {
100
+ try {
101
+ return new URL(raw).protocol === 'https:';
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ /** The Harness base URL: `HARNESS_API_URL`, TLS-only. Never the stored login. */
108
+ function harnessBase(env) {
109
+ const raw = (env['HARNESS_API_URL'] ?? '').trim();
110
+ if (raw === '') {
111
+ throw new AttestError('missing_host', '--attest needs HARNESS_API_URL (the Harness host the workflow attests to). The OIDC token is the credential — HARNESS_API_TOKEN and the stored login are not used.');
112
+ }
113
+ const url = normalizeUrl(raw);
114
+ if (url === null || !isHttps(url)) {
115
+ throw new AttestError('missing_host', '--attest needs HARNESS_API_URL to be an absolute https URL without user-info, query or fragment.');
116
+ }
117
+ return url;
118
+ }
119
+ /** The JSON body, read up to the answer limit; an oversized or non-JSON body reads as a `malformed_response` error body. */
120
+ async function readJson(response) {
121
+ const text = await readBounded(response, MAX_RESPONSE_BYTES);
122
+ if (text === null)
123
+ return { error: 'malformed_response', message: 'response larger than the answer limit' };
124
+ if (text === '')
125
+ return null;
126
+ try {
127
+ return JSON.parse(text);
128
+ }
129
+ catch {
130
+ return { error: 'malformed_response', message: 'response is not JSON' };
131
+ }
132
+ }
133
+ async function requestOidcToken(request, audience, fetchImpl) {
134
+ const secrets = [request.token];
135
+ const separator = request.url.includes('?') ? '&' : '?';
136
+ let response;
137
+ try {
138
+ response = await fetchImpl(`${request.url}${separator}audience=${encodeURIComponent(audience)}`, {
139
+ method: 'GET',
140
+ headers: { authorization: `bearer ${request.token}`, accept: 'application/json' },
141
+ signal: AbortSignal.timeout(ATTEST_TIMEOUT_MS),
142
+ // The request token travels to the runner's URL and nowhere else.
143
+ redirect: 'manual',
144
+ });
145
+ }
146
+ catch (err) {
147
+ throw new AttestError('oidc_request_failed', `The runner did not answer the OIDC token request: ${bounded(describeError(err), secrets)}`);
148
+ }
149
+ if (response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400)) {
150
+ throw new AttestError('oidc_request_failed', 'The runner redirected the OIDC token request; redirects are not followed with the request token.');
151
+ }
152
+ if (!response.ok) {
153
+ throw new AttestError('oidc_request_failed', `The runner refused the OIDC token request: HTTP ${response.status}.`);
154
+ }
155
+ let body;
156
+ try {
157
+ body = await readJson(response);
158
+ }
159
+ catch (err) {
160
+ throw new AttestError('oidc_request_failed', `The runner's OIDC token answer could not be read: ${bounded(describeError(err), secrets)}`);
161
+ }
162
+ const value = body?.value;
163
+ if (typeof value !== 'string' || value === '') {
164
+ throw new AttestError('oidc_request_failed', 'The runner answered the OIDC token request without a token.');
165
+ }
166
+ return value;
167
+ }
168
+ function describeError(err) {
169
+ if (err instanceof Error)
170
+ return err.name === 'TimeoutError' ? `no answer within ${ATTEST_TIMEOUT_MS} ms` : err.message;
171
+ return String(err);
172
+ }
173
+ async function exchangeOnce(base, oidcToken, runId, rclVersion, fetchImpl, secrets, reviewerRecovery) {
174
+ let response;
175
+ try {
176
+ response = await fetchImpl(`${base}/api/v1/reviews/attest`, {
177
+ method: 'POST',
178
+ headers: {
179
+ authorization: `Bearer ${oidcToken}`,
180
+ 'content-type': 'application/json',
181
+ accept: 'application/json',
182
+ 'x-harness-client': 'rcl',
183
+ 'x-harness-client-version': rclVersion,
184
+ 'user-agent': `rcl/${rclVersion} node/${process.versions.node}`,
185
+ },
186
+ body: JSON.stringify({ run_id: runId, ...(reviewerRecovery === undefined ? {} : { reviewer_recovery: reviewerRecovery }) }),
187
+ signal: AbortSignal.timeout(ATTEST_TIMEOUT_MS),
188
+ redirect: 'manual',
189
+ });
190
+ }
191
+ catch (err) {
192
+ return { retry: bounded(describeError(err), secrets) };
193
+ }
194
+ if (response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400)) {
195
+ throw new AttestError('malformed_response', 'Harness redirected the attest request — check HARNESS_API_URL (redirects are not followed with a token).');
196
+ }
197
+ let body;
198
+ try {
199
+ body = await readJson(response);
200
+ }
201
+ catch (err) {
202
+ // The connection went away under the body: as retryable as a failed request.
203
+ return { retry: bounded(describeError(err), secrets) };
204
+ }
205
+ const status = response.status;
206
+ const error = typeof body?.error === 'string' ? body.error : '';
207
+ const reason = typeof body?.reason === 'string' ? body.reason : error;
208
+ const message = typeof body?.message === 'string' ? body.message : '';
209
+ if (status >= 200 && status < 300) {
210
+ if (error === 'malformed_response') {
211
+ throw new AttestError('malformed_response', `Harness answered the attest request with ${bounded(message, secrets) || 'an unreadable body'}.`);
212
+ }
213
+ const data = body?.data;
214
+ const credential = data?.['credential'];
215
+ const expiresAt = data?.['expires_at'];
216
+ if (typeof credential !== 'string' ||
217
+ !credential.startsWith('rbc_') ||
218
+ data?.['run_id'] !== runId ||
219
+ typeof expiresAt !== 'string' ||
220
+ !Number.isFinite(Date.parse(expiresAt))) {
221
+ throw new AttestError('malformed_response', 'Harness answered the attest request without a run-bound credential for this run (or without a readable expiry).');
222
+ }
223
+ return { credential, expiresAt };
224
+ }
225
+ if (status >= 500 || status === 429 || status === 408) {
226
+ return { retry: `HTTP ${status}${message ? ` ${bounded(message, secrets)}` : ''}` };
227
+ }
228
+ const detail = `${bounded(reason, secrets, 60) || `http_${status}`}${message ? `: ${bounded(message, secrets)}` : ''}`;
229
+ const hint = REFUSAL_HINTS[reason];
230
+ const explained = hint ? `${detail} — ${hint}` : detail;
231
+ if (status === 401)
232
+ throw new AttestError('invalid_attestation', `Harness did not accept the Actions OIDC token (${explained}).`);
233
+ if (status === 403)
234
+ throw new AttestError('attestation_refused', `Harness refused to attest this workflow run (${explained}).`);
235
+ if (status === 409) {
236
+ throw new AttestError('run_exists', `Harness already holds a run with this id (${explained}); a credential binds a run not yet delivered.`);
237
+ }
238
+ throw new AttestError('attest_failed', `Harness refused the attest request: HTTP ${status} (${explained}).`);
239
+ }
240
+ /**
241
+ * Request the job's OIDC token for the Harness origin and exchange it for
242
+ * the run-bound credential of `runId`. Throws an `AttestError` — the review
243
+ * must not start — on every failure; an unavailable Harness (or GitHub
244
+ * behind it) is retried a bounded number of times first.
245
+ */
246
+ export async function attestRun(options) {
247
+ const runId = options.runId;
248
+ const reviewerRecovery = options.reviewerRecovery === undefined ? undefined : snapshotReviewerAttestation(runId, options.reviewerRecovery);
249
+ const env = options.env ?? process.env;
250
+ const fetchImpl = options.fetchImpl ?? fetch;
251
+ const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
252
+ const oidc = actionsOidcRequest(env);
253
+ const base = harnessBase(env);
254
+ const audience = new URL(base).origin;
255
+ const oidcToken = await requestOidcToken(oidc, audience, fetchImpl);
256
+ const secrets = [oidc.token, oidcToken];
257
+ let lastRetry = '';
258
+ for (let attempt = 0; attempt <= ATTEST_RETRIES; attempt++) {
259
+ if (attempt > 0)
260
+ await sleep(RETRY_PAUSE_MS);
261
+ const result = await exchangeOnce(base, oidcToken, runId, options.rclVersion, fetchImpl, secrets, reviewerRecovery);
262
+ if ('retry' in result) {
263
+ lastRetry = result.retry;
264
+ continue;
265
+ }
266
+ const attestation = {
267
+ credential: { url: base, token: result.credential, source: 'attest' },
268
+ runId,
269
+ expiresAt: result.expiresAt,
270
+ audience,
271
+ ...(reviewerRecovery === undefined ? {} : { reviewerRecovery }),
272
+ };
273
+ freshAttestations.set(attestation, structuredClone(attestation));
274
+ return attestation;
275
+ }
276
+ throw new AttestError('harness_unavailable', `Harness could not attest this run after ${1 + ATTEST_RETRIES} attempts (${lastRetry}). The workflow may retry; nothing was recorded.`);
277
+ }
278
+ /**
279
+ * The credential to deliver with: the one in hand while more than
280
+ * `RENEW_BEFORE_MS` of it remains, else a fresh one for the same run id (the
281
+ * server mints again for a run not yet recorded). A failed renewal keeps the
282
+ * credential in hand — the delivery then reports what the server says.
283
+ */
284
+ export async function renewAttestation(current, options) {
285
+ const now = (options.now ?? Date.now)();
286
+ // `expiresAt` was checked to parse at mint; a value that does not is treated as spent.
287
+ const expires = Date.parse(current.expiresAt);
288
+ if (Number.isFinite(expires) && expires - now > RENEW_BEFORE_MS)
289
+ return { attestation: current, renewed: false };
290
+ try {
291
+ const fresh = await attestRun({ ...options, runId: current.runId, reviewerRecovery: current.reviewerRecovery });
292
+ return { attestation: fresh, renewed: true };
293
+ }
294
+ catch (err) {
295
+ return { attestation: current, renewed: false, failure: err instanceof Error ? err.message : String(err) };
296
+ }
297
+ }
298
+ /**
299
+ * Decode a bounded internal transfer, never new mint authority. The resulting
300
+ * unbranded session requires scoped server preflight/own-run readback; it cannot
301
+ * create an unknown run on restart or authorize a new deadline.
302
+ */
303
+ export function parseTransferredAttestation(bytes, runId, expectedSource) {
304
+ const fail = () => {
305
+ throw new AttestError('invalid_attestation', 'A valid still-live session for this exact retained run is required; preserve the artifacts and do not relaunch reviewers.');
306
+ };
307
+ if (typeof bytes !== 'string' || Buffer.byteLength(bytes) > 65_536)
308
+ return fail();
309
+ let parsed;
310
+ try {
311
+ parsed = JSON.parse(bytes);
312
+ }
313
+ catch {
314
+ return fail();
315
+ }
316
+ const result = z.object({
317
+ credential: z.object({ url: z.string(), token: z.string().min(5).max(8192).regex(/^rbc_[^\s\x00-\x1f\x7f]+$/), source: z.literal('attest') }).strict(),
318
+ runId: z.string(), expiresAt: z.string(), audience: z.string(), reviewerRecovery: reviewerRequestSchema.optional(),
319
+ }).strict().safeParse(parsed);
320
+ if (!result.success)
321
+ return fail();
322
+ const session = result.data, url = normalizeUrl(session.credential.url), expiry = parseAttestedExpiry(session.expiresAt);
323
+ if (!url || url !== session.credential.url || new URL(url).origin !== session.audience ||
324
+ session.runId !== runId || !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}(?![\s\S])/i.test(runId) ||
325
+ expiry === undefined || expiry <= Date.now() || !isDeepStrictEqual(session.reviewerRecovery, expectedSource))
326
+ return fail();
327
+ if (session.reviewerRecovery)
328
+ snapshotReviewerAttestation(runId, session.reviewerRecovery);
329
+ return session;
330
+ }
331
+ //# sourceMappingURL=attest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.js","sourceRoot":"","sources":["../../src/telemetry/attest.ts"],"names":[],"mappings":"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"}