chainlesschain 0.166.20 → 0.166.21

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 (214) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-CcJst5Zs.js → AIOps-BjMnsUci.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BpHPFKd3.js → ActionButton-DdYFP03A.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DHAsASuS.js → Analytics-Bb8TuuK_.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BTKwo5RC.js → AppLayout-Kn3TIOtk.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BcCBTggA.js → Artifacts-4IxpqI_b.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-z1JvJYbT.js → Audit-BOV2caqU.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-CJ7DCMDR.js → BackgroundAgents-B86k-ay4.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-CKpxw4uw.js → Backup-C5_ie1e3.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-2jI_IlUB.js → BaseInput-xpwg6QCW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-C_4RfBeN.js → Chat-CVZOcZau.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-D8fPYhUu.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-BnF4z4N1.js → Checkbox-MKTq3zdP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-m_LMamhM.js → Codegen-JUk3wzep.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DzMbA760.js → Col-JPvTA0kC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-SScuZUcW.js → Community-Tqgl87NQ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CiOHRvwQ.js → Compact-BuAFYBmN.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-97FzYz-6.js → Compliance-CXS9WIPZ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-C0ss-SRl.js → Cowork-Ds2bFHrr.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CCbdc9fp.js → Cron-C_dV_OeW.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BPnabXej.js → Crosschain-BsO6tIRo.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-B65hFnHs.js → DID-rNOFqBac.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-B6qR_TF2.js → Dashboard-C2fcKKVY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-6c-2Fxm-.js → Dropdown-Y7Ndr0X_.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-GD57mfiz.js → EmailListRenderer-DcP_uPmL.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2mxG6LN.js → FamilyGuardDashboard-Cwn3gDzk.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-cZS-uvAo.js → Federation-ClQuOsqb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-UbSfBIe1.js → FormItemContext-DfwtmlcK.js} +1 -1
  29. package/src/assets/web-panel/assets/GenericCardRenderer-zNZhtbC5.js +1 -0
  30. package/src/assets/web-panel/assets/{Git-DAlhOiDA.js → Git-BZmdW-G5.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-B-RRVaP8.js → Governance-CqBk4lEn.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-DBl-pXYR.js → Inference-Dbmt3ZXk.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DjqOkvgY.js → KnowledgeGraph-hMTH6qf3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CEV7AEAD.js → Logs-CkiYgiW2.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BDCxa4d1.js → MarkdownRenderer-BL1FElXg.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-oRjzfmYJ.js → Marketplace-CbB6wfin.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BiTnznLw.js → McpTools-BSwiFtte.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-DR0C5K4N.js → Memory-B03PeHrz.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge--oR8wEcp.js → MobileBridge-CRGrnd-X.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DKqpYMuG.js → MobileProjects-CE_5v2kO.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-Dg0D6fDQ.js → Mtc-Dp11QVx1.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-D4_-yWTK.js → MtcAudit-CYu-3JBu.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-Coz55FxA.js → Multisig-CGyJ0Xl3.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-BWVjgW9Y.js → NLProgramming-CoWi_ov1.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-BflVuGwr.js → Notes-CgU9DDo9.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-CT0F_dJ7.js → NotificationSettings-DX4I2b4W.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-CMDTM2z5.js → Organization-oopLO_tk.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-acKvvYpC.js → Overflow-BFVvjMyf.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-CRq5j9Ax.js → P2P-CBy5t-Tk.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-DmtzN6Kn.js → PdhVaultBrowser--YWJNsu6.js} +4 -4
  52. package/src/assets/web-panel/assets/{Permissions-SZ-kjJDa.js → Permissions-C2dZ8scb.js} +3 -3
  53. package/src/assets/web-panel/assets/{PersonalDataHub-DXh-ZfgJ.js → PersonalDataHub-Bs3l7Hlx.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-DhBU9ftP.js → Pipeline-DEBWbZuD.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-BgEXpO_V.js → Privacy-CjHBb6NU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-B2DJ-dmK.js → ProjectInit-D2WipUz5.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-ve3SocWc.js → ProjectSettings-B6WfnrGB.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-5ZvFasSJ.js → Projects-FF_thRi6.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-C8fcF3BK.js → Providers-CCv5M_Dv.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-unjO8lNO.js → QrScannerModal-CGthxU54.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-BT1QtT7D.js → QuickAsk-CnPmXPFb.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BSjFrY1w.js → Recommend-Df_tGEa9.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-CWV0bICg.js → RemoteSession-Z58N0Loe.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BMjiMsk2.js → Reputation-CZTBQ2Vt.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-9XCY22PM.js → Row-CdK3YpCQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DQ9PDy7Q.js → RssFeed-CFMVT5sb.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-Boym2HwG.js → Search-DrF8RIvD.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-Gbq3lGQb.js → Security-Ddk2f2DM.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-OcUfLdnu.js → Services-CCuK-VOo.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BjTog6cA.js → Skeleton-DxCpHzeM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-Dny4ft_1.js → Skills-t2oTDgcv.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Cy_VnhpZ.js → Sla-Df63M9_R.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-CrFuL_lp.js → SpeechSettings-l7ox6KuX.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-k-FnjuOR.js → SyncSettings-COd_tgPp.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-ZEqDSo0_.js → Tasks-CzDCcrik.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CYYksYV5.js → Templates-D-vfxTGA.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BvTTRTHS.js → Tenant-BlpT_Gxc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-DMOQOtkj.js → Terminal-D5rq52Hg.js} +2 -2
  79. package/src/assets/web-panel/assets/TimelineRenderer-DdoMndkK.js +1 -0
  80. package/src/assets/web-panel/assets/{Tokens-VW6Wocdp.js → Tokens-BhgBsI6g.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BtOxZqP6.js → Trigger-DwwzoikZ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-XcGJoTQx.js → Trust-HkTpzXFb.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-aASNCs5j.js → UkeySign-D9nk6Ehe.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Bz89M52u.js → VideoEditing-BKk0rfoy.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-uU4dSS_N.js → Wallet-IVWIU_Lq.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Brrroxgr.js → WebAuthn-CFTCpfsG.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Cny-evI9.js → WorkflowEditor-Dnf4Obif.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-CJ5iSwWq.js → chat-D2snERdj.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DWa-2flG.js → colors-DKEjK1N1.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-DFwUfptU.js → compact-item-BEDLwQdt.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-FHWWcyeB.js → createContext-DA9iW1a0.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-QY_TElrN.js → hasIn-5l2xEcY9.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-hw1J_Oxs.js → index-5pW4t1iD.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BR4RMPnB.js → index-7P1b8HZo.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BUNwuu5v.js → index-B00GeekA.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-B18zERdP.js → index-B4QYBliR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-wqiOz655.js → index-B7_W_rYd.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQCtBurK.js → index-BO9dQjpt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DUfILsc-.js → index-BZ5lY2zx.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DUepuy7O.js → index-B_eCoZgW.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-uRUZdL7I.js → index-BgfImyZI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CUoLd1dt.js → index-Bq5P3piS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BiHRihC0.js → index-Bqc8tdIF.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BcVr-LOk.js → index-C7sKbM5s.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DDpXDi4J.js → index-CGlotREA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CjejB-z9.js → index-CRPrHE7h.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D2rPJ6Sv.js → index-CX1x4AFn.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-w3SdYwaC.js → index-CbTPvp2_.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D-Mhq8K6.js → index-CjWltbi_.js} +1 -1
  111. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +1 -0
  112. package/src/assets/web-panel/assets/{index-Bd7McYpJ.js → index-CkMKuqUs.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BYbwQ7SP.js → index-CmruhzFi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-2ufsNuVn.js → index-Csfb-7hw.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-0umhind6.js → index-CxEtQYdi.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B33frlaD.js → index-D7z4zB_a.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Dy2PnKZx.js → index-DLoalqRX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CUiTugu3.js → index-DU2TXJu-.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CGv5In_T.js → index-DXet1xol.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DCHMVYG1.js → index-Dbd7eEex.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-th467RN6.js → index-Dbkghqn_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CkmgbT7h.js → index-Dg2a9owQ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-aTiI7lOQ.js → index-DpqtbXdE.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C5F1vwec.js → index-DqwPFbOb.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-DaHvj4jA.js → index-DvV03Ayk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BRsGZBHc.js → index-NJieh3T1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CeGn0A4W.js → index-Td8ZwyoC.js} +1 -1
  128. package/src/assets/web-panel/assets/index-c8jJEHVs.js +1 -0
  129. package/src/assets/web-panel/assets/{index-va4Rt-yM.js → index-e-e40id6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CKS7n6mE.js → index-fccZmC_h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BEjwv2x6.js → index-fgYk0QXO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Dlq-u9E4.js → index-yYEQXYaU.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-BeSPUFDz.js → initDefaultProps-CPrcB1TC.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-Dcajvjm9.js → motion-BQ7mWRh_.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-B76orau-.js → move-CzOEq99p.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-zB6yFwcX.js → mtc-parser-BlQI5jrw.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BsbNjz8w.js → omit-DlW4gxmv.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-BiJ9tssQ.js → pickAttrs-BBYms5nP.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BdfMjMeN.js → placementArrow-az2MPJ_7.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-rV4LGpbU.js → responsiveObserve-D1-ibEol.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-HsVw1qFQ.js → slide-DHGqa4GA.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-D1ry8XPE.js → statusUtils-CYGDo6lD.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B1t6aQQ_.js → styleChecker-Cl2EM9K6.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-C8qbl-9w.js → useFlexGapSupport-DdYhzuv1.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-R7g_mYTC.js → useFs-DWumPuBW.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-Cd-kCe7Z.js → usePersonalDataHub-DxAO-Aqi.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-9WhK5UWA.js → vnode-CplsQf_N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-CUqppPco.js → zoom-Cw5HXNSG.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +2 -2
  151. package/src/commands/agent.js +19 -1
  152. package/src/commands/evolution-knowledge.js +54 -0
  153. package/src/commands/evolution-workbench.js +83 -0
  154. package/src/commands/evolution.js +6 -1
  155. package/src/commands/serve.js +16 -0
  156. package/src/commands/skill.js +158 -16
  157. package/src/data/changelog.json +13 -0
  158. package/src/gateways/ws/session-protocol.js +2 -0
  159. package/src/gateways/ws/ws-agent-handler.js +124 -69
  160. package/src/gateways/ws/ws-server.js +19 -0
  161. package/src/generated/cc-agent-protocol.schema.json +7 -1
  162. package/src/harness/jsonl-session-store.js +25 -1
  163. package/src/index.js +1 -1
  164. package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
  165. package/src/lib/app-server/graph-runtime.js +40 -1
  166. package/src/lib/app-server/server.js +181 -3
  167. package/src/lib/app-server/websocket-transport.js +2 -0
  168. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
  169. package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
  170. package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
  171. package/src/lib/evolution/evolution-artifact-ports.js +21 -0
  172. package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
  173. package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
  174. package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
  175. package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
  176. package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
  177. package/src/lib/evolution/evolution-workbench-projection.js +734 -0
  178. package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
  179. package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
  180. package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
  181. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
  182. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +644 -0
  183. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +282 -0
  184. package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
  185. package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
  186. package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
  187. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +643 -0
  188. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +259 -0
  189. package/src/lib/evolution/governed-knowledge-sync.js +485 -0
  190. package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
  191. package/src/lib/evolution/governed-skill-marketplace.js +430 -0
  192. package/src/lib/evolution/governed-wiki-pruning.js +435 -0
  193. package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
  194. package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
  195. package/src/lib/public-ide-capability-manifest.js +4 -0
  196. package/src/lib/skill-outcome-authority.js +43 -0
  197. package/src/lib/skill-outcome-transcript-authority.js +252 -0
  198. package/src/lib/skill-retrieval-router-benchmark.js +135 -0
  199. package/src/lib/skill-retrieval-router.js +235 -0
  200. package/src/lib/skill-vector-authority.js +325 -0
  201. package/src/lib/skill-vector-process-authority.js +386 -0
  202. package/src/repl/agent-repl.js +7 -1
  203. package/src/runtime/agent-core.js +72 -6
  204. package/src/runtime/agent-runtime.js +42 -0
  205. package/src/runtime/headless-runner.js +32 -0
  206. package/src/runtime/headless-stream.js +36 -1
  207. package/src/runtime/runtime-factory.js +62 -4
  208. package/src/assets/web-panel/assets/ChatBubbleRenderer-eMmw1eZF.js +0 -1
  209. package/src/assets/web-panel/assets/GenericCardRenderer-BMAtvGt1.js +0 -1
  210. package/src/assets/web-panel/assets/OrderTableRenderer-Dyrnqy_o.js +0 -1
  211. package/src/assets/web-panel/assets/TimelineRenderer-CnudkJxk.js +0 -1
  212. package/src/assets/web-panel/assets/devWarning-DxufPwXC.js +0 -1
  213. package/src/assets/web-panel/assets/index-ZMTB9p5z.js +0 -1
  214. package/src/assets/web-panel/assets/index-_PvIDelE.js +0 -1
@@ -0,0 +1,643 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
3
+
4
+ import {
5
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
6
+ isEvolutionLedgerArtifactResolver,
7
+ } from "./evolution-artifact-ports.js";
8
+ import {
9
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
10
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
11
+ } from "./evolution-ledger.js";
12
+ import {
13
+ GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
14
+ verifyGovernedKnowledgeEnvelopeIntegrity,
15
+ verifyGovernedKnowledgeRecord,
16
+ } from "./governed-knowledge-sync.js";
17
+
18
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA =
19
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v2";
20
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA =
21
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v1";
22
+ export const GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE =
23
+ "knowledge.sync.committed";
24
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_CORRUPT_CODE =
25
+ "CC_GOVERNED_KNOWLEDGE_SYNC_LEDGER_CORRUPT";
26
+
27
+ const ARTIFACT_TYPE = "governed-knowledge-sync-record";
28
+ const CONFLICT_READERS = new WeakSet();
29
+ const PUBLICATION_READERS = new WeakSet();
30
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
31
+ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
32
+ const DISPOSITIONS = new Set(["conflict", "local", "remote"]);
33
+ const MAX_CONFLICT_PAGE = 256;
34
+ const RECORD_KEYS = new Set([
35
+ "committedAt",
36
+ "authorizationReceiptDigest",
37
+ "conflictWithDigest",
38
+ "deviceId",
39
+ "disposition",
40
+ "envelope",
41
+ "envelopeDigest",
42
+ "knowledge",
43
+ "operationId",
44
+ "recordDigest",
45
+ "schema",
46
+ "tenantId",
47
+ ]);
48
+ const LEGACY_RECORD_KEYS = new Set(
49
+ [...RECORD_KEYS].filter((key) => key !== "operationId"),
50
+ );
51
+
52
+ function canonical(value) {
53
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
54
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
55
+ return `{${Object.keys(value)
56
+ .sort()
57
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
58
+ .join(",")}}`;
59
+ }
60
+
61
+ function hash(domain, value) {
62
+ return `sha256:${createHash("sha256")
63
+ .update(domain)
64
+ .update("\0")
65
+ .update(canonical(value))
66
+ .digest("hex")}`;
67
+ }
68
+
69
+ function corrupt(message) {
70
+ const error = new Error(message);
71
+ error.code = GOVERNED_KNOWLEDGE_SYNC_LEDGER_CORRUPT_CODE;
72
+ throw error;
73
+ }
74
+
75
+ function exact(value, keys, label) {
76
+ if (
77
+ !value ||
78
+ typeof value !== "object" ||
79
+ Array.isArray(value) ||
80
+ utilTypes.isProxy(value) ||
81
+ Reflect.ownKeys(value).length !== keys.size ||
82
+ Reflect.ownKeys(value).some(
83
+ (key) => typeof key !== "string" || !keys.has(key),
84
+ )
85
+ ) {
86
+ corrupt(`${label} is invalid`);
87
+ }
88
+ return value;
89
+ }
90
+
91
+ function identifier(value, label) {
92
+ if (typeof value !== "string" || !SAFE_ID.test(value)) {
93
+ throw new TypeError(`${label} is invalid`);
94
+ }
95
+ return value;
96
+ }
97
+
98
+ function capture(owner, method, label = method) {
99
+ if (
100
+ !owner ||
101
+ typeof owner !== "object" ||
102
+ utilTypes.isProxy(owner) ||
103
+ typeof owner[method] !== "function"
104
+ ) {
105
+ throw new TypeError(`${label}.${method}() is required`);
106
+ }
107
+ return (...args) => Reflect.apply(owner[method], owner, args);
108
+ }
109
+
110
+ function clone(value) {
111
+ return JSON.parse(JSON.stringify(value));
112
+ }
113
+
114
+ function freeze(value) {
115
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
116
+ Object.freeze(value);
117
+ for (const child of Object.values(value)) freeze(child);
118
+ }
119
+ return value;
120
+ }
121
+
122
+ function recordCore(value) {
123
+ const core = {
124
+ schema: value.schema,
125
+ tenantId: value.tenantId,
126
+ deviceId: value.deviceId,
127
+ disposition: value.disposition,
128
+ knowledge: value.knowledge,
129
+ envelope: value.envelope,
130
+ envelopeDigest: value.envelopeDigest,
131
+ conflictWithDigest: value.conflictWithDigest,
132
+ authorizationReceiptDigest: value.authorizationReceiptDigest,
133
+ committedAt: value.committedAt,
134
+ };
135
+ if (value.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA) {
136
+ core.operationId = value.operationId;
137
+ }
138
+ return core;
139
+ }
140
+
141
+ export function digestGovernedKnowledgeSyncLedgerRecord(value) {
142
+ return hash(value.schema, recordCore(value));
143
+ }
144
+
145
+ function normalizeDescriptor(input) {
146
+ return Object.freeze({
147
+ tenantId: identifier(input?.tenantId, "tenantId"),
148
+ artifactTenantId: identifier(input?.artifactTenantId, "artifactTenantId"),
149
+ deviceId: identifier(input?.deviceId, "deviceId"),
150
+ streamId: identifier(input?.streamId, "streamId"),
151
+ audience: identifier(input?.audience, "audience"),
152
+ purpose: identifier(input?.purpose, "purpose"),
153
+ });
154
+ }
155
+
156
+ function validateKnowledge(value, descriptor, disposition) {
157
+ let normalized;
158
+ try {
159
+ normalized = verifyGovernedKnowledgeRecord(value, {
160
+ tenantId: descriptor.tenantId,
161
+ });
162
+ } catch {
163
+ corrupt("knowledge sync record is invalid");
164
+ }
165
+ const comparable = { ...value };
166
+ delete comparable.conflictWithDigest;
167
+ if (canonical(comparable) !== canonical(normalized)) {
168
+ corrupt("knowledge sync record is not canonical");
169
+ }
170
+ const conflictWithDigest = value.conflictWithDigest ?? null;
171
+ if (
172
+ (disposition === "conflict" && !DIGEST.test(conflictWithDigest ?? "")) ||
173
+ (disposition !== "conflict" && conflictWithDigest !== null)
174
+ ) {
175
+ corrupt("knowledge sync conflict binding is invalid");
176
+ }
177
+ return conflictWithDigest;
178
+ }
179
+
180
+ function validateEnvelope(value, knowledge, descriptor, disposition) {
181
+ try {
182
+ verifyGovernedKnowledgeEnvelopeIntegrity(value, {
183
+ tenantId: descriptor.tenantId,
184
+ });
185
+ } catch {
186
+ corrupt("knowledge sync envelope integrity is invalid");
187
+ }
188
+ if (
189
+ !value ||
190
+ typeof value !== "object" ||
191
+ Array.isArray(value) ||
192
+ utilTypes.isProxy(value) ||
193
+ value.schema !== GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA ||
194
+ value.tenantId !== descriptor.tenantId ||
195
+ !SAFE_ID.test(value.senderDeviceId ?? "") ||
196
+ value.knowledgeId !== knowledge.knowledgeId ||
197
+ value.scope !== knowledge.scope ||
198
+ value.scopeId !== knowledge.scopeId ||
199
+ value.action !== knowledge.action ||
200
+ value.contentDigest !== knowledge.contentDigest ||
201
+ canonical(value.vectorClock) !== canonical(knowledge.vectorClock) ||
202
+ (disposition === "local") !== (value.senderDeviceId === descriptor.deviceId)
203
+ ) {
204
+ corrupt("knowledge sync envelope binding is invalid");
205
+ }
206
+ }
207
+
208
+ function validateLedgerRecord(value, descriptor) {
209
+ const current =
210
+ value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA;
211
+ exact(
212
+ value,
213
+ current ? RECORD_KEYS : LEGACY_RECORD_KEYS,
214
+ "knowledge sync ledger record",
215
+ );
216
+ if (
217
+ ![
218
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
219
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA,
220
+ ].includes(value.schema) ||
221
+ value.tenantId !== descriptor.tenantId ||
222
+ value.deviceId !== descriptor.deviceId ||
223
+ !DISPOSITIONS.has(value.disposition) ||
224
+ !DIGEST.test(value.authorizationReceiptDigest ?? "") ||
225
+ !DIGEST.test(value.envelopeDigest ?? "") ||
226
+ value.envelopeDigest !== value.envelope?.envelopeDigest ||
227
+ typeof value.committedAt !== "string" ||
228
+ !Number.isFinite(Date.parse(value.committedAt)) ||
229
+ value.recordDigest !== digestGovernedKnowledgeSyncLedgerRecord(value)
230
+ ) {
231
+ corrupt("knowledge sync ledger record binding is invalid");
232
+ }
233
+ if (
234
+ (current &&
235
+ value.operationId !== null &&
236
+ !SAFE_ID.test(value.operationId ?? "")) ||
237
+ (!current && Object.hasOwn(value, "operationId"))
238
+ ) {
239
+ corrupt("knowledge sync operation binding is invalid");
240
+ }
241
+ const conflictWithDigest = validateKnowledge(
242
+ value.knowledge,
243
+ descriptor,
244
+ value.disposition,
245
+ );
246
+ if (value.conflictWithDigest !== conflictWithDigest) {
247
+ corrupt("knowledge sync conflict digest was substituted");
248
+ }
249
+ validateEnvelope(
250
+ value.envelope,
251
+ value.knowledge,
252
+ descriptor,
253
+ value.disposition,
254
+ );
255
+ return freeze(clone(value));
256
+ }
257
+
258
+ function parseArtifact(resolution, descriptor) {
259
+ if (
260
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
261
+ resolution.authenticated !== true ||
262
+ resolution.found !== true ||
263
+ !DIGEST.test(resolution.digest ?? "") ||
264
+ !DIGEST.test(resolution.receiptDigest ?? "") ||
265
+ !Buffer.isBuffer(resolution.bytes)
266
+ ) {
267
+ corrupt("knowledge sync artifact resolution is incomplete");
268
+ }
269
+ let artifact;
270
+ try {
271
+ artifact = JSON.parse(resolution.bytes.toString("utf8"));
272
+ } catch {
273
+ corrupt("knowledge sync artifact is not JSON");
274
+ }
275
+ if (
276
+ artifact?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
277
+ artifact.tenantId !== descriptor.artifactTenantId ||
278
+ artifact.audience !== descriptor.audience ||
279
+ artifact.purpose !== descriptor.purpose ||
280
+ artifact.retention !== "ledger" ||
281
+ artifact.type !== ARTIFACT_TYPE
282
+ ) {
283
+ corrupt("knowledge sync durable artifact binding is invalid");
284
+ }
285
+ return validateLedgerRecord(artifact.value, descriptor);
286
+ }
287
+
288
+ export class GovernedKnowledgeSyncLedgerAdapter {
289
+ constructor({
290
+ descriptor: input,
291
+ artifactPorts,
292
+ ledger,
293
+ ledgerArtifactResolver,
294
+ envelopeVerifier,
295
+ now = Date.now,
296
+ } = {}) {
297
+ this.descriptor = normalizeDescriptor(input);
298
+ this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
299
+ this._read = capture(ledger, "read", "ledger");
300
+ this._verifyLedger = capture(ledger, "verify", "ledger");
301
+ this._append = capture(ledger, "appendDomainEvent", "ledger");
302
+ this._verifyEnvelope = capture(
303
+ envelopeVerifier,
304
+ "verify",
305
+ "envelopeVerifier",
306
+ );
307
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
308
+ throw new TypeError(
309
+ "a branded EvolutionArtifactPorts ledger resolver is required",
310
+ );
311
+ }
312
+ if (typeof now !== "function" || utilTypes.isProxy(now)) {
313
+ throw new TypeError("now must be a non-proxy function");
314
+ }
315
+ this._resolveArtifact = ledgerArtifactResolver;
316
+ this._now = now;
317
+ Object.freeze(this);
318
+ }
319
+
320
+ _events() {
321
+ const events = this._read();
322
+ if (!Array.isArray(events)) corrupt("EvolutionLedger returned no events");
323
+ return events.filter(
324
+ (event) =>
325
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
326
+ event.type === GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE &&
327
+ event.tenantId === this.descriptor.tenantId &&
328
+ event.correlationId === this.descriptor.streamId,
329
+ );
330
+ }
331
+
332
+ async _resolveEvent(event) {
333
+ const identity = this._verifyLedger();
334
+ const resolution = this._resolveArtifact({
335
+ epoch: identity.epoch,
336
+ ledgerId: identity.ledgerId,
337
+ ref: event.subjectRef,
338
+ tenantId: this.descriptor.artifactTenantId,
339
+ });
340
+ if (
341
+ resolution?.ref !== event.subjectRef.ref ||
342
+ resolution?.digest !== event.subjectRef.digest
343
+ ) {
344
+ corrupt("knowledge sync ledger resolved a substituted artifact");
345
+ }
346
+ const record = parseArtifact(resolution, this.descriptor);
347
+ const core = { ...record.envelope };
348
+ delete core.envelopeDigest;
349
+ delete core.signature;
350
+ if (
351
+ (await this._verifyEnvelope({
352
+ core,
353
+ envelopeDigest: record.envelopeDigest,
354
+ signature: record.envelope.signature,
355
+ })) !== true
356
+ ) {
357
+ corrupt("knowledge sync stored envelope signature is invalid");
358
+ }
359
+ if (
360
+ event.eventId !==
361
+ `${GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE}.${record.disposition}.${record.envelopeDigest.slice(7)}` ||
362
+ event.decision !== "committed"
363
+ ) {
364
+ corrupt("knowledge sync event binding is invalid");
365
+ }
366
+ return record;
367
+ }
368
+
369
+ async _entryByEventId(eventId) {
370
+ const matches = this._events().filter((event) => event.eventId === eventId);
371
+ if (matches.length > 1) corrupt("knowledge sync event is ambiguous");
372
+ return matches.length === 0
373
+ ? null
374
+ : { event: matches[0], record: await this._resolveEvent(matches[0]) };
375
+ }
376
+
377
+ load = async ({ knowledgeId } = {}) => {
378
+ const normalizedId = identifier(knowledgeId, "knowledgeId");
379
+ const entries = (
380
+ await Promise.all(
381
+ this._events().map(async (event) => ({
382
+ event,
383
+ record: await this._resolveEvent(event),
384
+ })),
385
+ )
386
+ ).filter(
387
+ ({ record }) =>
388
+ record.disposition !== "conflict" &&
389
+ record.knowledge.knowledgeId === normalizedId,
390
+ );
391
+ return entries.length === 0 ? null : entries.at(-1).record.knowledge;
392
+ };
393
+
394
+ commit = async ({
395
+ knowledge,
396
+ envelope,
397
+ envelopeDigest,
398
+ disposition,
399
+ authorizationReceiptDigest,
400
+ operationId = null,
401
+ } = {}) => {
402
+ if (!DISPOSITIONS.has(disposition)) {
403
+ throw new TypeError("knowledge sync disposition is invalid");
404
+ }
405
+ const conflictWithDigest = validateKnowledge(
406
+ knowledge,
407
+ this.descriptor,
408
+ disposition,
409
+ );
410
+ validateEnvelope(envelope, knowledge, this.descriptor, disposition);
411
+ if (envelopeDigest !== envelope.envelopeDigest) {
412
+ corrupt("knowledge sync envelope digest was substituted");
413
+ }
414
+ if (!DIGEST.test(authorizationReceiptDigest ?? "")) {
415
+ corrupt("knowledge sync authorization receipt is invalid");
416
+ }
417
+ if (operationId !== null && !SAFE_ID.test(operationId ?? "")) {
418
+ throw new TypeError("knowledge sync operationId is invalid");
419
+ }
420
+ if (operationId !== null) {
421
+ const prior = await this.getPublication({ operationId });
422
+ if (prior && prior.envelopeDigest !== envelopeDigest) {
423
+ corrupt("knowledge sync operationId resolved another envelope");
424
+ }
425
+ }
426
+ const envelopeCore = { ...envelope };
427
+ delete envelopeCore.envelopeDigest;
428
+ delete envelopeCore.signature;
429
+ if (
430
+ (await this._verifyEnvelope({
431
+ core: envelopeCore,
432
+ envelopeDigest,
433
+ signature: envelope.signature,
434
+ })) !== true
435
+ ) {
436
+ corrupt("knowledge sync envelope signature is invalid");
437
+ }
438
+ const eventId = `${GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE}.${disposition}.${envelopeDigest.slice(7)}`;
439
+ const existing = await this._entryByEventId(eventId);
440
+ if (existing) {
441
+ const stableExisting = recordCore(existing.record);
442
+ delete stableExisting.committedAt;
443
+ const stableRequest = {
444
+ schema: GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
445
+ tenantId: this.descriptor.tenantId,
446
+ deviceId: this.descriptor.deviceId,
447
+ disposition,
448
+ knowledge,
449
+ envelope,
450
+ envelopeDigest,
451
+ conflictWithDigest,
452
+ authorizationReceiptDigest,
453
+ operationId,
454
+ };
455
+ if (canonical(stableExisting) !== canonical(stableRequest)) {
456
+ corrupt("knowledge sync event identity resolved different content");
457
+ }
458
+ return Object.freeze({
459
+ authenticated: true,
460
+ durable: true,
461
+ recovered: true,
462
+ envelopeDigest,
463
+ knowledgeId: knowledge.knowledgeId,
464
+ });
465
+ }
466
+ const milliseconds = Number(this._now());
467
+ if (!Number.isFinite(milliseconds)) {
468
+ throw new TypeError("knowledge sync clock is invalid");
469
+ }
470
+ const committedAt = new Date(milliseconds).toISOString();
471
+ const core = {
472
+ schema: GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
473
+ tenantId: this.descriptor.tenantId,
474
+ deviceId: this.descriptor.deviceId,
475
+ disposition,
476
+ knowledge: clone(knowledge),
477
+ envelope: clone(envelope),
478
+ envelopeDigest,
479
+ conflictWithDigest,
480
+ authorizationReceiptDigest,
481
+ operationId,
482
+ committedAt,
483
+ };
484
+ const record = Object.freeze({
485
+ ...core,
486
+ recordDigest: digestGovernedKnowledgeSyncLedgerRecord(core),
487
+ });
488
+ validateLedgerRecord(record, this.descriptor);
489
+ const head = this._verifyLedger();
490
+ const published = this._put(ARTIFACT_TYPE, record, {
491
+ audience: this.descriptor.audience,
492
+ purpose: this.descriptor.purpose,
493
+ retention: "ledger",
494
+ });
495
+ if (
496
+ !published?.ref ||
497
+ published.receipt?.persisted !== true ||
498
+ published.receipt?.readbackVerified !== true ||
499
+ published.receipt?.integrityVerified !== true ||
500
+ published.receipt?.retention !== "ledger"
501
+ ) {
502
+ corrupt("knowledge sync artifact was not durably read back");
503
+ }
504
+ let receipt;
505
+ try {
506
+ receipt = this._append(
507
+ {
508
+ artifactTenantId: this.descriptor.artifactTenantId,
509
+ correlationId: this.descriptor.streamId,
510
+ decision: "committed",
511
+ eventId,
512
+ reason: `governed knowledge ${disposition} commit`,
513
+ skillName: null,
514
+ sourceRefs: [],
515
+ subjectRef: published.ref,
516
+ tenantId: this.descriptor.tenantId,
517
+ timestamp: committedAt,
518
+ type: GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE,
519
+ },
520
+ {
521
+ expectedHeadDigest: head.headDigest,
522
+ expectedSequence: head.sequence,
523
+ },
524
+ );
525
+ } catch (error) {
526
+ const recovered = await this._entryByEventId(eventId);
527
+ if (!recovered || canonical(recovered.record) !== canonical(record)) {
528
+ throw error;
529
+ }
530
+ receipt = { authenticated: true, durable: true, recovered: true };
531
+ }
532
+ if (receipt?.authenticated !== true || receipt.durable !== true) {
533
+ corrupt("knowledge sync ledger append was not durably confirmed");
534
+ }
535
+ const stored = await this._entryByEventId(eventId);
536
+ if (!stored || canonical(stored.record) !== canonical(record)) {
537
+ corrupt("knowledge sync ledger readback differs after commit");
538
+ }
539
+ return Object.freeze({
540
+ authenticated: true,
541
+ durable: true,
542
+ recovered: receipt.recovered === true,
543
+ envelopeDigest,
544
+ knowledgeId: knowledge.knowledgeId,
545
+ ...(DIGEST.test(receipt.receiptDigest ?? "")
546
+ ? { ledgerReceiptDigest: receipt.receiptDigest }
547
+ : {}),
548
+ });
549
+ };
550
+
551
+ getPublication = async ({ operationId } = {}) => {
552
+ const normalizedId = identifier(operationId, "publication operationId");
553
+ const matches = (
554
+ await Promise.all(
555
+ this._events().map((event) => this._resolveEvent(event)),
556
+ )
557
+ ).filter(
558
+ (record) =>
559
+ record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
560
+ record.disposition === "local" &&
561
+ record.operationId === normalizedId,
562
+ );
563
+ if (matches.length > 1) {
564
+ corrupt("knowledge publication operation is ambiguous");
565
+ }
566
+ return matches[0] ?? null;
567
+ };
568
+
569
+ listConflicts = async ({ cursor = 0, limit = 50 } = {}) => {
570
+ if (
571
+ !Number.isSafeInteger(cursor) ||
572
+ cursor < 0 ||
573
+ !Number.isSafeInteger(limit) ||
574
+ limit < 1 ||
575
+ limit > MAX_CONFLICT_PAGE
576
+ ) {
577
+ throw new TypeError("knowledge sync conflict page is invalid");
578
+ }
579
+ const conflicts = (
580
+ await Promise.all(
581
+ this._events().map((event) => this._resolveEvent(event)),
582
+ )
583
+ ).filter((record) => record.disposition === "conflict");
584
+ return Object.freeze({
585
+ items: Object.freeze(conflicts.slice(cursor, cursor + limit)),
586
+ nextCursor: cursor + limit < conflicts.length ? cursor + limit : null,
587
+ total: conflicts.length,
588
+ });
589
+ };
590
+
591
+ getConflict = async ({ envelopeDigest } = {}) => {
592
+ if (!DIGEST.test(envelopeDigest ?? "")) {
593
+ throw new TypeError("knowledge sync conflict envelope digest is invalid");
594
+ }
595
+ const eventId = `${GOVERNED_KNOWLEDGE_SYNC_COMMIT_EVENT_TYPE}.conflict.${envelopeDigest.slice(7)}`;
596
+ const entry = await this._entryByEventId(eventId);
597
+ return entry?.record ?? null;
598
+ };
599
+
600
+ conflictReader() {
601
+ const reader = Object.freeze({
602
+ tenantId: this.descriptor.tenantId,
603
+ deviceId: this.descriptor.deviceId,
604
+ load: this.load,
605
+ getConflict: this.getConflict,
606
+ listConflicts: this.listConflicts,
607
+ });
608
+ CONFLICT_READERS.add(reader);
609
+ return reader;
610
+ }
611
+
612
+ publicationReader() {
613
+ const reader = Object.freeze({
614
+ tenantId: this.descriptor.tenantId,
615
+ deviceId: this.descriptor.deviceId,
616
+ getPublication: this.getPublication,
617
+ });
618
+ PUBLICATION_READERS.add(reader);
619
+ return reader;
620
+ }
621
+
622
+ syncPorts({ authorize, encrypt, decrypt, sign, send } = {}) {
623
+ return Object.freeze({
624
+ authorize: capture(authorize, "authorize", "authorize"),
625
+ encrypt: capture(encrypt, "encrypt", "encrypt"),
626
+ decrypt: capture(decrypt, "decrypt", "decrypt"),
627
+ sign: capture(sign, "sign", "sign"),
628
+ verify: this._verifyEnvelope,
629
+ send: capture(send, "send", "send"),
630
+ load: this.load,
631
+ loadPublication: this.getPublication,
632
+ commit: this.commit,
633
+ });
634
+ }
635
+ }
636
+
637
+ export function isGovernedKnowledgeConflictReader(value) {
638
+ return CONFLICT_READERS.has(value);
639
+ }
640
+
641
+ export function isGovernedKnowledgePublicationReader(value) {
642
+ return PUBLICATION_READERS.has(value);
643
+ }