chainlesschain 0.166.10 → 0.166.13

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 (230) hide show
  1. package/README.md +33 -0
  2. package/bin/chainlesschain.js +5 -0
  3. package/package.json +4 -2
  4. package/src/assets/web-panel/assets/{AIOps-CLYBDAGv.js → AIOps-BN25cNOD.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Da9IP-m5.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-D7hkEvQm.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-CCV4Xnbc.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-CVSnVJeA.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-CuYdw5Ag.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-cV9FdpTy.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-BRnv6YSp.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-Bw5w87P4.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-C0GjtUAw.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DaoTqcdt.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-B4dYcEIi.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-mAhuOeuD.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-BK6KEdBk.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-CCglmNu5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-Cm8S4of7.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-Dhs1QLMe.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-CLlhmXWk.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-BnHVbaNs.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-UzQP9-0O.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-CBdlPClz.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-axIRPdq1.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-DUalW5rx.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-C1yP-uEu.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-Xh6Ig5q8.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-C_z63ixg.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-BYqB33_3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CEULuArm.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-DO9Hdcec.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-B8zyLiFe.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-BLAN2mWW.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-CrQcFM7u.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-DVnyiiU-.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-qjCME5OD.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-4JE3C3It.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-CjBuak9I.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-BtPcYQcC.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-Cx653_Ba.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-CkuD3YzS.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-BgNgU7HH.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-Dmd4Hjxz.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-C_5DA-G0.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-uwslV4XC.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-CuNgwVnX.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-CJayVX9H.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-Cb05H5go.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-BZlGKapZ.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-BIzZWYzd.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-vEYYyQXQ.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-MZqTy5CC.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-CRARUOl8.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-80VAK8PX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-CzRSoIwK.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-BpwQ2n4C.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-BC03TZ79.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-DE59-jaa.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-DOHmeWyA.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-hc5RZl1D.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cv5uMP7E.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-qohu7Ug0.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-drCPFWV5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-BAEgUeRy.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-CkJkKBlo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-bMuKEpez.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-DxWQVHRC.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-BpS8idmV.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-BPBLlW5v.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-C4SLEeUh.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-r-wfU39U.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-C7vjRmLN.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-DdzeFCV2.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CYyWN2KD.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-D8A9osUg.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DBvrNlyS.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-DBVAGc7o.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-C1vQUCRJ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-BKs4dah4.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-ByIuj3lD.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYlAFCm9.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-Dwyadd0c.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-Bm2f3s08.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-C8ORSh7V.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-1iVlnsM-.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CmqNyUSL.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-rUMaX3Ul.js} +1 -1
  96. package/src/assets/web-panel/assets/index-9biMQ-tw.js +1 -0
  97. package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-B53c3diB.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-B59OWAs7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-B8BrB0Ls.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-BC32_0xT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-BC8Wb6cy.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BCOhTILd.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-BFniLMn9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BIvM-uAX.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-BK-RY0-7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-BQL9r73Y.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BVtnizyC.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-Bf1PlIHp.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Bgw4Y2rU.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-BgwLNxmr.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-C-J5-pGH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-C-ZIHi42.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-C3B1S-mW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C5RfRciU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-CCEyz58d.js} +1 -1
  116. package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
  117. package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-CTfEmKK0.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-CfiHyVyl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-CkFvuAex.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D98FXb0w.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DDHk911Q.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-DJxtPFOh.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-DVJ1uKf4.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-Dcck8QfW.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-DgUE51Pz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-Dsve5Gkv.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-DvedhJeM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-DwMdWKiF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-OcbzdRpT.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-fPK6GFEg.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-geQinnns.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-pHWA7bmM.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-reUHhuz8.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-tqTx5wXo.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-CuA-cpkL.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-CimmE_9b.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-DlGlrltz.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-CK6BJQ07.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-BKjBfZfB.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-B2chVYw9.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-BW8aLJJ3.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-dXlPl66S.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-hSa89S4G.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-DM6KLt-s.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-C9MQAK15.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-C7rtRViA.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-Dm15xafq.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-mEiEytw4.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-DzPxflhY.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +5 -5
  153. package/src/commands/agent.js +51 -20
  154. package/src/commands/compact.js +349 -3
  155. package/src/commands/context.js +72 -1
  156. package/src/commands/graph.js +26 -15
  157. package/src/commands/hmemory.js +21 -0
  158. package/src/commands/hook.js +256 -28
  159. package/src/commands/memory.js +209 -42
  160. package/src/commands/promcomp.js +17 -0
  161. package/src/commands/serve.js +94 -10
  162. package/src/commands/session.js +2 -3
  163. package/src/commands/team.js +7 -1
  164. package/src/data/changelog.json +28 -2
  165. package/src/gateways/ws/session-core-protocol.js +62 -3
  166. package/src/gateways/ws/session-protocol.js +123 -15
  167. package/src/gateways/ws/ws-agent-handler.js +157 -9
  168. package/src/gateways/ws/ws-session-gateway.js +204 -30
  169. package/src/generated/cc-agent-protocol.schema.json +2094 -4
  170. package/src/harness/prompt-compressor.js +5 -55
  171. package/src/lib/agent-sandbox.js +14 -4
  172. package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
  173. package/src/lib/app-server/context-memory-notifications.js +54 -0
  174. package/src/lib/app-server/rollout-store-factory.js +115 -0
  175. package/src/lib/app-server/rollout-store.js +310 -23
  176. package/src/lib/app-server/server.js +184 -7
  177. package/src/lib/app-server/sqlite-rollout-store.js +59 -16
  178. package/src/lib/auto-mode-config.js +26 -0
  179. package/src/lib/causal-observability.js +13 -1
  180. package/src/lib/context-memory-kernel/authority.js +95 -0
  181. package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
  182. package/src/lib/context-memory-kernel/index.js +8 -0
  183. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
  184. package/src/lib/context-memory-kernel/live-compaction.js +375 -0
  185. package/src/lib/context-memory-kernel/memory-service.js +667 -0
  186. package/src/lib/context-memory-kernel/message-adapter.js +451 -0
  187. package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
  188. package/src/lib/context-memory-kernel/provider-context.js +192 -0
  189. package/src/lib/context-memory-kernel/runtime.js +61 -0
  190. package/src/lib/direct-model-usage.js +22 -18
  191. package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
  192. package/src/lib/graph-kernel/cutover-ledger.js +2 -2
  193. package/src/lib/graph-kernel/event-store.js +3 -5
  194. package/src/lib/graph-kernel/migration-saga.js +2 -2
  195. package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
  196. package/src/lib/hierarchical-memory.js +22 -0
  197. package/src/lib/hook-audit-store.js +170 -0
  198. package/src/lib/hook-event-bus.cjs +0 -0
  199. package/src/lib/hook-manager.js +25 -83
  200. package/src/lib/hook-runtime-adapters.js +233 -0
  201. package/src/lib/hook-runtime-contract.cjs +291 -0
  202. package/src/lib/hook-runtime-contract.js +21 -0
  203. package/src/lib/hook-trust.js +210 -0
  204. package/src/lib/hooks-v2-producers.js +52 -6
  205. package/src/lib/hooks-v2-runtime.js +443 -178
  206. package/src/lib/llm-pricing.js +10 -0
  207. package/src/lib/memory-manager.js +29 -4
  208. package/src/lib/model-context-window.js +52 -0
  209. package/src/lib/permanent-memory.js +17 -0
  210. package/src/lib/plan-mode.js +8 -4
  211. package/src/lib/process-execution-broker/index.js +208 -16
  212. package/src/lib/runtime-usage-ledger.js +20 -0
  213. package/src/lib/session-consolidator.js +59 -0
  214. package/src/lib/session-core-singletons.js +17 -4
  215. package/src/lib/session-hooks.js +29 -2
  216. package/src/lib/session-transcript-migration.js +188 -0
  217. package/src/lib/settings-hook-events.cjs +37 -401
  218. package/src/lib/settings-hook-events.js +210 -8
  219. package/src/lib/settings-hooks.cjs +42 -83
  220. package/src/lib/ws-session-manager.js +4 -1
  221. package/src/repl/agent-repl.js +186 -53
  222. package/src/runtime/agent-core.js +376 -350
  223. package/src/runtime/headless-runner.js +40 -33
  224. package/src/runtime/headless-stream.js +131 -30
  225. package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
  226. package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
  227. package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
  228. package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
  229. package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
  230. package/src/assets/web-panel/assets/index-DL2EFx7m.js +0 -1
