chainlesschain 0.162.148 → 0.162.150

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 (322) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-CBLvrjeG.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-DYv2GtE0.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-CL6PZ-Ww.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-xuyHt4uA.js} +3 -3
  8. package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-DOvSVycq.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-DMhfTswr.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-CQxDdm63.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-BEeNhK2a.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-8nul8eTq.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CL04O-ER.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-C50o-n7x.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-CH-bDkzs.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-DqAIMvSe.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-C43fo_my.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-BERnMrdP.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-Baw3w1gp.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-BEqAHF1-.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-CvnmKwK4.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-iMPxgVdt.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard--4SJX3YR.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BgLV6xgz.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-Bvb8oUD8.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-DpXPjJB5.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-BbFfJ1Xi.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DeGq1B-q.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-CNW7s9zM.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-L1PjW-lT.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-PK-X58to.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-BePWEH-d.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-LF_sBvdL.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-BKkfk9hy.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-BNMqUDla.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-w4WPiyz2.js} +5 -5
  37. package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-DUKMVGNi.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-BWhiEyTJ.js} +1 -1
  39. package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-Ocf5JEkX.js} +1 -1
  40. package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-D2B6MMhU.js} +4 -4
  41. package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-DdYjCq1O.js} +4 -4
  42. package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-Cb1hfuUZ.js} +3 -3
  43. package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-CTeImGp7.js} +1 -1
  44. package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-BjYNc7eQ.js} +4 -4
  45. package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-Dn_NtRXQ.js} +1 -1
  46. package/src/assets/web-panel/assets/{OrderTableRenderer-DIp8Xcbd.js → OrderTableRenderer-DVYYIizh.js} +1 -1
  47. package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-Be2Kmr5j.js} +4 -4
  48. package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow-Cu_-qRlR.js} +1 -1
  49. package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-DD2HoGzE.js} +2 -2
  50. package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-BRI7DVth.js} +3 -3
  51. package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-C9Srcs2M.js} +4 -4
  52. package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CUqcMgo1.js} +3 -3
  53. package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-HBrQGLXt.js} +1 -1
  54. package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-D-B0vjwh.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-eTeLIu9e.js} +2 -2
  56. package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-DrRqCsC6.js} +2 -2
  57. package/src/assets/web-panel/assets/{Projects-Dpid9CDg.js → Projects-1G9DNOhI.js} +1 -1
  58. package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-RkTZzpxP.js} +1 -1
  59. package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-BSCUgsgC.js} +1 -1
  60. package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CHgyM3Bz.js} +1 -1
  61. package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-0lry4OZq.js} +1 -1
  62. package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-Cn45UroZ.js} +2 -2
  63. package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-Q-Zjb707.js} +1 -1
  64. package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-BdM70oda.js} +1 -1
  65. package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-DmOAKKap.js} +2 -2
  66. package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-Dwavbm07.js} +1 -1
  67. package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DukXFCnk.js} +3 -3
  68. package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-BIlRnITu.js} +2 -2
  69. package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-YYVQdhhQ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-B8_iYHz2.js} +1 -1
  71. package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-BdVrhT31.js} +1 -1
  72. package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-CD3ggRx7.js} +1 -1
  73. package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-Bp02VZFH.js} +2 -2
  74. package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-DEVmCEsr.js} +1 -1
  75. package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-B6czWc4N.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-BCJLv17r.js} +1 -1
  77. package/src/assets/web-panel/assets/Terminal-CD132d2Y.js +3 -0
  78. package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-ZB-CvkZl.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BnSY0S-s.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-VZw9Oy2w.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-pZq7Hjd2.js} +1 -1
  82. package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-DnQaqk4q.js} +1 -1
  83. package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-BEUfmvJV.js} +1 -1
  84. package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-CoZKMXJ2.js} +4 -4
  85. package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-CBOGVx1I.js} +5 -5
  86. package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-huSKn7TT.js} +1 -1
  87. package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-A_3w6FBO.js} +1 -1
  88. package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-D1Bem9Oy.js} +1 -1
  89. package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-CJYJj0oO.js} +1 -1
  90. package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-BkbFiKT4.js} +1 -1
  91. package/src/assets/web-panel/assets/devWarning-WDr3_M_N.js +1 -0
  92. package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-CKvUafVY.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-AjrSPnvv.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-B8i0lViZ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-B9Svn0zc.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-BHdHSX06.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BHdailyo.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-BJwlEnYo.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-BOoAQjJz.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-BSgWxAOG.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-BdutMsne.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-BiDWxzbn.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-By5a0T_W.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-C-WIY-FQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-C37f6iey.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-C9bWmTcO.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-CBaosWRO.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-CBlBVJ_m.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-CD62EEGo.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-CUj-l7GM.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-CVS8Ymuq.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-ChkXUj3f.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-Cj0OZ-37.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-Co3OFL0t.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-308gCGh7.js → index-Crp8CbRg.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-D22zNXiS.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-DTs_D1OL.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-DfgCdFrN.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-DjYrecNb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-DpW9cf3e.js} +1 -1
  121. package/src/assets/web-panel/assets/index-Dwix3p4g.js +1 -0
  122. package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-F--HuPG1.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-Fuk6t_3K.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-JEAGMii9.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-PF-mpv8K.js} +1 -1
  126. package/src/assets/web-panel/assets/index-SHaoZ0CA.js +1 -0
  127. package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-b-sbVdjQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-pyvMVX8r.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DISWAYce.js → index-qNTtOVi_.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-tgO8iza6.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CahryTX0.js → index-ttDQVhZy.js} +1 -1
  132. package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-DtrnfsZH.js} +1 -1
  133. package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D4zqSaX3.js} +1 -1
  134. package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-CGFGOUQj.js} +1 -1
  135. package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DH2HvkJl.js} +1 -1
  136. package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-jJ2at5HX.js} +1 -1
  137. package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-CRyMT1Fv.js} +1 -1
  138. package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-DZ_CX0Pt.js} +1 -1
  139. package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-wruHk-h5.js} +1 -1
  140. package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BGgx8q67.js} +1 -1
  141. package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-Do5M7gKm.js} +1 -1
  142. package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-CRa-GZpX.js} +1 -1
  143. package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-BxPcq6pj.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-v5O2ZcJm.js} +1 -1
  145. package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub--z2FU0Px.js} +1 -1
  146. package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-1emidVKd.js} +1 -1
  147. package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-CcJaRyHs.js} +1 -1
  148. package/src/assets/web-panel/index.html +1 -1
  149. package/src/assets/web-panel/remote-session-sw.js +43 -0
  150. package/src/command-manifest.json +22 -1
  151. package/src/commands/a2a.js +19 -4
  152. package/src/commands/activitypub.js +20 -3
  153. package/src/commands/agent.js +71 -10
  154. package/src/commands/audit.js +40 -24
  155. package/src/commands/codeintel.js +320 -0
  156. package/src/commands/collab.js +15 -2
  157. package/src/commands/compliance.js +5 -0
  158. package/src/commands/config.js +4 -1
  159. package/src/commands/dao.js +86 -14
  160. package/src/commands/dev.js +2 -0
  161. package/src/commands/did.js +7 -1
  162. package/src/commands/dlp.js +23 -1
  163. package/src/commands/economy.js +29 -3
  164. package/src/commands/eval.js +255 -0
  165. package/src/commands/evomap.js +26 -0
  166. package/src/commands/governance.js +17 -3
  167. package/src/commands/hardening.js +18 -0
  168. package/src/commands/incentive.js +5 -0
  169. package/src/commands/init.js +46 -2
  170. package/src/commands/kg.js +4 -0
  171. package/src/commands/loop.js +6 -1
  172. package/src/commands/lowcode.js +15 -2
  173. package/src/commands/marketplace.js +40 -6
  174. package/src/commands/matrix.js +20 -1
  175. package/src/commands/memory.js +4 -1
  176. package/src/commands/mtc.js +7 -1
  177. package/src/commands/nostr.js +31 -4
  178. package/src/commands/note.js +7 -4
  179. package/src/commands/plugin.js +474 -0
  180. package/src/commands/pqc.js +5 -0
  181. package/src/commands/reputation.js +10 -1
  182. package/src/commands/scim.js +6 -0
  183. package/src/commands/session.js +32 -10
  184. package/src/commands/siem.js +11 -0
  185. package/src/commands/sla.js +18 -3
  186. package/src/commands/social.js +38 -5
  187. package/src/commands/sso.js +10 -2
  188. package/src/commands/stress.js +23 -4
  189. package/src/commands/team.js +463 -0
  190. package/src/commands/tech.js +2 -0
  191. package/src/commands/tenant.js +10 -1
  192. package/src/commands/terraform.js +6 -0
  193. package/src/commands/update.js +1 -1
  194. package/src/commands/zkp.js +20 -0
  195. package/src/gateways/ws/message-dispatcher.js +48 -2
  196. package/src/gateways/ws/remote-session-protocol.js +140 -42
  197. package/src/gateways/ws/ws-server.js +1 -1
  198. package/src/harness/jsonl-session-store.js +12 -5
  199. package/src/harness/plugin-manager.js +16 -4
  200. package/src/harness/prompt-compressor.js +27 -1
  201. package/src/harness/remote-command-ledger.js +189 -0
  202. package/src/harness/remote-session-push-apns.js +246 -0
  203. package/src/harness/remote-session-push-errors.js +15 -0
  204. package/src/harness/remote-session-push-fcm.js +9 -25
  205. package/src/harness/remote-session-push-huawei.js +174 -0
  206. package/src/harness/remote-session-push-oppo.js +171 -0
  207. package/src/harness/remote-session-push-senders.js +42 -0
  208. package/src/harness/remote-session-push-vivo.js +179 -0
  209. package/src/harness/remote-session-push-web.js +299 -0
  210. package/src/harness/remote-session-push-xiaomi.js +99 -0
  211. package/src/harness/worktree-isolator.js +16 -6
  212. package/src/index.js +6 -0
  213. package/src/lib/__tests__/logger.test.js +5 -2
  214. package/src/lib/a2a-protocol.js +25 -1
  215. package/src/lib/activitypub-bridge.js +61 -0
  216. package/src/lib/agent-core.js +4 -0
  217. package/src/lib/agent-economy.js +262 -29
  218. package/src/lib/agent-network.js +7 -1
  219. package/src/lib/agent-sandbox.js +161 -5
  220. package/src/lib/agent-team/task-lease.js +434 -0
  221. package/src/lib/agent-team/team-budget.js +165 -0
  222. package/src/lib/agent-team/team-mailbox.js +106 -0
  223. package/src/lib/agent-team/team-runner.js +282 -0
  224. package/src/lib/agent-team/team-worktree.js +236 -0
  225. package/src/lib/agents.js +18 -0
  226. package/src/lib/async-hook-supervisor.cjs +391 -0
  227. package/src/lib/audit-logger.js +7 -6
  228. package/src/lib/autonomous-developer.js +60 -0
  229. package/src/lib/chat-core.js +17 -4
  230. package/src/lib/collaboration-governance.js +56 -0
  231. package/src/lib/community-governance.js +68 -0
  232. package/src/lib/compliance-manager.js +63 -0
  233. package/src/lib/cross-chain.js +5 -0
  234. package/src/lib/dao-governance.js +151 -2
  235. package/src/lib/did-manager.js +23 -10
  236. package/src/lib/dlp-engine.js +70 -0
  237. package/src/lib/eval/runner.js +251 -0
  238. package/src/lib/eval/tasks.js +626 -0
  239. package/src/lib/eval/trend.js +200 -0
  240. package/src/lib/evolution-system.js +92 -0
  241. package/src/lib/evomap-federation.js +55 -0
  242. package/src/lib/evomap-governance.js +94 -0
  243. package/src/lib/fatal-handler.js +17 -1
  244. package/src/lib/hardening-manager.js +73 -0
  245. package/src/lib/hierarchical-memory.js +14 -8
  246. package/src/lib/knowledge-exporter.js +8 -2
  247. package/src/lib/knowledge-graph.js +79 -0
  248. package/src/lib/llm-providers.js +23 -14
  249. package/src/lib/logger.js +4 -1
  250. package/src/lib/lsp/__tests__/benchmark.test.js +88 -0
  251. package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
  252. package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
  253. package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
  254. package/src/lib/lsp/__tests__/lsp-client.test.js +269 -0
  255. package/src/lib/lsp/__tests__/lsp-manager.test.js +333 -0
  256. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
  257. package/src/lib/lsp/benchmark.js +257 -0
  258. package/src/lib/lsp/code-intelligence.js +356 -0
  259. package/src/lib/lsp/jsonrpc-stream.js +139 -0
  260. package/src/lib/lsp/lsp-client.js +339 -0
  261. package/src/lib/lsp/lsp-manager.js +375 -0
  262. package/src/lib/lsp/lsp-server-registry.js +196 -0
  263. package/src/lib/matrix-bridge.js +84 -0
  264. package/src/lib/memory-manager.js +5 -3
  265. package/src/lib/nostr-bridge.js +53 -0
  266. package/src/lib/permission-engine.js +22 -4
  267. package/src/lib/plugin-monitor-supervisor.js +238 -0
  268. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +256 -0
  269. package/src/lib/plugin-runtime/agents.js +51 -0
  270. package/src/lib/plugin-runtime/bin.js +100 -0
  271. package/src/lib/plugin-runtime/hooks.js +100 -0
  272. package/src/lib/plugin-runtime/install.js +396 -0
  273. package/src/lib/plugin-runtime/lsp.js +75 -0
  274. package/src/lib/plugin-runtime/manifest.js +458 -0
  275. package/src/lib/plugin-runtime/mcp.js +89 -0
  276. package/src/lib/plugin-runtime/monitors.js +100 -0
  277. package/src/lib/plugin-runtime/policy.js +152 -0
  278. package/src/lib/plugin-runtime/reload.js +79 -0
  279. package/src/lib/plugin-runtime/remote-source.js +240 -0
  280. package/src/lib/plugin-runtime/scopes.js +197 -0
  281. package/src/lib/plugin-runtime/settings.js +119 -0
  282. package/src/lib/plugin-runtime/signature.js +107 -0
  283. package/src/lib/plugin-runtime/skills.js +43 -0
  284. package/src/lib/plugin-runtime/trust.js +140 -0
  285. package/src/lib/pqc-manager.js +64 -0
  286. package/src/lib/reputation-optimizer.js +101 -0
  287. package/src/lib/sandbox-egress-proxy.js +262 -0
  288. package/src/lib/sandbox-fs-policy.js +112 -0
  289. package/src/lib/sandbox-network-policy.js +151 -0
  290. package/src/lib/sandbox-v2.js +24 -18
  291. package/src/lib/scim-manager.js +36 -0
  292. package/src/lib/session-manager.js +5 -2
  293. package/src/lib/settings-hook-events.cjs +78 -6
  294. package/src/lib/settings-hooks.cjs +30 -3
  295. package/src/lib/settings-loader.cjs +35 -1
  296. package/src/lib/siem-exporter.js +45 -0
  297. package/src/lib/skill-loader.js +38 -2
  298. package/src/lib/skill-marketplace.js +83 -0
  299. package/src/lib/sla-manager.js +88 -0
  300. package/src/lib/social-manager.js +74 -0
  301. package/src/lib/stress-tester.js +65 -0
  302. package/src/lib/tech-learning-engine.js +75 -0
  303. package/src/lib/telemetry/span-recorder.js +237 -0
  304. package/src/lib/tenant-saas.js +107 -0
  305. package/src/lib/terraform-manager.js +67 -0
  306. package/src/lib/token-incentive.js +180 -29
  307. package/src/lib/wallet-manager.js +81 -35
  308. package/src/lib/zkp-engine.js +87 -0
  309. package/src/repl/agent-repl.js +417 -6
  310. package/src/runtime/__tests__/auto-pin.test.js +104 -0
  311. package/src/runtime/agent-core.js +771 -104
  312. package/src/runtime/auto-pin.js +117 -0
  313. package/src/runtime/coding-agent-contract-shared.cjs +82 -8
  314. package/src/runtime/coding-agent-policy.cjs +32 -7
  315. package/src/runtime/fallback-model.js +134 -7
  316. package/src/runtime/headless-runner.js +388 -108
  317. package/src/runtime/mcp-config.js +46 -0
  318. package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
  319. package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
  320. package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
  321. package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
  322. package/src/assets/web-panel/assets/index-BXiw9dQf.js +0 -1
