chainlesschain 0.166.20 → 0.166.22

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 (222) hide show
  1. package/README.md +67 -9
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/assets/{AIOps-CcJst5Zs.js → AIOps-oJ7USzMC.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BpHPFKd3.js → ActionButton-BlgnZe_C.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DHAsASuS.js → Analytics-D2rRbTLu.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BTKwo5RC.js → AppLayout-FwS3f0B2.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BcCBTggA.js → Artifacts-iF-_08Hi.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-z1JvJYbT.js → Audit-D24p0zQw.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CJ7DCMDR.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CKpxw4uw.js → Backup-EOqht3H-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-2jI_IlUB.js → BaseInput-9XWYq2hj.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-C_4RfBeN.js → Chat-Dq5yardA.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-BnF4z4N1.js → Checkbox-CuyCBoBf.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-m_LMamhM.js → Codegen-DjWtYHNe.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DzMbA760.js → Col-CrVr_iuG.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-SScuZUcW.js → Community-C6QxpfGc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-CiOHRvwQ.js → Compact-B-v5r6Pa.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-97FzYz-6.js → Compliance-zNiLiFgD.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-C0ss-SRl.js → Cowork-D9K7lMOu.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-CCbdc9fp.js → Cron-DAjO36z4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BPnabXej.js → Crosschain-Bxqn0aqB.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-B65hFnHs.js → DID-DfRmLUe-.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-B6qR_TF2.js → Dashboard-Cz8KF3fr.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-6c-2Fxm-.js → Dropdown-C4oVfkP0.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-GD57mfiz.js → EmailListRenderer-ivyZKN8k.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2mxG6LN.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-cZS-uvAo.js → Federation-C93gZxnb.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-UbSfBIe1.js → FormItemContext-D_lEjYJE.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BMAtvGt1.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-DAlhOiDA.js → Git-mUu2HcLI.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-B-RRVaP8.js → Governance-CNuosrge.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DBl-pXYR.js → Inference-DwY5pbCB.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DjqOkvgY.js → KnowledgeGraph-aRUxhACD.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CEV7AEAD.js → Logs-DFfsWYy_.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BDCxa4d1.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-oRjzfmYJ.js → Marketplace-COI-ciM-.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BiTnznLw.js → McpTools-BJJwaIpe.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-DR0C5K4N.js → Memory-CDO6SGDZ.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge--oR8wEcp.js → MobileBridge-BlZ5tFf4.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DKqpYMuG.js → MobileProjects-DuoxbgWz.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dg0D6fDQ.js → Mtc-6ec9j70b.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-D4_-yWTK.js → MtcAudit-BuL7HkC7.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-Coz55FxA.js → Multisig-CJxR85lk.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BWVjgW9Y.js → NLProgramming-B71O1S4l.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-BflVuGwr.js → Notes-Bsw5zbpV.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-CT0F_dJ7.js → NotificationSettings-BnAhXuK_.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-Dyrnqy_o.js → OrderTableRenderer-BJ0R5GGz.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-CMDTM2z5.js → Organization-B7wwNxoP.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-acKvvYpC.js → Overflow-CfAGr0gM.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CRq5j9Ax.js → P2P-KhMg22Fz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-DmtzN6Kn.js → PdhVaultBrowser-NdAXI9ft.js} +4 -4
  53. package/src/assets/web-panel/assets/{Permissions-SZ-kjJDa.js → Permissions-CIYjqyT7.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DXh-ZfgJ.js → PersonalDataHub-D2ht3P_R.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DhBU9ftP.js → Pipeline-i6flZW1m.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BgEXpO_V.js → Privacy-DE0lhYVc.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-B2DJ-dmK.js → ProjectInit-BL3YbyxS.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-ve3SocWc.js → ProjectSettings-CEtdg7ni.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-5ZvFasSJ.js → Projects-CvtU5peJ.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-C8fcF3BK.js → Providers-DKt_Cg-j.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-unjO8lNO.js → QrScannerModal-DA61jNSx.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-BT1QtT7D.js → QuickAsk-fS9ryUmq.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-BSjFrY1w.js → Recommend-CR9dZU5Y.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-CWV0bICg.js → RemoteSession-BV0BR2Dz.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-BMjiMsk2.js → Reputation-BIeGUvYD.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-9XCY22PM.js → Row-DHDT1aro.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-DQ9PDy7Q.js → RssFeed-Cq6YKb1h.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-Boym2HwG.js → Search-DEF6vsy6.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Gbq3lGQb.js → Security-CHtYiKY9.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-OcUfLdnu.js → Services-u16lvBJN.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-BjTog6cA.js → Skeleton-CGbizyDj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-Dny4ft_1.js → Skills-BZMQcAa7.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Cy_VnhpZ.js → Sla-Bm-CycVi.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-CrFuL_lp.js → SpeechSettings-BudpA5kr.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-k-FnjuOR.js → SyncSettings-B8q1C1eC.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-ZEqDSo0_.js → Tasks-SU1pBWc-.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CYYksYV5.js → Templates-CyOfJzmt.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BvTTRTHS.js → Tenant-xqWSm2GP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DMOQOtkj.js → Terminal-D1Ttgjsi.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CnudkJxk.js → TimelineRenderer-Da2lYs5D.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-VW6Wocdp.js → Tokens-B34-SduO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-BtOxZqP6.js → Trigger-C8zyYm4R.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-XcGJoTQx.js → Trust-D1Pvqems.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-aASNCs5j.js → UkeySign-Do3VVnAy.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Bz89M52u.js → VideoEditing-Dz7egVIA.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-uU4dSS_N.js → Wallet-Dcuw-OxR.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-Brrroxgr.js → WebAuthn-DPlw-QsB.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Cny-evI9.js → WorkflowEditor-h4OsnU5q.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-CJ5iSwWq.js → chat-eO9wEwrW.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DWa-2flG.js → colors-34lSmOXw.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DFwUfptU.js → compact-item-CK4kEWJ4.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-FHWWcyeB.js → createContext-E0A57xed.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-QY_TElrN.js → hasIn-BD9ZMGAl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BcVr-LOk.js → index--N0u6kTG.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CUiTugu3.js → index-8qMA1DWQ.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-0umhind6.js → index-B0rkHxKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-wqiOz655.js → index-B_G_ElKO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B18zERdP.js → index-BbX_Dted.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Dy2PnKZx.js → index-Bjs90Eh9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-th467RN6.js → index-BmNbU2Z6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-uRUZdL7I.js → index-Brqc9Emx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-hw1J_Oxs.js → index-BsGmo6v1.js} +1 -1
  104. package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
  105. package/src/assets/web-panel/assets/{index-CjejB-z9.js → index-CT1_eRL-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DaHvj4jA.js → index-CZBaqe3d.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B33frlaD.js → index-CZkFMeWL.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYbwQ7SP.js → index-Ch175NUw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-va4Rt-yM.js → index-CsrKJJcX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DDpXDi4J.js → index-CuSau5ya.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D-Mhq8K6.js → index-Cx3Jn1r0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CKS7n6mE.js → index-Cz3unNfL.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BRsGZBHc.js → index-D4bB_x_v.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bd7McYpJ.js → index-DCn-ECvK.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DUfILsc-.js → index-DFLE2qO9.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DUepuy7O.js → index-DGRxt5wj.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BR4RMPnB.js → index-DONOUtlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dlq-u9E4.js → index-DP-UZAQN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DCHMVYG1.js → index-Da5fmOHB.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BiHRihC0.js → index-DcE1BspQ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CGv5In_T.js → index-DcbgVLOH.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BQCtBurK.js → index-DeXNCyQJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D2rPJ6Sv.js → index-DiT_REby.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CUoLd1dt.js → index-DpfisY1g.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-2ufsNuVn.js → index-DrOalGut.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-aTiI7lOQ.js → index-DrSAAuJj.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BUNwuu5v.js → index-DrsDA_md.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CkmgbT7h.js → index-DvKcroix.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BEjwv2x6.js → index-DzXjP44T.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CeGn0A4W.js → index-MIg5Z8qe.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C5F1vwec.js → index-o8pYehRq.js} +3 -3
  132. package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
  133. package/src/assets/web-panel/assets/{index-w3SdYwaC.js → index-yAGBu2E0.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BeSPUFDz.js → initDefaultProps-DMTkAomF.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Dcajvjm9.js → motion-Cnti1F5g.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-B76orau-.js → move-CGxmHUga.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-zB6yFwcX.js → mtc-parser-CuwwLoq7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BsbNjz8w.js → omit-BpdlTkPM.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BiJ9tssQ.js → pickAttrs-D7nWrThp.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BdfMjMeN.js → placementArrow-Bhx0TV8F.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-rV4LGpbU.js → responsiveObserve-CZ1KesZh.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-HsVw1qFQ.js → slide-CnldF8J6.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-D1ry8XPE.js → statusUtils-CZfo_GOA.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B1t6aQQ_.js → styleChecker-B2QCcAv5.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-C8qbl-9w.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-R7g_mYTC.js → useFs-B_atg9M0.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-Cd-kCe7Z.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-9WhK5UWA.js → vnode-DcePTYAm.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CUqppPco.js → zoom-BYmlnjRk.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +2 -2
  152. package/src/commands/agent.js +19 -1
  153. package/src/commands/evolution-knowledge.js +54 -0
  154. package/src/commands/evolution-workbench.js +83 -0
  155. package/src/commands/evolution.js +6 -1
  156. package/src/commands/serve.js +47 -0
  157. package/src/commands/skill.js +158 -16
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/session-protocol.js +2 -0
  160. package/src/gateways/ws/ws-agent-handler.js +124 -69
  161. package/src/gateways/ws/ws-server.js +19 -0
  162. package/src/generated/cc-agent-protocol.schema.json +7 -1
  163. package/src/harness/jsonl-session-store.js +25 -1
  164. package/src/index.js +11 -3
  165. package/src/lazy-dispatch.js +9 -1
  166. package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
  167. package/src/lib/app-server/graph-runtime.js +40 -1
  168. package/src/lib/app-server/server.js +181 -3
  169. package/src/lib/app-server/websocket-transport.js +23 -0
  170. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
  171. package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
  172. package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
  173. package/src/lib/evolution/evolution-artifact-ports.js +30 -0
  174. package/src/lib/evolution/evolution-deployment-loader.js +208 -0
  175. package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
  176. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  177. package/src/lib/evolution/evolution-release-train.js +538 -0
  178. package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
  179. package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
  180. package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
  181. package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
  182. package/src/lib/evolution/evolution-workbench-projection.js +753 -0
  183. package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
  184. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
  185. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  186. package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
  187. package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
  188. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
  189. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +671 -0
  190. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +310 -0
  191. package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
  192. package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
  193. package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
  194. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +729 -0
  195. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +312 -0
  196. package/src/lib/evolution/governed-knowledge-sync.js +795 -0
  197. package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
  198. package/src/lib/evolution/governed-skill-marketplace.js +430 -0
  199. package/src/lib/evolution/governed-wiki-pruning.js +435 -0
  200. package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
  201. package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
  202. package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
  203. package/src/lib/evolution/statistical-progressive-canary.js +683 -0
  204. package/src/lib/evolution/wikiskill-benchmark.js +510 -0
  205. package/src/lib/public-ide-capability-manifest.js +4 -0
  206. package/src/lib/session-host-lease.js +11 -16
  207. package/src/lib/skill-outcome-authority.js +43 -0
  208. package/src/lib/skill-outcome-transcript-authority.js +252 -0
  209. package/src/lib/skill-retrieval-router-benchmark.js +135 -0
  210. package/src/lib/skill-retrieval-router.js +235 -0
  211. package/src/lib/skill-vector-authority.js +325 -0
  212. package/src/lib/skill-vector-process-authority.js +386 -0
  213. package/src/repl/agent-repl.js +7 -1
  214. package/src/runtime/agent-core.js +133 -13
  215. package/src/runtime/agent-runtime.js +42 -0
  216. package/src/runtime/headless-runner.js +32 -0
  217. package/src/runtime/headless-stream.js +39 -1
  218. package/src/runtime/runtime-factory.js +62 -4
  219. package/src/assets/web-panel/assets/ChatBubbleRenderer-eMmw1eZF.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DxufPwXC.js +0 -1
  221. package/src/assets/web-panel/assets/index-ZMTB9p5z.js +0 -1
  222. package/src/assets/web-panel/assets/index-_PvIDelE.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
+ }