chainlesschain 0.166.18 → 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-CQSBl3hY.js → AIOps-BjMnsUci.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-IQt-vRLt.js → ActionButton-DdYFP03A.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DkHC8O7k.js → Analytics-Bb8TuuK_.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CSti2P2T.js → AppLayout-Kn3TIOtk.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-C57hxn3v.js → Artifacts-4IxpqI_b.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DByLntcf.js → Audit-BOV2caqU.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-D1Bd2EOa.js → BackgroundAgents-B86k-ay4.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-VstHzHng.js → Backup-C5_ie1e3.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CLhdexIf.js → BaseInput-xpwg6QCW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BefC_JZS.js → Chat-CVZOcZau.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DbXMvgmn.js → ChatBubbleRenderer-D8fPYhUu.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CEY982vx.js → Checkbox-MKTq3zdP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-Dcm_DTvJ.js → Codegen-JUk3wzep.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-C8SSu4KA.js → Col-JPvTA0kC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BVV9vwRR.js → Community-Tqgl87NQ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B7c5Vo18.js → Compact-BuAFYBmN.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Tq9jSZ5a.js → Compliance-CXS9WIPZ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BJUjT09Q.js → Cowork-Ds2bFHrr.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CjV9PEaS.js → Cron-C_dV_OeW.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Dl7ReL8F.js → Crosschain-BsO6tIRo.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-CG8PjWmM.js → DID-rNOFqBac.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CDBM6wmF.js → Dashboard-C2fcKKVY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-8_55bXTD.js → Dropdown-Y7Ndr0X_.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D3qOU1Cm.js → EmailListRenderer-DcP_uPmL.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bv5oWMZF.js → FamilyGuardDashboard-Cwn3gDzk.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-hpZ1xkKd.js → Federation-ClQuOsqb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BN7GT191.js → FormItemContext-DfwtmlcK.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-PCRhfA7M.js → GenericCardRenderer-zNZhtbC5.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CIlP2vy7.js → Git-BZmdW-G5.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-81lgm7YL.js → Governance-CqBk4lEn.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Cs24xMOV.js → Inference-Dbmt3ZXk.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CrJLVCZo.js → KnowledgeGraph-hMTH6qf3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DLyO8RKT.js → Logs-CkiYgiW2.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DBOqijrP.js → MarkdownRenderer-BL1FElXg.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-Dz7AbQZc.js → Marketplace-CbB6wfin.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BM0aFiWv.js → McpTools-BSwiFtte.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-C9SJzENX.js → Memory-B03PeHrz.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BO2HnNRk.js → MobileBridge-CRGrnd-X.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CK_jMz0l.js → MobileProjects-CE_5v2kO.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-CfhrJsdO.js → Mtc-Dp11QVx1.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-BE2ELxgI.js → MtcAudit-CYu-3JBu.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CgR_E3Jd.js → Multisig-CGyJ0Xl3.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Cw9445_K.js → NLProgramming-CoWi_ov1.js} +1 -1
  45. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +7 -0
  46. package/src/assets/web-panel/assets/{NotificationSettings-DxHVh4uT.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-pPXJtWo4.js → Organization-oopLO_tk.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-YamdTJwA.js → Overflow-BFVvjMyf.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BvqP53x7.js → P2P-CBy5t-Tk.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Blz1Xn2n.js → PdhVaultBrowser--YWJNsu6.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CgFRQqFJ.js → Permissions-C2dZ8scb.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CFeo3-6O.js → PersonalDataHub-Bs3l7Hlx.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-BkaRojEK.js → Pipeline-DEBWbZuD.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-BNZEx2Qp.js → Privacy-CjHBb6NU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-HUBOgEEK.js → ProjectInit-D2WipUz5.js} +2 -2
  57. package/src/assets/web-panel/assets/ProjectSettings-B6WfnrGB.js +2 -0
  58. package/src/assets/web-panel/assets/{Projects-Dc517BXp.js → Projects-FF_thRi6.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DTLf8bgj.js → Providers-CCv5M_Dv.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-BBNjPszk.js → QrScannerModal-CGthxU54.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DCsHvk3G.js → QuickAsk-CnPmXPFb.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Dpr5YSop.js → Recommend-Df_tGEa9.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DmKnvqGg.js → RemoteSession-Z58N0Loe.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CSRfuurX.js → Reputation-CZTBQ2Vt.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CDj3pQ_w.js → Row-CdK3YpCQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DI0a_kNq.js → RssFeed-CFMVT5sb.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-jAy7B2nU.js → Search-DrF8RIvD.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CkHTqYhc.js → Security-Ddk2f2DM.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-CP-0Nzga.js → Services-CCuK-VOo.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BkF5-p3n.js → Skeleton-DxCpHzeM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BDu-utDE.js → Skills-t2oTDgcv.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-CQvq_2Qb.js → Sla-Df63M9_R.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-T7Ap512g.js → SpeechSettings-l7ox6KuX.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-Bt-PLvot.js → SyncSettings-COd_tgPp.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-yLEcCogg.js → Tasks-CzDCcrik.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-ByN3fmbr.js → Templates-D-vfxTGA.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DBI7hITH.js → Tenant-BlpT_Gxc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B77_DlGX.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-BV2N6cR8.js → Tokens-BhgBsI6g.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-CjXWGH3p.js → Trigger-DwwzoikZ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-uqXIq3WC.js → Trust-HkTpzXFb.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-D-6qu4vY.js → UkeySign-D9nk6Ehe.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-CxGmx_2e.js → VideoEditing-BKk0rfoy.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DSq7WlAg.js → Wallet-IVWIU_Lq.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-CDBiD57O.js → WebAuthn-CFTCpfsG.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-Z8f63TSb.js → WorkflowEditor-Dnf4Obif.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-B-UZFBjy.js → chat-D2snERdj.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-CFk7K-7Q.js → colors-DKEjK1N1.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-X0IVMvgi.js → compact-item-BEDLwQdt.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DWg4j2n6.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-CkVCwNNF.js → hasIn-5l2xEcY9.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BipwEbTA.js → index-5pW4t1iD.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-5OcZHdzc.js → index-7P1b8HZo.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Cvwu_rA_.js → index-B00GeekA.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CbIAWbma.js → index-B4QYBliR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CNKFsBlz.js → index-B7_W_rYd.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BoskgPt9.js → index-BO9dQjpt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CvOa-IFV.js → index-BZ5lY2zx.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-_-9k3Tna.js → index-B_eCoZgW.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CbihMThv.js → index-BgfImyZI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DLSBks8h.js → index-Bq5P3piS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-LU54bChK.js → index-Bqc8tdIF.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Btqk6zWb.js → index-C7sKbM5s.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D8uEL8Uw.js → index-CGlotREA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CLlP1E4X.js → index-CRPrHE7h.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DeWKPQGs.js → index-CX1x4AFn.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Db_5xhrU.js → index-CbTPvp2_.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CDfSD07S.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-BPBia4b-.js → index-CkMKuqUs.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C1ZAOJRW.js → index-CmruhzFi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-P83LDnCz.js → index-Csfb-7hw.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DcDggpWR.js → index-CxEtQYdi.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-OjnAwUJo.js → index-D7z4zB_a.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D-EJNxgR.js → index-DLoalqRX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B3-B3FWD.js → index-DU2TXJu-.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D92g4l3n.js → index-DXet1xol.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Ca0mij1n.js → index-Dbd7eEex.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DCqpl_E_.js → index-Dbkghqn_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DyWlOuak.js → index-Dg2a9owQ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CUBkvFPH.js → index-DpqtbXdE.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DhVHoqGL.js → index-DqwPFbOb.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-BG-GaZri.js → index-DvV03Ayk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CMCEXBRh.js → index-NJieh3T1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B273IY-E.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-BzXjYUmd.js → index-e-e40id6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CCLwoATF.js → index-fccZmC_h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CN8HZlLH.js → index-fgYk0QXO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BB4KHHcv.js → index-yYEQXYaU.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-CFNgY8lJ.js → initDefaultProps-CPrcB1TC.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-D-5RrDzn.js → motion-BQ7mWRh_.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DN-L0Bd-.js → move-CzOEq99p.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-6mgLSeCK.js → mtc-parser-BlQI5jrw.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-ClWW8eTP.js → omit-DlW4gxmv.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-Vystq3R8.js → pickAttrs-BBYms5nP.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-D0H9hK4W.js → placementArrow-az2MPJ_7.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-B3iNRU-a.js → responsiveObserve-D1-ibEol.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CiMXe6am.js → slide-DHGqa4GA.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CGDZJ1uT.js → statusUtils-CYGDo6lD.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-D2zA6NkY.js → styleChecker-Cl2EM9K6.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-C1sYU6QE.js → useFlexGapSupport-DdYhzuv1.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BzUHSjg2.js → useFs-DWumPuBW.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CxB5yZCq.js → usePersonalDataHub-DxAO-Aqi.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BfUfMwtc.js → vnode-CplsQf_N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-CFYmj1TO.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 +26 -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/Notes-DZimkTrb.js +0 -7
  209. package/src/assets/web-panel/assets/OrderTableRenderer-Iy-pnX56.js +0 -1
  210. package/src/assets/web-panel/assets/ProjectSettings-CFMmhROS.js +0 -2
  211. package/src/assets/web-panel/assets/TimelineRenderer-CsLTB_QO.js +0 -1
  212. package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +0 -1
  213. package/src/assets/web-panel/assets/index-BCp2ir-1.js +0 -1
  214. package/src/assets/web-panel/assets/index-Bw4iuzRD.js +0 -1
@@ -0,0 +1,646 @@
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_DEPENDENCY_REQUEST_SCHEMA,
14
+ GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
15
+ digestGovernedKnowledgeDependencyResult,
16
+ isGovernedKnowledgeDependencyAuthority,
17
+ } from "./governed-knowledge-dependency-authority.js";
18
+ import {
19
+ isGovernedKnowledgeExecutionRecord,
20
+ verifyGovernedKnowledgeRecord,
21
+ } from "./governed-knowledge-sync.js";
22
+
23
+ export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA =
24
+ "chainlesschain.governed-knowledge-dependencies-prepared/v1";
25
+ export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA =
26
+ "chainlesschain.governed-knowledge-dependencies-settled/v1";
27
+ export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE =
28
+ "knowledge.revocation-dependencies.prepared";
29
+ export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE =
30
+ "knowledge.revocation-dependencies.settled";
31
+ export const GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE =
32
+ "CC_GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT";
33
+
34
+ const EXECUTORS = new WeakSet();
35
+ const ARTIFACT_TYPE = "governed-knowledge-dependency-operation";
36
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
37
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
38
+ const PREPARED_KEYS = new Set([
39
+ "deviceId",
40
+ "knowledge",
41
+ "operationDigest",
42
+ "preparedAt",
43
+ "recordDigest",
44
+ "schema",
45
+ "tenantId",
46
+ ]);
47
+ const SETTLED_KEYS = new Set([
48
+ "deviceId",
49
+ "operationDigest",
50
+ "recordDigest",
51
+ "results",
52
+ "schema",
53
+ "settledAt",
54
+ "tenantId",
55
+ ]);
56
+ const RESULT_KEYS = new Set([
57
+ "applied",
58
+ "appliedAt",
59
+ "attestation",
60
+ "authorityId",
61
+ "authorityRevision",
62
+ "dependencyDigest",
63
+ "dependencyDisposition",
64
+ "dependencyKind",
65
+ "deviceId",
66
+ "durable",
67
+ "handlerArtifactDigest",
68
+ "idempotent",
69
+ "knowledgeId",
70
+ "operationId",
71
+ "requestDigest",
72
+ "resultDigest",
73
+ "revocationReceiptDigest",
74
+ "schema",
75
+ "tenantId",
76
+ "verificationReceiptDigest",
77
+ ]);
78
+
79
+ function canonical(value) {
80
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
81
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
82
+ return `{${Object.keys(value)
83
+ .sort()
84
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
85
+ .join(",")}}`;
86
+ }
87
+
88
+ function hash(domain, value) {
89
+ return `sha256:${createHash("sha256")
90
+ .update(domain)
91
+ .update("\0")
92
+ .update(canonical(value))
93
+ .digest("hex")}`;
94
+ }
95
+
96
+ function clone(value) {
97
+ return structuredClone(value);
98
+ }
99
+
100
+ function freeze(value) {
101
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
102
+ Object.freeze(value);
103
+ for (const child of Object.values(value)) freeze(child);
104
+ }
105
+ return value;
106
+ }
107
+
108
+ function corrupt(message) {
109
+ const error = new Error(message);
110
+ error.code = GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE;
111
+ throw error;
112
+ }
113
+
114
+ function exact(value, keys, label) {
115
+ if (
116
+ !value ||
117
+ typeof value !== "object" ||
118
+ Array.isArray(value) ||
119
+ utilTypes.isProxy(value) ||
120
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
121
+ ) {
122
+ corrupt(`${label} is not a plain object`);
123
+ }
124
+ const actual = Reflect.ownKeys(value);
125
+ if (
126
+ actual.length !== keys.size ||
127
+ actual.some((key) => typeof key !== "string" || !keys.has(key))
128
+ ) {
129
+ corrupt(`${label} has an invalid shape`);
130
+ }
131
+ return value;
132
+ }
133
+
134
+ function identifier(value, label) {
135
+ if (typeof value !== "string" || !ID.test(value)) {
136
+ throw new TypeError(`${label} is invalid`);
137
+ }
138
+ return value;
139
+ }
140
+
141
+ function capture(owner, method, label) {
142
+ if (
143
+ !owner ||
144
+ typeof owner !== "object" ||
145
+ utilTypes.isProxy(owner) ||
146
+ typeof owner[method] !== "function"
147
+ ) {
148
+ throw new TypeError(`${label}.${method}() is required`);
149
+ }
150
+ return (...args) => Reflect.apply(owner[method], owner, args);
151
+ }
152
+
153
+ function descriptor(input) {
154
+ return freeze({
155
+ tenantId: identifier(input?.tenantId, "tenantId"),
156
+ artifactTenantId: identifier(input?.artifactTenantId, "artifactTenantId"),
157
+ deviceId: identifier(input?.deviceId, "deviceId"),
158
+ streamId: identifier(input?.streamId, "streamId"),
159
+ audience: identifier(input?.audience, "audience"),
160
+ purpose: identifier(input?.purpose, "purpose"),
161
+ });
162
+ }
163
+
164
+ export function digestGovernedKnowledgeDependencyOperation({
165
+ tenantId,
166
+ deviceId,
167
+ knowledge,
168
+ }) {
169
+ return hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, {
170
+ tenantId,
171
+ deviceId,
172
+ knowledge,
173
+ });
174
+ }
175
+
176
+ function preparedCore(value) {
177
+ return {
178
+ schema: value.schema,
179
+ tenantId: value.tenantId,
180
+ deviceId: value.deviceId,
181
+ operationDigest: value.operationDigest,
182
+ knowledge: value.knowledge,
183
+ preparedAt: value.preparedAt,
184
+ };
185
+ }
186
+
187
+ function settledCore(value) {
188
+ return {
189
+ schema: value.schema,
190
+ tenantId: value.tenantId,
191
+ deviceId: value.deviceId,
192
+ operationDigest: value.operationDigest,
193
+ results: value.results,
194
+ settledAt: value.settledAt,
195
+ };
196
+ }
197
+
198
+ function validateResult(
199
+ value,
200
+ dependency,
201
+ knowledge,
202
+ descriptorValue,
203
+ operationDigest,
204
+ ) {
205
+ exact(value, RESULT_KEYS, "dependency execution result");
206
+ const requestCore = {
207
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_REQUEST_SCHEMA,
208
+ tenantId: descriptorValue.tenantId,
209
+ deviceId: descriptorValue.deviceId,
210
+ operationId: `knowledge-dependency:${operationDigest.slice(7)}:${dependency.digest.slice(7)}`,
211
+ operationDigest,
212
+ knowledgeId: knowledge.knowledgeId,
213
+ action: knowledge.action,
214
+ contentDigest: knowledge.contentDigest,
215
+ revocationReceiptDigest: knowledge.revocationReceiptDigest,
216
+ dependency,
217
+ };
218
+ const expectedRequestDigest = hash(
219
+ GOVERNED_KNOWLEDGE_DEPENDENCY_REQUEST_SCHEMA,
220
+ requestCore,
221
+ );
222
+ if (
223
+ value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA ||
224
+ value.tenantId !== descriptorValue.tenantId ||
225
+ value.deviceId !== descriptorValue.deviceId ||
226
+ value.operationId !==
227
+ `knowledge-dependency:${operationDigest.slice(7)}:${dependency.digest.slice(7)}` ||
228
+ value.knowledgeId !== knowledge.knowledgeId ||
229
+ value.revocationReceiptDigest !== knowledge.revocationReceiptDigest ||
230
+ value.dependencyKind !== dependency.kind ||
231
+ value.dependencyDigest !== dependency.digest ||
232
+ value.dependencyDisposition !== dependency.disposition ||
233
+ value.applied !== true ||
234
+ value.durable !== true ||
235
+ value.idempotent !== true ||
236
+ value.requestDigest !== expectedRequestDigest ||
237
+ !DIGEST.test(value.resultDigest ?? "") ||
238
+ !DIGEST.test(value.verificationReceiptDigest ?? "") ||
239
+ value.resultDigest !== digestGovernedKnowledgeDependencyResult(value)
240
+ ) {
241
+ corrupt("dependency execution result is not exactly bound");
242
+ }
243
+ return freeze(clone(value));
244
+ }
245
+
246
+ function validatePrepared(value, descriptorValue) {
247
+ exact(value, PREPARED_KEYS, "dependency prepared record");
248
+ const knowledge = verifyGovernedKnowledgeRecord(value.knowledge, {
249
+ tenantId: descriptorValue.tenantId,
250
+ });
251
+ const operationDigest = digestGovernedKnowledgeDependencyOperation({
252
+ tenantId: descriptorValue.tenantId,
253
+ deviceId: descriptorValue.deviceId,
254
+ knowledge,
255
+ });
256
+ if (
257
+ value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA ||
258
+ value.tenantId !== descriptorValue.tenantId ||
259
+ value.deviceId !== descriptorValue.deviceId ||
260
+ !["tombstone", "revoke"].includes(knowledge.action) ||
261
+ value.operationDigest !== operationDigest ||
262
+ !Number.isFinite(Date.parse(value.preparedAt)) ||
263
+ value.recordDigest !==
264
+ hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, preparedCore(value))
265
+ ) {
266
+ corrupt("dependency prepared record is invalid");
267
+ }
268
+ return freeze(clone(value));
269
+ }
270
+
271
+ function validateSettled(value, prepared, descriptorValue) {
272
+ exact(value, SETTLED_KEYS, "dependency settled record");
273
+ const { knowledge, operationDigest } = prepared;
274
+ if (
275
+ value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA ||
276
+ value.tenantId !== descriptorValue.tenantId ||
277
+ value.deviceId !== descriptorValue.deviceId ||
278
+ value.operationDigest !== operationDigest ||
279
+ !Array.isArray(value.results) ||
280
+ value.results.length !== knowledge.dependencies.length ||
281
+ !Number.isFinite(Date.parse(value.settledAt)) ||
282
+ value.recordDigest !==
283
+ hash(GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA, settledCore(value))
284
+ ) {
285
+ corrupt("dependency settled record is invalid");
286
+ }
287
+ value.results.forEach((result, index) =>
288
+ validateResult(
289
+ result,
290
+ knowledge.dependencies[index],
291
+ knowledge,
292
+ descriptorValue,
293
+ operationDigest,
294
+ ),
295
+ );
296
+ return freeze(clone(value));
297
+ }
298
+
299
+ export class GovernedKnowledgeDependencyLedgerExecutor {
300
+ constructor({
301
+ descriptor: descriptorInput,
302
+ artifactPorts,
303
+ ledger,
304
+ ledgerArtifactResolver,
305
+ dependencyAuthority,
306
+ now = Date.now,
307
+ } = {}) {
308
+ this.descriptor = descriptor(descriptorInput);
309
+ this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
310
+ this._read = capture(ledger, "read", "ledger");
311
+ this._verifyLedger = capture(ledger, "verify", "ledger");
312
+ this._append = capture(ledger, "appendDomainEvent", "ledger");
313
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
314
+ throw new TypeError(
315
+ "a branded EvolutionArtifactPorts ledger resolver is required",
316
+ );
317
+ }
318
+ if (!isGovernedKnowledgeDependencyAuthority(dependencyAuthority)) {
319
+ throw new TypeError(
320
+ "a branded knowledge dependency authority is required",
321
+ );
322
+ }
323
+ if (
324
+ dependencyAuthority.tenantId !== this.descriptor.tenantId ||
325
+ dependencyAuthority.deviceId !== this.descriptor.deviceId
326
+ ) {
327
+ throw new TypeError("dependency authority boundary is invalid");
328
+ }
329
+ if (typeof now !== "function" || utilTypes.isProxy(now)) {
330
+ throw new TypeError("now must be a non-proxy function");
331
+ }
332
+ this._resolveArtifact = ledgerArtifactResolver;
333
+ this._apply = capture(dependencyAuthority, "apply", "dependencyAuthority");
334
+ this._now = now;
335
+ Object.freeze(this);
336
+ EXECUTORS.add(this);
337
+ }
338
+
339
+ _events(type) {
340
+ const events = this._read();
341
+ if (!Array.isArray(events)) corrupt("EvolutionLedger returned no events");
342
+ return events.filter(
343
+ (event) =>
344
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
345
+ event.type === type &&
346
+ event.tenantId === this.descriptor.tenantId &&
347
+ event.correlationId === this.descriptor.streamId,
348
+ );
349
+ }
350
+
351
+ _event(eventId, type) {
352
+ const matches = this._events(type).filter(
353
+ (event) => event.eventId === eventId,
354
+ );
355
+ if (matches.length > 1) corrupt("dependency event is ambiguous");
356
+ return matches[0] ?? null;
357
+ }
358
+
359
+ _resolve(event) {
360
+ const identity = this._verifyLedger();
361
+ const resolution = this._resolveArtifact({
362
+ epoch: identity.epoch,
363
+ ledgerId: identity.ledgerId,
364
+ ref: event.subjectRef,
365
+ tenantId: this.descriptor.artifactTenantId,
366
+ });
367
+ if (
368
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
369
+ resolution.authenticated !== true ||
370
+ resolution.found !== true ||
371
+ resolution.ref !== event.subjectRef.ref ||
372
+ resolution.digest !== event.subjectRef.digest ||
373
+ !Buffer.isBuffer(resolution.bytes)
374
+ ) {
375
+ corrupt(
376
+ "dependency artifact resolution is unauthenticated or substituted",
377
+ );
378
+ }
379
+ let artifact;
380
+ try {
381
+ artifact = JSON.parse(resolution.bytes.toString("utf8"));
382
+ } catch {
383
+ corrupt("dependency artifact is not JSON");
384
+ }
385
+ if (
386
+ artifact?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
387
+ artifact.tenantId !== this.descriptor.artifactTenantId ||
388
+ artifact.audience !== this.descriptor.audience ||
389
+ artifact.purpose !== this.descriptor.purpose ||
390
+ artifact.retention !== "ledger" ||
391
+ artifact.type !== ARTIFACT_TYPE
392
+ ) {
393
+ corrupt("dependency durable artifact binding is invalid");
394
+ }
395
+ return artifact.value;
396
+ }
397
+
398
+ _prepared(operationDigest) {
399
+ const event = this._event(
400
+ `${GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE}.${operationDigest.slice(7)}`,
401
+ GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
402
+ );
403
+ if (!event) return null;
404
+ const record = validatePrepared(this._resolve(event), this.descriptor);
405
+ if (
406
+ record.operationDigest !== operationDigest ||
407
+ event.decision !== "prepared" ||
408
+ !Array.isArray(event.sourceRefs) ||
409
+ event.sourceRefs.length !== 0
410
+ ) {
411
+ corrupt("dependency prepared event is invalid");
412
+ }
413
+ return { event, record };
414
+ }
415
+
416
+ _settled(prepared) {
417
+ const event = this._event(
418
+ `${GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE}.${prepared.operationDigest.slice(7)}`,
419
+ GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE,
420
+ );
421
+ if (!event) return null;
422
+ const record = validateSettled(
423
+ this._resolve(event),
424
+ prepared,
425
+ this.descriptor,
426
+ );
427
+ const preparedEntry = this._prepared(prepared.operationDigest);
428
+ if (
429
+ !preparedEntry ||
430
+ event.decision !== "committed" ||
431
+ !Array.isArray(event.sourceRefs) ||
432
+ event.sourceRefs.length !== 1 ||
433
+ canonical(event.sourceRefs[0]) !==
434
+ canonical(preparedEntry.event.subjectRef)
435
+ ) {
436
+ corrupt("dependency settled event lineage is invalid");
437
+ }
438
+ return { event, record };
439
+ }
440
+
441
+ _timestamp() {
442
+ const milliseconds = Number(this._now());
443
+ if (!Number.isFinite(milliseconds)) {
444
+ throw new TypeError("dependency ledger clock is invalid");
445
+ }
446
+ return new Date(milliseconds).toISOString();
447
+ }
448
+
449
+ _publishArtifact(record) {
450
+ const published = this._put(ARTIFACT_TYPE, record, {
451
+ audience: this.descriptor.audience,
452
+ purpose: this.descriptor.purpose,
453
+ retention: "ledger",
454
+ });
455
+ if (
456
+ !published?.ref ||
457
+ published.receipt?.persisted !== true ||
458
+ published.receipt.readbackVerified !== true ||
459
+ published.receipt.integrityVerified !== true ||
460
+ published.receipt.retention !== "ledger"
461
+ ) {
462
+ corrupt("dependency artifact was not durably read back");
463
+ }
464
+ return published.ref;
465
+ }
466
+
467
+ async _prepare(knowledgeInput, knowledge, operationDigest) {
468
+ const existing = this._prepared(operationDigest);
469
+ if (existing) {
470
+ if (canonical(existing.record.knowledge) !== canonical(knowledge)) {
471
+ corrupt("dependency operation identity resolved different knowledge");
472
+ }
473
+ return existing;
474
+ }
475
+ if (!isGovernedKnowledgeExecutionRecord(knowledgeInput)) {
476
+ throw new TypeError(
477
+ "first dependency execution requires a governed record",
478
+ );
479
+ }
480
+ const preparedAt = this._timestamp();
481
+ const core = {
482
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA,
483
+ tenantId: this.descriptor.tenantId,
484
+ deviceId: this.descriptor.deviceId,
485
+ operationDigest,
486
+ knowledge: clone(knowledge),
487
+ preparedAt,
488
+ };
489
+ const record = freeze({
490
+ ...core,
491
+ recordDigest: hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, core),
492
+ });
493
+ const head = this._verifyLedger();
494
+ const ref = this._publishArtifact(record);
495
+ const eventId = `${GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE}.${operationDigest.slice(7)}`;
496
+ try {
497
+ const receipt = this._append(
498
+ {
499
+ artifactTenantId: this.descriptor.artifactTenantId,
500
+ correlationId: this.descriptor.streamId,
501
+ decision: "prepared",
502
+ eventId,
503
+ reason: "governed knowledge revocation dependencies prepared",
504
+ skillName: null,
505
+ sourceRefs: [],
506
+ subjectRef: ref,
507
+ tenantId: this.descriptor.tenantId,
508
+ timestamp: preparedAt,
509
+ type: GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
510
+ },
511
+ {
512
+ expectedHeadDigest: head.headDigest,
513
+ expectedSequence: head.sequence,
514
+ },
515
+ );
516
+ if (receipt?.authenticated !== true || receipt.durable !== true) {
517
+ corrupt("dependency prepare append was not durable");
518
+ }
519
+ } catch (error) {
520
+ const recovered = this._prepared(operationDigest);
521
+ if (
522
+ !recovered ||
523
+ canonical(recovered.record.knowledge) !== canonical(knowledge)
524
+ ) {
525
+ throw error;
526
+ }
527
+ }
528
+ return this._prepared(operationDigest);
529
+ }
530
+
531
+ async _settle(prepared, results) {
532
+ const existing = this._settled(prepared);
533
+ if (existing) return existing;
534
+ const settledAt = this._timestamp();
535
+ const core = {
536
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA,
537
+ tenantId: this.descriptor.tenantId,
538
+ deviceId: this.descriptor.deviceId,
539
+ operationDigest: prepared.operationDigest,
540
+ results: clone(results),
541
+ settledAt,
542
+ };
543
+ const record = freeze({
544
+ ...core,
545
+ recordDigest: hash(GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA, core),
546
+ });
547
+ const preparedEntry = this._prepared(prepared.operationDigest);
548
+ if (!preparedEntry) corrupt("cannot settle unprepared dependencies");
549
+ const head = this._verifyLedger();
550
+ const ref = this._publishArtifact(record);
551
+ const eventId = `${GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE}.${prepared.operationDigest.slice(7)}`;
552
+ try {
553
+ const receipt = this._append(
554
+ {
555
+ artifactTenantId: this.descriptor.artifactTenantId,
556
+ correlationId: this.descriptor.streamId,
557
+ decision: "committed",
558
+ eventId,
559
+ reason: "governed knowledge revocation dependencies applied",
560
+ skillName: null,
561
+ sourceRefs: [preparedEntry.event.subjectRef],
562
+ subjectRef: ref,
563
+ tenantId: this.descriptor.tenantId,
564
+ timestamp: settledAt,
565
+ type: GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE,
566
+ },
567
+ {
568
+ expectedHeadDigest: head.headDigest,
569
+ expectedSequence: head.sequence,
570
+ },
571
+ );
572
+ if (receipt?.authenticated !== true || receipt.durable !== true) {
573
+ corrupt("dependency settlement append was not durable");
574
+ }
575
+ } catch (error) {
576
+ const recovered = this._settled(prepared);
577
+ if (
578
+ !recovered ||
579
+ canonical(recovered.record.results) !== canonical(results)
580
+ ) {
581
+ throw error;
582
+ }
583
+ }
584
+ return this._settled(prepared);
585
+ }
586
+
587
+ async execute(knowledgeInput) {
588
+ const knowledge = verifyGovernedKnowledgeRecord(knowledgeInput, {
589
+ tenantId: this.descriptor.tenantId,
590
+ });
591
+ if (!["tombstone", "revoke"].includes(knowledge.action)) {
592
+ throw new TypeError("dependency execution requires a revocation record");
593
+ }
594
+ const operationDigest = digestGovernedKnowledgeDependencyOperation({
595
+ tenantId: this.descriptor.tenantId,
596
+ deviceId: this.descriptor.deviceId,
597
+ knowledge,
598
+ });
599
+ const prepared = this._prepared(operationDigest);
600
+ const completed = prepared ? this._settled(prepared.record) : null;
601
+ if (completed) return this._result(completed.record, knowledge, true);
602
+ await this._prepare(knowledgeInput, knowledge, operationDigest);
603
+ const results = [];
604
+ for (const dependency of knowledge.dependencies) {
605
+ results.push(
606
+ await this._apply({
607
+ tenantId: this.descriptor.tenantId,
608
+ deviceId: this.descriptor.deviceId,
609
+ operationDigest,
610
+ knowledge,
611
+ dependency,
612
+ }),
613
+ );
614
+ }
615
+ const settled = await this._settle({ operationDigest, knowledge }, results);
616
+ return this._result(settled.record, knowledge, prepared !== null);
617
+ }
618
+
619
+ async resume({ operationDigest } = {}) {
620
+ if (!DIGEST.test(operationDigest ?? "")) {
621
+ throw new TypeError("operationDigest is invalid");
622
+ }
623
+ const prepared = this._prepared(operationDigest);
624
+ if (!prepared)
625
+ throw new Error("prepared dependency operation was not found");
626
+ return this.execute(prepared.record.knowledge);
627
+ }
628
+
629
+ _result(record, knowledge, recovered) {
630
+ return freeze({
631
+ authenticated: true,
632
+ durable: true,
633
+ recovered,
634
+ tenantId: this.descriptor.tenantId,
635
+ deviceId: this.descriptor.deviceId,
636
+ knowledgeId: knowledge.knowledgeId,
637
+ revocationReceiptDigest: knowledge.revocationReceiptDigest,
638
+ operationDigest: record.operationDigest,
639
+ resultDigests: record.results.map(({ resultDigest }) => resultDigest),
640
+ });
641
+ }
642
+ }
643
+
644
+ export function isGovernedKnowledgeDependencyExecutor(value) {
645
+ return EXECUTORS.has(value);
646
+ }