@@ -224,14 +224,15 @@ function _recordTransaction(db, config) {
224
224
  createdAt: now,
225
225
  _seq: ++_seq,
226
226
  };
227
- _transactions.set(id, tx);
228
-
229
227
  if (db) {
230
228
  db.prepare(
231
229
  `INSERT INTO token_transactions (id, from_account, to_account, amount, reason, type, created_at)
232
230
  VALUES (?, ?, ?, ?, ?, ?, ?)`,
233
231
  ).run(id, tx.fromAccount, tx.toAccount, tx.amount, tx.reason, tx.type, now);
234
232
  }
233
+ // Register in the in-memory ledger only after the row is persisted, so a
234
+ // failed INSERT (e.g. inside a rolled-back transaction) leaves no phantom.
235
+ _transactions.set(id, tx);
235
236
  return tx;
236
237
  }
237
238
 
@@ -255,6 +256,21 @@ export function transfer(db, config = {}) {
255
256
  throw new Error(`Insufficient balance: ${fromAccount.balance} < ${amount}`);
256
257
  }
257
258
 
259
+ // The debit, the credit and the ledger row must all land or none of them.
260
+ // Without an enclosing transaction a mid-way failure would persist the debit
261
+ // but not the credit (tokens vanish) or move the balances yet never record
262
+ // the ledger — and the CLI re-hydrates from these tables, so it survives.
263
+ const fromSnap = {
264
+ balance: fromAccount.balance,
265
+ totalSpent: fromAccount.totalSpent,
266
+ updatedAt: fromAccount.updatedAt,
267
+ };
268
+ const toSnap = {
269
+ balance: toAccount.balance,
270
+ totalEarned: toAccount.totalEarned,
271
+ updatedAt: toAccount.updatedAt,
272
+ };
273
+
258
274
  fromAccount.balance -= amount;
