@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,662 @@
1
+ import { cosmiconfig } from 'cosmiconfig';
2
+ import { join } from 'path';
3
+ import { SEARCH_PLACES } from '../config/loader.js';
4
+ import { HarnessSchema } from '../config/schema.js';
5
+ import { resolveDataDir } from '../config/data-dir.js';
6
+ import { credentialHost, resolveHarnessCredential } from './credentials.js';
7
+ import { declareReviewerRecovery, buildRunEnvelope } from './envelope.js';
8
+ import { validateRunEnvelope } from './envelope-validation.js';
9
+ import { Quarantine, QUARANTINE_DIR } from './quarantine.js';
10
+ import { deliverable } from './events.js';
11
+ import { ensureNoticeShown } from './notice.js';
12
+ import { Outbox, OUTBOX_DIR } from './outbox.js';
13
+ import { scrubText } from './scrub.js';
14
+ import { describeOutcome, HarnessSink, validateEnvelopeTimeoutMs } from './sink.js';
15
+ import { isReviewerArtifact } from '../report/reviewer-artifact.js';
16
+ import { sha256Hex } from '../report/run-header.js';
17
+ import { ReviewerDeliveryQueue } from './reviewer-delivery.js';
18
+ import { parseAttestedExpiry, recoverAttestedDelivery } from './attested-retry.js';
19
+ import { verifiedConsensusReportProblem } from './report-consistency.js';
20
+ import { AttestedReviewerDelivery } from './attested-reviewer-delivery.js';
21
+ /**
22
+ * Evidence delivery for a finished review and for the converge commands
23
+ * (epic IO-12475, section 8): resolve where the evidence goes, send it,
24
+ * spool what could not be sent, and say in one dim line what happened.
25
+ * Delivery never blocks a review on the network beyond its own timeouts,
26
+ * never changes the review's result, and never turns a local failure of its
27
+ * own (a read-only data dir, a torn file) into a failed review — only
28
+ * `--evidence-required` turns an unacknowledged delivery into an exit code.
29
+ */
30
+ export const STARTUP_FLUSH_DEADLINE_MS = 5_000;
31
+ export const EVIDENCE_REQUIRED_EXIT_CODE = 4;
32
+ const ENV_OFF = new Set(['off', '0', 'false', 'no', 'none', 'disabled']);
33
+ const LEVELS = new Set(['off', 'envelope', 'findings', 'full']);
34
+ /**
35
+ * What `RCL_TELEMETRY` asks for: `off` (also `0`, `false`, `no`), a level
36
+ * name, or nothing when unset. A value that is set but not understood is a
37
+ * failed opt-out and reads as `off` — never as the default.
38
+ */
39
+ export function envTelemetryLevel(env) {
40
+ const raw = (env['RCL_TELEMETRY'] ?? '').trim().toLowerCase();
41
+ if (raw === '')
42
+ return undefined;
43
+ if (ENV_OFF.has(raw))
44
+ return 'off';
45
+ return LEVELS.has(raw) ? raw : 'off';
46
+ }
47
+ /**
48
+ * Why `--evidence-required` cannot be honored, or undefined when it can:
49
+ * evidence cannot be required and withheld at the same time. The flag and
50
+ * the environment are known up front; the project config once loaded.
51
+ */
52
+ export function evidenceRequirementConflict(opts, config, env) {
53
+ if (!opts.evidenceRequired)
54
+ return undefined;
55
+ if (opts.telemetry === false)
56
+ return '--evidence-required contradicts --no-telemetry: evidence cannot be required and withheld.';
57
+ if (envTelemetryLevel(env) === 'off')
58
+ return '--evidence-required contradicts RCL_TELEMETRY=off: evidence cannot be required and withheld.';
59
+ if (config?.harness?.telemetry === 'off') {
60
+ return '--evidence-required contradicts harness.telemetry: off in the project config: evidence cannot be required and withheld.';
61
+ }
62
+ return undefined;
63
+ }
64
+ /** `--no-telemetry` wins, then `RCL_TELEMETRY`, then `harness.telemetry`; default `full`. */
65
+ export function resolveTelemetryLevel(config, flags, env) {
66
+ if (flags.noTelemetry)
67
+ return 'off';
68
+ return envTelemetryLevel(env) ?? config?.harness?.telemetry ?? 'full';
69
+ }
70
+ /**
71
+ * The `harness` section of the project's config file, read without the
72
+ * full loader (whose fleet degradation warns on stderr — noise no startup
73
+ * flush should print). A missing or unusable file reads as no settings;
74
+ * `configPath` (`--config`) names the file instead of searching from `cwd`,
75
+ * and one that cannot be read fails closed like an unparseable section.
76
+ */
77
+ export async function loadHarnessSettings(cwd, configPath) {
78
+ try {
79
+ const explorer = cosmiconfig('review-council', { searchPlaces: SEARCH_PLACES });
80
+ const found = configPath !== undefined ? await explorer.load(configPath) : await explorer.search(cwd);
81
+ if (!found || found.isEmpty || typeof found.config !== 'object' || found.config === null)
82
+ return undefined;
83
+ const harness = found.config.harness;
84
+ if (harness === undefined)
85
+ return {};
86
+ const parsed = HarnessSchema.safeParse(harness);
87
+ // A harness section that does not parse fails closed: an opt-out the
88
+ // user wrote next to a typo must still hold.
89
+ return parsed.success ? { harness: parsed.data } : { harness: { telemetry: 'off' } };
90
+ }
91
+ catch {
92
+ // A file that exists but cannot be read or parsed may hold an opt-out
93
+ // behind a syntax error: fail closed, as for an unparseable section.
94
+ return { harness: { telemetry: 'off' } };
95
+ }
96
+ }
97
+ export async function createTelemetryRuntime(options) {
98
+ if (options.envelopeTimeoutMs !== undefined)
99
+ validateEnvelopeTimeoutMs(options.envelopeTimeoutMs);
100
+ const env = options.env ?? process.env;
101
+ const cwd = options.cwd ?? process.cwd();
102
+ const dataDir = options.dataDir ?? resolveDataDir(env);
103
+ const config = options.config ?? (await loadHarnessSettings(cwd));
104
+ const level = resolveTelemetryLevel(config, { noTelemetry: options.noTelemetry }, env);
105
+ const runtime = {
106
+ level,
107
+ repoManaged: false,
108
+ parseFailures: config?.harness?.parseFailures === true,
109
+ outbox: new Outbox(join(dataDir, OUTBOX_DIR)),
110
+ quarantine: new Quarantine(join(dataDir, QUARANTINE_DIR)),
111
+ dataDir,
112
+ rclVersion: options.rclVersion,
113
+ stderr: options.stderr ?? ((line) => process.stderr.write(`${line}\n`)),
114
+ };
115
+ if (level === 'off')
116
+ return runtime;
117
+ if (options.credential) {
118
+ runtime.repoManaged = true;
119
+ runtime.credential = options.credential;
120
+ runtime.attested = options.credential.source === 'attest';
121
+ runtime.attestedExpiresAt = options.attestedExpiresAt;
122
+ runtime.sink = new HarnessSink({
123
+ credential: options.credential,
124
+ rclVersion: options.rclVersion,
125
+ ...(options.envelopeTimeoutMs !== undefined ? { envelopeTimeoutMs: options.envelopeTimeoutMs } : {}),
126
+ ...(options.attestedExpiresAt !== undefined ? { attestedExpiresAt: options.attestedExpiresAt } : {}),
127
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
128
+ });
129
+ return runtime;
130
+ }
131
+ const resolved = await resolveHarnessCredential({
132
+ env,
133
+ cwd,
134
+ ...(options.credentialsPath !== undefined ? { credentialsPath: options.credentialsPath } : {}),
135
+ ...(options.requireRepo !== undefined ? { requireRepo: options.requireRepo } : {}),
136
+ });
137
+ runtime.repoManaged = resolved.repoManaged;
138
+ if (!resolved.repoManaged && options.requireRepo !== false) {
139
+ // Not a Harness-managed repository: there is nowhere the evidence belongs.
140
+ return { ...runtime, level: 'off' };
141
+ }
142
+ if (resolved.note !== undefined)
143
+ runtime.note = resolved.note;
144
+ if (resolved.credential) {
145
+ runtime.credential = resolved.credential;
146
+ runtime.sink = new HarnessSink({
147
+ credential: resolved.credential,
148
+ rclVersion: options.rclVersion,
149
+ ...(options.envelopeTimeoutMs !== undefined ? { envelopeTimeoutMs: options.envelopeTimeoutMs } : {}),
150
+ ...(options.attestedExpiresAt !== undefined ? { attestedExpiresAt: options.attestedExpiresAt } : {}),
151
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
152
+ });
153
+ }
154
+ return runtime;
155
+ }
156
+ /**
157
+ * The consent notice precedes the first transmission from this machine to a
158
+ * host, whatever the transmission is — a run, a converge event, or a flush of
159
+ * something spooled earlier. A notice that cannot be recorded shows again
160
+ * next time; it is never a failure.
161
+ */
162
+ // Persistence failures are absorbed inside `ensureNoticeShown` (shown, not
163
+ // recorded — it shows again next time); anything that escapes means the
164
+ // notice itself could not be written, and nothing is transmitted then.
165
+ async function noticeBefore(runtime, scope = 'ordinary') {
166
+ if (!runtime.credential)
167
+ return;
168
+ await ensureNoticeShown(credentialHost(runtime.credential), runtime.dataDir, runtime.stderr, scope);
169
+ }
170
+ /** Flush the outbox through the runtime's sink, the notice shown first. */
171
+ export async function flushOutbox(runtime, options = {}) {
172
+ if (!runtime.sink)
173
+ throw new Error('No Harness credential to flush with.');
174
+ await noticeBefore(runtime);
175
+ const started = performance.now();
176
+ const ordinary = await runtime.outbox.flush(runtime.sink, options);
177
+ if (runtime.level !== 'full' || runtime.attested)
178
+ return ordinary;
179
+ const remaining = options.deadlineMs === undefined ? undefined : Math.max(0, options.deadlineMs - (performance.now() - started));
180
+ const privateResult = await new ReviewerDeliveryQueue(runtime.dataDir).flush(runtime.sink, { ...options, deadlineMs: remaining }, () => noticeBefore(runtime, 'private-reviewers'));
181
+ return { ...ordinary, delivered: [...ordinary.delivered, ...privateResult.delivered], remaining: [...ordinary.remaining, ...privateResult.remaining],
182
+ failed: [...ordinary.failed, ...privateResult.failed], dropped: [...ordinary.dropped, ...privateResult.dropped],
183
+ ...(ordinary.stopped || privateResult.stopped ? { stopped: ordinary.stopped ?? privateResult.stopped } : {}) };
184
+ }
185
+ /** Bounded: an offline machine must never stall a command. Fail-soft. */
186
+ export async function flushOutboxAtStart(runtime, deadlineMs = STARTUP_FLUSH_DEADLINE_MS) {
187
+ if (!runtime.sink)
188
+ return;
189
+ try {
190
+ // One listing, inside the deadline: flush scans the outbox itself.
191
+ const summary = await flushOutbox(runtime, { deadlineMs });
192
+ if (summary.delivered.length > 0) {
193
+ runtime.stderr(`Delivered ${summary.delivered.length} spooled evidence entr${summary.delivered.length === 1 ? 'y' : 'ies'} to ${credentialHost(runtime.credential)}.`);
194
+ }
195
+ }
196
+ catch (err) {
197
+ // The outbox is a convenience; a broken data dir must not stop the
198
+ // command — but a spooled entry that never leaves deserves a trace.
199
+ runtime.stderr(`Outbox flush skipped: ${scrubText(String(err), 200)}`);
200
+ }
201
+ }
202
+ function exitFor(status, evidenceRequired) {
203
+ return evidenceRequired && status !== 'recorded' ? EVIDENCE_REQUIRED_EXIT_CODE : 0;
204
+ }
205
+ function localFailure(err) {
206
+ return scrubText(err instanceof Error ? err.message : String(err), 300);
207
+ }
208
+ /** The wire builder defaults an absent finding label to `none`; inspect the immutable report first. */
209
+ export function verifiedConsensusDiagnostics(result) {
210
+ if (result.run?.gating?.mode !== 'verified-consensus')
211
+ return [];
212
+ const diagnostics = [];
213
+ const reasons = new Set(['consensus', 'critical', 'verified', 'none']);
214
+ let hasVerificationEvidence = false;
215
+ for (const [group, findings] of [
216
+ ['findings', result.findings],
217
+ ['belowThresholdFindings', result.belowThresholdFindings ?? []],
218
+ ]) {
219
+ findings.forEach((finding, index) => {
220
+ if (finding.gating?.verification !== undefined)
221
+ hasVerificationEvidence = true;
222
+ if (!reasons.has(finding.gating?.reason ?? '')) {
223
+ diagnostics.push({ path: `${group}.${index}.gating.reason`, message: 'Verified-consensus finding is missing a valid gating label' });
224
+ }
225
+ });
226
+ }
227
+ if (hasVerificationEvidence && result.stats?.verification == null) {
228
+ diagnostics.unshift({ path: 'stats.verification', message: 'Verified-consensus report is missing verification stats for annotated candidates' });
229
+ }
230
+ return diagnostics.slice(0, 20);
231
+ }
232
+ /** Only a proof-derived private artifact may explain intentionally unlabeled strict-fallback bytes. */
233
+ function authenticatedStrictFallback(input) {
234
+ const artifact = input.reviewerArtifact, gate = artifact?.validation.gate;
235
+ if (!artifact || !isReviewerArtifact(artifact) || artifact.gatingDisposition !== 'strict_fallback' ||
236
+ artifact.reportSha256 !== sha256Hex(input.artifacts.report_json) || gate === undefined ||
237
+ gate.validation !== 'deterministic' || gate.reportedCiExitCode === 0 ||
238
+ gate.reportedCiExitCode !== gate.conservativeCiExitCode || gate.annotations.length !== 0 ||
239
+ gate.unresolvedFindingIdentities.length !== 0 ||
240
+ input.result.run?.ci_exit_code !== gate.reportedCiExitCode || input.result.stats?.verification != null)
241
+ return false;
242
+ return [...input.result.findings, ...(input.result.belowThresholdFindings ?? [])]
243
+ .every(finding => finding.gating === undefined);
244
+ }
245
+ function verifiedConsensusEnvelopeDiagnostics(input, envelope) {
246
+ const strictFallback = authenticatedStrictFallback(input);
247
+ const diagnostics = strictFallback ? [] : verifiedConsensusDiagnostics(input.result);
248
+ if (diagnostics.length > 0 || envelope.run.gating?.mode !== 'verified-consensus')
249
+ return diagnostics;
250
+ try {
251
+ const report = JSON.parse(input.artifacts.report_json);
252
+ const problem = verifiedConsensusReportProblem(report, envelope, input.artifacts.report_json, input.result, { allowUnlabeledStrictFallback: strictFallback });
253
+ if (problem)
254
+ diagnostics.push({ path: 'report_json', message: problem });
255
+ }
256
+ catch {
257
+ diagnostics.push({ path: 'report_json', message: 'report_json malformed; verified-consensus source cannot be checked' });
258
+ }
259
+ return diagnostics;
260
+ }
261
+ async function retainRun(runtime, input, envelope, diagnostics, acknowledged = false) {
262
+ return (runtime.quarantine ?? new Quarantine(join(runtime.dataDir, QUARANTINE_DIR))).retain({
263
+ runId: input.result.run?.id ?? '', artifacts: input.artifacts, envelope,
264
+ events: (input.events ?? []).filter(deliverable), requestedMode: runtime.attested ? 'attested' : 'asserted',
265
+ acknowledged, diagnostics: [...(input.outputDiagnostics ?? []), ...diagnostics],
266
+ });
267
+ }
268
+ function retentionLine(retention, runId) {
269
+ return retention.status === 'complete'
270
+ ? `original evidence retained; inspect with rcl telemetry rejected --run ${runId}`
271
+ : `could not preserve a complete recovery copy (${retention.error})`;
272
+ }
273
+ /**
274
+ * POST the envelope, PUT the artifacts (at `full`), POST any events; spool
275
+ * whatever the server could not take because it was unreachable. Local
276
+ * failures (notice file, outbox) are reported, never thrown.
277
+ */
278
+ export async function deliverRun(runtime, input) {
279
+ if (input.reviewerArtifact || input.result.run?.reviewer_evidence)
280
+ return deliverReviewerRun(runtime, input);
281
+ const outcome = await deliverCompletedRun(runtime, input);
282
+ if (input.outputDiagnostics?.length && !outcome.retention && runtime.level !== 'off' && runtime.repoManaged && input.result.run) {
283
+ const envelope = buildRunEnvelope(input.result, input.artifacts, {
284
+ level: runtime.level, delivery: { mode: 'direct' }, parseFailures: runtime.parseFailures,
285
+ });
286
+ const retention = await retainRun(runtime, input, envelope, [], outcome.status === 'recorded');
287
+ return { ...outcome, runId: input.result.run.id, retention,
288
+ line: `${outcome.line}; ${retentionLine(retention, input.result.run.id)}` };
289
+ }
290
+ return outcome;
291
+ }
292
+ /** Private delivery remains distinct from ordinary telemetry and its lossy outbox. */
293
+ async function deliverReviewerRun(runtime, input) {
294
+ const runId = input.result.run?.id, required = input.evidenceRequired === true;
295
+ const finish = (status, spooled, line) => ({ status, spooled, line, runId, exitCode: exitFor(status, required) });
296
+ if (runtime.level === 'off' || !runtime.repoManaged)
297
+ return finish('off', false, required ? 'Private reviewer evidence retained locally; telemetry is off' : '');
298
+ if (!runId || !input.reviewerArtifact || !input.result.run?.reviewer_evidence || runtime.level !== 'full' ||
299
+ !runtime.sink || !runtime.credential || input.events?.length ||
300
+ (runtime.attested ? !(input.attestedReviewer instanceof AttestedReviewerDelivery) ||
301
+ !input.attestedReviewer.matchesRuntime(runtime.credential, runtime.attestedExpiresAt) : input.attestedReviewer !== undefined)) {
302
+ return finish('rejected', false, 'Private reviewer delivery requires complete retained evidence, full telemetry and a supported current owner credential');
303
+ }
304
+ let envelope;
305
+ try {
306
+ const declaration = declareReviewerRecovery({ artifact: input.reviewerArtifact, descriptor: input.result.run.reviewer_evidence,
307
+ ...(input.reviewerSource === undefined ? {} : { source: input.reviewerSource }) });
308
+ envelope = buildRunEnvelope(input.result, input.artifacts, { level: 'full', delivery: { mode: 'direct' }, parseFailures: runtime.parseFailures, reviewerRecovery: declaration });
309
+ }
310
+ catch {
311
+ return finish('rejected', false, 'Private reviewer delivery refused locally; original checkpoint evidence is unchanged');
312
+ }
313
+ if (verifiedConsensusEnvelopeDiagnostics(input, envelope).length > 0) {
314
+ return finish('rejected', false, 'Private reviewer delivery refused locally: verified-consensus report mismatch');
315
+ }
316
+ const queue = new ReviewerDeliveryQueue(runtime.dataDir);
317
+ try {
318
+ await noticeBefore(runtime, 'private-reviewers');
319
+ if (runtime.attested) {
320
+ await input.attestedReviewer.deliver({ envelope, artifacts: input.artifacts, artifact: input.reviewerArtifact });
321
+ return finish('recorded', false, 'Private evidence and embedded JSON read back; ordinary artifact PUT receipts verified; no native admission implied');
322
+ }
323
+ await queue.deliver({ sink: runtime.sink, envelope, artifacts: input.artifacts, artifact: input.reviewerArtifact });
324
+ return finish('recorded', false, 'Reviewer evidence and ordinary reports recorded and read back; no native admission implied');
325
+ }
326
+ catch {
327
+ if (runtime.attested)
328
+ return finish('rejected', false, 'Attested private delivery incomplete; nothing spooled and original checkpoint evidence is unchanged');
329
+ const retained = await queue.isRetained(runId);
330
+ return finish(retained ? 'spooled' : 'rejected', retained, retained ? 'Private reviewer delivery incomplete; exact bytes retained for an owner-checked telemetry flush' : 'Private reviewer delivery refused locally; original checkpoint evidence is unchanged');
331
+ }
332
+ }
333
+ async function deliverCompletedRun(runtime, input) {
334
+ const evidenceRequired = input.evidenceRequired === true;
335
+ // A runtime built for the outbox commands (`requireRepo: false`) may carry
336
+ // a level and a sink outside a Harness-managed repository; new evidence
337
+ // still never leaves one.
338
+ if (runtime.level === 'off' || !runtime.repoManaged) {
339
+ return {
340
+ status: 'off',
341
+ line: evidenceRequired ? 'Evidence not sent: telemetry is off, or this repository is not Harness-managed' : '',
342
+ spooled: false,
343
+ exitCode: exitFor('off', evidenceRequired),
344
+ };
345
+ }
346
+ const runId = input.result.run?.id;
347
+ if (runId === undefined) {
348
+ return {
349
+ status: 'skipped',
350
+ line: 'Evidence not sent: the report has no run header',
351
+ spooled: false,
352
+ exitCode: exitFor('skipped', evidenceRequired),
353
+ };
354
+ }
355
+ let envelope;
356
+ try {
357
+ envelope = buildRunEnvelope(input.result, input.artifacts, {
358
+ level: runtime.level, delivery: { mode: 'direct' }, parseFailures: runtime.parseFailures,
359
+ });
360
+ }
361
+ catch {
362
+ const retention = await retainRun(runtime, input, undefined, [{ path: 'envelope', message: 'Could not build a complete evidence envelope' }]);
363
+ return { status: 'rejected', runId, spooled: false, failureDisposition: 'local-invalid', retention, exitCode: exitFor('rejected', evidenceRequired),
364
+ line: `Evidence refused locally: invalid envelope; ${retentionLine(retention, runId)}` };
365
+ }
366
+ const diagnostics = validateRunEnvelope(envelope, input.artifacts);
367
+ diagnostics.push(...verifiedConsensusEnvelopeDiagnostics(input, envelope));
368
+ if (diagnostics.length > 0) {
369
+ const retention = await retainRun(runtime, input, envelope, diagnostics);
370
+ return { status: 'rejected', runId, spooled: false, failureDisposition: 'local-invalid', retention, exitCode: exitFor('rejected', evidenceRequired),
371
+ line: `Evidence refused locally (${diagnostics[0].path}: ${diagnostics[0].message}); ${retentionLine(retention, runId)}` };
372
+ }
373
+ const events = (input.events ?? []).filter(deliverable);
374
+ const artifactsToSend = runtime.level === 'full'
375
+ ? {
376
+ report_json: input.artifacts.report_json,
377
+ ...(input.artifacts.report_md !== undefined ? { report_md: input.artifacts.report_md } : {}),
378
+ }
379
+ : {};
380
+ if (!runtime.sink || !runtime.credential) {
381
+ // No credential to send with. When the caller insists on evidence, the
382
+ // run still goes to the outbox so a later login + flush can deliver it.
383
+ const reason = runtime.note ?? 'no Harness credential';
384
+ if (!evidenceRequired) {
385
+ return { status: 'skipped', line: `Evidence not sent: ${reason}`, runId, spooled: false, exitCode: 0 };
386
+ }
387
+ const retention = await retainRun(runtime, input, envelope, [{ path: 'delivery', message: reason }]);
388
+ try {
389
+ await runtime.outbox.spoolRun({ runId, envelope, artifacts: artifactsToSend, events });
390
+ return {
391
+ status: 'spooled',
392
+ retention,
393
+ line: `Evidence spooled (${reason}); run rcl telemetry flush once a credential is available; ${retentionLine(retention, runId)}`,
394
+ runId,
395
+ spooled: true,
396
+ exitCode: EVIDENCE_REQUIRED_EXIT_CODE,
397
+ };
398
+ }
399
+ catch (err) {
400
+ return {
401
+ status: 'skipped',
402
+ retention,
403
+ line: `Evidence not sent: ${reason}; could not spool it either (${localFailure(err)}); ${retentionLine(retention, runId)}`,
404
+ runId,
405
+ spooled: false,
406
+ exitCode: EVIDENCE_REQUIRED_EXIT_CODE,
407
+ };
408
+ }
409
+ }
410
+ const host = credentialHost(runtime.credential);
411
+ await noticeBefore(runtime);
412
+ // Hold one immutable serialization for the first POST and every bounded
413
+ // attested replay; no retry rebuilds the envelope or run identity.
414
+ const serializedEnvelope = JSON.stringify(envelope);
415
+ const deliveryDiagnostics = [];
416
+ const preparedPost = runtime.sink.preparePostRun(envelope, serializedEnvelope);
417
+ let posted = preparedPost.kind === 'ready' ? await preparedPost.post() : preparedPost;
418
+ if (posted.kind === 'unavailable' && runtime.attested && runtime.attestedExpiresAt !== undefined) {
419
+ deliveryDiagnostics.push({ path: 'delivery.initial_transport', message: posted.reason });
420
+ // Recovery stops on refusal; keep organization disablement distinct in the delivery result.
421
+ if (parseAttestedExpiry(runtime.attestedExpiresAt) === undefined) {
422
+ posted = { kind: 'rejected', httpStatus: 0, error: 'attested_recovery_invalid_expiry', message: 'attested expiry must be a valid ISO timestamp' };
423
+ }
424
+ else {
425
+ const recovered = await recoverAttestedDelivery({
426
+ runId, payload: serializedEnvelope, expiresAt: runtime.attestedExpiresAt, receiptFirst: true, initialAttempts: 1,
427
+ post: async (payload, signal) => {
428
+ if (payload !== serializedEnvelope || preparedPost.kind !== 'ready')
429
+ return { kind: 'rejected' };
430
+ const outcome = await preparedPost.post({ signal });
431
+ if (outcome.kind === 'ok')
432
+ return { kind: 'recorded', value: outcome.value };
433
+ if (outcome.kind === 'conflict')
434
+ return { kind: 'conflict' };
435
+ if (outcome.kind === 'disabled')
436
+ return { kind: 'disabled', value: outcome };
437
+ if (outcome.kind === 'rejected')
438
+ return { kind: 'rejected' };
439
+ return { kind: 'unavailable' };
440
+ }, receipt: async (_runId, signal) => preparedPost.kind === 'ready' ? preparedPost.receipt({ signal }) : Promise.resolve({ kind: 'rejected' }),
441
+ });
442
+ if (recovered.kind === 'recorded' && recovered.value !== undefined)
443
+ posted = { kind: 'ok', httpStatus: 200, value: recovered.value };
444
+ else if (recovered.kind === 'recorded')
445
+ posted = { kind: 'rejected', httpStatus: 0, error: 'attested_recovery_missing_receipt', message: 'recorded recovery did not provide a receipt' };
446
+ else if (recovered.kind === 'conflict')
447
+ posted = { kind: 'conflict', message: 'attested recovery found a conflicting run' };
448
+ else if (recovered.kind === 'disabled')
449
+ posted = recovered.value;
450
+ else if (recovered.kind === 'rejected' || recovered.kind === 'receipt_rejected')
451
+ posted = { kind: 'rejected', httpStatus: 0, error: 'attested_recovery_refused', message: recovered.kind };
452
+ else
453
+ posted = { kind: 'unavailable', reason: `attested_recovery_${recovered.kind}` };
454
+ }
455
+ }
456
+ switch (posted.kind) {
457
+ case 'unavailable': {
458
+ const retention = await retainRun(runtime, input, envelope, [...deliveryDiagnostics, { path: 'delivery', message: describeOutcome(posted) }]);
459
+ if (runtime.attested) {
460
+ // The run-bound credential ends with the workflow run; a flush later
461
+ // would have to use another credential and record an asserted run.
462
+ return {
463
+ status: 'error',
464
+ retention,
465
+ runId,
466
+ spooled: false,
467
+ line: `Evidence not recorded (Harness unreachable: ${posted.reason}); nothing spooled — an attested run does not outlive its workflow run; ${retentionLine(retention, runId)}`,
468
+ exitCode: exitFor('error', evidenceRequired),
469
+ };
470
+ }
471
+ try {
472
+ const spooled = await runtime.outbox.spoolRun({ runId, envelope, artifacts: artifactsToSend, events });
473
+ const dropped = spooled.artifactsDropped.length > 0 ? ' — artifacts not spooled: outbox over its cap' : '';
474
+ return {
475
+ status: 'spooled',
476
+ retention,
477
+ runId,
478
+ spooled: true,
479
+ line: `Evidence spooled (Harness unreachable: ${posted.reason}); run rcl telemetry flush${dropped}; ${retentionLine(retention, runId)}`,
480
+ exitCode: exitFor('spooled', evidenceRequired),
481
+ };
482
+ }
483
+ catch (err) {
484
+ return {
485
+ status: 'error',
486
+ retention,
487
+ runId,
488
+ spooled: false,
489
+ line: `Evidence not sent (Harness unreachable: ${posted.reason}) and could not be spooled: ${localFailure(err)}; ${retentionLine(retention, runId)}`,
490
+ exitCode: exitFor('error', evidenceRequired),
491
+ };
492
+ }
493
+ }
494
+ case 'disabled': {
495
+ const retention = deliveryDiagnostics.length > 0
496
+ ? await retainRun(runtime, input, envelope, [...deliveryDiagnostics, { path: 'delivery', message: describeOutcome(posted) }])
497
+ : undefined;
498
+ return {
499
+ status: 'disabled',
500
+ ...(retention ? { retention } : {}),
501
+ runId,
502
+ spooled: false,
503
+ line: `Evidence not sent: ${host} has not enabled review evidence for this organization${retention ? `; ${retentionLine(retention, runId)}` : ''}`,
504
+ exitCode: exitFor('disabled', evidenceRequired),
505
+ };
506
+ }
507
+ case 'conflict': {
508
+ const retention = await retainRun(runtime, input, envelope, [...deliveryDiagnostics, { path: 'delivery', message: describeOutcome(posted) }]);
509
+ return {
510
+ status: 'conflict',
511
+ retention,
512
+ runId,
513
+ spooled: false,
514
+ line: `Evidence conflict: ${host} already holds run ${runId} with a different report; nothing recorded; ${retentionLine(retention, runId)}`,
515
+ exitCode: exitFor('conflict', evidenceRequired),
516
+ };
517
+ }
518
+ case 'rejected': {
519
+ const retention = await retainRun(runtime, input, envelope, [...deliveryDiagnostics, { path: 'delivery', message: describeOutcome(posted) }]);
520
+ return {
521
+ status: 'rejected',
522
+ retention,
523
+ runId,
524
+ spooled: false,
525
+ line: `Evidence refused by ${host} (${describeOutcome(posted)}); nothing spooled; ${retentionLine(retention, runId)}`,
526
+ exitCode: exitFor('rejected', evidenceRequired),
527
+ };
528
+ }
529
+ case 'ok':
530
+ break;
531
+ }
532
+ const receipt = posted.value;
533
+ const notes = [];
534
+ const pendingArtifacts = {};
535
+ let unreachable = false;
536
+ let artifactsRefused = 0;
537
+ for (const [kind, bytes] of Object.entries(artifactsToSend)) {
538
+ if (!receipt.artifacts_expected.includes(kind))
539
+ continue;
540
+ if (unreachable) {
541
+ // The server went away mid-delivery: spool the rest instead of
542
+ // waiting out one timeout per artifact.
543
+ pendingArtifacts[kind] = bytes;
544
+ continue;
545
+ }
546
+ const outcome = await runtime.sink.putArtifact(runId, kind, bytes);
547
+ if (outcome.kind === 'ok')
548
+ continue;
549
+ if (outcome.kind === 'disabled') {
550
+ notes.push('artifacts capped by the organization');
551
+ artifactsRefused += 1;
552
+ break;
553
+ }
554
+ if (outcome.kind === 'unavailable') {
555
+ unreachable = true;
556
+ pendingArtifacts[kind] = bytes;
557
+ continue;
558
+ }
559
+ // A refusal is final — retrying the same bytes cannot help — so it is
560
+ // not spooled; under --evidence-required it makes the evidence incomplete.
561
+ artifactsRefused += 1;
562
+ notes.push(`${kind} refused: ${describeOutcome(outcome)}`);
563
+ }
564
+ let pendingEvents = [];
565
+ if (events.length > 0) {
566
+ if (unreachable) {
567
+ pendingEvents = events;
568
+ }
569
+ else {
570
+ const outcome = await runtime.sink.postEvents(events);
571
+ if (outcome.kind === 'unavailable')
572
+ pendingEvents = events;
573
+ else if (outcome.kind === 'rejected' || outcome.kind === 'conflict')
574
+ notes.push(`events refused: ${describeOutcome(outcome)}`);
575
+ }
576
+ }
577
+ let spooled = false;
578
+ if (runtime.attested && (Object.keys(pendingArtifacts).length > 0 || pendingEvents.length > 0)) {
579
+ notes.push('Harness became unreachable mid-delivery; nothing spooled — an attested run does not outlive its workflow run');
580
+ }
581
+ else if (Object.keys(pendingArtifacts).length > 0 || pendingEvents.length > 0) {
582
+ const parts = [
583
+ Object.keys(pendingArtifacts).length > 0 ? 'artifacts' : undefined,
584
+ pendingEvents.length > 0 ? 'events' : undefined,
585
+ ].filter((p) => p !== undefined);
586
+ try {
587
+ const result = await runtime.outbox.spoolRun({
588
+ runId,
589
+ envelope,
590
+ artifacts: pendingArtifacts,
591
+ events: pendingEvents,
592
+ envelopeDelivered: true,
593
+ runUrl: receipt.url,
594
+ });
595
+ const kept = Object.keys(pendingArtifacts).filter((kind) => !result.artifactsDropped.includes(kind));
596
+ spooled = kept.length > 0 || pendingEvents.length > 0;
597
+ const retained = [kept.length > 0 ? 'artifacts' : undefined, pendingEvents.length > 0 ? 'events' : undefined].filter((p) => p !== undefined);
598
+ if (retained.length > 0)
599
+ notes.push(`${retained.join(' and ')} spooled; run rcl telemetry flush`);
600
+ if (result.artifactsDropped.length > 0) {
601
+ notes.push(`${result.artifactsDropped.join(', ')} not spooled: outbox over its cap`);
602
+ }
603
+ }
604
+ catch (err) {
605
+ notes.push(`${parts.join(' and ')} not delivered and could not be spooled: ${localFailure(err)}`);
606
+ }
607
+ }
608
+ // Recording the envelope does not acknowledge artifacts the server expected
609
+ // but subsequently refused, including an organization cap changed mid-flight.
610
+ const artifactsOutstanding = Object.keys(pendingArtifacts).length + artifactsRefused;
611
+ const retention = artifactsOutstanding > 0 || pendingEvents.length > 0
612
+ ? await retainRun(runtime, input, envelope, [...deliveryDiagnostics, { path: 'delivery', message: notes.join('; ') }], true)
613
+ : undefined;
614
+ if (retention)
615
+ notes.push(retentionLine(retention, runId));
616
+ return {
617
+ status: 'recorded',
618
+ runId,
619
+ url: receipt.url,
620
+ spooled,
621
+ ...(retention ? { retention } : {}),
622
+ line: `Evidence recorded: ${receipt.url}${notes.length > 0 ? ` (${notes.join('; ')})` : ''}`,
623
+ exitCode: evidenceRequired && artifactsOutstanding > 0 ? EVIDENCE_REQUIRED_EXIT_CODE : 0,
624
+ };
625
+ }
626
+ /**
627
+ * Converge commands report their events through the same sink, fail-soft:
628
+ * unreachable spools, anything else is noted and dropped.
629
+ */
630
+ export async function emitConvergeEvents(runtime, events) {
631
+ if (runtime.level === 'off' || !runtime.sink || !runtime.repoManaged)
632
+ return 'skipped';
633
+ const sendable = events.filter(deliverable);
634
+ if (sendable.length === 0)
635
+ return 'skipped';
636
+ await noticeBefore(runtime);
637
+ const outcome = await runtime.sink.postEvents(sendable);
638
+ switch (outcome.kind) {
639
+ case 'ok':
640
+ return 'sent';
641
+ case 'unavailable':
642
+ try {
643
+ await runtime.outbox.spoolEvents(sendable);
644
+ return 'spooled';
645
+ }
646
+ catch {
647
+ return 'refused';
648
+ }
649
+ case 'disabled':
650
+ return 'skipped';
651
+ case 'conflict':
652
+ case 'rejected':
653
+ runtime.stderr(`Converge events refused by ${runtime.credential ? credentialHost(runtime.credential) : 'Harness'}: ${describeOutcome(outcome)}`);
654
+ return 'refused';
655
+ }
656
+ }
657
+ /** Keep transport uncertainty conservative, while distinguishing proven pre-network rejection. */
658
+ export function guardedDeliveryState(delivery) {
659
+ return { deliveryPending: delivery.spooled || delivery.exitCode !== 0,
660
+ ...(delivery.exitCode !== 0 && delivery.failureDisposition ? { deliveryFailure: delivery.failureDisposition } : {}) };
661
+ }
662
+ //# sourceMappingURL=deliver.js.map