chainlesschain 0.166.37 → 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 (193) hide show
  1. package/package.json +7 -2
  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-B_Nt1Qe4.js → AIOps-qWUdiFr5.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-CHQbie4X.js → ActionButton-B_f7go3E.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-Bm9364Lw.js → Analytics-hSGFlSkB.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-DTwlIh2v.js → AppLayout-CCYGgj71.js} +3 -3
  10. package/src/assets/web-panel/assets/{Artifacts-OibP0qB4.js → Artifacts-BdS1H9gq.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-B8Fwavkg.js → Audit-Cck9IebC.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-p1Vb2K2B.js → BackgroundAgents-DZzoM_QS.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-BI3QT-wI.js → Backup-D8H_QtGu.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BW_VRWWu.js → BaseInput-CTsNF_pu.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-CUEhDQfq.js → Chat-CcEiTYY8.js} +4 -4
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-C5UVXdVE.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-URYsaaxv.js → Checkbox-BPB9NNJx.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-DJAwC80a.js → Codegen-CKKMf7jD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-DfRKFzc9.js → Col-DpSSB4Uu.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-GOkGHuly.js → Community-CfR6ikoH.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-CIMs13NC.js → Compact-CqnkGGjK.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-BE-TQIxV.js → Compliance-9IzhdVQb.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-CYmbJiWw.js → Cowork-eXsgH33N.js} +4 -4
  24. package/src/assets/web-panel/assets/{Cron-Be3OIWyM.js → Cron-DvkzHFRi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-2xB2HS2D.js → Crosschain--az9d9f7.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-B_lJO2yF.js → DID-_Eb4kpnJ.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-DnVWqUER.js → Dashboard-aDVisdXj.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-C7ZJvHVa.js → Dropdown-oQ54XzS9.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-DLevT-0F.js → EmailListRenderer-BUPdMau1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BwhQ5BRU.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BkGI-Xkq.js → Federation-Cpnb3Moe.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-BgIIbMd7.js → FormItemContext-DmsrJkeU.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-qL-qN8Nb.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BTzgrC4U.js → Git-HFG17p7Q.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-p28vdCN4.js → Governance-D5Z5c7N8.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-Cqephrur.js → Inference-DH159h74.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-C3v5Q4Zp.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-T6f0w32w.js → Logs-Gqn8hFsM.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-Dj5XPm3S.js → MarkdownRenderer-NHJaejHI.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-ClDsvHDH.js → Marketplace-BArcWifg.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C4P-_snx.js → McpTools-Q1BfBSnd.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-BZZfG6y6.js → Memory-Cz8nRL7N.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DpIv_BLs.js → MobileBridge-CRuxLRJw.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-Buz3NIQg.js → MobileProjects-B1CQIAGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-HS2PJB79.js → Mtc-CFhXZbPk.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-UmBrcU27.js → MtcAudit-C69LqcZ5.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-C00sXiZf.js → Multisig-y7yZeTTG.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Dj1ng_ph.js → NLProgramming-DgjhoWea.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-C4LEVKlk.js → Notes-DRc2WTDh.js} +4 -4
  50. package/src/assets/web-panel/assets/{NotificationSettings-BWXwnekv.js → NotificationSettings-CLPx24yn.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-CZHfK8Nn.js → OrderTableRenderer-CMSNA4CO.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-CFEtFPrV.js → Organization-Dm6LIyhZ.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DSz4MJK1.js → Overflow-DP4DOYd-.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DyTEytwG.js → P2P-HFwvtFI1.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-B5QNGLVx.js → PdhVaultBrowser-D9gPfKRM.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-wEC_X7x4.js → Permissions-Bdtxniwh.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-If5GZlGZ.js → PersonalDataHub-Dgl2AbES.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-LB4gqqmX.js → Pipeline-DpZrzYwK.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-QVLhoxcN.js → Privacy-EQ551c0t.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-FaAbTYTo.js → ProjectInit-xUSeczsM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DhMeNA21.js → ProjectSettings-B66Sr_t8.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-5L4lkWAZ.js → Projects-B4zikj95.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DhZFp8fO.js → Providers-DjLbqQPh.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BZuJ7_xi.js → QrScannerModal-KVsAQCd_.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-TXddPYYb.js → QuickAsk-C4noJXu8.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DDuXIKYt.js → Recommend-Cn15clqY.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-CDrTXImv.js → RemoteSession-DdonMFwH.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-B2xKaKzt.js → Reputation-Bqe3NwWN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-DzAjWAOX.js → Row-CnxBgjkD.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-CKH38BLF.js → RssFeed-CSRrgZyK.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-CuPqJYoQ.js → Search-DTUYUfFx.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-DmAd2hxz.js → Security-BHExHVIm.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-Bt3nljnY.js → Services-B_IWqPes.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CP7RH093.js → Skeleton-C_oAtzmX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-DKNeMBTx.js → Skills-maJNokSL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CbpM8Nrd.js → Sla-CMM_ZsLH.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DTk-vTzF.js → SpeechSettings-D7w_oNwK.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-DKiplwmc.js → SyncSettings-D0Zl3NIr.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-z-lOm8fx.js → Tasks-Bs0H0ctR.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-Rb-Q0DGX.js → Templates-C6T6oCpR.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-C2sqDUnR.js → Tenant-ByL-kAYO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-DcyzskEE.js → Terminal-6JXNhc3b.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-lg0Eam7N.js → TimelineRenderer-KiuUtCsl.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-D9USIMIA.js → Tokens-C0TWTIER.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BQpaQJ5k.js → Trigger-DpC5aaJu.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-C-Mik04s.js → Trust-lqqflCwv.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-DrnZ_o56.js → UkeySign-BYSlVfBc.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BDOsoZi0.js → VideoEditing-DX08oo_R.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-Ct_bleI7.js → Wallet-CcIFPvzL.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-B6b6FDao.js → WebAuthn-D8DfxfVT.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-ZUJMaIHr.js → WorkflowEditor-Csadpaln.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BII20OJy.js → chat-CewHWc_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DEsJRV3n.js → colors-B8at89r3.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-DoDYAzN9.js → compact-item-v_gxtF5-.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-o_nofnVW.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-CAsABTHC.js → hasIn-DjHUzt7E.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CeJSTcXw.js → index-1Tfwr_GA.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CVQSl1uY.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-CQE-WMEU.js → index-BC20EQ7h.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DciLb_Ww.js → index-BGrmPk8T.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Bqyg3PME.js → index-BPJ7uL2Q.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DU2Rpx1m.js → index-BRNyE3Kb.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CeWJqXNX.js → index-BVPsegMN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DWZNYecl.js → index-B_egGFcR.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-TSwbtCYG.js → index-BdZLA7k9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BrIIJ2s-.js → index-Bk_Te9OR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D5Fd4tdL.js → index-Bz8C8VXx.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B4SfcwZA.js → index-C7MHbmwn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Bn2ZPUXO.js → index-CFL1Hewx.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DsoFTdA2.js → index-CV1SgaBd.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B9hYHPhs.js → index-CXIPAeAB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dgt1mKby.js → index-Ca8YZU2B.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DRAA2McB.js → index-Caf9UjhG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BcYbQoY7.js → index-Cb1uNDOv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bycj011d.js → index-CquUCUzS.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BzMA6Ra3.js → index-CwHoF-TP.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Dbb34cAr.js → index-Cxk0mCoQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BxT8yTwS.js → index-D3o-pacB.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DrsAF-Ar.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-B9Z75LfA.js → index-DRRK_8Eg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-kIyLNyoF.js → index-DUMvVGyf.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DQmX_-hk.js → index-DdHdbXpy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-tCeNfxv4.js → index-Ddw05Myq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BDRh3v44.js → index-Dfrb3Prv.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Bmwo5wQG.js → index-DiKaYIdo.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C1YDdyQ1.js → index-DmZLZsyC.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dhnau6uw.js → index-FgUrhq_H.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cf3sFEoE.js → index-Khw7wzVk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-B0ApxOMw.js → index-San3zacc.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-D_CMB_wC.js → index-coOi37of.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BnbnmRqg.js → index-hyeBuocp.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DDQzBK3l.js → index-uk59xr0W.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CE2J04dA.js → index-wjvn8-9F.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-CNjeeoKE.js → initDefaultProps-Id2dFdjh.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-CBT8IZDm.js → motion-DRxtwxng.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-h1MOxjqv.js → move-BDYvdTb6.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-C_3pqNmn.js → mtc-parser-cz8LGI8Z.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-CMUnPFDk.js → omit-DHJeh6tH.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-p8_c1xq0.js → pickAttrs-XJEQIp7e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-D6O67r23.js → placementArrow-AFcf8lEn.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DquhepAK.js → responsiveObserve-CDEeBxs1.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-CZ-m6gmS.js → slide-CvbVfi6T.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-k9ejZFtd.js → statusUtils-DtCyuEnq.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-NX6_137R.js → styleChecker--UgmTsGY.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-bCqR70lP.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-2l0vSqyY.js → useFs-CJx3zw01.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-1yccm4O7.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CxQzajDo.js → vnode-B2RGEQG4.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-CrTKwFyb.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 +26 -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/devWarning-0tgDCszN.js +0 -1
  192. package/src/assets/web-panel/assets/index-CFF8XEFE.js +0 -1
  193. package/src/assets/web-panel/assets/index-DVUEISry.js +0 -1
@@ -0,0 +1,554 @@
1
+ import { types as utilTypes } from "node:util";
2
+
3
+ import { EVOLUTION_LEDGER_WITNESS_SCHEMA } from "./evolution-ledger.js";
4
+ import {
5
+ captureEvolutionLedgerManifestAuthority,
6
+ verifyEvolutionLedgerManifestHead,
7
+ verifyEvolutionLedgerSegmentManifest,
8
+ } from "./evolution-ledger-manifest-chain.js";
9
+
10
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_ADAPTER_SCHEMA =
11
+ "chainlesschain.evolution-ledger-manifest-witness-adapter/v2";
12
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_RECEIPT_SCHEMA =
13
+ "chainlesschain.evolution-ledger-manifest-witness-receipt/v2";
14
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE =
15
+ "CC_EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID";
16
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_CORRUPT_CODE =
17
+ "CC_EVOLUTION_LEDGER_MANIFEST_WITNESS_CORRUPT";
18
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_UNAVAILABLE_CODE =
19
+ "CC_EVOLUTION_LEDGER_MANIFEST_WITNESS_UNAVAILABLE";
20
+ export const EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE =
21
+ "CC_EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN";
22
+
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const ADAPTERS = new WeakSet();
25
+ const CONFIG_KEYS = new Set(["descriptor", "manifestAuthority", "witness"]);
26
+ const DESCRIPTOR_KEYS = new Set([
27
+ "epoch",
28
+ "identityDigest",
29
+ "ledgerId",
30
+ "manifestTrustKeyId",
31
+ "maximumEventsPerSegment",
32
+ "storeMarkerDigest",
33
+ "storeMarkerEntryDigest",
34
+ "storeMarkerId",
35
+ "tenantId",
36
+ "witnessTrust",
37
+ ]);
38
+ const TRUST_KEYS = new Set(["algorithm", "keyId", "trustPolicyDigest"]);
39
+ const CHECKPOINT_KEYS = new Set(["expectedWitnessDigest", "head", "manifest"]);
40
+
41
+ export class EvolutionLedgerManifestWitnessError extends Error {
42
+ constructor(code, message, options = undefined) {
43
+ super(message, options);
44
+ this.name = "EvolutionLedgerManifestWitnessError";
45
+ this.code = code;
46
+ }
47
+ }
48
+
49
+ function failure(code, message, options = undefined) {
50
+ return new EvolutionLedgerManifestWitnessError(code, message, options);
51
+ }
52
+
53
+ function rejectProxy(
54
+ value,
55
+ label,
56
+ code = EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
57
+ ) {
58
+ if (
59
+ (typeof value === "object" && value !== null) ||
60
+ typeof value === "function"
61
+ ) {
62
+ if (utilTypes.isProxy(value))
63
+ throw failure(code, `${label} must not be a Proxy`);
64
+ }
65
+ }
66
+
67
+ function exactRecord(
68
+ value,
69
+ keys,
70
+ label,
71
+ code = EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
72
+ ) {
73
+ rejectProxy(value, label, code);
74
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
75
+ throw failure(code, `${label} must be a record`);
76
+ }
77
+ const prototype = Object.getPrototypeOf(value);
78
+ if (prototype !== Object.prototype && prototype !== null) {
79
+ throw failure(code, `${label} must use a plain prototype`);
80
+ }
81
+ const fields = Object.getOwnPropertyDescriptors(value);
82
+ const names = Object.keys(fields);
83
+ if (names.length !== keys.size || names.some((name) => !keys.has(name))) {
84
+ throw failure(code, `${label} fields are invalid`);
85
+ }
86
+ for (const name of names) {
87
+ if (!("value" in fields[name])) {
88
+ throw failure(code, `${label}.${name} must be an own data property`);
89
+ }
90
+ }
91
+ return fields;
92
+ }
93
+
94
+ function data(fields, key) {
95
+ return fields[key].value;
96
+ }
97
+
98
+ function identifier(
99
+ value,
100
+ label,
101
+ code = EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
102
+ ) {
103
+ if (
104
+ typeof value !== "string" ||
105
+ value.trim() !== value ||
106
+ value.length < 1 ||
107
+ value.length > 512 ||
108
+ value.includes("\0")
109
+ ) {
110
+ throw failure(code, `${label} is invalid`);
111
+ }
112
+ return value;
113
+ }
114
+
115
+ function digest(
116
+ value,
117
+ label,
118
+ code = EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
119
+ ) {
120
+ if (!DIGEST.test(value || ""))
121
+ throw failure(code, `${label} must be sha256-bound`);
122
+ return value;
123
+ }
124
+
125
+ function scope(value) {
126
+ const fields = exactRecord(
127
+ value,
128
+ DESCRIPTOR_KEYS,
129
+ "manifest witness descriptor",
130
+ );
131
+ const maximumEventsPerSegment = data(fields, "maximumEventsPerSegment");
132
+ if (
133
+ !Number.isSafeInteger(maximumEventsPerSegment) ||
134
+ maximumEventsPerSegment < 1 ||
135
+ maximumEventsPerSegment > 1024
136
+ ) {
137
+ throw failure(
138
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
139
+ "descriptor.maximumEventsPerSegment is invalid",
140
+ );
141
+ }
142
+ const trustFields = exactRecord(
143
+ data(fields, "witnessTrust"),
144
+ TRUST_KEYS,
145
+ "descriptor.witnessTrust",
146
+ );
147
+ const witnessTrust = Object.freeze({
148
+ algorithm: identifier(
149
+ data(trustFields, "algorithm"),
150
+ "witnessTrust.algorithm",
151
+ ),
152
+ keyId: identifier(data(trustFields, "keyId"), "witnessTrust.keyId"),
153
+ trustPolicyDigest: digest(
154
+ data(trustFields, "trustPolicyDigest"),
155
+ "witnessTrust.trustPolicyDigest",
156
+ ),
157
+ });
158
+ const manifestTrustKeyId = identifier(
159
+ data(fields, "manifestTrustKeyId"),
160
+ "descriptor.manifestTrustKeyId",
161
+ );
162
+ if (manifestTrustKeyId === witnessTrust.keyId) {
163
+ throw failure(
164
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
165
+ "manifest and witness trust key identities must be independent",
166
+ );
167
+ }
168
+ return Object.freeze({
169
+ epoch: identifier(data(fields, "epoch"), "descriptor.epoch"),
170
+ identityDigest: digest(
171
+ data(fields, "identityDigest"),
172
+ "descriptor.identityDigest",
173
+ ),
174
+ ledgerId: identifier(data(fields, "ledgerId"), "descriptor.ledgerId"),
175
+ manifestTrustKeyId,
176
+ maximumEventsPerSegment,
177
+ storeMarkerDigest: digest(
178
+ data(fields, "storeMarkerDigest"),
179
+ "descriptor.storeMarkerDigest",
180
+ ),
181
+ storeMarkerEntryDigest: digest(
182
+ data(fields, "storeMarkerEntryDigest"),
183
+ "descriptor.storeMarkerEntryDigest",
184
+ ),
185
+ storeMarkerId: identifier(
186
+ data(fields, "storeMarkerId"),
187
+ "descriptor.storeMarkerId",
188
+ ),
189
+ tenantId: identifier(data(fields, "tenantId"), "descriptor.tenantId"),
190
+ witnessTrust,
191
+ });
192
+ }
193
+
194
+ function captureWitness(value) {
195
+ rejectProxy(value, "manifest witness");
196
+ if (!value || typeof value !== "object") {
197
+ throw failure(
198
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
199
+ "manifest witness is required",
200
+ );
201
+ }
202
+ const id = Object.getOwnPropertyDescriptor(value, "id");
203
+ if (!id || !("value" in id)) {
204
+ throw failure(
205
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
206
+ "manifest witness id must be own data",
207
+ );
208
+ }
209
+ const read = Object.getOwnPropertyDescriptor(value, "read");
210
+ const compareAndSwap = Object.getOwnPropertyDescriptor(
211
+ value,
212
+ "compareAndSwap",
213
+ );
214
+ if (
215
+ !read ||
216
+ !compareAndSwap ||
217
+ !("value" in read) ||
218
+ !("value" in compareAndSwap) ||
219
+ typeof read.value !== "function" ||
220
+ typeof compareAndSwap.value !== "function"
221
+ ) {
222
+ throw failure(
223
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
224
+ "manifest witness read and compareAndSwap ports are required",
225
+ );
226
+ }
227
+ rejectProxy(read.value, "manifest witness.read");
228
+ rejectProxy(compareAndSwap.value, "manifest witness.compareAndSwap");
229
+ return Object.freeze({
230
+ compareAndSwap: Object.freeze((request) =>
231
+ Reflect.apply(compareAndSwap.value, value, [request]),
232
+ ),
233
+ id: identifier(id.value, "manifest witness id"),
234
+ read: Object.freeze(() => Reflect.apply(read.value, value, [])),
235
+ });
236
+ }
237
+
238
+ function sync(
239
+ value,
240
+ label,
241
+ code = EVOLUTION_LEDGER_MANIFEST_WITNESS_UNAVAILABLE_CODE,
242
+ ) {
243
+ rejectProxy(value, label, code);
244
+ if (utilTypes.isPromise(value))
245
+ throw failure(code, `${label} must be synchronous`);
246
+ return value;
247
+ }
248
+
249
+ function own(record, name, code) {
250
+ rejectProxy(record, "witness record", code);
251
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
252
+ throw failure(code, "witness record is invalid");
253
+ }
254
+ const field = Object.getOwnPropertyDescriptor(record, name);
255
+ if (!field || !("value" in field)) {
256
+ throw failure(code, `witness record.${name} must be own data`);
257
+ }
258
+ return field.value;
259
+ }
260
+
261
+ function normalizeWitness(record, descriptor, witnessId, code) {
262
+ if (own(record, "schema", code) !== EVOLUTION_LEDGER_WITNESS_SCHEMA) {
263
+ throw failure(code, "witness record schema is invalid");
264
+ }
265
+ if (
266
+ own(record, "authenticated", code) !== true ||
267
+ own(record, "durable", code) !== true
268
+ ) {
269
+ throw failure(code, "witness record is not authenticated durable state");
270
+ }
271
+ if (own(record, "witnessId", code) !== witnessId) {
272
+ throw failure(code, "witness record id binding differs");
273
+ }
274
+ const status = own(record, "status", code);
275
+ const witnessDigest = digest(
276
+ own(record, "witnessDigest", code),
277
+ "witnessDigest",
278
+ code,
279
+ );
280
+ const generation = own(record, "generation", code);
281
+ if (!Number.isSafeInteger(generation) || generation < 0) {
282
+ throw failure(code, "witness generation is invalid");
283
+ }
284
+ const trust = descriptor.witnessTrust;
285
+ for (const [field, expected] of Object.entries(trust)) {
286
+ if (own(record, field, code) !== expected) {
287
+ throw failure(code, `witness ${field} trust binding differs`);
288
+ }
289
+ }
290
+ if (status === "absent") {
291
+ if (generation !== 0)
292
+ throw failure(code, "absent witness generation is invalid");
293
+ return Object.freeze({ status, witnessDigest, generation, record });
294
+ }
295
+ if (status !== "committed") throw failure(code, "witness status is invalid");
296
+ for (const [field, expected] of Object.entries({
297
+ epoch: descriptor.epoch,
298
+ identityDigest: descriptor.identityDigest,
299
+ ledgerId: descriptor.ledgerId,
300
+ storeMarkerDigest: descriptor.storeMarkerDigest,
301
+ storeMarkerEntryDigest: descriptor.storeMarkerEntryDigest,
302
+ storeMarkerId: descriptor.storeMarkerId,
303
+ })) {
304
+ if (own(record, field, code) !== expected) {
305
+ throw failure(code, `witness ${field} binding differs`);
306
+ }
307
+ }
308
+ return Object.freeze({ status, witnessDigest, generation, record });
309
+ }
310
+
311
+ function verifyManifestPair(authority, descriptor, rawManifest, rawHead) {
312
+ let manifest;
313
+ let head;
314
+ const manifestDescriptor = Object.freeze({
315
+ epoch: descriptor.epoch,
316
+ ledgerId: descriptor.ledgerId,
317
+ maximumEventsPerSegment: descriptor.maximumEventsPerSegment,
318
+ tenantId: descriptor.tenantId,
319
+ });
320
+ try {
321
+ manifest = verifyEvolutionLedgerSegmentManifest({
322
+ authority,
323
+ descriptor: manifestDescriptor,
324
+ manifest: rawManifest,
325
+ });
326
+ head = verifyEvolutionLedgerManifestHead({
327
+ authority,
328
+ descriptor: manifestDescriptor,
329
+ head: rawHead,
330
+ });
331
+ } catch (cause) {
332
+ throw failure(
333
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
334
+ "manifest witness input is invalid",
335
+ { cause },
336
+ );
337
+ }
338
+ if (
339
+ head.manifestDigest !== manifest.manifestDigest ||
340
+ head.manifestSequence !== manifest.manifestSequence ||
341
+ head.sequence !== manifest.sequenceEnd ||
342
+ head.eventDigest !== manifest.eventDigests.at(-1)
343
+ ) {
344
+ throw failure(
345
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
346
+ "manifest head does not bind its checkpoint manifest",
347
+ );
348
+ }
349
+ return Object.freeze({ head, manifest });
350
+ }
351
+
352
+ function snapshot(descriptor, witnessId, manifest, head) {
353
+ return Object.freeze({
354
+ anchorDigest: manifest.manifestDigest,
355
+ epoch: descriptor.epoch,
356
+ headDigest: head.headDigest,
357
+ identityDigest: descriptor.identityDigest,
358
+ ledgerId: descriptor.ledgerId,
359
+ payloadDigest: manifest.eventDigestRoot,
360
+ segmentDigest: manifest.contentDigest,
361
+ sequence: head.sequence,
362
+ storeMarkerDigest: descriptor.storeMarkerDigest,
363
+ storeMarkerEntryDigest: descriptor.storeMarkerEntryDigest,
364
+ storeMarkerId: descriptor.storeMarkerId,
365
+ witnessId,
366
+ });
367
+ }
368
+
369
+ function sameWitness(left, right) {
370
+ return left?.witnessDigest === right?.witnessDigest;
371
+ }
372
+
373
+ export function createEvolutionLedgerManifestWitnessAdapter(
374
+ options = undefined,
375
+ ) {
376
+ const fields = exactRecord(
377
+ options,
378
+ CONFIG_KEYS,
379
+ "manifest witness adapter configuration",
380
+ );
381
+ const descriptor = scope(data(fields, "descriptor"));
382
+ const manifestAuthority = captureEvolutionLedgerManifestAuthority(
383
+ data(fields, "manifestAuthority"),
384
+ );
385
+ const witness = captureWitness(data(fields, "witness"));
386
+
387
+ const read = () => {
388
+ let raw;
389
+ try {
390
+ raw = sync(witness.read(), "manifest witness read result");
391
+ } catch (cause) {
392
+ if (cause instanceof EvolutionLedgerManifestWitnessError) throw cause;
393
+ throw failure(
394
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_UNAVAILABLE_CODE,
395
+ "manifest witness read failed",
396
+ { cause },
397
+ );
398
+ }
399
+ return normalizeWitness(
400
+ raw,
401
+ descriptor,
402
+ witness.id,
403
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_CORRUPT_CODE,
404
+ );
405
+ };
406
+
407
+ const adapter = Object.freeze({
408
+ descriptor: Object.freeze({
409
+ ...descriptor,
410
+ schema: EVOLUTION_LEDGER_MANIFEST_WITNESS_ADAPTER_SCHEMA,
411
+ witnessId: witness.id,
412
+ }),
413
+ read,
414
+ checkpoint(input) {
415
+ const requestFields = exactRecord(
416
+ input,
417
+ CHECKPOINT_KEYS,
418
+ "manifest witness checkpoint request",
419
+ );
420
+ const expectedWitnessDigest = digest(
421
+ data(requestFields, "expectedWitnessDigest"),
422
+ "expectedWitnessDigest",
423
+ );
424
+ const { manifest, head } = verifyManifestPair(
425
+ manifestAuthority,
426
+ descriptor,
427
+ data(requestFields, "manifest"),
428
+ data(requestFields, "head"),
429
+ );
430
+ const current = read();
431
+ if (current.witnessDigest !== expectedWitnessDigest) {
432
+ return Object.freeze({
433
+ checkpointed: false,
434
+ conflict: true,
435
+ current: current.record,
436
+ schema: EVOLUTION_LEDGER_MANIFEST_WITNESS_RECEIPT_SCHEMA,
437
+ });
438
+ }
439
+ const next = snapshot(descriptor, witness.id, manifest, head);
440
+ let rawAcknowledgement;
441
+ try {
442
+ rawAcknowledgement = sync(
443
+ witness.compareAndSwap({ expected: current.record, next }),
444
+ "manifest witness compareAndSwap result",
445
+ );
446
+ } catch (cause) {
447
+ throw failure(
448
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE,
449
+ "manifest witness acknowledgement was lost; reopen before retrying",
450
+ { cause },
451
+ );
452
+ }
453
+ let acknowledgement;
454
+ try {
455
+ acknowledgement = normalizeWitness(
456
+ rawAcknowledgement,
457
+ descriptor,
458
+ witness.id,
459
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_CORRUPT_CODE,
460
+ );
461
+ } catch (cause) {
462
+ throw failure(
463
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE,
464
+ "manifest witness acknowledgement is invalid; reopen before retrying",
465
+ { cause },
466
+ );
467
+ }
468
+ if (!sameWitness(acknowledgement, current)) {
469
+ const fieldsToBind = {
470
+ anchorDigest: manifest.manifestDigest,
471
+ headDigest: head.headDigest,
472
+ payloadDigest: manifest.eventDigestRoot,
473
+ segmentDigest: manifest.contentDigest,
474
+ sequence: head.sequence,
475
+ };
476
+ for (const [field, expected] of Object.entries(fieldsToBind)) {
477
+ if (
478
+ own(
479
+ acknowledgement.record,
480
+ field,
481
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_CORRUPT_CODE,
482
+ ) !== expected
483
+ ) {
484
+ throw failure(
485
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE,
486
+ "manifest witness acknowledged substituted checkpoint; reopen before retrying",
487
+ );
488
+ }
489
+ }
490
+ } else {
491
+ return Object.freeze({
492
+ checkpointed: false,
493
+ conflict: true,
494
+ current: acknowledgement.record,
495
+ schema: EVOLUTION_LEDGER_MANIFEST_WITNESS_RECEIPT_SCHEMA,
496
+ });
497
+ }
498
+ let readback;
499
+ try {
500
+ readback = read();
501
+ } catch (cause) {
502
+ throw failure(
503
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE,
504
+ "manifest witness may be checkpointed; reopen before retrying",
505
+ { cause },
506
+ );
507
+ }
508
+ if (!sameWitness(readback, acknowledgement)) {
509
+ throw failure(
510
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_COMMIT_UNKNOWN_CODE,
511
+ "manifest witness readback differs; reopen before retrying",
512
+ );
513
+ }
514
+ return Object.freeze({
515
+ checkpointed: true,
516
+ conflict: false,
517
+ headDigest: head.headDigest,
518
+ manifestDigest: manifest.manifestDigest,
519
+ schema: EVOLUTION_LEDGER_MANIFEST_WITNESS_RECEIPT_SCHEMA,
520
+ sequence: head.sequence,
521
+ witnessDigest: readback.witnessDigest,
522
+ });
523
+ },
524
+ });
525
+ ADAPTERS.add(adapter);
526
+ return adapter;
527
+ }
528
+
529
+ export function captureEvolutionLedgerManifestWitnessAdapter(
530
+ value,
531
+ expected = undefined,
532
+ ) {
533
+ if (!ADAPTERS.has(value)) {
534
+ throw new TypeError(
535
+ "a branded Evolution Ledger manifest witness adapter is required",
536
+ );
537
+ }
538
+ if (expected !== undefined) {
539
+ const fields = exactRecord(
540
+ expected,
541
+ new Set(["epoch", "ledgerId", "tenantId"]),
542
+ "expected manifest witness scope",
543
+ );
544
+ for (const field of ["epoch", "ledgerId", "tenantId"]) {
545
+ if (value.descriptor[field] !== data(fields, field)) {
546
+ throw failure(
547
+ EVOLUTION_LEDGER_MANIFEST_WITNESS_INVALID_CODE,
548
+ `manifest witness ${field} scope differs`,
549
+ );
550
+ }
551
+ }
552
+ }
553
+ return value;
554
+ }