259
275
  fromAccount.totalSpent += amount;
260
276
  fromAccount.updatedAt = now;
@@ -262,17 +278,33 @@ export function transfer(db, config = {}) {
262
278
  toAccount.totalEarned += amount;
263
279
  toAccount.updatedAt = now;
264
280
 
265
- _persistAccount(db, fromAccount);
266
- _persistAccount(db, toAccount);
281
+ let tx;
282
+ const applyWrites = () => {
283
+ _persistAccount(db, fromAccount);
284
+ _persistAccount(db, toAccount);
285
+ tx = _recordTransaction(db, {
286
+ from,
287
+ to,
288
+ amount,
289
+ reason: config.reason,
290
+ type: TX_TYPES.TRANSFER,
291
+ now,
292
+ });
293
+ };
294
+
295
+ try {
296
+ if (db && typeof db.transaction === "function") {
297
+ db.transaction(applyWrites)();
298
+ } else {
299
+ applyWrites();
300
+ }
301
+ } catch (err) {
302
+ // Roll the in-memory Maps back so they match the rolled-back DB.
303
+ Object.assign(fromAccount, fromSnap);
304
+ Object.assign(toAccount, toSnap);
305
+ throw err;
306
+ }
267
307
 
268
- const tx = _recordTransaction(db, {
269
- from,
270
- to,
271
- amount,
272
- reason: config.reason,
273
- type: TX_TYPES.TRANSFER,
274
- now,
275
- });
276
308
  return _strip(tx);
277
309
  }