@@ -0,0 +1,192 @@
1
+ import {
2
+ canonicalDigest,
3
+ canonicalJson,
4
+ normalizeContextItem,
5
+ } from "@chainlesschain/context-memory-kernel";
6
+ import { getContextWindow } from "../model-context-window.js";
7
+ import { createCliContextMemoryRuntime } from "./runtime.js";
8
+ import {
9
+ contextItemsToMessages,
10
+ memoryRecordsToContextItems,
11
+ messagesToContextItems,
12
+ } from "./message-adapter.js";
13
+
14
+ function defaultAdmissions(sessionId, options) {
15
+ const candidates = [
16
+ { scope: "session", scopeId: sessionId },
17
+ { scope: "agent", scopeId: options.agentId || sessionId },
18
+ { scope: "user", scopeId: options.userId || "local-user" },
19
+ ];
20
+ const configured = options.contextMemoryScopeAdmissions;
21
+ const admissions = Array.isArray(configured) && configured.length > 0
22
+ ? configured
23
+ : candidates;
24
+ const seen = new Set();
25
+ return admissions.filter((entry) => {
26
+ const key = `${entry.scope}\0${entry.scopeId || ""}`;
27
+ if (seen.has(key)) return false;
28
+ seen.add(key);
29
+ return true;
30
+ });
31
+ }
32
+
33
+ function toolDefinitionsToContextItems(definitionsInput, { sessionId, sink }) {
34
+ const definitions = Array.isArray(definitionsInput) ? definitionsInput : [];
35
+ return definitions.map((definition, index) => {
36
+ const content = canonicalJson(definition);
37
+ const name = String(
38
+ definition?.function?.name || definition?.name || `tool-${index}`,
39
+ );
40
+ const sourceDigest = canonicalDigest(
41
+ definition,
42
+ "chainlesschain.cli-tool-schema/v1",
43
+ );
44
+ return normalizeContextItem({
45
+ schemaVersion: 1,
46
+ itemId: `cli-tool-${sourceDigest.slice(7, 39)}`,
47
+ kind: "tool-schema",
48
+ scope: "session",
49
+ scopeId: sessionId,
50
+ sourceRef: {
51
+ store: "cli-tool-registry",
52
+ id: name,
53
+ digest: sourceDigest,
54
+ },
55
+ provenance: {
56
+ source: "cli-tool-registry",
57
+ observedAt: "1970-01-01T00:00:00.000Z",
58
+ },
59
+ trust: "host",
60
+ sensitivity: "internal",
61
+ allowedSinks: [sink],
62
+ tokenEstimate: Math.max(
63
+ 1,
64
+ Math.ceil(Buffer.byteLength(content, "utf8") / 4),
65
+ ),
66
+ priority: Math.max(500_000, 600_000 - index),
67
+ pinned: false,
68
+ createdAt: "1970-01-01T00:00:00.000Z",
69
+ content,
70
+ });
71
+ });
72
+ }
73
+
74
+ /**
75
+ * Bind every paid provider request to one canonical plan and memory revision.
76
+ * The returned messages are ephemeral; the authoritative transcript remains
77
+ * the JSONL/session port and recalled memories remain independently deletable.
78
+ */
79
+ export async function prepareCanonicalProviderContext(
80
+ messagesInput,
81
+ options = {},
82
+ ) {
83
+ const messages = Array.isArray(messagesInput) ? messagesInput : [];
84
+ const sessionId = String(options.sessionId || "ephemeral-cli-session");
85
+ const runtime = createCliContextMemoryRuntime({
86
+ env: options.contextMemoryEnv || process.env,
87
+ sessionId,
88
+ scopeKey: `cli:provider:${sessionId}`,
89
+ ...(options.contextMemoryFilePath
90
+ ? { memoryFilePath: options.contextMemoryFilePath }
91
+ : {}),
92
+ });
93
+ if (!runtime.decision.canonical || options.contextMemorySkipPlanning === true) {
94
+ return { messages, plan: null, recall: null, decision: runtime.decision };
95
+ }
96
+
97
+ const provider = String(options.provider || "local");
98
+ const sink = String(options.contextMemorySink || `provider.${provider}`);
99
+ const scopeAdmissions = defaultAdmissions(sessionId, options);
100
+ const lastUser = [...messages]
101
+ .reverse()
102
+ .find((message) => message?.role === "user");
103
+ const query =
104
+ typeof lastUser?.content === "string" && lastUser.content.trim()
105
+ ? lastUser.content.trim().slice(0, 32 * 1024)
106
+ : "*";
107
+ const recall = await runtime.kernel.recallMemory({
108
+ query,
109
+ sink,
110
+ scopeAdmissions,
111
+ limit: Math.max(1, Math.min(32, Number(options.contextMemoryRecallLimit) || 12)),
112
+ tokenBudget: Math.max(
113
+ 1,
114
+ Math.min(32_768, Number(options.contextMemoryRecallTokens) || 4096),
115
+ ),
116
+ });
117
+ const messageItems = messagesToContextItems(messages, {
118
+ sessionId,
119
+ allowedSinks: [sink],
120
+ trustCurrentSystemPolicy: true,
121
+ trustedSystemIndexes: options.contextMemoryTrustedSystemIndexes,
122
+ });
123
+ const memoryItems = memoryRecordsToContextItems(
124
+ recall.results.map((entry) => entry.record),
125
+ { insertionSequence: Math.max(0, messages.length - 1) },
126
+ );
127
+ const toolItems = toolDefinitionsToContextItems(
128
+ options.contextMemoryToolDefinitions,
129
+ { sessionId, sink },
130
+ );
131
+ const items = [...messageItems, ...memoryItems, ...toolItems];
132
+ const modelWindowTokens = Math.max(
133
+ 1024,
134
+ Number(options.contextMemoryModelWindowTokens) ||
135
+ getContextWindow(options.model, provider) ||
136
+ 128 * 1024,
137
+ );
138
+ const reservedOutputTokens = Math.min(
139
+ modelWindowTokens - 1,
140
+ Math.max(256, Number(options.maxOutputTokens) || 4096),
141
+ );
142
+ const safetyMarginTokens = Math.min(
143
+ modelWindowTokens - reservedOutputTokens - 1,
144
+ Math.max(64, Math.floor(modelWindowTokens * 0.05)),
145
+ );
146
+ const inputBudget =
147
+ modelWindowTokens - reservedOutputTokens - safetyMarginTokens;
148
+ const recoveryReserveTokens = Math.min(
149
+ Math.max(32, Math.floor(inputBudget * 0.05)),
150
+ Math.max(0, inputBudget - 1),
151
+ );
152
+ const sessionHead =
153
+ options.contextMemorySessionHead ||
154
+ canonicalDigest(
155
+ messageItems.map((item) => item.digest),
156
+ "chainlesschain.cli-provider-context-head/v1",
157
+ );
158
+ const plan = await runtime.kernel.planContext({
159
+ modelWindowTokens,
160
+ reservedOutputTokens,
161
+ safetyMarginTokens,
162
+ recoveryReserveTokens,
163
+ items,
164
+ sink,
165
+ scopeAdmissions,
166
+ partitionCeilings: {
167
+ "trusted-system": inputBudget,
168
+ "working-state": inputBudget,
169
+ "tools-and-skills": inputBudget,
170
+ conversation: inputBudget,
171
+ "tool-evidence": inputBudget,
172
+ "memory-and-rules": Math.max(1, Math.floor(inputBudget * 0.12)),
173
+ },
174
+ policyVersion: String(options.contextMemoryPolicyVersion || "cli-provider-v1"),
175
+ modelProfile: `${provider}:${String(options.model || "default")}`.slice(0, 256),
176
+ sessionHead,
177
+ memoryRevision: recall.memoryRevision,
178
+ });
179
+ return {
180
+ messages: contextItemsToMessages(
181
+ plan.selected.filter((item) => item.kind !== "tool-schema"),
182
+ ),
183
+ selectedToolNames: toolItems
184
+ .filter((item) => plan.selectedItemIds.includes(item.itemId))
185
+ .map((item) => item.sourceRef.id),
186
+ plan,
187
+ recall,
188
+ decision: runtime.decision,
189
+ };
190
+ }
191
+
192
+ export { defaultAdmissions, toolDefinitionsToContextItems };
@@ -0,0 +1,61 @@
1
+ import { ContextMemoryKernel } from "@chainlesschain/context-memory-kernel";
2
+ import { DurableJsonMemoryPort } from "./durable-memory-port.js";
3
+ import { JsonlSessionContextPort } from "./jsonl-session-context-port.js";
4
+ import { CliLegacyMemoryPrivacyPurgePort } from "./privacy-purge-port.js";
5
+ import {
6
+ createCliAuthority,
7
+ resolveCliContextMemoryCutover,
8
+ } from "./authority.js";
9
+
10
+ export function createCliContextMemoryRuntime(options = {}) {
11
+ const scopeKey = options.scopeKey ||
12
+ (options.sessionId ? `cli:session:${options.sessionId}` : "cli:memory");
13
+ const decision = resolveCliContextMemoryCutover({
14
+ env: options.env,
15
+ scopeKey,
16
+ });
17
+ const authority = createCliAuthority({
18
+ decision,
19
+ now: options.clock || Date.now,
20
+ });
21
+ const memoryPort =
22
+ options.memoryPort ||
23
+ new DurableJsonMemoryPort({
24
+ ...(options.memoryFilePath ? { filePath: options.memoryFilePath } : {}),
25
+ });
26
+ const sessionPort =
27
+ options.sessionPort ||
28
+ (options.sessionId
29
+ ? new JsonlSessionContextPort({
30
+ sessionId: options.sessionId,
31
+ allowedSinks: options.allowedSinks || ["*"],
32
+ })
33
+ : null);
34
+ const purgePorts = options.purgePorts || [
35
+ new CliLegacyMemoryPrivacyPurgePort({
36
+ ...(options.legacyMemoryStorePath
37
+ ? { memoryStorePath: options.legacyMemoryStorePath }
38
+ : {}),
39
+ ...(options.legacyDb ? { legacyDb: options.legacyDb } : {}),
40
+ }),
41
+ ];
42
+ const kernel = new ContextMemoryKernel({
43
+ sessionPort,
44
+ memoryPort,
45
+ reconciliationPort: memoryPort,
46
+ authorityRegistry: authority.registry,
47
+ writer: authority.writer,
48
+ mode: decision.canonical ? "canonical" : "shadow",
49
+ clock: options.clock || Date.now,
50
+ ...(options.randomUUID ? { randomUUID: options.randomUUID } : {}),
51
+ purgePorts,
52
+ });
53
+ return Object.freeze({
54
+ decision,
55
+ kernel,
56
+ memoryPort,
57
+ sessionPort,
58
+ authorityRegistry: authority.registry,
59
+ writer: authority.writer,
60
+ });
61
+ }
@@ -36,9 +36,16 @@ async function persistUsageEvent(persist, type, event) {
36
36
  }
