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,485 @@
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
+
6
+ export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
7
+ "chainlesschain.governed-evolution-knowledge-sync/v1";
8
+ export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
9
+ "chainlesschain.governed-evolution-knowledge-envelope/v1";
10
+ export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
11
+ PERSONAL: "personal",
12
+ PROJECT: "project",
13
+ TEAM: "team",
14
+ ORG: "org",
15
+ });
16
+
17
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
18
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
19
+ const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
20
+ const ACTIONS = new Set(["upsert", "tombstone", "revoke"]);
21
+ const MAX_CIPHERTEXT_BYTES = 12 * 1024 * 1024;
22
+ const EXECUTION_RECORDS = new WeakSet();
23
+ const SYNCHRONIZERS = new WeakSet();
24
+ const ENVELOPE_KEYS = new Set([
25
+ "action",
26
+ "ciphertext",
27
+ "ciphertextDigest",
28
+ "contentDigest",
29
+ "envelopeDigest",
30
+ "keyRef",
31
+ "knowledgeId",
32
+ "schema",
33
+ "scope",
34
+ "scopeId",
35
+ "senderDeviceId",
36
+ "signature",
37
+ "tenantId",
38
+ "vectorClock",
39
+ ]);
40
+
41
+ function canonical(value) {
42
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
43
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
44
+ return `{${Object.keys(value)
45
+ .sort()
46
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
47
+ .join(",")}}`;
48
+ }
49
+
50
+ function hash(domain, value) {
51
+ return `sha256:${createHash("sha256")
52
+ .update(`${domain}\0${canonical(value)}`)
53
+ .digest("hex")}`;
54
+ }
55
+
56
+ function hashBytes(value) {
57
+ return `sha256:${createHash("sha256").update(value).digest("hex")}`;
58
+ }
59
+
60
+ function clone(value) {
61
+ return value == null ? value : JSON.parse(JSON.stringify(value));
62
+ }
63
+
64
+ function freeze(value) {
65
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
66
+ Object.freeze(value);
67
+ for (const child of Object.values(value)) freeze(child);
68
+ }
69
+ return value;
70
+ }
71
+
72
+ function record(value, label) {
73
+ if (
74
+ !value ||
75
+ typeof value !== "object" ||
76
+ Array.isArray(value) ||
77
+ utilTypes.isProxy(value) ||
78
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
79
+ )
80
+ throw new TypeError(`${label} must be a plain object`);
81
+ return value;
82
+ }
83
+
84
+ function id(value, label) {
85
+ if (typeof value !== "string" || !ID.test(value))
86
+ throw new TypeError(`${label} is invalid`);
87
+ return value;
88
+ }
89
+
90
+ function digest(value, label) {
91
+ if (typeof value !== "string" || !DIGEST.test(value))
92
+ throw new TypeError(`${label} must be sha256-bound`);
93
+ return value;
94
+ }
95
+
96
+ function capture(owner, method) {
97
+ if (
98
+ !owner ||
99
+ typeof owner !== "object" ||
100
+ utilTypes.isProxy(owner) ||
101
+ typeof owner[method] !== "function"
102
+ )
103
+ throw new TypeError(`${method} authority is required`);
104
+ return (...args) => Reflect.apply(owner[method], owner, args);
105
+ }
106
+
107
+ function vectorClock(value) {
108
+ record(value, "vectorClock");
109
+ const entries = Object.entries(value);
110
+ if (entries.length < 1 || entries.length > 64)
111
+ throw new TypeError("vectorClock is empty or unbounded");
112
+ const result = {};
113
+ for (const [deviceId, revision] of entries.sort(([a], [b]) =>
114
+ a.localeCompare(b),
115
+ )) {
116
+ id(deviceId, "vectorClock device");
117
+ if (!Number.isSafeInteger(revision) || revision < 0)
118
+ throw new TypeError("vectorClock revision is invalid");
119
+ result[deviceId] = revision;
120
+ }
121
+ return result;
122
+ }
123
+
124
+ function relation(left, right) {
125
+ const devices = new Set([...Object.keys(left), ...Object.keys(right)]);
126
+ let before = false;
127
+ let after = false;
128
+ for (const device of devices) {
129
+ const a = left[device] || 0;
130
+ const b = right[device] || 0;
131
+ before ||= a < b;
132
+ after ||= a > b;
133
+ }
134
+ if (before && after) return "concurrent";
135
+ if (before) return "before";
136
+ if (after) return "after";
137
+ return "equal";
138
+ }
139
+
140
+ function normalizeDependencies(value, action) {
141
+ if (!Array.isArray(value) || value.length > 256)
142
+ throw new TypeError("dependency dispositions are unbounded");
143
+ const seen = new Set();
144
+ return value.map((entry) => {
145
+ record(entry, "dependency disposition");
146
+ const normalized = {
147
+ kind: id(entry.kind, "dependency kind"),
148
+ digest: digest(entry.digest, "dependency digest"),
149
+ disposition: id(entry.disposition, "dependency disposition"),
150
+ };
151
+ const key = `${normalized.kind}:${normalized.digest}`;
152
+ if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
153
+ seen.add(key);
154
+ if (
155
+ ["tombstone", "revoke"].includes(action) &&
156
+ ![
157
+ "tombstone",
158
+ "quarantine",
159
+ "reject-candidate",
160
+ "rollback-active",
161
+ ].includes(normalized.disposition)
162
+ )
163
+ throw new TypeError("revocation dependency disposition is unsafe");
164
+ return normalized;
165
+ });
166
+ }
167
+
168
+ function normalizeRecord(input, descriptor, { executionRecord = false } = {}) {
169
+ record(input, "knowledge record");
170
+ const action = ACTIONS.has(input.action) ? input.action : null;
171
+ const scope = SCOPES.has(input.scope) ? input.scope : null;
172
+ if (!action || !scope || input.tenantId !== descriptor.tenantId)
173
+ throw new TypeError("knowledge record boundary is invalid");
174
+ const dependencies = normalizeDependencies(input.dependencies || [], action);
175
+ if (
176
+ ["team", "org"].includes(scope) &&
177
+ !DIGEST.test(input.approvalReceiptDigest || "")
178
+ )
179
+ throw new TypeError("shared knowledge requires approval");
180
+ if (
181
+ ["tombstone", "revoke"].includes(action) &&
182
+ (!DIGEST.test(input.revocationReceiptDigest || "") ||
183
+ dependencies.length < 1)
184
+ )
185
+ throw new TypeError(
186
+ "revocation must bind its receipt and dependency graph",
187
+ );
188
+ const normalized = freeze({
189
+ schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
190
+ tenantId: descriptor.tenantId,
191
+ knowledgeId: id(input.knowledgeId, "knowledgeId"),
192
+ scope,
193
+ scopeId: id(input.scopeId, "scopeId"),
194
+ action,
195
+ contentDigest: digest(input.contentDigest, "contentDigest"),
196
+ vectorClock: vectorClock(input.vectorClock),
197
+ approvalReceiptDigest: input.approvalReceiptDigest || null,
198
+ revocationReceiptDigest: input.revocationReceiptDigest || null,
199
+ dependencies,
200
+ });
201
+ if (executionRecord) EXECUTION_RECORDS.add(normalized);
202
+ return normalized;
203
+ }
204
+
205
+ export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
206
+ return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
207
+ }
208
+
209
+ export function isGovernedKnowledgeExecutionRecord(value) {
210
+ return EXECUTION_RECORDS.has(value);
211
+ }
212
+
213
+ export function verifyGovernedKnowledgeEnvelopeIntegrity(
214
+ envelope,
215
+ { tenantId } = {},
216
+ ) {
217
+ record(envelope, "knowledge envelope");
218
+ const expectedTenantId = id(tenantId, "tenantId");
219
+ if (typeof envelope.ciphertext !== "string") {
220
+ throw new Error("knowledge envelope ciphertext is invalid");
221
+ }
222
+ const ciphertext = Buffer.from(envelope.ciphertext, "base64");
223
+ const keys = Reflect.ownKeys(envelope);
224
+ const core = { ...envelope };
225
+ delete core.envelopeDigest;
226
+ delete core.signature;
227
+ if (
228
+ envelope.schema !== GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA ||
229
+ keys.length !== ENVELOPE_KEYS.size ||
230
+ keys.some((key) => typeof key !== "string" || !ENVELOPE_KEYS.has(key)) ||
231
+ envelope.tenantId !== expectedTenantId ||
232
+ !ID.test(envelope.senderDeviceId || "") ||
233
+ !ID.test(envelope.knowledgeId || "") ||
234
+ !SCOPES.has(envelope.scope) ||
235
+ !ID.test(envelope.scopeId || "") ||
236
+ !ACTIONS.has(envelope.action) ||
237
+ !DIGEST.test(envelope.contentDigest || "") ||
238
+ canonical(vectorClock(envelope.vectorClock)) !==
239
+ canonical(envelope.vectorClock) ||
240
+ ciphertext.length < 1 ||
241
+ ciphertext.length > MAX_CIPHERTEXT_BYTES ||
242
+ ciphertext.toString("base64") !== envelope.ciphertext ||
243
+ envelope.ciphertextDigest !== hashBytes(ciphertext) ||
244
+ !ID.test(envelope.keyRef || "") ||
245
+ envelope.envelopeDigest !== hash(GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA, core)
246
+ ) {
247
+ throw new Error("knowledge envelope integrity is invalid");
248
+ }
249
+ return freeze({ core: freeze(clone(core)) });
250
+ }
251
+
252
+ export class GovernedKnowledgeSync {
253
+ constructor({ tenantId, deviceId, ports, dependencyExecutor = null } = {}) {
254
+ this.tenantId = id(tenantId, "tenantId");
255
+ this.deviceId = id(deviceId, "deviceId");
256
+ this._authorize = capture(ports, "authorize");
257
+ this._encrypt = capture(ports, "encrypt");
258
+ this._decrypt = capture(ports, "decrypt");
259
+ this._sign = capture(ports, "sign");
260
+ this._verify = capture(ports, "verify");
261
+ this._load = capture(ports, "load");
262
+ this._commit = capture(ports, "commit");
263
+ this._send = capture(ports, "send");
264
+ this._loadPublication =
265
+ ports?.loadPublication === undefined
266
+ ? null
267
+ : capture(ports, "loadPublication");
268
+ if (
269
+ dependencyExecutor !== null &&
270
+ !isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
271
+ ) {
272
+ throw new TypeError(
273
+ "dependencyExecutor must be a branded governed dependency executor",
274
+ );
275
+ }
276
+ this._executeDependencies = dependencyExecutor
277
+ ? capture(dependencyExecutor, "execute")
278
+ : null;
279
+ SYNCHRONIZERS.add(this);
280
+ }
281
+
282
+ async publish(input, { operationId = null } = {}) {
283
+ const knowledge = normalizeRecord(input, this, { executionRecord: true });
284
+ if (knowledge.scope === "personal")
285
+ throw new Error("personal knowledge cannot enter a shared sync channel");
286
+ if (operationId !== null) {
287
+ id(operationId, "publish operationId");
288
+ if (!this._loadPublication) {
289
+ throw new Error("durable publication recovery is unavailable");
290
+ }
291
+ const existing = await this._loadPublication({ operationId });
292
+ if (existing) {
293
+ const comparable = { ...existing.knowledge };
294
+ delete comparable.conflictWithDigest;
295
+ if (
296
+ existing.operationId !== operationId ||
297
+ existing.disposition !== "local" ||
298
+ canonical(comparable) !== canonical(knowledge) ||
299
+ existing.envelope?.envelopeDigest !== existing.envelopeDigest
300
+ ) {
301
+ throw new Error("publish operationId resolved different knowledge");
302
+ }
303
+ verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
304
+ const sent = await this._send({ envelope: existing.envelope });
305
+ if (
306
+ sent?.durable !== true ||
307
+ sent.envelopeDigest !== existing.envelopeDigest
308
+ ) {
309
+ throw new Error("sync transport did not durably accept the envelope");
310
+ }
311
+ return freeze(clone(existing.envelope));
312
+ }
313
+ }
314
+ const admission = await this._admit("publish", knowledge);
315
+ await this._applyRevocationDependencies(knowledge);
316
+ const plaintext = Buffer.from(canonical(knowledge), "utf8");
317
+ const encrypted = await this._encrypt({ knowledge, plaintext });
318
+ if (
319
+ !Buffer.isBuffer(encrypted?.ciphertext) ||
320
+ encrypted.ciphertext.length < 1 ||
321
+ encrypted.ciphertext.length > MAX_CIPHERTEXT_BYTES ||
322
+ encrypted.ciphertext.includes(plaintext) ||
323
+ encrypted.ciphertextDigest !== hashBytes(encrypted.ciphertext)
324
+ )
325
+ throw new Error("sync encryption authority returned unsafe ciphertext");
326
+ const core = {
327
+ schema: GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
328
+ tenantId: this.tenantId,
329
+ senderDeviceId: this.deviceId,
330
+ knowledgeId: knowledge.knowledgeId,
331
+ scope: knowledge.scope,
332
+ scopeId: knowledge.scopeId,
333
+ action: knowledge.action,
334
+ contentDigest: knowledge.contentDigest,
335
+ vectorClock: knowledge.vectorClock,
336
+ ciphertext: encrypted.ciphertext.toString("base64"),
337
+ ciphertextDigest: encrypted.ciphertextDigest,
338
+ keyRef: id(encrypted.keyRef, "encryption keyRef"),
339
+ };
340
+ const envelopeDigest = hash(GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA, core);
341
+ const signature = await this._sign({ core, envelopeDigest });
342
+ const envelope = freeze({
343
+ ...core,
344
+ envelopeDigest,
345
+ signature: clone(signature),
346
+ });
347
+ await this._persist(knowledge, envelope, "local", admission, operationId);
348
+ const sent = await this._send({ envelope });
349
+ if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
350
+ throw new Error("sync transport did not durably accept the envelope");
351
+ return envelope;
352
+ }
353
+
354
+ async receive(envelope) {
355
+ let core;
356
+ try {
357
+ ({ core } = verifyGovernedKnowledgeEnvelopeIntegrity(envelope, this));
358
+ } catch {
359
+ throw new Error("knowledge envelope is unauthenticated or cross-tenant");
360
+ }
361
+ if (
362
+ envelope.senderDeviceId === this.deviceId ||
363
+ (await this._verify({
364
+ core,
365
+ envelopeDigest: envelope.envelopeDigest,
366
+ signature: envelope.signature,
367
+ })) !== true
368
+ )
369
+ throw new Error("knowledge envelope is unauthenticated or cross-tenant");
370
+ const decrypted = await this._decrypt({ envelope });
371
+ if (!Buffer.isBuffer(decrypted?.plaintext))
372
+ throw new Error("knowledge envelope decryption failed");
373
+ let parsed;
374
+ try {
375
+ parsed = JSON.parse(decrypted.plaintext.toString("utf8"));
376
+ } catch {
377
+ throw new Error("knowledge envelope plaintext is not canonical JSON");
378
+ }
379
+ if (canonical(parsed) !== decrypted.plaintext.toString("utf8"))
380
+ throw new Error("knowledge envelope plaintext is not canonical JSON");
381
+ const knowledge = normalizeRecord(parsed, this, { executionRecord: true });
382
+ if (
383
+ knowledge.knowledgeId !== envelope.knowledgeId ||
384
+ knowledge.contentDigest !== envelope.contentDigest ||
385
+ knowledge.scope !== envelope.scope ||
386
+ knowledge.scopeId !== envelope.scopeId ||
387
+ knowledge.action !== envelope.action ||
388
+ canonical(knowledge.vectorClock) !== canonical(envelope.vectorClock) ||
389
+ !["team", "org", "project"].includes(knowledge.scope)
390
+ )
391
+ throw new Error("knowledge envelope substituted its governed record");
392
+ const admission = await this._admit("receive", knowledge);
393
+ const current = await this._load({ knowledgeId: knowledge.knowledgeId });
394
+ if (current) {
395
+ const order = relation(current.vectorClock, knowledge.vectorClock);
396
+ if (order === "after") return freeze({ applied: false, reason: "stale" });
397
+ if (order === "equal") {
398
+ if (current.contentDigest !== knowledge.contentDigest)
399
+ throw new Error("equal vector clock binds conflicting knowledge");
400
+ return freeze({ applied: false, reason: "replay" });
401
+ }
402
+ if (order === "concurrent") {
403
+ await this._persist(
404
+ { ...knowledge, conflictWithDigest: current.contentDigest },
405
+ envelope,
406
+ "conflict",
407
+ admission,
408
+ );
409
+ return freeze({
410
+ applied: false,
411
+ reason: "conflict",
412
+ requiresHumanMerge: true,
413
+ });
414
+ }
415
+ }
416
+ await this._applyRevocationDependencies(knowledge);
417
+ await this._persist(knowledge, envelope, "remote", admission);
418
+ return freeze({ applied: true, action: knowledge.action });
419
+ }
420
+
421
+ async _admit(operation, knowledge) {
422
+ const result = await this._authorize({ operation, knowledge });
423
+ if (
424
+ result?.authenticated !== true ||
425
+ result.allowed !== true ||
426
+ result.tenantId !== this.tenantId ||
427
+ result.knowledgeId !== knowledge.knowledgeId ||
428
+ result.scope !== knowledge.scope ||
429
+ result.scopeId !== knowledge.scopeId ||
430
+ !DIGEST.test(result.receiptDigest || "")
431
+ )
432
+ throw new Error("knowledge synchronization is not authorized");
433
+ return freeze(clone(result));
434
+ }
435
+
436
+ async _persist(
437
+ knowledge,
438
+ envelope,
439
+ disposition,
440
+ admission,
441
+ operationId = null,
442
+ ) {
443
+ const result = await this._commit({
444
+ knowledge,
445
+ envelope,
446
+ envelopeDigest: envelope.envelopeDigest,
447
+ disposition,
448
+ authorizationReceiptDigest: admission.receiptDigest,
449
+ operationId,
450
+ });
451
+ if (
452
+ result?.authenticated !== true ||
453
+ result.durable !== true ||
454
+ result.envelopeDigest !== envelope.envelopeDigest ||
455
+ result.knowledgeId !== knowledge.knowledgeId
456
+ )
457
+ throw new Error("knowledge synchronization was not durably committed");
458
+ }
459
+
460
+ async _applyRevocationDependencies(knowledge) {
461
+ if (!["tombstone", "revoke"].includes(knowledge.action)) return;
462
+ if (!this._executeDependencies) {
463
+ throw new Error("revocation dependency executor is unavailable");
464
+ }
465
+ const result = await this._executeDependencies(knowledge);
466
+ if (
467
+ result?.authenticated !== true ||
468
+ result.durable !== true ||
469
+ result.tenantId !== this.tenantId ||
470
+ result.deviceId !== this.deviceId ||
471
+ result.knowledgeId !== knowledge.knowledgeId ||
472
+ result.revocationReceiptDigest !== knowledge.revocationReceiptDigest ||
473
+ !DIGEST.test(result.operationDigest ?? "") ||
474
+ !Array.isArray(result.resultDigests) ||
475
+ result.resultDigests.length !== knowledge.dependencies.length ||
476
+ result.resultDigests.some((value) => !DIGEST.test(value))
477
+ ) {
478
+ throw new Error("revocation dependencies were not durably applied");
479
+ }
480
+ }
481
+ }
482
+
483
+ export function isGovernedKnowledgeSync(value) {
484
+ return SYNCHRONIZERS.has(value);
485
+ }