@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,279 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, mkdir, open, readdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { z } from 'zod';
6
+ import { isReviewerArtifact } from '../report/reviewer-artifact.js';
7
+ import { withRecoveryLock, syncDirectory, writeExclusiveBytes } from '../evidence/original-run/journal.js';
8
+ import { prepareLockRoot, inspectRecoveryDirectory } from '../evidence/original-run/lock-path.js';
9
+ import { platformPath, readStable, sha256 } from './recovery/files.js';
10
+ import { normalizeUrl } from './credentials.js';
11
+ import { MAX_ARTIFACT_BYTES, MAX_ENVELOPE_BYTES, validateRunEnvelope } from './envelope-validation.js';
12
+ export const REVIEWER_OUTBOX_DIR = 'reviewer-outbox';
13
+ const uuid = z.string().regex(/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}(?![\s\S])/i);
14
+ const digest = z.string().regex(/^[0-9a-f]{64}(?![\s\S])/);
15
+ const reference = z.object({ sha256: digest, bytes: z.number().int().min(0).max(MAX_ARTIFACT_BYTES) }).strict();
16
+ const manifestSchema = z.object({ version: z.literal(1), runId: uuid, host: z.string(), credentialKind: z.enum(['login', 'env']),
17
+ envelope: reference, report_json: reference, report_md: reference.optional(), reviewer: reference }).strict();
18
+ const files = { report_json: 'report.json', report_md: 'report.md' };
19
+ const ref = (text) => ({ sha256: sha256(text), bytes: Buffer.byteLength(text) });
20
+ function fail(reason) { throw new Error(`reviewer_delivery_${reason}`); }
21
+ function safeFailure(error) {
22
+ return error instanceof Error && /^reviewer_delivery_[a-z_]+$/.test(error.message) ? error.message : 'reviewer_delivery_local_refusal';
23
+ }
24
+ function accepted(outcome) {
25
+ if (outcome.kind !== 'ok')
26
+ fail(outcome.kind === 'unavailable' ? 'unavailable' : 'refused');
27
+ return outcome.value;
28
+ }
29
+ async function privateRead(path, limit) {
30
+ const check = async () => { const stat = await lstat(path); if (!stat.isFile() || stat.nlink !== 1 || stat.uid !== process.geteuid?.() || (stat.mode & 0o777) !== 0o600)
31
+ fail('unsafe_file'); };
32
+ await check();
33
+ const raw = await readStable(path, limit);
34
+ await check();
35
+ // readStable's UTF-8 decoder may normalize BOM; private payload bytes may not.
36
+ if (!Buffer.from(raw.text).equals(raw.raw))
37
+ fail('nonexact_bytes');
38
+ return raw.text;
39
+ }
40
+ async function publish(path, bytes) {
41
+ try {
42
+ await writeExclusiveBytes(path, Buffer.from(bytes));
43
+ }
44
+ catch (error) {
45
+ if (error.code !== 'EEXIST')
46
+ throw error;
47
+ if (await privateRead(path, MAX_ARTIFACT_BYTES) !== bytes)
48
+ fail('immutable_conflict');
49
+ const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
50
+ try {
51
+ await handle.sync();
52
+ }
53
+ finally {
54
+ await handle.close();
55
+ }
56
+ await syncDirectory(join(path, '..'));
57
+ }
58
+ }
59
+ function validate(entry) {
60
+ const { manifest: m, envelope, artifacts, privateBytes } = entry;
61
+ if (normalizeUrl(m.host) !== m.host || m.envelope.bytes > MAX_ENVELOPE_BYTES || envelope.run.id !== m.runId ||
62
+ validateRunEnvelope(envelope, artifacts).length || !isDeepStrictEqual(ref(entry.envelopeBytes), m.envelope) ||
63
+ !isDeepStrictEqual(ref(artifacts.report_json), m.report_json) || !isDeepStrictEqual(ref(privateBytes), m.reviewer) ||
64
+ (m.report_md === undefined ? artifacts.report_md !== undefined : !isDeepStrictEqual(ref(artifacts.report_md), m.report_md)))
65
+ fail('invalid_entry');
66
+ const declaration = envelope.reviewer_recovery;
67
+ if (!declaration || declaration.sha256 !== m.reviewer.sha256 || declaration.bytes !== m.reviewer.bytes)
68
+ fail('declaration_mismatch');
69
+ const wire = JSON.parse(privateBytes), report = JSON.parse(artifacts.report_json);
70
+ if (wire.report?.bytes !== artifacts.report_json || wire.report?.sha256 !== m.report_json.sha256 ||
71
+ wire.assembly?.run?.id !== m.runId || report.run?.id !== m.runId ||
72
+ !isDeepStrictEqual(report.run?.reviewer_evidence, declaration.descriptor))
73
+ fail('report_binding');
74
+ }
75
+ function budget(options) {
76
+ const duration = options.deadlineMs ?? 120_000;
77
+ if (!Number.isFinite(duration) || duration < 0)
78
+ fail('invalid_deadline');
79
+ const bounded = Math.min(duration, 120_000), end = performance.now() + bounded;
80
+ const deadline = AbortSignal.timeout(Math.max(1, Math.ceil(bounded)));
81
+ const signal = options.signal ? AbortSignal.any([options.signal, deadline]) : deadline;
82
+ return () => { const left = end - performance.now(); if (left <= 0 || signal.aborted)
83
+ fail('deadline'); return { timeoutMs: left, signal }; };
84
+ }
85
+ /**
86
+ * Immutable private delivery copies. No token or token fingerprint is retained.
87
+ * Current server authorization, not this local directory, determines ownership.
88
+ * Unknown-run restart refuses: a replacement principal cannot recreate a run.
89
+ */
90
+ export class ReviewerDeliveryQueue {
91
+ root;
92
+ constructor(dataDir) { this.root = join(platformPath(dataDir), REVIEWER_OUTBOX_DIR); }
93
+ /** Retain exact already-validated local bytes; never admit deserialized brands. */
94
+ async retain(input) {
95
+ const entry = this.snapshot(input);
96
+ await this.lock(entry.manifest.runId, async () => { await this.save(entry); });
97
+ }
98
+ /** Initial delivery is the only path allowed to create an as-yet unknown run. */
99
+ async deliver(input, options = {}) {
100
+ const entry = this.snapshot(input), request = budget(options);
101
+ await this.lock(entry.manifest.runId, async () => {
102
+ request();
103
+ await this.save(entry);
104
+ // An existing manifest might belong to an earlier process/principal.
105
+ // Only this invocation's first publication can use the creation path.
106
+ await this.transfer(await this.load(entry.manifest.runId), input.sink, request, entryWasNew.delete(entry));
107
+ });
108
+ }
109
+ /** Explicit/current-credential retry; no provider calls or changed run identity. */
110
+ async flush(sink, options = {}, authorizeTransfer) {
111
+ const summary = { delivered: [], remaining: [], failed: [], dropped: [] };
112
+ const request = budget({ deadlineMs: options.deadlineMs });
113
+ let names;
114
+ try {
115
+ names = await readdir(this.root);
116
+ }
117
+ catch (error) {
118
+ if (error.code === 'ENOENT')
119
+ return summary;
120
+ throw error;
121
+ }
122
+ if (options.runId !== undefined && !uuid.safeParse(options.runId).success)
123
+ fail('invalid_run');
124
+ const selected = names.filter(name => uuid.safeParse(name).success && (!options.runId || name === options.runId.toLowerCase())).sort();
125
+ for (const [index, id] of selected.entries()) {
126
+ try {
127
+ request();
128
+ await this.lock(id, async () => {
129
+ const entry = await this.load(id);
130
+ if (await this.acknowledged(entry))
131
+ return;
132
+ await authorizeTransfer?.();
133
+ request();
134
+ await this.transfer(entry, sink, request, false);
135
+ summary.delivered.push(entry.manifest.runId);
136
+ });
137
+ }
138
+ catch (error) {
139
+ const reason = safeFailure(error);
140
+ summary.remaining.push(id);
141
+ summary.failed.push({ id, reason });
142
+ if (reason === 'reviewer_delivery_deadline')
143
+ summary.stopped = 'deadline';
144
+ else if (reason === 'reviewer_delivery_unavailable')
145
+ summary.stopped = 'unavailable';
146
+ if (summary.stopped) {
147
+ summary.remaining.push(...selected.slice(index + 1));
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ return summary;
153
+ }
154
+ /** Local retention only; never a server acknowledgment. */
155
+ async isRetained(runId) {
156
+ if (!uuid.safeParse(runId).success)
157
+ return false;
158
+ try {
159
+ await this.lock(runId, async () => { await this.load(runId); });
160
+ return true;
161
+ }
162
+ catch {
163
+ return false;
164
+ }
165
+ }
166
+ snapshot(input) {
167
+ if (!isReviewerArtifact(input.artifact))
168
+ fail('unvalidated_artifact');
169
+ if (input.sink.credentialSource === 'attest')
170
+ fail('attested_replay_unsupported');
171
+ const envelopeBytes = JSON.stringify(input.envelope), envelope = JSON.parse(envelopeBytes);
172
+ const artifacts = { ...input.artifacts }, privateBytes = input.artifact.bytes;
173
+ const manifest = manifestSchema.parse({ version: 1, runId: envelope.run.id, host: input.sink.baseUrl, credentialKind: input.sink.credentialSource,
174
+ envelope: ref(envelopeBytes), report_json: ref(artifacts.report_json), ...(artifacts.report_md === undefined ? {} : { report_md: ref(artifacts.report_md) }), reviewer: ref(privateBytes) });
175
+ const entry = { manifest, envelope, envelopeBytes, artifacts, privateBytes, directory: join(this.root, manifest.runId.toLowerCase()) };
176
+ validate(entry);
177
+ return entry;
178
+ }
179
+ async lock(runId, work) {
180
+ return withRecoveryLock(join(this.root, 'locks'), runId.toLowerCase(), work);
181
+ }
182
+ async save(entry) {
183
+ await prepareLockRoot(this.root);
184
+ try {
185
+ await mkdir(entry.directory, { mode: 0o700 });
186
+ await syncDirectory(this.root);
187
+ }
188
+ catch (error) {
189
+ if (error.code !== 'EEXIST')
190
+ throw error;
191
+ }
192
+ await inspectRecoveryDirectory(entry.directory, true);
193
+ const existing = await readdir(entry.directory);
194
+ if (existing.length === 0)
195
+ entryWasNew.add(entry);
196
+ await publish(join(entry.directory, 'envelope.json'), entry.envelopeBytes);
197
+ await publish(join(entry.directory, 'reviewer-artifact.json'), entry.privateBytes);
198
+ for (const kind of ['report_json', 'report_md'])
199
+ if (entry.artifacts[kind] !== undefined)
200
+ await publish(join(entry.directory, files[kind]), entry.artifacts[kind]);
201
+ // Publish manifest last; a crash before it leaves evidence, never an uploadable partial entry.
202
+ await publish(join(entry.directory, 'manifest.json'), JSON.stringify(entry.manifest));
203
+ }
204
+ async load(id) {
205
+ const directory = join(this.root, id.toLowerCase());
206
+ await inspectRecoveryDirectory(directory, true);
207
+ const manifest = manifestSchema.parse(JSON.parse(await privateRead(join(directory, 'manifest.json'), 4096)));
208
+ if (manifest.runId.toLowerCase() !== id.toLowerCase())
209
+ fail('invalid_run');
210
+ const allowed = ['manifest.json', 'envelope.json', 'reviewer-artifact.json', 'report.json', 'acknowledged.json', ...(manifest.report_md ? ['report.md'] : [])];
211
+ if ((await readdir(directory)).some(name => !allowed.includes(name)))
212
+ fail('unknown_file');
213
+ const envelopeBytes = await privateRead(join(directory, 'envelope.json'), MAX_ENVELOPE_BYTES);
214
+ const entry = { manifest, directory, envelopeBytes, envelope: JSON.parse(envelopeBytes), privateBytes: await privateRead(join(directory, 'reviewer-artifact.json'), MAX_ARTIFACT_BYTES),
215
+ artifacts: { report_json: await privateRead(join(directory, 'report.json'), MAX_ARTIFACT_BYTES), ...(manifest.report_md ? { report_md: await privateRead(join(directory, 'report.md'), MAX_ARTIFACT_BYTES) } : {}) } };
216
+ validate(entry);
217
+ return entry;
218
+ }
219
+ ack(entry) { return JSON.stringify({ version: 1, runId: entry.manifest.runId, manifestSha256: sha256(JSON.stringify(entry.manifest)) }); }
220
+ async acknowledged(entry) {
221
+ try {
222
+ if (await privateRead(join(entry.directory, 'acknowledged.json'), 4096) !== this.ack(entry))
223
+ fail('invalid_ack');
224
+ return true;
225
+ }
226
+ catch (error) {
227
+ if (error.code === 'ENOENT')
228
+ return false;
229
+ throw error;
230
+ }
231
+ }
232
+ async transfer(entry, sink, request, initial) {
233
+ const m = entry.manifest;
234
+ if (sink.baseUrl !== m.host || sink.credentialSource !== m.credentialKind)
235
+ fail('credential_mismatch');
236
+ accepted(await sink.checkReviewerRecovery(request()));
237
+ let read = initial ? undefined : await sink.getReviewerArtifact(m.runId, m.reviewer, request());
238
+ if (read && read.kind !== 'ok' && read.kind !== 'pending')
239
+ accepted(read);
240
+ // A matching private read is the server's completed admission proof: it
241
+ // validates the retained ordinary/private pair, so replaying the ordinary
242
+ // uploads would only repeat already acknowledged work after a lost local ACK.
243
+ if (read?.kind === 'ok') {
244
+ if (!read.value.bytes.equals(Buffer.from(entry.privateBytes)))
245
+ fail('private_mismatch');
246
+ await publish(join(entry.directory, 'acknowledged.json'), this.ack(entry));
247
+ return;
248
+ }
249
+ accepted(await sink.postRun(entry.envelope, request(), entry.envelopeBytes));
250
+ read ??= await sink.getReviewerArtifact(m.runId, m.reviewer, request());
251
+ if (read.kind !== 'ok' && read.kind !== 'pending')
252
+ accepted(read);
253
+ if (read.kind === 'ok' && !read.value.bytes.equals(Buffer.from(entry.privateBytes)))
254
+ fail('private_mismatch');
255
+ // Private admission validates the stored ordinary/private pair. Ordinary
256
+ // reports must be present and read back before the private PUT.
257
+ for (const kind of ['report_json', 'report_md']) {
258
+ const bytes = entry.artifacts[kind];
259
+ if (bytes === undefined)
260
+ continue;
261
+ accepted(await sink.putArtifact(m.runId, kind, bytes, request()));
262
+ const raw = accepted(await sink.getArtifact(m.runId, kind, Buffer.byteLength(bytes), request()));
263
+ if (!raw.bytes.equals(Buffer.from(bytes)))
264
+ fail('ordinary_mismatch');
265
+ }
266
+ if (read.kind === 'pending') {
267
+ accepted(await sink.putReviewerArtifact(m.runId, entry.privateBytes, m.reviewer, request()));
268
+ read = await sink.getReviewerArtifact(m.runId, m.reviewer, request());
269
+ }
270
+ if (read.kind === 'pending')
271
+ fail('unavailable');
272
+ if (!accepted(read).bytes.equals(Buffer.from(entry.privateBytes)))
273
+ fail('private_mismatch');
274
+ await publish(join(entry.directory, 'acknowledged.json'), this.ack(entry));
275
+ }
276
+ }
277
+ // Ephemeral creation authority is never persisted or reconstructed from a manifest.
278
+ const entryWasNew = new WeakSet();
279
+ //# sourceMappingURL=reviewer-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-delivery.js","sourceRoot":"","sources":["../../src/telemetry/reviewer-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ReviewerRecoveryPreflight } from '../evidence/reviewer-recovery.js';
2
+ import type { HarnessSink, RequestOptions } from './sink.js';
3
+ /** Exact local source references only; this does not establish ancestry or server authority. */
4
+ export declare function assertReviewerRecoveryReference(request: ReviewerRecoveryPreflight): void;
5
+ /** Check the exact parent report embedded in an already digest-checked private response. */
6
+ export declare function assertReviewerRecoverySource(request: ReviewerRecoveryPreflight, bytes: Uint8Array): void;
7
+ /**
8
+ * Server support and private immediate-parent availability under the CURRENT
9
+ * credential, before the executor reserves a native/provider intent. This is
10
+ * not source ancestry, native-attempt or protected-producer authority. Signed
11
+ * exact-parent grants require a separate attested coordinator and fail closed.
12
+ */
13
+ export declare function createReviewerRecoveryPreflight(sink: HarnessSink, options?: RequestOptions): (request: ReviewerRecoveryPreflight) => Promise<void>;
@@ -0,0 +1,56 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { abortSignalWithTimeout } from './abort-signal.js';
3
+ import { sha256 } from './recovery/files.js';
4
+ /** Exact local source references only; this does not establish ancestry or server authority. */
5
+ export function assertReviewerRecoveryReference(request) {
6
+ if (!request.lineage.length || request.lineage.length > 32 ||
7
+ !isDeepStrictEqual(request.lineage.at(-1), request.source))
8
+ throw new Error('reviewer_recovery_source_unavailable');
9
+ }
10
+ /** Check the exact parent report embedded in an already digest-checked private response. */
11
+ export function assertReviewerRecoverySource(request, bytes) {
12
+ assertReviewerRecoveryReference(request);
13
+ const source = request.source;
14
+ try {
15
+ const wire = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
16
+ if (wire.report?.sha256 !== source.reportSha256 || typeof wire.report?.bytes !== 'string' || sha256(wire.report.bytes) !== source.reportSha256 ||
17
+ wire.assembly?.run?.id !== source.runId || wire.assembly?.run?.target?.headSha !== request.headSha)
18
+ throw new Error('mismatch');
19
+ }
20
+ catch {
21
+ throw new Error('reviewer_recovery_source_unavailable');
22
+ }
23
+ }
24
+ /**
25
+ * Server support and private immediate-parent availability under the CURRENT
26
+ * credential, before the executor reserves a native/provider intent. This is
27
+ * not source ancestry, native-attempt or protected-producer authority. Signed
28
+ * exact-parent grants require a separate attested coordinator and fail closed.
29
+ */
30
+ export function createReviewerRecoveryPreflight(sink, options = {}) {
31
+ const settings = { ...options };
32
+ return async (original) => {
33
+ const request = structuredClone(original);
34
+ const timeoutMs = Math.min(settings.timeoutMs ?? 120_000, 120_000);
35
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
36
+ throw new Error('reviewer_recovery_capability_unavailable');
37
+ const cancellation = abortSignalWithTimeout(settings.signal, timeoutMs);
38
+ const options = { ...settings, signal: cancellation.signal };
39
+ try {
40
+ if (sink.credentialSource === 'attest')
41
+ throw new Error('reviewer_recovery_attested_preflight_unsupported');
42
+ if ((await sink.checkReviewerRecovery(options)).kind !== 'ok')
43
+ throw new Error('reviewer_recovery_capability_unavailable');
44
+ const source = request.source;
45
+ assertReviewerRecoveryReference(request);
46
+ const read = await sink.getReviewerArtifact(source.runId, { sha256: source.reviewerArtifactSha256 }, options);
47
+ if (read.kind !== 'ok')
48
+ throw new Error('reviewer_recovery_source_unavailable');
49
+ assertReviewerRecoverySource(request, read.value.bytes);
50
+ }
51
+ finally {
52
+ cancellation.dispose();
53
+ }
54
+ };
55
+ }
56
+ //# sourceMappingURL=reviewer-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-preflight.js","sourceRoot":"","sources":["../../src/telemetry/reviewer-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Free text that leaves the process — reviewer errors and warnings, runner
3
+ * claims, finding prose, consensus excerpts — is truncated and scrubbed for
4
+ * anything shaped like a credential before it is sent (epic IO-12475,
5
+ * section 5.5 "Never sent"). Hex digests survive (a commit id is evidence);
6
+ * opaque mixed-class tokens do not.
7
+ */
8
+ export declare const MAX_FREE_TEXT = 2000;
9
+ export declare const REDACTED = "[redacted]";
10
+ /**
11
+ * Normalize only strings rendered for people. Stored and wire values remain
12
+ * untouched; ZWJ/ZWNJ are intentionally retained for language and emoji text.
13
+ */
14
+ export declare function sanitizePresentation(value: string, { multiline }: {
15
+ multiline: boolean;
16
+ }): string;
17
+ /** Normalize newly produced human text before report hashing, never retained originals. */
18
+ export declare function normalizeGeneratedText(value: string): string;
19
+ /** Escape display controls in JSON source without changing parsed semantic values. */
20
+ export declare function escapeDisplayControls(value: string): string;
21
+ /** Replace every credential-shaped substring with `[redacted]`. */
22
+ export declare function scrubSecrets(text: string): string;
23
+ /**
24
+ * Scrub, then cap at `max` Unicode code points with an ellipsis. Preliminary
25
+ * truncation keeps only through a real whitespace boundary inside the bounded
26
+ * UTF-16 prefix, so no split credential fragment can survive later redaction.
27
+ */
28
+ export declare function scrubText(text: string, max?: number): string;
29
+ /**
30
+ * Identifiers that come from configuration rather than prose — model ids,
31
+ * roles, providers: key-shaped substrings go, but a long mixed-case id such as
32
+ * `anthropic/Claude-Sonnet-4-5-20250929` is not an opaque token and stays.
33
+ */
34
+ export declare function scrubIdentifier(text: string, max?: number): string;
35
+ export declare function scrubOptional(text: string | undefined, max?: number): string | undefined;
36
+ /**
37
+ * Scrub every string nested inside a JSON-like value — keys included. The
38
+ * structure survives: two keys that scrub to the same name stay distinct
39
+ * (`[redacted]`, `[redacted]#2`, …), and the keys that would reach into the
40
+ * object's prototype are dropped rather than assigned.
41
+ */
42
+ export declare function scrubDeep<T>(value: T): T;
43
+ /**
44
+ * Drop fenced code blocks — a malformed model answer can echo the prompt,
45
+ * and the prompt contains the diff. A run of three or more backticks or
46
+ * tildes opens a block wherever it stands (models often open one mid-line,
47
+ * "here is the JSON: ```json"). It closes, as in CommonMark, only at a line
48
+ * start: up to three spaces, a run of the same character at least as long,
49
+ * then nothing but spaces to the end of the line. A same-length run inside
50
+ * the block's own lines therefore never ends it early, and an unclosed
51
+ * block runs to the end of the text.
52
+ */
53
+ export declare function stripFencedCode(text: string): string;
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Free text that leaves the process — reviewer errors and warnings, runner
3
+ * claims, finding prose, consensus excerpts — is truncated and scrubbed for
4
+ * anything shaped like a credential before it is sent (epic IO-12475,
5
+ * section 5.5 "Never sent"). Hex digests survive (a commit id is evidence);
6
+ * opaque mixed-class tokens do not.
7
+ */
8
+ export const MAX_FREE_TEXT = 2_000;
9
+ export const REDACTED = '[redacted]';
10
+ const DISPLAY_MARKS = /[\u061c\u180e\u200b\u200e\u200f\u202a-\u202e\u2060\u2066-\u2069\ufeff]/g;
11
+ const DISPLAY_LINE_SEPARATORS = /\r\n|[\r\u0085\u2028\u2029]/g;
12
+ /**
13
+ * Normalize only strings rendered for people. Stored and wire values remain
14
+ * untouched; ZWJ/ZWNJ are intentionally retained for language and emoji text.
15
+ */
16
+ export function sanitizePresentation(value, { multiline }) {
17
+ const lineReplacement = multiline ? '\n' : ' ';
18
+ return value.replace(DISPLAY_LINE_SEPARATORS, lineReplacement)
19
+ .replace(multiline ? /[\u0000-\u0009\u000b-\u001f\u007f-\u009f]/g : /[\u0000-\u001f\u007f-\u009f]/g, ' ')
20
+ .replace(DISPLAY_MARKS, '');
21
+ }
22
+ /** Normalize newly produced human text before report hashing, never retained originals. */
23
+ export function normalizeGeneratedText(value) {
24
+ return value.replace(/[\uD800-\uDFFF]/gu, '\uFFFD')
25
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '');
26
+ }
27
+ /** Escape display controls in JSON source without changing parsed semantic values. */
28
+ export function escapeDisplayControls(value) {
29
+ return value.replace(/[\u0085\u061c\u180e\u200b\u200e\u200f\u2028-\u202e\u2060\u2066-\u2069\ufeff]/g, (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`);
30
+ }
31
+ const KEY_PATTERNS = [
32
+ // Authorization header values.
33
+ /\b(?:bearer|basic)\s+[A-Za-z0-9._~+/=-]{16,}/gi,
34
+ // JSON Web Tokens: three base64url segments.
35
+ /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,
36
+ // AWS access key ids, long-lived (AKIA) and temporary STS (ASIA).
37
+ /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,
38
+ // OpenAI, Anthropic (sk-ant-), OpenRouter (sk-or-), project keys (sk-proj-).
39
+ /\bsk-[A-Za-z0-9_-]{16,}/g,
40
+ // GitHub tokens, classic and fine-grained.
41
+ /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}/g,
42
+ /\bgithub_pat_[A-Za-z0-9_]{20,}/g,
43
+ // Google API keys.
44
+ /\bAIza[0-9A-Za-z_-]{30,}/g,
45
+ // Harness API tokens and CLI logins.
46
+ /\b(?:aone|hcli)_[A-Za-z0-9]{16,}/g,
47
+ // Slack.
48
+ /\bxox[abprs]-[A-Za-z0-9-]{10,}/g,
49
+ // Stripe secret and restricted keys.
50
+ /\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}/g,
51
+ // GitLab personal access tokens, npm access tokens, Hugging Face tokens.
52
+ /\bglpat-[A-Za-z0-9_-]{16,}/g,
53
+ /\bnpm_[A-Za-z0-9]{30,}/g,
54
+ /\bhf_[A-Za-z0-9]{30,}/g,
55
+ ];
56
+ /**
57
+ * `api_key=…`, `token: "…"` and the like: the value goes, the name stays. A
58
+ * quoted value is consumed through its closing quote whatever it contains
59
+ * (spaces, commas, a short passphrase); an unquoted one is a run of eight or
60
+ * more non-delimiter characters — shorter unquoted runs are left alone so
61
+ * that prose such as `token: string` keeps its type name.
62
+ */
63
+ // The key may be a compound (`client_secret`, `GITHUB_TOKEN`, `private_key`)
64
+ // and may itself be quoted, as in JSON.
65
+ const SENSITIVE_KEY = String.raw `(?<![A-Za-z0-9_-])["']?[A-Za-z0-9_-]*(?:api[_-]?key|access[_-]?token|refresh[_-]?token|secret|password|passwd|token|private[_-]?key)["']?`;
66
+ // Non-overlapping alternatives consume escaped characters once, including a
67
+ // terminal escape. Match through the closing quote or end of input, even when
68
+ // pre-cut removed the closing quote or the supplied value spans real newlines.
69
+ const ASSIGNMENT_QUOTED = new RegExp(String.raw `(${SENSITIVE_KEY}\s*[:=]\s*)(["'])(?:(?!\2)[^\\]|\\(?:[\s\S]|(?![\s\S])))*(?:\2|(?![\s\S]))`, 'gi');
70
+ const ASSIGNMENT = new RegExp(String.raw `(${SENSITIVE_KEY}\s*[:=]\s*)([^\s"',;]{8,})`, 'gi');
71
+ /**
72
+ * Any long opaque token mixing upper, lower and digits — never a pure hex
73
+ * digest (no upper-case letters) or a plain word. Matched with a simple
74
+ * bounded pattern and judged procedurally, so no backtracking blow-up.
75
+ */
76
+ const OPAQUE_TOKEN = /\b[A-Za-z0-9+/=_-]{32,}\b/g;
77
+ function opaqueToken(candidate) {
78
+ return /[A-Z]/.test(candidate) && /[a-z]/.test(candidate) && /[0-9]/.test(candidate);
79
+ }
80
+ /** Replace every credential-shaped substring with `[redacted]`. */
81
+ export function scrubSecrets(text) {
82
+ let out = text.replace(ASSIGNMENT_QUOTED, redactQuoted);
83
+ for (const pattern of KEY_PATTERNS)
84
+ out = out.replace(pattern, REDACTED);
85
+ out = out.replace(ASSIGNMENT, (_match, prefix) => `${prefix}${REDACTED}`);
86
+ out = out.replace(OPAQUE_TOKEN, (candidate) => (opaqueToken(candidate) ? REDACTED : candidate));
87
+ return out;
88
+ }
89
+ /** `key="value"` → `key="[redacted]"`: the quotes stay so the text still reads as an assignment. */
90
+ function redactQuoted(match, prefix) {
91
+ const quote = match.charAt(prefix.length);
92
+ return `${prefix}${quote}${REDACTED}${quote}`;
93
+ }
94
+ /**
95
+ * Scrub, then cap at `max` Unicode code points with an ellipsis. Preliminary
96
+ * truncation keeps only through a real whitespace boundary inside the bounded
97
+ * UTF-16 prefix, so no split credential fragment can survive later redaction.
98
+ */
99
+ export function scrubText(text, max = MAX_FREE_TEXT) {
100
+ const bounded = preCut(text, max * 4);
101
+ return truncateCodepoints(scrubSecrets(bounded), max, bounded !== text);
102
+ }
103
+ function truncateCodepoints(text, max, cut = false) {
104
+ const points = [];
105
+ let units = 0;
106
+ for (const point of text) {
107
+ if (points.length >= max)
108
+ break;
109
+ points.push(point);
110
+ units += point.length;
111
+ }
112
+ if (!cut && units === text.length)
113
+ return text;
114
+ return `${points.slice(0, Math.max(0, max - 1)).join('')}…`;
115
+ }
116
+ function preCut(text, at) {
117
+ if (text.length <= at)
118
+ return text;
119
+ // A half-surrogate at the boundary cannot be a whitespace boundary.
120
+ const prefix = text.slice(0, at);
121
+ const back = prefix.search(/\s\S*$/);
122
+ return back === -1 ? '' : prefix.slice(0, back);
123
+ }
124
+ /**
125
+ * Identifiers that come from configuration rather than prose — model ids,
126
+ * roles, providers: key-shaped substrings go, but a long mixed-case id such as
127
+ * `anthropic/Claude-Sonnet-4-5-20250929` is not an opaque token and stays.
128
+ */
129
+ export function scrubIdentifier(text, max = 200) {
130
+ let out = text.replace(ASSIGNMENT_QUOTED, redactQuoted);
131
+ for (const pattern of KEY_PATTERNS)
132
+ out = out.replace(pattern, REDACTED);
133
+ out = out.replace(ASSIGNMENT, (_match, prefix) => `${prefix}${REDACTED}`);
134
+ return truncateCodepoints(out, max);
135
+ }
136
+ export function scrubOptional(text, max = MAX_FREE_TEXT) {
137
+ return text === undefined ? undefined : scrubText(text, max);
138
+ }
139
+ const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
140
+ /**
141
+ * Scrub every string nested inside a JSON-like value — keys included. The
142
+ * structure survives: two keys that scrub to the same name stay distinct
143
+ * (`[redacted]`, `[redacted]#2`, …), and the keys that would reach into the
144
+ * object's prototype are dropped rather than assigned.
145
+ */
146
+ export function scrubDeep(value) {
147
+ if (typeof value === 'string')
148
+ return scrubText(value);
149
+ if (Array.isArray(value))
150
+ return value.map((item) => scrubDeep(item));
151
+ if (value !== null && typeof value === 'object') {
152
+ const out = {};
153
+ for (const [key, item] of Object.entries(value)) {
154
+ if (UNSAFE_KEYS.has(key))
155
+ continue;
156
+ const base = scrubSecrets(key);
157
+ let name = base;
158
+ for (let n = 2; Object.prototype.hasOwnProperty.call(out, name); n += 1)
159
+ name = `${base}#${n}`;
160
+ out[name] = scrubDeep(item);
161
+ }
162
+ return out;
163
+ }
164
+ return value;
165
+ }
166
+ /**
167
+ * Drop fenced code blocks — a malformed model answer can echo the prompt,
168
+ * and the prompt contains the diff. A run of three or more backticks or
169
+ * tildes opens a block wherever it stands (models often open one mid-line,
170
+ * "here is the JSON: ```json"). It closes, as in CommonMark, only at a line
171
+ * start: up to three spaces, a run of the same character at least as long,
172
+ * then nothing but spaces to the end of the line. A same-length run inside
173
+ * the block's own lines therefore never ends it early, and an unclosed
174
+ * block runs to the end of the text.
175
+ */
176
+ export function stripFencedCode(text) {
177
+ const fence = /(`{3,}|~{3,})/g;
178
+ let out = '';
179
+ let cursor = 0;
180
+ let open;
181
+ let match;
182
+ while ((match = fence.exec(text)) !== null) {
183
+ const run = match[1];
184
+ if (!open) {
185
+ out += `${text.slice(cursor, match.index)}[code omitted]`;
186
+ open = { char: run[0], length: run.length };
187
+ cursor = match.index + run.length;
188
+ }
189
+ else if (run[0] === open.char && run.length >= open.length && closesAtLineStart(text, match.index, run.length)) {
190
+ open = undefined;
191
+ // The closing line is the fence's own; resume at its line break.
192
+ const lineEnd = text.indexOf('\n', match.index + run.length);
193
+ cursor = lineEnd === -1 ? text.length : lineEnd;
194
+ }
195
+ }
196
+ return open ? out : out + text.slice(cursor);
197
+ }
198
+ function closesAtLineStart(text, index, length) {
199
+ const lineStart = text.lastIndexOf('\n', index - 1) + 1;
200
+ if (!/^ {0,3}$/.test(text.slice(lineStart, index)))
201
+ return false;
202
+ const lineEnd = text.indexOf('\n', index + length);
203
+ return /^ *\r?$/.test(text.slice(index + length, lineEnd === -1 ? undefined : lineEnd));
204
+ }
205
+ //# sourceMappingURL=scrub.js.map