278
310
 
@@ -425,28 +457,59 @@ export function rewardContribution(db, contributionId, opts = {}) {
425
457
 
426
458
  const now = Number(opts.now ?? Date.now());
427
459
  const account = _ensureAccount(db, contribution.userId, now);
460
+
461
+ // Credit the account, record the ledger row and mark the contribution
462
+ // rewarded atomically. A partial failure would otherwise credit the balance
463
+ // without flipping `rewarded`, letting the same contribution be rewarded
464
+ // again after the next re-hydrate (double-reward).
465
+ const acctSnap = {
466
+ balance: account.balance,
467
+ totalEarned: account.totalEarned,
468
+ updatedAt: account.updatedAt,
469
+ };
470
+ const contribSnap = {
471
+ rewarded: contribution.rewarded,
472
+ rewardAmount: contribution.rewardAmount,
473
+ txId: contribution.txId,
474
+ };
475
+
428
476
  account.balance += amount;
429
477
  account.totalEarned += amount;
430
478
  account.updatedAt = now;
431
- _persistAccount(db, account);
432
-
433
- const tx = _recordTransaction(db, {
434
- from: null,
435
- to: contribution.userId,
436
- amount,
437
- reason: `contribution:${contribution.type}:${contributionId.slice(0, 8)}`,
438
- type: TX_TYPES.REWARD,
439
- now,
440
- });
441
479
 
442
- contribution.rewarded = true;
443
- contribution.rewardAmount = amount;
444
- contribution.txId = tx.id;
480
+ let tx;
481
+ const applyWrites = () => {
482
+ _persistAccount(db, account);
483
+ tx = _recordTransaction(db, {
484
+ from: null,
485
+ to: contribution.userId,
486
+ amount,
487
+ reason: `contribution:${contribution.type}:${contributionId.slice(0, 8)}`,
488
+ type: TX_TYPES.REWARD,
489
+ now,
490
+ });
491
+ contribution.rewarded = true;
492
+ contribution.rewardAmount = amount;
493
+ contribution.txId = tx.id;
494
+ if (db) {
495
+ db.prepare(
496
+ `UPDATE contributions SET rewarded = ?, reward_amount = ?, tx_id = ? WHERE id = ?`,
497
+ ).run(1, amount, tx.id, contributionId);
498
+ }
499
+ };
445
500
 
446
- if (db) {
447
- db.prepare(
448
- `UPDATE contributions SET rewarded = ?, reward_amount = ?, tx_id = ? WHERE id = ?`,
449
- ).run(1, amount, tx.id, contributionId);
501
+ try {
502
+ if (db && typeof db.transaction === "function") {
503
+ db.transaction(applyWrites)();
504
+ } else {
505
+ applyWrites();
506
+ }
507
+ } catch (err) {
508
+ // Roll the in-memory Maps back to match the rolled-back DB.
509
+ Object.assign(account, acctSnap);
510
+ Object.assign(contribution, contribSnap);
511
+ if (tx) _transactions.delete(tx.id);
512
+ throw err;
450
513
  }
451
514
 
452
515
  return { contribution: _strip(contribution), tx: _strip(tx) };
@@ -512,6 +575,94 @@ export function _resetState() {
512
575
  _seq = 0;
513
576
  }
514
577
 
578
+ /**
579
+ * Rehydrate the in-memory ledger Maps from the persisted token_* tables. The CLI
580
+ * runs each `cc incentive` subcommand in a fresh node process, so these
581
+ * module-level Maps start empty every invocation. Every write dual-writes (Map +
582
+ * INSERT into token_accounts/token_transactions/contributions) but every read
583
+ * (getBalance/listAccounts/getTransactionHistory/getContributions/
584
+ * getLeaderboard) is Map-only and nothing SELECTed the tables back.
585
+ *
586
+ * This is worse than mere invisibility: `_ensureAccount` does `_accounts.get`
587
+ * (miss on a cold Map) → creates balance 0 → `_persistAccount` INSERT OR REPLACE,
588
+ * so a second process minting/rewarding an existing account CLOBBERS the
589
+ * persisted balance to 0 before applying its delta — balances never accumulate
590
+ * and transfers fail with "Insufficient balance: 0". Call after
591
+ * ensureTokenTables(db).
592
+ */
593
+ export function loadFromDb(db) {
594
+ if (!db) return 0;
595
+ ensureTokenTables(db);
596
+ _accounts.clear();
597
+ _transactions.clear();
598
+ _contributions.clear();
599
+
600
+ for (const r of db
601
+ .prepare(
602
+ `SELECT id, account_id, balance, total_earned, total_spent, created_at, updated_at
603
+ FROM token_accounts ORDER BY created_at ASC`,
604
+ )
605
+ .all()) {
606
+ _accounts.set(r.account_id, {
607
+ id: r.id,
608
+ accountId: r.account_id,
609
+ balance: Number(r.balance) || 0,
610
+ totalEarned: Number(r.total_earned) || 0,
611
+ totalSpent: Number(r.total_spent) || 0,
612
+ createdAt: Number(r.created_at),
613
+ updatedAt: Number(r.updated_at),
614
+ _seq: ++_seq,
615
+ });
616
+ }
617
+
618
+ for (const r of db
619
+ .prepare(
620
+ `SELECT id, from_account, to_account, amount, reason, type, created_at
621
+ FROM token_transactions ORDER BY created_at ASC`,
622
+ )
623
+ .all()) {
624
+ _transactions.set(r.id, {
625
+ id: r.id,
626
+ fromAccount: r.from_account ?? null,
627
+ toAccount: r.to_account ?? null,
628
+ amount: Number(r.amount),
629
+ reason: r.reason ?? null,
630
+ type: r.type,
631
+ createdAt: Number(r.created_at),
632
+ _seq: ++_seq,
633
+ });
634
+ }
635
+
636
+ for (const r of db
637
+ .prepare(
638
+ `SELECT id, user_id, type, value, metadata, rewarded, reward_amount, tx_id, created_at
639
+ FROM contributions ORDER BY created_at ASC`,
640
+ )
641
+ .all()) {
642
+ // One corrupt metadata cell must not sink the whole ledger load.
643
+ let metadata = null;
644
+ try {
645
+ metadata = r.metadata ? JSON.parse(r.metadata) : null;
646
+ } catch {
647
+ metadata = null;
648
+ }
649
+ _contributions.set(r.id, {
650
+ id: r.id,
651
+ userId: r.user_id,
652
+ type: r.type,
653
+ value: Number(r.value) || 0,
654
+ metadata,
655
+ rewarded: !!r.rewarded,
656
+ rewardAmount: Number(r.reward_amount) || 0,
657
+ txId: r.tx_id ?? null,
658
+ createdAt: Number(r.created_at),
659
+ _seq: ++_seq,
660
+ });
661
+ }
662
+
663
+ return _accounts.size + _transactions.size + _contributions.size;
664
+ }
665
+
515
666
  // ═══════════════════════════════════════════════════════════════
516
667
  // Phase 66 V2 — Account + Claim lifecycle, per-user claim cap
517
668
  // ═══════════════════════════════════════════════════════════════
@@ -159,10 +159,23 @@ export function setDefaultWallet(db, address) {
159
159
  const wallet = getWallet(db, address);
160
160
  if (!wallet) return false;
161
161
 
162
- db.prepare("UPDATE wallets SET is_default = 0 WHERE address LIKE ?").run("%");
163
- db.prepare("UPDATE wallets SET is_default = 1 WHERE address = ?").run(
164
- address,
165
- );
162
+ // Clear the current default(s) then set the new one atomically. Without a
163
+ // transaction, a failure on the second UPDATE leaves every wallet non-default
164
+ // (the default signing/sending wallet silently disappears until re-set),
165
+ // breaking the exactly-one-default invariant.
166
+ const applyWrites = () => {
167
+ db.prepare("UPDATE wallets SET is_default = 0 WHERE address LIKE ?").run(
168
+ "%",
169
+ );
170
+ db.prepare("UPDATE wallets SET is_default = 1 WHERE address = ?").run(
171
+ address,
172
+ );
173
+ };
174
+ if (db && typeof db.transaction === "function") {
175
+ db.transaction(applyWrites)();
176
+ } else {
177
+ applyWrites();
178
+ }
166
179
  return true;
167
180
  }
168
181
 
@@ -171,21 +184,36 @@ export function setDefaultWallet(db, address) {
171
184
  */
172
185
  export function deleteWallet(db, address) {
173
186
  ensureWalletTables(db);
174
- const result = db
175
- .prepare("DELETE FROM wallets WHERE address = ?")
176
- .run(address);
177
- if (result.changes > 0) {
178
- // Promote next wallet to default
179
- const next = db
180
- .prepare("SELECT address FROM wallets ORDER BY created_at ASC LIMIT 1")
181
- .get();
182
- if (next) {
183
- db.prepare("UPDATE wallets SET is_default = 1 WHERE address = ?").run(
184
- next.address,
185
- );
187
+ const wallet = getWallet(db, address);
188
+ if (!wallet) return false;
189
+ const wasDefault = Number(wallet.is_default) === 1;
190
+
191
+ const doDelete = () => {
192
+ const result = db
193
+ .prepare("DELETE FROM wallets WHERE address = ?")
194
+ .run(address);
195
+ // Only promote a new default when the DELETED wallet was the default —
196
+ // otherwise the existing default is untouched and promoting the oldest
197
+ // remaining wallet would leave two defaults. Promote the oldest remaining
198
+ // so exactly one default survives.
199
+ if (result.changes > 0 && wasDefault) {
200
+ const next = db
201
+ .prepare("SELECT address FROM wallets ORDER BY created_at ASC LIMIT 1")
202
+ .get();
203
+ if (next) {
204
+ db.prepare("UPDATE wallets SET is_default = 1 WHERE address = ?").run(
205
+ next.address,
206
+ );
207
+ }
186
208
  }
187
- }
188
- return result.changes > 0;
209
+ return result.changes;
210
+ };
211
+
212
+ const changes =
213
+ db && typeof db.transaction === "function"
214
+ ? db.transaction(doDelete)()
215
+ : doDelete();
216
+ return changes > 0;
189
217
  }
190
218
 
191
219
  /**
@@ -278,28 +306,46 @@ export function transferAsset(db, assetId, toAddress, amount) {
278
306
  const asset = getAsset(db, assetId);
279
307
  if (!asset) throw new Error(`Asset not found: ${assetId}`);
280
308
 
309
+ // The destination must be a real local wallet — createAsset enforces the same
310
+ // invariant on the way in. Without this, a transfer to a bogus address moves
311
+ // the asset out of the sender's wallet to an address no wallet owns, so it
312
+ // disappears from every getAssets/getWalletSummary view (permanently orphaned).
313
+ const dest = getWallet(db, toAddress);
314
+ if (!dest) throw new Error(`Destination wallet not found: ${toAddress}`);
315
+
281
316
  const txId = `tx-${crypto.randomBytes(8).toString("hex")}`;
282
317
  const fromAddress = asset.wallet_address;
283
318
  const txAmount = amount || asset.amount;
284
319
 
285
- db.prepare(
286
- `INSERT INTO transactions (id, from_address, to_address, asset_id, amount, tx_type, status)
287
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
288
- ).run(
289
- txId,
290
- fromAddress,
291
- toAddress,
292
- assetId,
293
- txAmount,
294
- "transfer",
295
- "confirmed",
296
- );
320
+ // Record the ledger row and move ownership atomically. Without a transaction,
321
+ // a failure on the ownership UPDATE would leave a "confirmed" transactions row
322
+ // for a transfer that never happened (the asset stays with the sender).
323
+ const applyWrites = () => {
324
+ db.prepare(
325
+ `INSERT INTO transactions (id, from_address, to_address, asset_id, amount, tx_type, status)
326
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
327
+ ).run(
328
+ txId,
329
+ fromAddress,
330
+ toAddress,
331
+ assetId,
332
+ txAmount,
333
+ "transfer",
334
+ "confirmed",
335
+ );
297
336
 
298
- // Update asset ownership
299
- db.prepare("UPDATE digital_assets SET wallet_address = ? WHERE id = ?").run(
300
- toAddress,
301
- assetId,
302
- );
337
+ // Update asset ownership
338
+ db.prepare("UPDATE digital_assets SET wallet_address = ? WHERE id = ?").run(
339
+ toAddress,
340
+ assetId,
341
+ );
342
+ };
343
+
344
+ if (db && typeof db.transaction === "function") {
345
+ db.transaction(applyWrites)();
346
+ } else {
347
+ applyWrites();
348
+ }
303
349
 
304
350
  return {
305
351
  txId,
@@ -471,6 +471,93 @@ export function _resetState() {
471
471
  _proofExpiryMs = ZKP_DEFAULT_PROOF_EXPIRY_MS;
472
472
  }
473
473
 
474
+ /**
475
+ * Rehydrate the in-memory Maps from the persisted zkp_* tables. The CLI runs
476
+ * each `cc zkp` subcommand in a fresh node process, so _circuits/_proofs/
477
+ * _verificationKeys/_credentials start empty every invocation. Every write
478
+ * dual-writes (Map + INSERT into zkp_circuits/zkp_proofs/zkp_credentials) but
479
+ * every read (listCircuits/listProofs/listCredentials/getZKPStats + the
480
+ * generateProof/verifyProof/selectiveDisclose lookups) is Map-only and nothing
481
+ * SELECTed the tables back — so `zkp circuits`/`proofs`/`credentials` were always
482
+ * empty, and `prove`/`verify`/`disclose` threw "not found" for a circuit/proof/
483
+ * credential that genuinely exists on disk. Call after ensureZKPTables(db).
484
+ */
485
+ export function loadFromDb(db) {
486
+ if (!db) return 0;
487
+ ensureZKPTables(db);
488
+ _circuits.clear();
489
+ _proofs.clear();
490
+ _verificationKeys.clear();
491
+ _credentials.clear();
492
+
493
+ const parse = (v, fallback) => {
494
+ try {
495
+ return v ? JSON.parse(v) : fallback;
496
+ } catch {
497
+ return fallback;
498
+ }
499
+ };
500
+
501
+ for (const r of db
502
+ .prepare(
503
+ `SELECT id, name, definition, compiled, verification_key, status, created_at
504
+ FROM zkp_circuits ORDER BY created_at ASC`,
505
+ )
506
+ .all()) {
507
+ const definition = parse(r.definition, {});
508
+ const constraints = Array.isArray(definition.constraints)
509
+ ? definition.constraints
510
+ : [];
511
+ _circuits.set(r.id, {
512
+ id: r.id,
513
+ name: r.name,
514
+ definition,
515
+ compiled: parse(r.compiled, {}),
516
+ constraints: constraints.length || 1,
517
+ inputs: definition.inputs || [],
518
+ outputs: definition.outputs || [],
519
+ verificationKey: r.verification_key,
520
+ status: r.status,
521
+ createdAt: r.created_at,
522
+ });
523
+ if (r.verification_key) _verificationKeys.set(r.id, r.verification_key);
524
+ }
525
+
526
+ for (const r of db
527
+ .prepare(
528
+ `SELECT id, circuit_id, proof, public_inputs, verified, scheme, created_at
529
+ FROM zkp_proofs ORDER BY created_at ASC`,
530
+ )
531
+ .all()) {
532
+ _proofs.set(r.id, {
533
+ id: r.id,
534
+ circuitId: r.circuit_id,
535
+ scheme: r.scheme,
536
+ proof: parse(r.proof, {}),
537
+ publicInputs: parse(r.public_inputs, []),
538
+ verified: !!r.verified,
539
+ createdAt: r.created_at,
540
+ });
541
+ }
542
+
543
+ for (const r of db
544
+ .prepare(
545
+ `SELECT id, did, claims, merkle_root, created_at
546
+ FROM zkp_credentials ORDER BY created_at ASC`,
547
+ )
548
+ .all()) {
549
+ _credentials.set(r.id, {
550
+ id: r.id,
551
+ did: r.did ?? null,
552
+ claims: parse(r.claims, {}),
553
+ merkleRoot: r.merkle_root,
554
+ createdAt: r.created_at,
555
+ });
556
+ }
557
+
558
+ return _circuits.size + _proofs.size + _credentials.size;
559
+ }
560
+
474
561
  /* ──────────────────────────────────────────────────────────
475
562
  * V2 — Phase 88 surface (strictly additive)
476
563
  * ────────────────────────────────────────────────────────── */