chainlesschain 0.166.38 → 0.166.39

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 (196) hide show
  1. package/package.json +6 -1
  2. package/scripts/governed-learning-local-attestor-service.mjs +222 -0
  3. package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
  4. package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
  5. package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
  6. package/src/assets/web-panel/assets/{AIOps-DBbcVPqB.js → AIOps-qWUdiFr5.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-D5vETPOk.js → ActionButton-B_f7go3E.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-WVhas3Fw.js → Analytics-hSGFlSkB.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-CSTRI93Q.js → AppLayout-CCYGgj71.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-BZT8FOoE.js → Artifacts-BdS1H9gq.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-CT2-Tsby.js → Audit-Cck9IebC.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BWA5LNBe.js → BackgroundAgents-DZzoM_QS.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-B-zEbldA.js → Backup-D8H_QtGu.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BAEwtdNT.js → BaseInput-CTsNF_pu.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-BT1-y6t1.js → Chat-CcEiTYY8.js} +6 -6
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BVijMHeO.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-B8IJYZsD.js → Checkbox-BPB9NNJx.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-DEt453nL.js → Codegen-CKKMf7jD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-DWuVSmZv.js → Col-DpSSB4Uu.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-CcoNuU33.js → Community-CfR6ikoH.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BKtuIYWA.js → Compact-CqnkGGjK.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-bHzxGq3P.js → Compliance-9IzhdVQb.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-BY2Kb15t.js → Cowork-eXsgH33N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Cron-DC-j0jvp.js → Cron-DvkzHFRi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CzEuAHQz.js → Crosschain--az9d9f7.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-7QUNq6Fz.js → DID-_Eb4kpnJ.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-CT6RiEFl.js → Dashboard-aDVisdXj.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-CW8IPY7r.js → Dropdown-oQ54XzS9.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Zt8WOLuN.js → EmailListRenderer-BUPdMau1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B6aymxi7.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BiuFrRq0.js → Federation-Cpnb3Moe.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DaiOAkHa.js → FormItemContext-DmsrJkeU.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-D1KbDpXs.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BILl0huA.js → Git-HFG17p7Q.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CLyhrPrh.js → Governance-D5Z5c7N8.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DyNhiIpK.js → Inference-DH159h74.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Bor_ye4m.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-ZDqbu8kg.js → Logs-Gqn8hFsM.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-NHJaejHI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DbDi29dH.js → Marketplace-BArcWifg.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DfU8dWbV.js → McpTools-Q1BfBSnd.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-DeAz-2-6.js → Memory-Cz8nRL7N.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-ws3TJXal.js → MobileBridge-CRuxLRJw.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-CGwVfeTv.js → MobileProjects-B1CQIAGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BtJjJJpl.js → Mtc-CFhXZbPk.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BNZwipXs.js → MtcAudit-C69LqcZ5.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-9mSOrKWA.js → Multisig-y7yZeTTG.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-gz1lEDED.js → NLProgramming-DgjhoWea.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BeufuOVX.js → Notes-DRc2WTDh.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-CbFyi9jZ.js → NotificationSettings-CLPx24yn.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-CMSNA4CO.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-DKBKNViH.js → Organization-Dm6LIyhZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{Overflow-CvPfKE1x.js → Overflow-DP4DOYd-.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DjL2q8og.js → P2P-HFwvtFI1.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-D9gPfKRM.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-BUoNho3w.js → Permissions-Bdtxniwh.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-C4Iu2Pic.js → PersonalDataHub-Dgl2AbES.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-BiDrIlwr.js → Pipeline-DpZrzYwK.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BnvU6vGp.js → Privacy-EQ551c0t.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DDzoyhnH.js → ProjectInit-xUSeczsM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CV6b43H0.js → ProjectSettings-B66Sr_t8.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B0k1907g.js → Projects-B4zikj95.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DaeuFo-x.js → Providers-DjLbqQPh.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-C03Bll1h.js → QrScannerModal-KVsAQCd_.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-Cn9nLaen.js → QuickAsk-C4noJXu8.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXfkC8Ts.js → Recommend-Cn15clqY.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DNj6D_LI.js → RemoteSession-DdonMFwH.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-DDDIwiUI.js → Reputation-Bqe3NwWN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-JukNm-id.js → Row-CnxBgjkD.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-B1AhzL2z.js → RssFeed-CSRrgZyK.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-B5y6_DVm.js → Search-DTUYUfFx.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-C2pvv32x.js → Security-BHExHVIm.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-DBka7ppY.js → Services-B_IWqPes.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DfPwNTSh.js → Skeleton-C_oAtzmX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Cs4ntp-l.js → Skills-maJNokSL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CrUJ0guM.js → Sla-CMM_ZsLH.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BFbokLV1.js → SpeechSettings-D7w_oNwK.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-CSnh1o3D.js → SyncSettings-D0Zl3NIr.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CQZppIPo.js → Tasks-Bs0H0ctR.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BqLeHq7Z.js → Templates-C6T6oCpR.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CkzPA-ri.js → Tenant-ByL-kAYO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-D5IRhnu6.js → Terminal-6JXNhc3b.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-ICdiYzgz.js → TimelineRenderer-KiuUtCsl.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-89CaZBwe.js → Tokens-C0TWTIER.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Di251qR1.js → Trigger-DpC5aaJu.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-M4sC3Mv6.js → Trust-lqqflCwv.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-BL7EUWxj.js → UkeySign-BYSlVfBc.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BV5Se5il.js → VideoEditing-DX08oo_R.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-IoY13rov.js → Wallet-CcIFPvzL.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DKFPq0uV.js → WebAuthn-D8DfxfVT.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-oizkYeQD.js → WorkflowEditor-Csadpaln.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Du6ZthE5.js → chat-CewHWc_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-I2ie73HS.js → colors-B8at89r3.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-C-02XOOx.js → compact-item-v_gxtF5-.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DgP09zg2.js → createContext-BOwFpJqA.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DenB_kSS.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-kWDasRib.js → hasIn-DjHUzt7E.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-HH3Zccc0.js → index-1Tfwr_GA.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-M9mzJo6V.js → index-5qmLo1us.js} +1 -1
  100. package/src/assets/web-panel/assets/index-B8bNwM9U.js +1 -0
  101. package/src/assets/web-panel/assets/{index-CDM6OO4D.js → index-BC20EQ7h.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cokjvq67.js → index-BGrmPk8T.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-5Ll5Fdqb.js → index-BPJ7uL2Q.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-H_31JkaZ.js → index-BRNyE3Kb.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D9HwtJX5.js → index-BVPsegMN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Bpz5RnQy.js → index-B_egGFcR.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-CjuJ1FYZ.js → index-BdZLA7k9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cx5dAdFu.js → index-Bk_Te9OR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CHSghc3j.js → index-Bz8C8VXx.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-RwcHDSqP.js → index-C7MHbmwn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CtbMRqD-.js → index-CFL1Hewx.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D0EQSoEb.js → index-CV1SgaBd.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C3D5NSjS.js → index-CXIPAeAB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BZ6bWk4x.js → index-Ca8YZU2B.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AtAiEmjM.js → index-Caf9UjhG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DKJ-d5F1.js → index-Cb1uNDOv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-mF8UmKqp.js → index-CquUCUzS.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CpOQeTac.js → index-CwHoF-TP.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Na5QA1LE.js → index-Cxk0mCoQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BUvpjPMv.js → index-D3o-pacB.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BZcdP3id.js → index-DA3n0Y28.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DC0cpgIP.js +1 -0
  123. package/src/assets/web-panel/assets/{index-LLQQqj9B.js → index-DRRK_8Eg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D5LV04FO.js → index-DUMvVGyf.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BkcCllZ7.js → index-DdHdbXpy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-OYyn8GoU.js → index-Ddw05Myq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CgogPjKJ.js → index-Dfrb3Prv.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CbHEQTU6.js → index-DiKaYIdo.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CQCdk4dn.js → index-DmZLZsyC.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-uHI8QHu4.js → index-FgUrhq_H.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-I4A_y2Ee.js → index-Khw7wzVk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BSlTGxUJ.js → index-San3zacc.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BYxia8nl.js → index-coOi37of.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CkP2DW3a.js → index-hyeBuocp.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Ryflob2W.js → index-uk59xr0W.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DcVj7YJB.js → index-wjvn8-9F.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BPHGo-UX.js → initDefaultProps-Id2dFdjh.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BBr8JvWc.js → motion-DRxtwxng.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CdKWToz7.js → move-BDYvdTb6.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-B8tkkKBs.js → mtc-parser-cz8LGI8Z.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DN4aP33H.js → omit-DHJeh6tH.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CoHRkRJq.js → pickAttrs-XJEQIp7e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DpGGGAPa.js → placementArrow-AFcf8lEn.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-BabRsZo5.js → responsiveObserve-CDEeBxs1.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DJjyrwqK.js → slide-CvbVfi6T.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BaRVkO5S.js → statusUtils-DtCyuEnq.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-HcMYUjTR.js → styleChecker--UgmTsGY.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-c3IBzp2l.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-DD7igwyF.js → useFs-CJx3zw01.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-GEF0hhnd.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-D51u7zqF.js → vnode-B2RGEQG4.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-tXG23Lc9.js → zoom-ob-0px2z.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/evolution-attestor-trust.js +113 -0
  156. package/src/commands/evolution.js +2 -0
  157. package/src/commands/learning.js +34 -5
  158. package/src/data/changelog.json +13 -0
  159. package/src/lib/evolution/evolution-artifact-ports.js +21 -0
  160. package/src/lib/evolution/evolution-deployment-loader.js +56 -0
  161. package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
  162. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
  163. package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
  164. package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
  165. package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
  166. package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
  167. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
  168. package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
  169. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
  170. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
  171. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
  172. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
  173. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
  174. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
  175. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
  176. package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
  177. package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
  178. package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
  179. package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
  180. package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
  181. package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
  182. package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
  183. package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
  184. package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
  185. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
  186. package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
  187. package/src/lib/hook-audit-store.js +68 -2
  188. package/src/lib/hooks-v2-runtime.js +52 -26
  189. package/src/lib/learning/skill-synthesizer.js +66 -5
  190. package/src/lib/remote-read-loop-guard.js +30 -3
  191. package/src/assets/web-panel/assets/MarkdownRenderer-DnSfkf98.js +0 -1
  192. package/src/assets/web-panel/assets/OrderTableRenderer-CFbhBT44.js +0 -1
  193. package/src/assets/web-panel/assets/PdhVaultBrowser-Cv9PLMWJ.js +0 -7
  194. package/src/assets/web-panel/assets/devWarning-CxKkOIjh.js +0 -1
  195. package/src/assets/web-panel/assets/index-b5a6l3Uu.js +0 -1
  196. package/src/assets/web-panel/assets/index-xt-BOyp_.js +0 -1
@@ -0,0 +1,812 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
3
+
4
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_STORE_SCHEMA =
5
+ "chainlesschain.evolution-immutable-ledger-segment-store/v1";
6
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_PROOF_VERIFIER_SCHEMA =
7
+ "chainlesschain.evolution-immutable-ledger-segment-proof-verifier/v1";
8
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RETAIN_REQUEST_SCHEMA =
9
+ "chainlesschain.evolution-immutable-ledger-segment-retain-request/v1";
10
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLVE_REQUEST_SCHEMA =
11
+ "chainlesschain.evolution-immutable-ledger-segment-resolve-request/v1";
12
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLUTION_SCHEMA =
13
+ "chainlesschain.evolution-immutable-ledger-segment-resolution/v1";
14
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RETENTION_PROOF_SCHEMA =
15
+ "chainlesschain.evolution-immutable-ledger-segment-retention-proof/v1";
16
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RECEIPT_SCHEMA =
17
+ "chainlesschain.evolution-immutable-ledger-segment-receipt/v1";
18
+
19
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE =
20
+ "CC_EVOLUTION_LEDGER_IMMUTABLE_STORE_INVALID";
21
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_UNAVAILABLE_CODE =
22
+ "CC_EVOLUTION_LEDGER_IMMUTABLE_STORE_UNAVAILABLE";
23
+ export const EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE =
24
+ "CC_EVOLUTION_LEDGER_IMMUTABLE_STORE_CORRUPT";
25
+
26
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
27
+ const MAX_SEGMENT_BYTES = 64 * 1024 * 1024;
28
+ const RETENTION_MODES = new Set(["compliance", "legal-hold"]);
29
+ const STORES = new WeakSet();
30
+ const VERIFIERS = new WeakSet();
31
+
32
+ const DESCRIPTOR_KEYS = new Set([
33
+ "authorityId",
34
+ "authorityRevision",
35
+ "epoch",
36
+ "handlerArtifactDigest",
37
+ "immutabilityMode",
38
+ "ledgerId",
39
+ "proofAlgorithm",
40
+ "tenantId",
41
+ ]);
42
+ const VERIFIER_DESCRIPTOR_KEYS = new Set([
43
+ "authorityId",
44
+ "authorityRevision",
45
+ "proofAlgorithm",
46
+ "verifierArtifactDigest",
47
+ ]);
48
+ const STORE_CONFIG_KEYS = new Set(["backend", "descriptor", "proofVerifier"]);
49
+ const VERIFIER_CONFIG_KEYS = new Set(["descriptor", "verify"]);
50
+ const RETAIN_INPUT_KEYS = new Set([
51
+ "bytes",
52
+ "minimumRetainedUntil",
53
+ "sequenceEnd",
54
+ "sequenceStart",
55
+ ]);
56
+ const RESOLVE_INPUT_KEYS = new Set([
57
+ "contentDigest",
58
+ "minimumRetainedUntil",
59
+ "segmentRef",
60
+ "sequenceEnd",
61
+ "sequenceStart",
62
+ "storageVersion",
63
+ ]);
64
+ const PROOF_KEYS = new Set([
65
+ "authorityId",
66
+ "authorityRevision",
67
+ "contentDigest",
68
+ "epoch",
69
+ "issuedAt",
70
+ "ledgerId",
71
+ "proofAlgorithm",
72
+ "proofDigest",
73
+ "retainedUntil",
74
+ "retentionMode",
75
+ "schema",
76
+ "segmentRef",
77
+ "sequenceEnd",
78
+ "sequenceStart",
79
+ "signature",
80
+ "storageVersion",
81
+ "tenantId",
82
+ ]);
83
+ const RESOLUTION_KEYS = new Set(["bytes", "found", "proof", "schema"]);
84
+
85
+ export class EvolutionImmutableLedgerSegmentStoreError extends Error {
86
+ constructor(code, message, options = undefined) {
87
+ super(message, options);
88
+ this.name = "EvolutionImmutableLedgerSegmentStoreError";
89
+ this.code = code;
90
+ }
91
+ }
92
+
93
+ function failure(code, message, options = undefined) {
94
+ return new EvolutionImmutableLedgerSegmentStoreError(code, message, options);
95
+ }
96
+
97
+ function rejectProxy(
98
+ value,
99
+ label,
100
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
101
+ ) {
102
+ if (
103
+ (typeof value === "object" && value !== null) ||
104
+ typeof value === "function"
105
+ ) {
106
+ if (utilTypes.isProxy(value))
107
+ throw failure(code, `${label} must not be a Proxy`);
108
+ }
109
+ }
110
+
111
+ function exactRecord(
112
+ value,
113
+ keys,
114
+ label,
115
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
116
+ ) {
117
+ rejectProxy(value, label, code);
118
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
119
+ throw failure(code, `${label} must be a record`);
120
+ }
121
+ const prototype = Object.getPrototypeOf(value);
122
+ if (prototype !== Object.prototype && prototype !== null) {
123
+ throw failure(code, `${label} must use a plain prototype`);
124
+ }
125
+ const descriptors = Object.getOwnPropertyDescriptors(value);
126
+ const names = Object.keys(descriptors);
127
+ if (names.length !== keys.size || names.some((name) => !keys.has(name))) {
128
+ throw failure(code, `${label} fields are invalid`);
129
+ }
130
+ for (const name of names) {
131
+ if (!("value" in descriptors[name])) {
132
+ throw failure(code, `${label}.${name} must be an own data property`);
133
+ }
134
+ }
135
+ return descriptors;
136
+ }
137
+
138
+ function data(descriptors, key) {
139
+ return descriptors[key].value;
140
+ }
141
+
142
+ function identifier(
143
+ value,
144
+ label,
145
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
146
+ ) {
147
+ if (
148
+ typeof value !== "string" ||
149
+ value.trim() !== value ||
150
+ value.length < 1 ||
151
+ value.length > 512 ||
152
+ value.includes("\0")
153
+ ) {
154
+ throw failure(code, `${label} is invalid`);
155
+ }
156
+ return value;
157
+ }
158
+
159
+ function digest(
160
+ value,
161
+ label,
162
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
163
+ ) {
164
+ if (!DIGEST.test(value || ""))
165
+ throw failure(code, `${label} must be sha256-bound`);
166
+ return value;
167
+ }
168
+
169
+ function positiveInteger(
170
+ value,
171
+ label,
172
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
173
+ ) {
174
+ if (!Number.isSafeInteger(value) || value < 1) {
175
+ throw failure(code, `${label} must be a positive safe integer`);
176
+ }
177
+ return value;
178
+ }
179
+
180
+ function instant(
181
+ value,
182
+ label,
183
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
184
+ ) {
185
+ if (typeof value !== "string")
186
+ throw failure(code, `${label} must be an ISO instant`);
187
+ const timestamp = Date.parse(value);
188
+ if (
189
+ !Number.isFinite(timestamp) ||
190
+ new Date(timestamp).toISOString() !== value
191
+ ) {
192
+ throw failure(code, `${label} must be a canonical ISO instant`);
193
+ }
194
+ return Object.freeze({ timestamp, value });
195
+ }
196
+
197
+ function copyBytes(value, label, code) {
198
+ rejectProxy(value, label, code);
199
+ if (
200
+ !Buffer.isBuffer(value) ||
201
+ Object.getPrototypeOf(value) !== Buffer.prototype
202
+ ) {
203
+ throw failure(code, `${label} must be a safe Buffer`);
204
+ }
205
+ if (value.byteLength < 1 || value.byteLength > MAX_SEGMENT_BYTES) {
206
+ throw failure(code, `${label} size is outside the segment bound`);
207
+ }
208
+ return Buffer.from(value);
209
+ }
210
+
211
+ function sha256(bytes) {
212
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
213
+ }
214
+
215
+ function canonical(value) {
216
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
217
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
218
+ return `{${Object.keys(value)
219
+ .sort()
220
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
221
+ .join(",")}}`;
222
+ }
223
+
224
+ function proofPayload(proof) {
225
+ return {
226
+ authorityId: proof.authorityId,
227
+ authorityRevision: proof.authorityRevision,
228
+ contentDigest: proof.contentDigest,
229
+ epoch: proof.epoch,
230
+ issuedAt: proof.issuedAt,
231
+ ledgerId: proof.ledgerId,
232
+ proofAlgorithm: proof.proofAlgorithm,
233
+ retainedUntil: proof.retainedUntil,
234
+ retentionMode: proof.retentionMode,
235
+ schema: proof.schema,
236
+ segmentRef: proof.segmentRef,
237
+ sequenceEnd: proof.sequenceEnd,
238
+ sequenceStart: proof.sequenceStart,
239
+ storageVersion: proof.storageVersion,
240
+ tenantId: proof.tenantId,
241
+ };
242
+ }
243
+
244
+ export function computeImmutableLedgerSegmentProofDigest(proof) {
245
+ const normalized = normalizeProof(proof, { verifyDigest: false });
246
+ return sha256(Buffer.from(canonical(proofPayload(normalized)), "utf8"));
247
+ }
248
+
249
+ function storeDescriptor(value) {
250
+ const fields = exactRecord(
251
+ value,
252
+ DESCRIPTOR_KEYS,
253
+ "immutable segment store descriptor",
254
+ );
255
+ if (data(fields, "immutabilityMode") !== "external-retention-authority") {
256
+ throw failure(
257
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
258
+ "immutable segment store must use an external retention authority",
259
+ );
260
+ }
261
+ return Object.freeze({
262
+ authorityId: identifier(
263
+ data(fields, "authorityId"),
264
+ "descriptor.authorityId",
265
+ ),
266
+ authorityRevision: positiveInteger(
267
+ data(fields, "authorityRevision"),
268
+ "descriptor.authorityRevision",
269
+ ),
270
+ epoch: identifier(data(fields, "epoch"), "descriptor.epoch"),
271
+ handlerArtifactDigest: digest(
272
+ data(fields, "handlerArtifactDigest"),
273
+ "descriptor.handlerArtifactDigest",
274
+ ),
275
+ immutabilityMode: "external-retention-authority",
276
+ ledgerId: identifier(data(fields, "ledgerId"), "descriptor.ledgerId"),
277
+ proofAlgorithm: identifier(
278
+ data(fields, "proofAlgorithm"),
279
+ "descriptor.proofAlgorithm",
280
+ ),
281
+ tenantId: identifier(data(fields, "tenantId"), "descriptor.tenantId"),
282
+ });
283
+ }
284
+
285
+ function verifierDescriptor(value) {
286
+ const fields = exactRecord(
287
+ value,
288
+ VERIFIER_DESCRIPTOR_KEYS,
289
+ "immutable segment proof verifier descriptor",
290
+ );
291
+ return Object.freeze({
292
+ authorityId: identifier(
293
+ data(fields, "authorityId"),
294
+ "verifier.authorityId",
295
+ ),
296
+ authorityRevision: positiveInteger(
297
+ data(fields, "authorityRevision"),
298
+ "verifier.authorityRevision",
299
+ ),
300
+ proofAlgorithm: identifier(
301
+ data(fields, "proofAlgorithm"),
302
+ "verifier.proofAlgorithm",
303
+ ),
304
+ verifierArtifactDigest: digest(
305
+ data(fields, "verifierArtifactDigest"),
306
+ "verifier.verifierArtifactDigest",
307
+ ),
308
+ });
309
+ }
310
+
311
+ function ownCallable(owner, name, label) {
312
+ rejectProxy(owner, label);
313
+ if (!owner || typeof owner !== "object") {
314
+ throw failure(
315
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
316
+ `${label} must be a record`,
317
+ );
318
+ }
319
+ const descriptor = Object.getOwnPropertyDescriptor(owner, name);
320
+ if (!descriptor || !("value" in descriptor)) {
321
+ throw failure(
322
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
323
+ `${label}.${name} must be an own data method`,
324
+ );
325
+ }
326
+ rejectProxy(descriptor.value, `${label}.${name}`);
327
+ if (typeof descriptor.value !== "function") {
328
+ throw failure(
329
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
330
+ `${label}.${name} must be a function`,
331
+ );
332
+ }
333
+ return Object.freeze((request) =>
334
+ Reflect.apply(descriptor.value, owner, [request]),
335
+ );
336
+ }
337
+
338
+ function synchronous(
339
+ value,
340
+ label,
341
+ code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_UNAVAILABLE_CODE,
342
+ ) {
343
+ rejectProxy(value, label, code);
344
+ if (utilTypes.isPromise(value)) {
345
+ throw failure(code, `${label} must be synchronous`);
346
+ }
347
+ return value;
348
+ }
349
+
350
+ function normalizeProof(value, { verifyDigest = true } = {}) {
351
+ const code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE;
352
+ const fields = exactRecord(
353
+ value,
354
+ PROOF_KEYS,
355
+ "immutable segment retention proof",
356
+ code,
357
+ );
358
+ if (
359
+ data(fields, "schema") !==
360
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RETENTION_PROOF_SCHEMA
361
+ ) {
362
+ throw failure(code, "immutable segment retention proof schema is invalid");
363
+ }
364
+ const issuedAt = instant(data(fields, "issuedAt"), "proof.issuedAt", code);
365
+ const retainedUntil = instant(
366
+ data(fields, "retainedUntil"),
367
+ "proof.retainedUntil",
368
+ code,
369
+ );
370
+ if (retainedUntil.timestamp <= issuedAt.timestamp) {
371
+ throw failure(
372
+ code,
373
+ "immutable segment retention proof has expired retention",
374
+ );
375
+ }
376
+ const retentionMode = data(fields, "retentionMode");
377
+ if (!RETENTION_MODES.has(retentionMode)) {
378
+ throw failure(code, "immutable segment retention mode is invalid");
379
+ }
380
+ const normalized = Object.freeze({
381
+ authorityId: identifier(
382
+ data(fields, "authorityId"),
383
+ "proof.authorityId",
384
+ code,
385
+ ),
386
+ authorityRevision: positiveInteger(
387
+ data(fields, "authorityRevision"),
388
+ "proof.authorityRevision",
389
+ code,
390
+ ),
391
+ contentDigest: digest(
392
+ data(fields, "contentDigest"),
393
+ "proof.contentDigest",
394
+ code,
395
+ ),
396
+ epoch: identifier(data(fields, "epoch"), "proof.epoch", code),
397
+ issuedAt: issuedAt.value,
398
+ ledgerId: identifier(data(fields, "ledgerId"), "proof.ledgerId", code),
399
+ proofAlgorithm: identifier(
400
+ data(fields, "proofAlgorithm"),
401
+ "proof.proofAlgorithm",
402
+ code,
403
+ ),
404
+ proofDigest: digest(data(fields, "proofDigest"), "proof.proofDigest", code),
405
+ retainedUntil: retainedUntil.value,
406
+ retentionMode,
407
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RETENTION_PROOF_SCHEMA,
408
+ segmentRef: digest(data(fields, "segmentRef"), "proof.segmentRef", code),
409
+ sequenceEnd: positiveInteger(
410
+ data(fields, "sequenceEnd"),
411
+ "proof.sequenceEnd",
412
+ code,
413
+ ),
414
+ sequenceStart: positiveInteger(
415
+ data(fields, "sequenceStart"),
416
+ "proof.sequenceStart",
417
+ code,
418
+ ),
419
+ signature: identifier(data(fields, "signature"), "proof.signature", code),
420
+ storageVersion: identifier(
421
+ data(fields, "storageVersion"),
422
+ "proof.storageVersion",
423
+ code,
424
+ ),
425
+ tenantId: identifier(data(fields, "tenantId"), "proof.tenantId", code),
426
+ });
427
+ if (normalized.sequenceEnd < normalized.sequenceStart) {
428
+ throw failure(code, "immutable segment proof sequence range is invalid");
429
+ }
430
+ if (normalized.segmentRef !== normalized.contentDigest) {
431
+ throw failure(code, "immutable segment reference is not content-addressed");
432
+ }
433
+ if (
434
+ verifyDigest &&
435
+ computeImmutableLedgerSegmentProofDigest(normalized) !==
436
+ normalized.proofDigest
437
+ ) {
438
+ throw failure(code, "immutable segment proof digest is invalid");
439
+ }
440
+ return normalized;
441
+ }
442
+
443
+ function assertProofBinding(proof, expected, descriptor) {
444
+ const code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE;
445
+ for (const [field, value] of Object.entries({
446
+ authorityId: descriptor.authorityId,
447
+ authorityRevision: descriptor.authorityRevision,
448
+ contentDigest: expected.contentDigest,
449
+ epoch: descriptor.epoch,
450
+ ledgerId: descriptor.ledgerId,
451
+ proofAlgorithm: descriptor.proofAlgorithm,
452
+ segmentRef: expected.segmentRef,
453
+ sequenceEnd: expected.sequenceEnd,
454
+ sequenceStart: expected.sequenceStart,
455
+ tenantId: descriptor.tenantId,
456
+ })) {
457
+ if (proof[field] !== value)
458
+ throw failure(code, `immutable segment proof ${field} binding differs`);
459
+ }
460
+ if (
461
+ expected.storageVersion !== undefined &&
462
+ proof.storageVersion !== expected.storageVersion
463
+ ) {
464
+ throw failure(
465
+ code,
466
+ "immutable segment proof storageVersion binding differs",
467
+ );
468
+ }
469
+ if (
470
+ Date.parse(proof.retainedUntil) < Date.parse(expected.minimumRetainedUntil)
471
+ ) {
472
+ throw failure(
473
+ code,
474
+ "immutable segment retention is shorter than requested",
475
+ );
476
+ }
477
+ }
478
+
479
+ function verifyProof(verifier, proof) {
480
+ let verified;
481
+ try {
482
+ verified = synchronous(
483
+ verifier.verify(proof),
484
+ "immutable segment proof verification",
485
+ );
486
+ } catch (cause) {
487
+ if (cause instanceof EvolutionImmutableLedgerSegmentStoreError) throw cause;
488
+ throw failure(
489
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_UNAVAILABLE_CODE,
490
+ "immutable segment proof verifier failed",
491
+ { cause },
492
+ );
493
+ }
494
+ if (verified !== true) {
495
+ throw failure(
496
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE,
497
+ "immutable segment proof signature was rejected",
498
+ );
499
+ }
500
+ }
501
+
502
+ function retainRequest(input, descriptor) {
503
+ const fields = exactRecord(
504
+ input,
505
+ RETAIN_INPUT_KEYS,
506
+ "immutable segment retain request",
507
+ );
508
+ const bytes = copyBytes(
509
+ data(fields, "bytes"),
510
+ "immutable segment retain bytes",
511
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
512
+ );
513
+ const sequenceStart = positiveInteger(
514
+ data(fields, "sequenceStart"),
515
+ "request.sequenceStart",
516
+ );
517
+ const sequenceEnd = positiveInteger(
518
+ data(fields, "sequenceEnd"),
519
+ "request.sequenceEnd",
520
+ );
521
+ if (sequenceEnd < sequenceStart) {
522
+ throw failure(
523
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
524
+ "segment sequence range is invalid",
525
+ );
526
+ }
527
+ const minimumRetainedUntil = instant(
528
+ data(fields, "minimumRetainedUntil"),
529
+ "request.minimumRetainedUntil",
530
+ ).value;
531
+ const contentDigest = sha256(bytes);
532
+ return Object.freeze({
533
+ bytes,
534
+ contentDigest,
535
+ epoch: descriptor.epoch,
536
+ ledgerId: descriptor.ledgerId,
537
+ minimumRetainedUntil,
538
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RETAIN_REQUEST_SCHEMA,
539
+ segmentRef: contentDigest,
540
+ sequenceEnd,
541
+ sequenceStart,
542
+ tenantId: descriptor.tenantId,
543
+ });
544
+ }
545
+
546
+ function resolveRequest(input, descriptor) {
547
+ const fields = exactRecord(
548
+ input,
549
+ RESOLVE_INPUT_KEYS,
550
+ "immutable segment resolve request",
551
+ );
552
+ const contentDigest = digest(
553
+ data(fields, "contentDigest"),
554
+ "request.contentDigest",
555
+ );
556
+ const segmentRef = digest(data(fields, "segmentRef"), "request.segmentRef");
557
+ if (segmentRef !== contentDigest) {
558
+ throw failure(
559
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
560
+ "segment resolve reference is not content-addressed",
561
+ );
562
+ }
563
+ const sequenceStart = positiveInteger(
564
+ data(fields, "sequenceStart"),
565
+ "request.sequenceStart",
566
+ );
567
+ const sequenceEnd = positiveInteger(
568
+ data(fields, "sequenceEnd"),
569
+ "request.sequenceEnd",
570
+ );
571
+ if (sequenceEnd < sequenceStart) {
572
+ throw failure(
573
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
574
+ "segment sequence range is invalid",
575
+ );
576
+ }
577
+ return Object.freeze({
578
+ contentDigest,
579
+ epoch: descriptor.epoch,
580
+ ledgerId: descriptor.ledgerId,
581
+ minimumRetainedUntil: instant(
582
+ data(fields, "minimumRetainedUntil"),
583
+ "request.minimumRetainedUntil",
584
+ ).value,
585
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLVE_REQUEST_SCHEMA,
586
+ segmentRef,
587
+ sequenceEnd,
588
+ sequenceStart,
589
+ storageVersion: identifier(
590
+ data(fields, "storageVersion"),
591
+ "request.storageVersion",
592
+ ),
593
+ tenantId: descriptor.tenantId,
594
+ });
595
+ }
596
+
597
+ function normalizeResolution(value, expected, descriptor, verifier) {
598
+ const code = EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE;
599
+ const fields = exactRecord(
600
+ value,
601
+ RESOLUTION_KEYS,
602
+ "immutable segment resolution",
603
+ code,
604
+ );
605
+ if (
606
+ data(fields, "schema") !==
607
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLUTION_SCHEMA
608
+ ) {
609
+ throw failure(code, "immutable segment resolution schema is invalid");
610
+ }
611
+ if (data(fields, "found") !== true) {
612
+ throw failure(code, "immutable segment is missing");
613
+ }
614
+ const bytes = copyBytes(
615
+ data(fields, "bytes"),
616
+ "immutable segment resolution bytes",
617
+ code,
618
+ );
619
+ if (sha256(bytes) !== expected.contentDigest) {
620
+ throw failure(code, "immutable segment resolved substituted bytes");
621
+ }
622
+ const proof = normalizeProof(data(fields, "proof"));
623
+ assertProofBinding(proof, expected, descriptor);
624
+ verifyProof(verifier, proof);
625
+ return Object.freeze({
626
+ authenticated: true,
627
+ bytes,
628
+ immutable: true,
629
+ proof,
630
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLUTION_SCHEMA,
631
+ });
632
+ }
633
+
634
+ export function createImmutableLedgerSegmentProofVerifier(options = undefined) {
635
+ const fields = exactRecord(
636
+ options,
637
+ VERIFIER_CONFIG_KEYS,
638
+ "immutable segment proof verifier configuration",
639
+ );
640
+ const normalizedDescriptor = verifierDescriptor(data(fields, "descriptor"));
641
+ const verify = data(fields, "verify");
642
+ rejectProxy(verify, "immutable segment proof verifier");
643
+ if (typeof verify !== "function") {
644
+ throw failure(
645
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
646
+ "immutable segment proof verifier function is required",
647
+ );
648
+ }
649
+ const verifier = Object.freeze({
650
+ descriptor: normalizedDescriptor,
651
+ verify: Object.freeze((proof) => Reflect.apply(verify, undefined, [proof])),
652
+ });
653
+ VERIFIERS.add(verifier);
654
+ return verifier;
655
+ }
656
+
657
+ export function captureImmutableLedgerSegmentProofVerifier(value) {
658
+ if (!VERIFIERS.has(value)) {
659
+ throw new TypeError(
660
+ "a branded immutable ledger segment proof verifier is required",
661
+ );
662
+ }
663
+ return value;
664
+ }
665
+
666
+ export function createImmutableLedgerSegmentStorePort(options = undefined) {
667
+ const fields = exactRecord(
668
+ options,
669
+ STORE_CONFIG_KEYS,
670
+ "immutable segment store configuration",
671
+ );
672
+ const backend = data(fields, "backend");
673
+ const normalizedDescriptor = storeDescriptor(data(fields, "descriptor"));
674
+ const verifier = captureImmutableLedgerSegmentProofVerifier(
675
+ data(fields, "proofVerifier"),
676
+ );
677
+ for (const field of ["authorityId", "authorityRevision", "proofAlgorithm"]) {
678
+ if (verifier.descriptor[field] !== normalizedDescriptor[field]) {
679
+ throw failure(
680
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
681
+ `immutable segment verifier ${field} binding differs`,
682
+ );
683
+ }
684
+ }
685
+ const retainBackend = ownCallable(
686
+ backend,
687
+ "retain",
688
+ "immutable segment backend",
689
+ );
690
+ const resolveBackend = ownCallable(
691
+ backend,
692
+ "resolve",
693
+ "immutable segment backend",
694
+ );
695
+
696
+ const resolveNormalized = (request) => {
697
+ let result;
698
+ try {
699
+ result = synchronous(
700
+ resolveBackend(request),
701
+ "immutable segment backend resolve result",
702
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE,
703
+ );
704
+ } catch (cause) {
705
+ if (cause instanceof EvolutionImmutableLedgerSegmentStoreError)
706
+ throw cause;
707
+ throw failure(
708
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_UNAVAILABLE_CODE,
709
+ "immutable segment backend resolve failed",
710
+ { cause },
711
+ );
712
+ }
713
+ return normalizeResolution(result, request, normalizedDescriptor, verifier);
714
+ };
715
+
716
+ const port = Object.freeze({
717
+ descriptor: Object.freeze({
718
+ ...normalizedDescriptor,
719
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_STORE_SCHEMA,
720
+ verifierArtifactDigest: verifier.descriptor.verifierArtifactDigest,
721
+ }),
722
+ resolve(input) {
723
+ return resolveNormalized(resolveRequest(input, normalizedDescriptor));
724
+ },
725
+ retain(input) {
726
+ const request = retainRequest(input, normalizedDescriptor);
727
+ let rawProof;
728
+ try {
729
+ rawProof = synchronous(
730
+ retainBackend(request),
731
+ "immutable segment backend retain result",
732
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE,
733
+ );
734
+ } catch (cause) {
735
+ if (cause instanceof EvolutionImmutableLedgerSegmentStoreError)
736
+ throw cause;
737
+ throw failure(
738
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_UNAVAILABLE_CODE,
739
+ "immutable segment backend retain failed",
740
+ { cause },
741
+ );
742
+ }
743
+ const proof = normalizeProof(rawProof);
744
+ assertProofBinding(proof, request, normalizedDescriptor);
745
+ verifyProof(verifier, proof);
746
+ const resolution = resolveNormalized(
747
+ Object.freeze({
748
+ contentDigest: request.contentDigest,
749
+ epoch: request.epoch,
750
+ ledgerId: request.ledgerId,
751
+ minimumRetainedUntil: request.minimumRetainedUntil,
752
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RESOLVE_REQUEST_SCHEMA,
753
+ segmentRef: request.segmentRef,
754
+ sequenceEnd: request.sequenceEnd,
755
+ sequenceStart: request.sequenceStart,
756
+ storageVersion: proof.storageVersion,
757
+ tenantId: request.tenantId,
758
+ }),
759
+ );
760
+ if (resolution.proof.proofDigest !== proof.proofDigest) {
761
+ throw failure(
762
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_CORRUPT_CODE,
763
+ "immutable segment readback proof differs from retained proof",
764
+ );
765
+ }
766
+ return Object.freeze({
767
+ authenticated: true,
768
+ contentDigest: request.contentDigest,
769
+ immutable: true,
770
+ proof,
771
+ readbackVerified: true,
772
+ retainedUntil: proof.retainedUntil,
773
+ schema: EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_RECEIPT_SCHEMA,
774
+ segmentRef: request.segmentRef,
775
+ sequenceEnd: request.sequenceEnd,
776
+ sequenceStart: request.sequenceStart,
777
+ storageVersion: proof.storageVersion,
778
+ });
779
+ },
780
+ });
781
+ STORES.add(port);
782
+ return port;
783
+ }
784
+
785
+ export function captureImmutableLedgerSegmentStorePort(
786
+ value,
787
+ expected = undefined,
788
+ ) {
789
+ if (!STORES.has(value)) {
790
+ throw new TypeError("a branded immutable ledger segment store is required");
791
+ }
792
+ if (expected !== undefined) {
793
+ const fields = exactRecord(
794
+ expected,
795
+ new Set(["epoch", "ledgerId", "tenantId"]),
796
+ "expected immutable segment scope",
797
+ );
798
+ for (const field of ["epoch", "ledgerId", "tenantId"]) {
799
+ if (value.descriptor[field] !== data(fields, field)) {
800
+ throw failure(
801
+ EVOLUTION_IMMUTABLE_LEDGER_SEGMENT_INVALID_CODE,
802
+ `immutable segment store ${field} scope differs`,
803
+ );
804
+ }
805
+ }
806
+ }
807
+ return value;
808
+ }
809
+
810
+ export function isImmutableLedgerSegmentStorePort(value) {
811
+ return STORES.has(value);
812
+ }