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,795 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
3
+
4
+ import { isGovernedKnowledgeDependencyExecutor } from "./governed-knowledge-dependency-ledger-executor.js";
5
+ import { isGovernedKnowledgeArtifactLifecycle } from "./governed-knowledge-artifact-lifecycle.js";
6
+
7
+ export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
8
+ "chainlesschain.governed-evolution-knowledge-sync/v1";
9
+ export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
10
+ "chainlesschain.governed-evolution-knowledge-envelope/v1";
11
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
12
+ "chainlesschain.governed-knowledge-artifact-binding/v2";
13
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
14
+ "chainlesschain.governed-knowledge-artifact-binding/v1";
15
+ export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
16
+ PERSONAL: "personal",
17
+ PROJECT: "project",
18
+ TEAM: "team",
19
+ ORG: "org",
20
+ });
21
+
22
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
23
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
24
+ const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
25
+ const ACTIONS = new Set(["upsert", "tombstone", "revoke"]);
26
+ const MAX_CIPHERTEXT_BYTES = 12 * 1024 * 1024;
27
+ const EXECUTION_RECORDS = new WeakSet();
28
+ const SYNCHRONIZERS = new WeakSet();
29
+ const ENVELOPE_KEYS = new Set([
30
+ "action",
31
+ "ciphertext",
32
+ "ciphertextDigest",
33
+ "contentDigest",
34
+ "envelopeDigest",
35
+ "keyRef",
36
+ "knowledgeId",
37
+ "schema",
38
+ "scope",
39
+ "scopeId",
40
+ "senderDeviceId",
41
+ "signature",
42
+ "tenantId",
43
+ "vectorClock",
44
+ ]);
45
+ const ARTIFACT_BINDING_KEYS = new Set([
46
+ "activate",
47
+ "authorizationReceiptDigest",
48
+ "baseline",
49
+ "evidenceDigest",
50
+ "humanReviewed",
51
+ "issuedAt",
52
+ "operationId",
53
+ "operation",
54
+ "schema",
55
+ ]);
56
+ const LEGACY_ARTIFACT_BINDING_KEYS = new Set(
57
+ [...ARTIFACT_BINDING_KEYS].filter((key) => key !== "activate"),
58
+ );
59
+
60
+ function canonical(value) {
61
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
62
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
63
+ return `{${Object.keys(value)
64
+ .sort()
65
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
66
+ .join(",")}}`;
67
+ }
68
+
69
+ function hash(domain, value) {
70
+ return `sha256:${createHash("sha256")
71
+ .update(`${domain}\0${canonical(value)}`)
72
+ .digest("hex")}`;
73
+ }
74
+
75
+ function hashBytes(value) {
76
+ return `sha256:${createHash("sha256").update(value).digest("hex")}`;
77
+ }
78
+
79
+ function clone(value) {
80
+ return value == null ? value : JSON.parse(JSON.stringify(value));
81
+ }
82
+
83
+ function freeze(value) {
84
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
85
+ Object.freeze(value);
86
+ for (const child of Object.values(value)) freeze(child);
87
+ }
88
+ return value;
89
+ }
90
+
91
+ function record(value, label) {
92
+ if (
93
+ !value ||
94
+ typeof value !== "object" ||
95
+ Array.isArray(value) ||
96
+ utilTypes.isProxy(value) ||
97
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
98
+ )
99
+ throw new TypeError(`${label} must be a plain object`);
100
+ return value;
101
+ }
102
+
103
+ function id(value, label) {
104
+ if (typeof value !== "string" || !ID.test(value))
105
+ throw new TypeError(`${label} is invalid`);
106
+ return value;
107
+ }
108
+
109
+ function digest(value, label) {
110
+ if (typeof value !== "string" || !DIGEST.test(value))
111
+ throw new TypeError(`${label} must be sha256-bound`);
112
+ return value;
113
+ }
114
+
115
+ function capture(owner, method) {
116
+ if (
117
+ !owner ||
118
+ typeof owner !== "object" ||
119
+ utilTypes.isProxy(owner) ||
120
+ typeof owner[method] !== "function"
121
+ )
122
+ throw new TypeError(`${method} authority is required`);
123
+ return (...args) => Reflect.apply(owner[method], owner, args);
124
+ }
125
+
126
+ function vectorClock(value) {
127
+ record(value, "vectorClock");
128
+ const entries = Object.entries(value);
129
+ if (entries.length < 1 || entries.length > 64)
130
+ throw new TypeError("vectorClock is empty or unbounded");
131
+ const result = {};
132
+ for (const [deviceId, revision] of entries.sort(([a], [b]) =>
133
+ a.localeCompare(b),
134
+ )) {
135
+ id(deviceId, "vectorClock device");
136
+ if (!Number.isSafeInteger(revision) || revision < 0)
137
+ throw new TypeError("vectorClock revision is invalid");
138
+ result[deviceId] = revision;
139
+ }
140
+ return result;
141
+ }
142
+
143
+ function relation(left, right) {
144
+ const devices = new Set([...Object.keys(left), ...Object.keys(right)]);
145
+ let before = false;
146
+ let after = false;
147
+ for (const device of devices) {
148
+ const a = left[device] || 0;
149
+ const b = right[device] || 0;
150
+ before ||= a < b;
151
+ after ||= a > b;
152
+ }
153
+ if (before && after) return "concurrent";
154
+ if (before) return "before";
155
+ if (after) return "after";
156
+ return "equal";
157
+ }
158
+
159
+ function normalizeDependencies(value, action) {
160
+ if (!Array.isArray(value) || value.length > 256)
161
+ throw new TypeError("dependency dispositions are unbounded");
162
+ const seen = new Set();
163
+ return value.map((entry) => {
164
+ record(entry, "dependency disposition");
165
+ const normalized = {
166
+ kind: id(entry.kind, "dependency kind"),
167
+ digest: digest(entry.digest, "dependency digest"),
168
+ disposition: id(entry.disposition, "dependency disposition"),
169
+ };
170
+ const key = `${normalized.kind}:${normalized.digest}`;
171
+ if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
172
+ seen.add(key);
173
+ if (
174
+ ["tombstone", "revoke"].includes(action) &&
175
+ ![
176
+ "tombstone",
177
+ "quarantine",
178
+ "reject-candidate",
179
+ "rollback-active",
180
+ ].includes(normalized.disposition)
181
+ )
182
+ throw new TypeError("revocation dependency disposition is unsafe");
183
+ return normalized;
184
+ });
185
+ }
186
+
187
+ function normalizeRecord(input, descriptor, { executionRecord = false } = {}) {
188
+ record(input, "knowledge record");
189
+ const action = ACTIONS.has(input.action) ? input.action : null;
190
+ const scope = SCOPES.has(input.scope) ? input.scope : null;
191
+ if (!action || !scope || input.tenantId !== descriptor.tenantId)
192
+ throw new TypeError("knowledge record boundary is invalid");
193
+ const dependencies = normalizeDependencies(input.dependencies || [], action);
194
+ if (
195
+ ["team", "org"].includes(scope) &&
196
+ !DIGEST.test(input.approvalReceiptDigest || "")
197
+ )
198
+ throw new TypeError("shared knowledge requires approval");
199
+ if (
200
+ ["tombstone", "revoke"].includes(action) &&
201
+ (!DIGEST.test(input.revocationReceiptDigest || "") ||
202
+ dependencies.length < 1)
203
+ )
204
+ throw new TypeError(
205
+ "revocation must bind its receipt and dependency graph",
206
+ );
207
+ const normalized = freeze({
208
+ schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
209
+ tenantId: descriptor.tenantId,
210
+ knowledgeId: id(input.knowledgeId, "knowledgeId"),
211
+ scope,
212
+ scopeId: id(input.scopeId, "scopeId"),
213
+ action,
214
+ contentDigest: digest(input.contentDigest, "contentDigest"),
215
+ vectorClock: vectorClock(input.vectorClock),
216
+ approvalReceiptDigest: input.approvalReceiptDigest || null,
217
+ revocationReceiptDigest: input.revocationReceiptDigest || null,
218
+ dependencies,
219
+ });
220
+ if (executionRecord) EXECUTION_RECORDS.add(normalized);
221
+ return normalized;
222
+ }
223
+
224
+ export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
225
+ return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
226
+ }
227
+
228
+ export function verifyGovernedKnowledgeArtifactBinding(
229
+ input,
230
+ { tenantId, knowledge, authorizationReceiptDigest } = {},
231
+ ) {
232
+ record(input, "knowledge artifact binding");
233
+ const expectedTenantId = id(tenantId, "tenantId");
234
+ const normalizedKnowledge = verifyGovernedKnowledgeRecord(knowledge, {
235
+ tenantId: expectedTenantId,
236
+ });
237
+ const keys = Reflect.ownKeys(input);
238
+ const current = input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA;
239
+ const legacy =
240
+ input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA;
241
+ const expectedKeys = current
242
+ ? ARTIFACT_BINDING_KEYS
243
+ : LEGACY_ARTIFACT_BINDING_KEYS;
244
+ const baseline =
245
+ input.baseline === null
246
+ ? null
247
+ : verifyGovernedKnowledgeRecord(input.baseline, {
248
+ tenantId: expectedTenantId,
249
+ });
250
+ if (
251
+ (!current && !legacy) ||
252
+ keys.length !== expectedKeys.size ||
253
+ keys.some((key) => typeof key !== "string" || !expectedKeys.has(key)) ||
254
+ !ID.test(input.operationId ?? "") ||
255
+ !(
256
+ current ? ["publish", "merge", "receive"] : ["publish", "merge"]
257
+ ).includes(input.operation) ||
258
+ (current && typeof input.activate !== "boolean") ||
259
+ !Number.isFinite(Date.parse(input.issuedAt)) ||
260
+ input.authorizationReceiptDigest !== authorizationReceiptDigest ||
261
+ !DIGEST.test(input.authorizationReceiptDigest ?? "") ||
262
+ !DIGEST.test(input.evidenceDigest ?? "") ||
263
+ typeof input.humanReviewed !== "boolean" ||
264
+ (baseline !== null &&
265
+ (baseline.knowledgeId !== normalizedKnowledge.knowledgeId ||
266
+ baseline.scope !== normalizedKnowledge.scope ||
267
+ baseline.scopeId !== normalizedKnowledge.scopeId)) ||
268
+ canonical(baseline) !== canonical(input.baseline)
269
+ ) {
270
+ throw new Error("knowledge artifact binding is invalid");
271
+ }
272
+ return freeze(clone(input));
273
+ }
274
+
275
+ export function isGovernedKnowledgeExecutionRecord(value) {
276
+ return EXECUTION_RECORDS.has(value);
277
+ }
278
+
279
+ export function verifyGovernedKnowledgeEnvelopeIntegrity(
280
+ envelope,
281
+ { tenantId } = {},
282
+ ) {
283
+ record(envelope, "knowledge envelope");
284
+ const expectedTenantId = id(tenantId, "tenantId");
285
+ if (typeof envelope.ciphertext !== "string") {
286
+ throw new Error("knowledge envelope ciphertext is invalid");
287
+ }
288
+ const ciphertext = Buffer.from(envelope.ciphertext, "base64");
289
+ const keys = Reflect.ownKeys(envelope);
290
+ const core = { ...envelope };
291
+ delete core.envelopeDigest;
292
+ delete core.signature;
293
+ if (
294
+ envelope.schema !== GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA ||
295
+ keys.length !== ENVELOPE_KEYS.size ||
296
+ keys.some((key) => typeof key !== "string" || !ENVELOPE_KEYS.has(key)) ||
297
+ envelope.tenantId !== expectedTenantId ||
298
+ !ID.test(envelope.senderDeviceId || "") ||
299
+ !ID.test(envelope.knowledgeId || "") ||
300
+ !SCOPES.has(envelope.scope) ||
301
+ !ID.test(envelope.scopeId || "") ||
302
+ !ACTIONS.has(envelope.action) ||
303
+ !DIGEST.test(envelope.contentDigest || "") ||
304
+ canonical(vectorClock(envelope.vectorClock)) !==
305
+ canonical(envelope.vectorClock) ||
306
+ ciphertext.length < 1 ||
307
+ ciphertext.length > MAX_CIPHERTEXT_BYTES ||
308
+ ciphertext.toString("base64") !== envelope.ciphertext ||
309
+ envelope.ciphertextDigest !== hashBytes(ciphertext) ||
310
+ !ID.test(envelope.keyRef || "") ||
311
+ envelope.envelopeDigest !== hash(GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA, core)
312
+ ) {
313
+ throw new Error("knowledge envelope integrity is invalid");
314
+ }
315
+ return freeze({ core: freeze(clone(core)) });
316
+ }
317
+
318
+ export class GovernedKnowledgeSync {
319
+ constructor({
320
+ tenantId,
321
+ deviceId,
322
+ ports,
323
+ dependencyExecutor = null,
324
+ artifactLifecycle,
325
+ clock = () => Date.now(),
326
+ } = {}) {
327
+ this.tenantId = id(tenantId, "tenantId");
328
+ this.deviceId = id(deviceId, "deviceId");
329
+ this._authorize = capture(ports, "authorize");
330
+ this._encrypt = capture(ports, "encrypt");
331
+ this._decrypt = capture(ports, "decrypt");
332
+ this._sign = capture(ports, "sign");
333
+ this._verify = capture(ports, "verify");
334
+ this._load = capture(ports, "load");
335
+ this._commit = capture(ports, "commit");
336
+ this._send = capture(ports, "send");
337
+ this._loadPublication =
338
+ ports?.loadPublication === undefined
339
+ ? null
340
+ : capture(ports, "loadPublication");
341
+ this._loadReception = capture(ports, "loadReception");
342
+ if (!isGovernedKnowledgeArtifactLifecycle(artifactLifecycle)) {
343
+ throw new TypeError(
344
+ "a branded governed Knowledge artifact lifecycle is required",
345
+ );
346
+ }
347
+ this._prepareArtifact = capture(artifactLifecycle, "prepare");
348
+ this._commitArtifact = capture(artifactLifecycle, "commit");
349
+ if (typeof clock !== "function") throw new TypeError("clock is required");
350
+ this._clock = clock;
351
+ if (
352
+ dependencyExecutor !== null &&
353
+ !isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
354
+ ) {
355
+ throw new TypeError(
356
+ "dependencyExecutor must be a branded governed dependency executor",
357
+ );
358
+ }
359
+ this._executeDependencies = dependencyExecutor
360
+ ? capture(dependencyExecutor, "execute")
361
+ : null;
362
+ SYNCHRONIZERS.add(this);
363
+ }
364
+
365
+ async publish(input, options = {}) {
366
+ const result = await this.publishWithArtifactEvidence(input, options);
367
+ return result.envelope;
368
+ }
369
+
370
+ async publishWithArtifactEvidence(
371
+ input,
372
+ {
373
+ operationId = null,
374
+ artifactOperation = "publish",
375
+ artifactEvidenceDigest = null,
376
+ artifactHumanReviewed = false,
377
+ } = {},
378
+ ) {
379
+ const knowledge = normalizeRecord(input, this, { executionRecord: true });
380
+ if (knowledge.scope === "personal")
381
+ throw new Error("personal knowledge cannot enter a shared sync channel");
382
+ if (operationId !== null) {
383
+ id(operationId, "publish operationId");
384
+ if (!this._loadPublication) {
385
+ throw new Error("durable publication recovery is unavailable");
386
+ }
387
+ const existing = await this._loadPublication({ operationId });
388
+ if (existing) {
389
+ const comparable = { ...existing.knowledge };
390
+ delete comparable.conflictWithDigest;
391
+ if (
392
+ existing.operationId !== operationId ||
393
+ existing.disposition !== "local" ||
394
+ canonical(comparable) !== canonical(knowledge) ||
395
+ existing.envelope?.envelopeDigest !== existing.envelopeDigest
396
+ ) {
397
+ throw new Error("publish operationId resolved different knowledge");
398
+ }
399
+ verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
400
+ const binding = verifyGovernedKnowledgeArtifactBinding(
401
+ existing.artifactBinding,
402
+ {
403
+ tenantId: this.tenantId,
404
+ knowledge,
405
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
406
+ },
407
+ );
408
+ if (
409
+ artifactOperation !== binding.operation ||
410
+ (artifactEvidenceDigest !== null &&
411
+ artifactEvidenceDigest !== binding.evidenceDigest) ||
412
+ artifactHumanReviewed !== binding.humanReviewed
413
+ ) {
414
+ throw new Error("publish artifact recovery binding differs");
415
+ }
416
+ const prepared = await this._prepareArtifact({
417
+ knowledge,
418
+ currentKnowledge: binding.baseline,
419
+ operation: binding.operation,
420
+ operationId: binding.operationId,
421
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
422
+ evidenceDigest: binding.evidenceDigest,
423
+ issuedAt: binding.issuedAt,
424
+ humanReviewed: binding.humanReviewed,
425
+ });
426
+ const sent = await this._send({ envelope: existing.envelope });
427
+ if (
428
+ sent?.durable !== true ||
429
+ sent.envelopeDigest !== existing.envelopeDigest
430
+ ) {
431
+ throw new Error("sync transport did not durably accept the envelope");
432
+ }
433
+ const artifact = await this._commitArtifact(prepared);
434
+ return freeze({
435
+ envelope: clone(existing.envelope),
436
+ artifact: clone(artifact),
437
+ recovered: true,
438
+ });
439
+ }
440
+ }
441
+ const admission = await this._admit("publish", knowledge);
442
+ const current = await this._load({ knowledgeId: knowledge.knowledgeId });
443
+ const effectiveOperationId =
444
+ operationId ??
445
+ `knowledge-publish:${hash(
446
+ "chainlesschain.governed-knowledge-publish-operation/v1",
447
+ { tenantId: this.tenantId, deviceId: this.deviceId, knowledge },
448
+ ).slice(7)}`;
449
+ const milliseconds = Number(this._clock());
450
+ if (!Number.isFinite(milliseconds))
451
+ throw new TypeError("knowledge sync clock is invalid");
452
+ const binding = freeze({
453
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
454
+ activate: true,
455
+ operationId: effectiveOperationId,
456
+ operation: artifactOperation,
457
+ issuedAt: new Date(milliseconds).toISOString(),
458
+ authorizationReceiptDigest: admission.receiptDigest,
459
+ evidenceDigest: artifactEvidenceDigest ?? admission.receiptDigest,
460
+ humanReviewed: artifactHumanReviewed,
461
+ baseline: current === null ? null : clone(current),
462
+ });
463
+ verifyGovernedKnowledgeArtifactBinding(binding, {
464
+ tenantId: this.tenantId,
465
+ knowledge,
466
+ authorizationReceiptDigest: admission.receiptDigest,
467
+ });
468
+ const prepared = await this._prepareArtifact({
469
+ knowledge,
470
+ currentKnowledge: binding.baseline,
471
+ operation: binding.operation,
472
+ operationId: binding.operationId,
473
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
474
+ evidenceDigest: binding.evidenceDigest,
475
+ issuedAt: binding.issuedAt,
476
+ humanReviewed: binding.humanReviewed,
477
+ });
478
+ await this._applyRevocationDependencies(knowledge);
479
+ const plaintext = Buffer.from(canonical(knowledge), "utf8");
480
+ const encrypted = await this._encrypt({ knowledge, plaintext });
481
+ if (
482
+ !Buffer.isBuffer(encrypted?.ciphertext) ||
483
+ encrypted.ciphertext.length < 1 ||
484
+ encrypted.ciphertext.length > MAX_CIPHERTEXT_BYTES ||
485
+ encrypted.ciphertext.includes(plaintext) ||
486
+ encrypted.ciphertextDigest !== hashBytes(encrypted.ciphertext)
487
+ )
488
+ throw new Error("sync encryption authority returned unsafe ciphertext");
489
+ const core = {
490
+ schema: GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
491
+ tenantId: this.tenantId,
492
+ senderDeviceId: this.deviceId,
493
+ knowledgeId: knowledge.knowledgeId,
494
+ scope: knowledge.scope,
495
+ scopeId: knowledge.scopeId,
496
+ action: knowledge.action,
497
+ contentDigest: knowledge.contentDigest,
498
+ vectorClock: knowledge.vectorClock,
499
+ ciphertext: encrypted.ciphertext.toString("base64"),
500
+ ciphertextDigest: encrypted.ciphertextDigest,
501
+ keyRef: id(encrypted.keyRef, "encryption keyRef"),
502
+ };
503
+ const envelopeDigest = hash(GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA, core);
504
+ const signature = await this._sign({ core, envelopeDigest });
505
+ const envelope = freeze({
506
+ ...core,
507
+ envelopeDigest,
508
+ signature: clone(signature),
509
+ });
510
+ await this._persist(
511
+ knowledge,
512
+ envelope,
513
+ "local",
514
+ admission,
515
+ operationId,
516
+ binding,
517
+ );
518
+ const sent = await this._send({ envelope });
519
+ if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
520
+ throw new Error("sync transport did not durably accept the envelope");
521
+ const artifact = await this._commitArtifact(prepared);
522
+ return freeze({ envelope, artifact: clone(artifact), recovered: false });
523
+ }
524
+
525
+ async receive(envelope) {
526
+ let core;
527
+ try {
528
+ ({ core } = verifyGovernedKnowledgeEnvelopeIntegrity(envelope, this));
529
+ } catch {
530
+ throw new Error("knowledge envelope is unauthenticated or cross-tenant");
531
+ }
532
+ if (
533
+ envelope.senderDeviceId === this.deviceId ||
534
+ (await this._verify({
535
+ core,
536
+ envelopeDigest: envelope.envelopeDigest,
537
+ signature: envelope.signature,
538
+ })) !== true
539
+ )
540
+ throw new Error("knowledge envelope is unauthenticated or cross-tenant");
541
+ const decrypted = await this._decrypt({ envelope });
542
+ if (!Buffer.isBuffer(decrypted?.plaintext))
543
+ throw new Error("knowledge envelope decryption failed");
544
+ let parsed;
545
+ try {
546
+ parsed = JSON.parse(decrypted.plaintext.toString("utf8"));
547
+ } catch {
548
+ throw new Error("knowledge envelope plaintext is not canonical JSON");
549
+ }
550
+ if (canonical(parsed) !== decrypted.plaintext.toString("utf8"))
551
+ throw new Error("knowledge envelope plaintext is not canonical JSON");
552
+ const knowledge = normalizeRecord(parsed, this, { executionRecord: true });
553
+ if (
554
+ knowledge.knowledgeId !== envelope.knowledgeId ||
555
+ knowledge.contentDigest !== envelope.contentDigest ||
556
+ knowledge.scope !== envelope.scope ||
557
+ knowledge.scopeId !== envelope.scopeId ||
558
+ knowledge.action !== envelope.action ||
559
+ canonical(knowledge.vectorClock) !== canonical(envelope.vectorClock) ||
560
+ !["team", "org", "project"].includes(knowledge.scope)
561
+ )
562
+ throw new Error("knowledge envelope substituted its governed record");
563
+ const admission = await this._admit("receive", knowledge);
564
+ const existing = await this._loadReception({
565
+ envelopeDigest: envelope.envelopeDigest,
566
+ });
567
+ if (existing) {
568
+ const comparable = { ...existing.knowledge };
569
+ delete comparable.conflictWithDigest;
570
+ if (
571
+ !["remote", "conflict"].includes(existing.disposition) ||
572
+ existing.envelopeDigest !== envelope.envelopeDigest ||
573
+ canonical(comparable) !== canonical(knowledge)
574
+ ) {
575
+ throw new Error("receive envelope resolved different knowledge");
576
+ }
577
+ const binding = verifyGovernedKnowledgeArtifactBinding(
578
+ existing.artifactBinding,
579
+ {
580
+ tenantId: this.tenantId,
581
+ knowledge,
582
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
583
+ },
584
+ );
585
+ if (
586
+ binding.operation !== "receive" ||
587
+ binding.activate !== (existing.disposition === "remote")
588
+ ) {
589
+ throw new Error("receive artifact recovery binding differs");
590
+ }
591
+ const prepared = await this._prepareArtifact({
592
+ knowledge,
593
+ currentKnowledge: binding.baseline,
594
+ operation: binding.operation,
595
+ operationId: binding.operationId,
596
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
597
+ evidenceDigest: binding.evidenceDigest,
598
+ issuedAt: binding.issuedAt,
599
+ activate: binding.activate,
600
+ humanReviewed: binding.humanReviewed,
601
+ });
602
+ const artifact = await this._commitArtifact(prepared);
603
+ return existing.disposition === "conflict"
604
+ ? freeze({
605
+ applied: false,
606
+ reason: "conflict",
607
+ requiresHumanMerge: true,
608
+ recovered: true,
609
+ artifact: clone(artifact),
610
+ })
611
+ : freeze({
612
+ applied: true,
613
+ action: knowledge.action,
614
+ recovered: true,
615
+ artifact: clone(artifact),
616
+ });
617
+ }
618
+ const current = await this._load({ knowledgeId: knowledge.knowledgeId });
619
+ if (current) {
620
+ const order = relation(current.vectorClock, knowledge.vectorClock);
621
+ if (order === "after") return freeze({ applied: false, reason: "stale" });
622
+ if (order === "equal") {
623
+ if (current.contentDigest !== knowledge.contentDigest)
624
+ throw new Error("equal vector clock binds conflicting knowledge");
625
+ return freeze({ applied: false, reason: "replay" });
626
+ }
627
+ if (order === "concurrent") {
628
+ const binding = this._receiveArtifactBinding({
629
+ knowledge,
630
+ current,
631
+ admission,
632
+ envelope,
633
+ activate: false,
634
+ });
635
+ const prepared = await this._prepareArtifact({
636
+ knowledge,
637
+ currentKnowledge: binding.baseline,
638
+ operation: binding.operation,
639
+ operationId: binding.operationId,
640
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
641
+ evidenceDigest: binding.evidenceDigest,
642
+ issuedAt: binding.issuedAt,
643
+ activate: binding.activate,
644
+ humanReviewed: binding.humanReviewed,
645
+ });
646
+ await this._persist(
647
+ { ...knowledge, conflictWithDigest: current.contentDigest },
648
+ envelope,
649
+ "conflict",
650
+ admission,
651
+ null,
652
+ binding,
653
+ );
654
+ const artifact = await this._commitArtifact(prepared);
655
+ return freeze({
656
+ applied: false,
657
+ reason: "conflict",
658
+ requiresHumanMerge: true,
659
+ recovered: false,
660
+ artifact: clone(artifact),
661
+ });
662
+ }
663
+ }
664
+ const binding = this._receiveArtifactBinding({
665
+ knowledge,
666
+ current,
667
+ admission,
668
+ envelope,
669
+ activate: true,
670
+ });
671
+ const prepared = await this._prepareArtifact({
672
+ knowledge,
673
+ currentKnowledge: binding.baseline,
674
+ operation: binding.operation,
675
+ operationId: binding.operationId,
676
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
677
+ evidenceDigest: binding.evidenceDigest,
678
+ issuedAt: binding.issuedAt,
679
+ activate: binding.activate,
680
+ humanReviewed: binding.humanReviewed,
681
+ });
682
+ await this._applyRevocationDependencies(knowledge);
683
+ await this._persist(
684
+ knowledge,
685
+ envelope,
686
+ "remote",
687
+ admission,
688
+ null,
689
+ binding,
690
+ );
691
+ const artifact = await this._commitArtifact(prepared);
692
+ return freeze({
693
+ applied: true,
694
+ action: knowledge.action,
695
+ recovered: false,
696
+ artifact: clone(artifact),
697
+ });
698
+ }
699
+
700
+ _receiveArtifactBinding({
701
+ knowledge,
702
+ current,
703
+ admission,
704
+ envelope,
705
+ activate,
706
+ }) {
707
+ const milliseconds = Number(this._clock());
708
+ if (!Number.isFinite(milliseconds))
709
+ throw new TypeError("knowledge sync clock is invalid");
710
+ const binding = freeze({
711
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
712
+ activate,
713
+ operationId: `knowledge-receive:${envelope.envelopeDigest.slice(7)}`,
714
+ operation: "receive",
715
+ issuedAt: new Date(milliseconds).toISOString(),
716
+ authorizationReceiptDigest: admission.receiptDigest,
717
+ evidenceDigest: envelope.envelopeDigest,
718
+ humanReviewed: false,
719
+ baseline: current === null ? null : clone(current),
720
+ });
721
+ verifyGovernedKnowledgeArtifactBinding(binding, {
722
+ tenantId: this.tenantId,
723
+ knowledge,
724
+ authorizationReceiptDigest: admission.receiptDigest,
725
+ });
726
+ return binding;
727
+ }
728
+
729
+ async _admit(operation, knowledge) {
730
+ const result = await this._authorize({ operation, knowledge });
731
+ if (
732
+ result?.authenticated !== true ||
733
+ result.allowed !== true ||
734
+ result.tenantId !== this.tenantId ||
735
+ result.knowledgeId !== knowledge.knowledgeId ||
736
+ result.scope !== knowledge.scope ||
737
+ result.scopeId !== knowledge.scopeId ||
738
+ !DIGEST.test(result.receiptDigest || "")
739
+ )
740
+ throw new Error("knowledge synchronization is not authorized");
741
+ return freeze(clone(result));
742
+ }
743
+
744
+ async _persist(
745
+ knowledge,
746
+ envelope,
747
+ disposition,
748
+ admission,
749
+ operationId = null,
750
+ artifactBinding = null,
751
+ ) {
752
+ const result = await this._commit({
753
+ knowledge,
754
+ envelope,
755
+ envelopeDigest: envelope.envelopeDigest,
756
+ disposition,
757
+ authorizationReceiptDigest: admission.receiptDigest,
758
+ operationId,
759
+ artifactBinding,
760
+ });
761
+ if (
762
+ result?.authenticated !== true ||
763
+ result.durable !== true ||
764
+ result.envelopeDigest !== envelope.envelopeDigest ||
765
+ result.knowledgeId !== knowledge.knowledgeId
766
+ )
767
+ throw new Error("knowledge synchronization was not durably committed");
768
+ }
769
+
770
+ async _applyRevocationDependencies(knowledge) {
771
+ if (!["tombstone", "revoke"].includes(knowledge.action)) return;
772
+ if (!this._executeDependencies) {
773
+ throw new Error("revocation dependency executor is unavailable");
774
+ }
775
+ const result = await this._executeDependencies(knowledge);
776
+ if (
777
+ result?.authenticated !== true ||
778
+ result.durable !== true ||
779
+ result.tenantId !== this.tenantId ||
780
+ result.deviceId !== this.deviceId ||
781
+ result.knowledgeId !== knowledge.knowledgeId ||
782
+ result.revocationReceiptDigest !== knowledge.revocationReceiptDigest ||
783
+ !DIGEST.test(result.operationDigest ?? "") ||
784
+ !Array.isArray(result.resultDigests) ||
785
+ result.resultDigests.length !== knowledge.dependencies.length ||
786
+ result.resultDigests.some((value) => !DIGEST.test(value))
787
+ ) {
788
+ throw new Error("revocation dependencies were not durably applied");
789
+ }
790
+ }
791
+ }
792
+
793
+ export function isGovernedKnowledgeSync(value) {
794
+ return SYNCHRONIZERS.has(value);
795
+ }