37
37
  }
38
38
 
39
- function unknownUsageEvent({ callId, provider, model, source, code }) {
39
+ function unknownUsageEvent({
40
+ callId,
41
+ provider,
42
+ model,
43
+ source,
44
+ operationId,
45
+ code,
46
+ }) {
40
47
  return projectRuntimeUsageBoundary(
41
- { callId, provider, model, source, code },
48
+ { callId, provider, model, source, operationId, code },
42
49
  "unknown",
43
50
  );
44
51
  }
@@ -54,6 +61,7 @@ export async function runMeteredDirectModelCall({
54
61
  provider,
55
62
  model,
56
63
  source = "model",
64
+ operationId = undefined,
57
65
  sessionBudget = null,
58
66
  call,
59
67
  }) {
@@ -77,11 +85,14 @@ export async function runMeteredDirectModelCall({
77
85
  await persistUsageEvent(
78
86
  persist,
79
87
  runtimeUsageEventType("started"),
80
- projectRuntimeUsageBoundary({ callId, provider, model, source }, "started"),
88
+ projectRuntimeUsageBoundary(
89
+ { callId, provider, model, source, operationId },
90
+ "started",
91
+ ),
81
92
  );
82
93
  beginSessionBudgetUsage(
83
94
  sessionBudget,
84
- { callId, provider, model, source },
95
+ { callId, provider, model, source, operationId },
85
96
  `direct model call ${source}`,
86
97
  );
87
98
  let result;
@@ -93,13 +104,10 @@ export async function runMeteredDirectModelCall({
93
104
  provider,
94
105
  model,
95
106
  source,
107
+ operationId,
96
108
  code: "provider_call_failed",
97
109
  });
98
- await persistUsageEvent(
99
- persist,
100
- runtimeUsageEventType("unknown"),
101
- unknown,
102
- );
110
+ await persistUsageEvent(persist, runtimeUsageEventType("unknown"), unknown);
103
111
  markSessionBudgetUsageUnknown(sessionBudget, unknown);
104
112
  throw error;
105
113
  }
@@ -111,6 +119,7 @@ export async function runMeteredDirectModelCall({
111
119
  provider,
112
120
  model,
113
121
  source,
122
+ operationId,
114
123
  usage: result.usage,
115
124
  });
116
125
  } catch {
@@ -119,6 +128,7 @@ export async function runMeteredDirectModelCall({
119
128
  provider,
120
129
  model,
121
130
  source,
131
+ operationId,
122
132
  code: "provider_usage_missing",
123
133
  });
124
134
  await persistUsageEvent(
@@ -127,10 +137,7 @@ export async function runMeteredDirectModelCall({
127
137
  unknown,
128
138
  );
129
139
  if (markSessionBudgetUsageUnknown(sessionBudget, unknown)) {
130
- rejectSessionBudgetUsageUnknown(
131
- unknown,
132
- `direct model call ${source}`,
133
- );
140
+ rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
134
141
  }
135
142
  return result;
136
143
  }
@@ -146,13 +153,10 @@ export async function runMeteredDirectModelCall({
146
153
  provider,
147
154
  model,
148
155
  source,
156
+ operationId,
149
157
  code: "provider_usage_missing",
150
158
  });
151
- await persistUsageEvent(
152
- persist,
153
- runtimeUsageEventType("unknown"),
154
- unknown,
155
- );
159
+ await persistUsageEvent(persist, runtimeUsageEventType("unknown"), unknown);
156
160
  if (markSessionBudgetUsageUnknown(sessionBudget, unknown)) {
157
161
  rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
158
162
  }
@@ -1,8 +1,6 @@
1
1
  import path from "node:path";
2
- import {
3
- defaultRolloutStoreDirectory,
4
- JsonlRolloutStore,
5
- } from "../app-server/rollout-store.js";
2
+ import { defaultRolloutStoreDirectory } from "../app-server/rollout-store.js";
3
+ import { createRolloutStore } from "../app-server/rollout-store-factory.js";
6
4
  import { GraphCutoverLedger } from "./cutover-ledger.js";
7
5
  import {
8
6
  graphRuntimeEntryManifestDigest,
@@ -230,7 +228,8 @@ export function createRuntimeGraphCutoverAuthorityResolver({
230
228
  const resolvedLedger =
231
229
  ledger ||
232
230
  new GraphCutoverLedger({
233
- store: new JsonlRolloutStore({
231
+ store: createRolloutStore({
232
+ backend: env.CHAINLESSCHAIN_ROLLOUT_STORE,
234
233
  directory: path.resolve(
235
234
  stateDirectory ||
236
235
  env.CHAINLESSCHAIN_GRAPH_CUTOVER_STATE_DIR ||
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { JsonlRolloutStore } from "../app-server/rollout-store.js";
2
+ import { createRolloutStore } from "../app-server/rollout-store-factory.js";
3
3
  import { assertGraphCutoverTransition } from "./authority.js";
4
4
  import { graphDigest } from "./compiler.js";
5
5
  import {
@@ -478,7 +478,7 @@ function projection(state, events) {
478
478
  }
479
479
 
480
480
  export class GraphCutoverLedger {
481
- constructor({ store = new JsonlRolloutStore(), now = Date.now } = {}) {
481
+ constructor({ store = createRolloutStore(), now = Date.now } = {}) {
482
482
  this.store = store;
483
483
  this.now = now;
484
484
  }
@@ -1,8 +1,6 @@
1
1
  import path from "node:path";
2
- import {
3
- JsonlRolloutStore,
4
- defaultRolloutStoreDirectory,
5
- } from "../app-server/rollout-store.js";
2
+ import { defaultRolloutStoreDirectory } from "../app-server/rollout-store.js";
3
+ import { createRolloutStore } from "../app-server/rollout-store-factory.js";
6
4
 
7
5
  export const GRAPH_EVENT_SCHEMA = "chainlesschain.graph-event/v1";
8
6
 
@@ -16,7 +14,7 @@ function clone(value) {
16
14
 
17
15
  export class GraphEventStore {
18
16
  constructor({
19
- rolloutStore = new JsonlRolloutStore({
17
+ rolloutStore = createRolloutStore({
20
18
  directory: defaultGraphEventStoreDirectory(),
21
19
  }),
22
20
  } = {}) {
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { JsonlRolloutStore } from "../app-server/rollout-store.js";
2
+ import { createRolloutStore } from "../app-server/rollout-store-factory.js";
3
3
  import { createGraphAuthorityBinding } from "./authority.js";
4
4
 
5
5
  export const GRAPH_MIGRATION_SCHEMA =
@@ -84,7 +84,7 @@ function stateFromEvents(events, migrationId) {
84
84
  * this API intentionally has no "fall back to legacy" operation.
85
85
  */
86
86
  export class GraphAuthorityMigrationSaga {
87
- constructor({ store = new JsonlRolloutStore(), now = Date.now } = {}) {
87
+ constructor({ store = createRolloutStore(), now = Date.now } = {}) {
88
88
  this.store = store;
89
89
  this.now = now;
90
90
  }
@@ -797,6 +797,7 @@ export function normalizeGraphProductionCutoverEvidence(
797
797
  expectedRepository = undefined,
798
798
  expectedEnvironment = undefined,
799
799
  expectedWorkflowRunId = undefined,
800
+ expectedWorkflowRunAttempt = undefined,
800
801
  } = {},
801
802
  ) {
802
803
  if (input?.schema !== GRAPH_PRODUCTION_CUTOVER_EVIDENCE_SCHEMA) {
@@ -832,7 +833,9 @@ export function normalizeGraphProductionCutoverEvidence(
832
833
  (expectedRepository && provenance.repository !== expectedRepository) ||
833
834
  (expectedEnvironment && provenance.environment !== expectedEnvironment) ||
834
835
  (expectedWorkflowRunId !== undefined &&
835
- provenance.workflowRunId !== Number(expectedWorkflowRunId))
836
+ provenance.workflowRunId !== Number(expectedWorkflowRunId)) ||
837
+ (expectedWorkflowRunAttempt !== undefined &&
838
+ provenance.workflowRunAttempt !== Number(expectedWorkflowRunAttempt))
836
839
  ) {
837
840
  throw evidenceError(
838
841
  "CC_GRAPH_PRODUCTION_PROVENANCE_MISMATCH",
@@ -844,6 +847,10 @@ export function normalizeGraphProductionCutoverEvidence(
844
847
  expectedWorkflowRunId === undefined
845
848
  ? undefined
846
849
  : Number(expectedWorkflowRunId),
850
+ expectedWorkflowRunAttempt:
851
+ expectedWorkflowRunAttempt === undefined
852
+ ? undefined
853
+ : Number(expectedWorkflowRunAttempt),
847
854
  actual: provenance,
848
855
  },
849
856
  );
@@ -6,6 +6,18 @@
6
6
  */
7
7
 
8
8
  import { escapeLike } from "./sql-like.js";
9
+ import {
10
+ assertLegacyMutationAllowed,
11
+ resolveCliContextMemoryCutover,
12
+ } from "./context-memory-kernel/authority.js";
13
+
14
+ function assertLegacyHierarchicalMemoryMutationAllowed(operation) {
15
+ assertLegacyMutationAllowed(
16
+ resolveCliContextMemoryCutover({
17
+ scopeKey: `cli:legacy-hierarchical-memory:${operation}`,
18
+ }),
19
+ );
20
+ }
9
21
 
10
22
  // ─── Configuration ───────────────────────────────────────────────
11
23
  export const MEMORY_CONFIG = {
@@ -123,6 +135,7 @@ function calcRetention(
123
135
  * Create persistent memory tables for long-term / core / sharing
124
136
  */
125
137
  export function ensureMemoryTables(db) {
138
+ assertLegacyHierarchicalMemoryMutationAllowed("ensure-tables");
126
139
  db.exec(`
127
140
  CREATE TABLE IF NOT EXISTS memory_long_term (
128
141
  id TEXT PRIMARY KEY,
@@ -179,6 +192,7 @@ export function ensureMemoryTables(db) {
179
192
  * @param {string} [options.namespace] - Namespace for in-memory isolation (default: "global")
180
193
  */
181
194
  export function storeMemory(db, content, options = {}) {
195
+ assertLegacyHierarchicalMemoryMutationAllowed("store");
182
196
  if (!content || !content.trim()) {
183
197
  throw new Error("Memory content cannot be empty");
184
198
  }
@@ -258,6 +272,7 @@ export function storeMemory(db, content, options = {}) {
258
272
  * the default "global" namespace (backward compatible).
259
273
  */
260
274
  export function recallMemory(db, query, options = {}) {
275
+ assertLegacyHierarchicalMemoryMutationAllowed("recall");
261
276
  if (!query || !query.trim()) return [];
262
277
 
263
278
  const limit = Math.max(1, parseInt(options.limit) || 20);
@@ -653,6 +668,7 @@ export function applyForgettingCurve(
653
668
  * persisted to the DB — lives alongside the in-memory layer.
654
669
  */
655
670
  export function attachMetadata(memoryId, metadata, namespace = DEFAULT_NS) {
671
+ assertLegacyHierarchicalMemoryMutationAllowed("attach-metadata");
656
672
  if (!memoryId) throw new Error("memoryId is required");
657
673
  if (!metadata || typeof metadata !== "object")
658
674
  throw new Error("metadata must be an object");
@@ -682,6 +698,7 @@ function _locateInMemory(memoryId) {
682
698
  * Promote a memory one layer up: working → short-term → long-term.
683
699
  */
684
700
  export function promoteMemoryV2(db, memoryId) {
701
+ assertLegacyHierarchicalMemoryMutationAllowed("promote");
685
702
  if (!memoryId) throw new Error("memoryId is required");
686
703
  const loc = _locateInMemory(memoryId);
687
704
  if (loc && loc.layer === MEMORY_LAYER.WORKING) {
@@ -728,6 +745,7 @@ export function promoteMemoryV2(db, memoryId) {
728
745
  * (long-term/core demotion requires DB round-trip; not exposed here.)
729
746
  */
730
747
  export function demoteMemoryV2(memoryId) {
748
+ assertLegacyHierarchicalMemoryMutationAllowed("demote");
731
749
  if (!memoryId) throw new Error("memoryId is required");
732
750
  for (const [ns, nsMap] of _shortTermNS) {
733
751
  if (nsMap.has(memoryId)) {
@@ -790,6 +808,7 @@ export function shareMemoryV2(
790
808
  }
791
809
 
792
810
  export function revokeShare(shareId) {
811
+ assertLegacyHierarchicalMemoryMutationAllowed("revoke-share");
793
812
  const record = _v2Shares.find((s) => s.id === shareId);
794
813
  if (!record) throw new Error(`Share not found: ${shareId}`);
795
814
  if (record.revokedAt) throw new Error(`Share already revoked`);
@@ -896,6 +915,7 @@ export function searchSemanticV2(db, options = {}) {
896
915
  * Delegates to existing consolidateMemory() for promotion logic.
897
916
  */
898
917
  export function consolidateV2(db, options = {}) {
918
+ assertLegacyHierarchicalMemoryMutationAllowed("consolidate-v2");
899
919
  const id = `consol-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
900
920
  const record = {
901
921
  id,
@@ -949,6 +969,7 @@ export function listConsolidations(options = {}) {
949
969
  * Prune with per-layer scope + custom threshold.
950
970
  */
951
971
  export function pruneV2(db, options = {}) {
972
+ assertLegacyHierarchicalMemoryMutationAllowed("prune-v2");
952
973
  const { layer, maxAge = 720, threshold } = options;
953
974
  if (layer && !_LAYER_VALUES.has(layer))
954
975
  throw new Error(`Invalid layer: ${layer}`);
@@ -1000,6 +1021,7 @@ export function startConsolidationTimer({
1000
1021
  db,
1001
1022
  onTick,
1002
1023
  } = {}) {
1024
+ assertLegacyHierarchicalMemoryMutationAllowed("start-consolidation-timer");
1003
1025
  if (_consolidationTimer) return _consolidationTimer;
1004
1026
  if (!db) throw new Error("db is required for consolidation timer");
1005
1027
  _consolidationTimer = setInterval(() => {