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
@@ -27,10 +27,20 @@ import {
27
27
  readVerifiedProjection,
28
28
  sessionExists,
29
29
  } from "../harness/jsonl-session-store.js";
30
- import { PromptCompressor } from "../harness/prompt-compressor.js";
30
+ import {
31
+ estimateMessagesTokens,
32
+ getContextWindow,
33
+ PromptCompressor,
34
+ } from "../harness/prompt-compressor.js";
31
35
  import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
32
36
  import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
33
37
  import { chatWithTools } from "../runtime/agent-core.js";
38
+ import { canonicalDigest } from "@chainlesschain/context-memory-kernel";
39
+ import {
40
+ contextItemsToMessages,
41
+ createCliContextMemoryRuntime,
42
+ createSummaryContextItem,
43
+ } from "../lib/context-memory-kernel/index.js";
34
44
 
35
45
  /** Build a compressor sized to the session (or explicit overrides). */
36
46
  function buildCompressor(options, recorded, llmQuery) {
@@ -75,7 +85,7 @@ function attachMeteringMetadata(value, { callId, settled }) {
75
85
  }
76
86
  }
77
87
 
78
- function buildSemanticQuery(options, recorded, sessionId, ledger) {
88
+ function buildSemanticQuery(options, recorded, sessionId, operationId, ledger) {
79
89
  const provider = options.provider || recorded.provider || undefined;
80
90
  const model = options.model || recorded.model || undefined;
81
91
  // A preview must be both write-free and spend-free. It uses the same
@@ -92,6 +102,7 @@ function buildSemanticQuery(options, recorded, sessionId, ledger) {
92
102
  provider,
93
103
  model,
94
104
  source: "semantic-compaction",
105
+ operationId,
95
106
  persist: async (type, data) => {
96
107
  const appended = appendEventIfHead(
97
108
  sessionId,
@@ -138,6 +149,201 @@ function buildSemanticQuery(options, recorded, sessionId, ledger) {
138
149
  };
139
150
  }
140
151
 
152
+ function kernelBudget(options, recorded, compressor) {
153
+ const model = options.model || recorded.model || undefined;
154
+ const provider = options.provider || recorded.provider || undefined;
155
+ const modelWindowTokens = getContextWindow(model, provider);
156
+ const reservedOutputTokens = Math.max(
157
+ 1,
158
+ Math.min(2048, Math.floor(modelWindowTokens / 10)),
159
+ );
160
+ const maximumInput = Math.max(1, modelWindowTokens - reservedOutputTokens);
161
+ const targetInput = Math.max(
162
+ 1,
163
+ Math.min(
164
+ maximumInput,
165
+ Math.trunc(Number(compressor.maxTokens)) || maximumInput,
166
+ ),
167
+ );
168
+ const safetyMarginTokens = Math.max(
169
+ 0,
170
+ modelWindowTokens - reservedOutputTokens - targetInput,
171
+ );
172
+ const recoveryReserveTokens =
173
+ targetInput <= 1
174
+ ? 0
175
+ : Math.min(256, Math.max(1, Math.floor(targetInput * 0.05)));
176
+ return {
177
+ modelWindowTokens,
178
+ reservedOutputTokens,
179
+ safetyMarginTokens,
180
+ recoveryReserveTokens,
181
+ };
182
+ }
183
+
184
+ function buildKernelSummarizer({
185
+ llmQuery,
186
+ provider,
187
+ model,
188
+ compressor,
189
+ ledger,
190
+ sessionPort,
191
+ }) {
192
+ if (typeof llmQuery !== "function") return undefined;
193
+ return async (droppedItems, context) => {
194
+ if (ledger.headHash !== context.inputHead) {
195
+ const error = new Error("session changed before semantic compaction");
196
+ error.code = "SESSION_REVISION_STALE";
197
+ throw error;
198
+ }
199
+ const droppedMessages = contextItemsToMessages(droppedItems);
200
+ if (droppedMessages.length < 3) {
201
+ return { items: [], usageReceipt: { outcome: "not_metered" } };
202
+ }
203
+ const summaryCompressor = new PromptCompressor({
204
+ maxMessages: 4,
205
+ maxTokens: Math.max(256, Math.floor(compressor.maxTokens / 4)),
206
+ llmQuery,
207
+ });
208
+ let compacted;
209
+ try {
210
+ compacted = await compactConversationWithProvider(droppedMessages, {
211
+ compressor: summaryCompressor,
212
+ provider,
213
+ model,
214
+ });
215
+ } finally {
216
+ if (ledger.headHash !== context.inputHead) {
217
+ sessionPort.registerOwnedHeadAdvance({
218
+ operationId: context.operationId,
219
+ fromHead: context.inputHead,
220
+ toHead: ledger.headHash,
221
+ });
222
+ }
223
+ }
224
+ const { messages, stats } = compacted;
225
+ if (stats.summaryUsageUnknown === true) {
226
+ const error = new Error(
227
+ stats.summaryUsageUnknownReason || "provider usage outcome is unknown",
228
+ );
229
+ error.code = "reconciliation_required";
230
+ error.outcomeUnknown = true;
231
+ throw error;
232
+ }
233
+ const providerWasCalled = Boolean(stats.summaryCallId);
234
+ if (providerWasCalled && stats.summaryUsageLedgerSettled !== true) {
235
+ const error = new Error("semantic compaction usage ledger is unsettled");
236
+ error.code = "provider_usage_unsettled";
237
+ error.outcomeUnknown = true;
238
+ throw error;
239
+ }
240
+ const reduced =
241
+ Number(stats.saved || 0) > 0 || messages.length < droppedMessages.length;
242
+ const item = reduced
243
+ ? createSummaryContextItem({
244
+ messages,
245
+ parents: droppedItems,
246
+ operationId: context.operationId,
247
+ now: new Date().toISOString(),
248
+ })
249
+ : null;
250
+ const usageReceipt = providerWasCalled
251
+ ? {
252
+ outcome: "settled",
253
+ callId: stats.summaryCallId,
254
+ ...(stats.summaryProvider || provider
255
+ ? { provider: stats.summaryProvider || provider }
256
+ : {}),
257
+ ...(stats.summaryModel || model
258
+ ? { model: stats.summaryModel || model }
259
+ : {}),
260
+ inputTokens: stats.summaryUsage?.inputTokens || 0,
261
+ outputTokens: stats.summaryUsage?.outputTokens || 0,
262
+ ledgerDigest: canonicalDigest(
263
+ { callId: stats.summaryCallId, headHash: ledger.headHash },
264
+ "chainlesschain.cli-compaction-usage/v1",
265
+ ),
266
+ }
267
+ : { outcome: "not_metered" };
268
+ return { items: item ? [item] : [], usageReceipt };
269
+ };
270
+ }
271
+
272
+ function compactionRequest({
273
+ sessionId,
274
+ operationId,
275
+ options,
276
+ source,
277
+ compressor,
278
+ memoryRevision,
279
+ summarizer,
280
+ }) {
281
+ const provider =
282
+ options.provider || source.recorded.provider || "provider.local";
283
+ const model = options.model || source.recorded.model || "default";
284
+ return {
285
+ operationId,
286
+ sessionId,
287
+ ...kernelBudget(options, source.recorded, compressor),
288
+ sink: provider,
289
+ scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
290
+ policyVersion: "cli-context-policy-v1",
291
+ modelProfile: model,
292
+ memoryRevision,
293
+ allowFallback: false,
294
+ ...(summarizer ? { summarizer } : {}),
295
+ metadata: {
296
+ inputMessageCount: source.messages.length,
297
+ originalTokens: estimateMessagesTokens(source.messages),
298
+ provider,
299
+ model,
300
+ },
301
+ };
302
+ }
303
+
304
+ async function dryRunKernelPlan(runtime, request) {
305
+ const snapshot = await runtime.sessionPort.readSnapshot(request.sessionId);
306
+ const plan = await runtime.kernel.planContext({
307
+ modelWindowTokens: request.modelWindowTokens,
308
+ reservedOutputTokens: request.reservedOutputTokens,
309
+ safetyMarginTokens: request.safetyMarginTokens,
310
+ recoveryReserveTokens: request.recoveryReserveTokens,
311
+ items: snapshot.items,
312
+ sink: request.sink,
313
+ scopeAdmissions: request.scopeAdmissions,
314
+ ...(request.partitionCeilings
315
+ ? { partitionCeilings: request.partitionCeilings }
316
+ : {}),
317
+ ...(request.partitionMinimums
318
+ ? { partitionMinimums: request.partitionMinimums }
319
+ : {}),
320
+ policyVersion: request.policyVersion,
321
+ modelProfile: request.modelProfile,
322
+ sessionHead: snapshot.head,
323
+ memoryRevision: request.memoryRevision ?? snapshot.memoryRevision,
324
+ ...(request.now ? { now: request.now } : {}),
325
+ });
326
+ return {
327
+ plan,
328
+ messages: contextItemsToMessages(plan.selected),
329
+ stats: {
330
+ strategy: "canonical-deterministic-selection",
331
+ originalMessages: snapshot.items.length,
332
+ compressedMessages: plan.selected.length,
333
+ originalTokens: snapshot.items.reduce(
334
+ (total, item) => total + item.tokenEstimate,
335
+ 0,
336
+ ),
337
+ compressedTokens: plan.selectedTokens,
338
+ saved:
339
+ snapshot.items.reduce((total, item) => total + item.tokenEstimate, 0) -
340
+ plan.selectedTokens,
341
+ dropped: plan.dropped,
342
+ digest: plan.digest,
343
+ },
344
+ };
345
+ }
346
+
141
347
  function readCompactSource(sessionId) {
142
348
  return readVerifiedProjection(sessionId, () => {
143
349
  let recorded = Object.freeze({ model: "", provider: "" });
@@ -192,6 +398,10 @@ export function registerCompactCommand(program) {
192
398
  "Disable provider summarization and stay deterministic",
193
399
  )
194
400
  .option("--base-url <url>", "Provider base URL for semantic compaction")
401
+ .option(
402
+ "--operation-id <id>",
403
+ "Stable idempotency key (default: derived from session head)",
404
+ )
195
405
  .option("--json", "Output as JSON")
196
406
  .action(async (sessionId, options) => {
197
407
  try {
@@ -204,6 +414,10 @@ export function registerCompactCommand(program) {
204
414
 
205
415
  const source = readCompactSource(sessionId);
206
416
  const messages = source.messages;
417
+ const operationId =
418
+ options.operationId ||
419
+ `compact-${sessionId}-${String(source.headHash).slice(-24)}`;
420
+ const runtime = createCliContextMemoryRuntime({ sessionId });
207
421
  const ledger = {
208
422
  headHash: source.headHash,
209
423
  callId: null,
@@ -214,9 +428,133 @@ export function registerCompactCommand(program) {
214
428
  options,
215
429
  source.recorded,
216
430
  sessionId,
431
+ operationId,
217
432
  ledger,
218
433
  );
219
434
  const compressor = buildCompressor(options, source.recorded, llmQuery);
435
+ const memoryRevision =
436
+ runtime.decision.canonical && !options.dryRun
437
+ ? await runtime.memoryPort.getRevision()
438
+ : 0;
439
+ const summarizer = buildKernelSummarizer({
440
+ llmQuery,
441
+ provider: options.provider || source.recorded.provider || undefined,
442
+ model: options.model || source.recorded.model || undefined,
443
+ compressor,
444
+ ledger,
445
+ sessionPort: runtime.sessionPort,
446
+ });
447
+ const request = compactionRequest({
448
+ sessionId,
449
+ operationId,
450
+ options,
451
+ source,
452
+ compressor,
453
+ memoryRevision,
454
+ summarizer,
455
+ });
456
+ const canonicalPreview = await dryRunKernelPlan(runtime, request);
457
+
458
+ if (runtime.decision.canonical) {
459
+ const reduced = canonicalPreview.plan.dropped.length > 0;
460
+ if (!reduced || options.dryRun) {
461
+ if (options.json) {
462
+ console.log(
463
+ JSON.stringify(
464
+ {
465
+ sessionId,
466
+ operationId,
467
+ compacted: false,
468
+ dryRun: Boolean(options.dryRun),
469
+ cutover: runtime.decision,
470
+ stats: canonicalPreview.stats,
471
+ },
472
+ null,
473
+ 2,
474
+ ),
475
+ );
476
+ return;
477
+ }
478
+ logger.log(
479
+ chalk.gray(
480
+ reduced
481
+ ? `Would compact ${canonicalPreview.plan.dropped.length} canonical item(s).`
482
+ : `Nothing to compact - ${messages.length} message(s) are within the canonical budget.`,
483
+ ),
484
+ );
485
+ return;
486
+ }
487
+
488
+ const receipt = await runtime.kernel.compactContext(request);
489
+ if (["stale", "reconciliation_required"].includes(receipt.status)) {
490
+ if (options.json) {
491
+ console.log(
492
+ JSON.stringify(
493
+ {
494
+ sessionId,
495
+ operationId,
496
+ cutover: runtime.decision,
497
+ receipt,
498
+ },
499
+ null,
500
+ 2,
501
+ ),
502
+ );
503
+ } else {
504
+ logger.error(
505
+ chalk.yellow(
506
+ `Compaction requires ${receipt.status === "stale" ? "a retry" : "reconciliation"}: ${operationId}`,
507
+ ),
508
+ );
509
+ }
510
+ process.exitCode = receipt.status === "stale" ? 1 : 2;
511
+ return;
512
+ }
513
+ const committed = await runtime.sessionPort.readSnapshot(sessionId);
514
+ const compressedTokens = committed.items.reduce(
515
+ (total, item) => total + item.tokenEstimate,
516
+ 0,
517
+ );
518
+ const stats = {
519
+ strategy: "canonical-context-memory-kernel",
520
+ originalMessages: messages.length,
521
+ compressedMessages: committed.items.length,
522
+ originalTokens: canonicalPreview.stats.originalTokens,
523
+ compressedTokens,
524
+ saved: canonicalPreview.stats.originalTokens - compressedTokens,
525
+ dropped: canonicalPreview.plan.dropped,
526
+ };
527
+ if (options.json) {
528
+ console.log(
529
+ JSON.stringify(
530
+ {
531
+ sessionId,
532
+ operationId,
533
+ compacted: true,
534
+ cutover: runtime.decision,
535
+ stats,
536
+ receipt,
537
+ },
538
+ null,
539
+ 2,
540
+ ),
541
+ );
542
+ return;
543
+ }
544
+ logger.log(chalk.green(`Compacted ${sessionId}`));
545
+ logger.log(
546
+ chalk.gray(
547
+ ` ${stats.originalMessages} -> ${stats.compressedMessages} messages` +
548
+ `, ${stats.originalTokens} -> ${stats.compressedTokens} tokens` +
549
+ ` (saved ${stats.saved}, canonical kernel)`,
550
+ ),
551
+ );
552
+ logger.log(
553
+ chalk.gray(` resume with: cc agent --resume ${sessionId}`),
554
+ );
555
+ return;
556
+ }
557
+
220
558
  // llmQuery already persisted a complete call ledger. The provider
221
559
  // helper only carries its metadata through stats; its projected usage
222
560
  // event is intentionally not appended a second time here.
@@ -260,7 +598,15 @@ export function registerCompactCommand(program) {
260
598
  if (options.json) {
261
599
  console.log(
262
600
  JSON.stringify(
263
- { sessionId, dryRun: !!options.dryRun, stats },
601
+ {
602
+ sessionId,
603
+ dryRun: !!options.dryRun,
604
+ cutover: runtime.decision,
605
+ stats,
606
+ ...(runtime.decision.shadow
607
+ ? { canonicalShadow: canonicalPreview.stats }
608
+ : {}),
609
+ },
264
610
  null,
265
611
  2,
266
612
  ),
@@ -74,7 +74,7 @@ export function registerContextCommand(program) {
74
74
  .action(async (id, options) => {
75
75
  const { rebuildMessages, getLastSessionId, sessionExists, readEvents } =
76
76
  await import("../harness/jsonl-session-store.js");
77
- const { estimateTokens, getContextWindow } =
77
+ const { adaptiveThresholds, estimateTokens, getContextWindow } =
78
78
  await import("../harness/prompt-compressor.js");
79
79
 
80
80
  const sessionId = id || getLastSessionId();
@@ -118,6 +118,61 @@ export function registerContextCommand(program) {
118
118
  const provider = options.provider || recordedProvider || "ollama";
119
119
  const window = getContextWindow(model, provider);
120
120
 
121
+ let canonicalReport = null;
122
+ try {
123
+ const { createCliContextMemoryRuntime } =
124
+ await import("../lib/context-memory-kernel/index.js");
125
+ const runtime = createCliContextMemoryRuntime({ sessionId });
126
+ const snapshot = await runtime.sessionPort.readSnapshot(sessionId);
127
+ const threshold = adaptiveThresholds(window).maxTokens;
128
+ const reservedOutputTokens = Math.max(
129
+ 1,
130
+ Math.min(2048, Math.floor(window / 10)),
131
+ );
132
+ const safetyMarginTokens = Math.max(
133
+ 0,
134
+ window - reservedOutputTokens - threshold,
135
+ );
136
+ const recoveryReserveTokens = Math.min(
137
+ 256,
138
+ Math.max(1, Math.floor(threshold * 0.05)),
139
+ );
140
+ const plan = await runtime.kernel.planContext({
141
+ modelWindowTokens: window,
142
+ reservedOutputTokens,
143
+ safetyMarginTokens,
144
+ recoveryReserveTokens,
145
+ items: snapshot.items,
146
+ sink: provider,
147
+ scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
148
+ policyVersion: "cli-context-policy-v1",
149
+ modelProfile: model || "default",
150
+ sessionHead: snapshot.head,
151
+ memoryRevision: snapshot.memoryRevision,
152
+ });
153
+ canonicalReport = {
154
+ stage: runtime.decision.stage,
155
+ mode: runtime.decision.mode,
156
+ shadow: runtime.decision.shadow,
157
+ planDigest: plan.digest,
158
+ policyVersion: plan.policyVersion,
159
+ selectedItems: plan.selected.length,
160
+ droppedItems: plan.dropped.length,
161
+ selectedTokens: plan.selectedTokens,
162
+ inputBudget: plan.inputBudget,
163
+ selectableBudget: plan.selectableBudget,
164
+ partitions: plan.partitions,
165
+ minimumShortfalls: plan.minimumShortfalls,
166
+ dropped: plan.dropped,
167
+ };
168
+ } catch (error) {
169
+ canonicalReport = {
170
+ status: "rejected",
171
+ code: error?.code || "context_plan_failed",
172
+ message: error?.message || String(error),
173
+ };
174
+ }
175
+
121
176
  const { buckets, counts, total } = categorizeContext(
122
177
  messages,
123
178
  estimateTokens,
@@ -227,6 +282,7 @@ export function registerContextCommand(program) {
227
282
  breakdown: buckets,
228
283
  counts,
229
284
  overflows: total > window,
285
+ contextMemoryKernel: canonicalReport,
230
286
  ...(sourceReport
231
287
  ? {
232
288
  sources: sourceReport.ranked,
@@ -291,6 +347,21 @@ export function registerContextCommand(program) {
291
347
  ` headroom ${String(remaining).padStart(7)} tokens remaining`,
292
348
  ),
293
349
  );
350
+ if (canonicalReport?.status === "rejected") {
351
+ logger.log(
352
+ chalk.red(
353
+ ` canonical plan rejected: ${canonicalReport.code} - ${canonicalReport.message}`,
354
+ ),
355
+ );
356
+ } else if (canonicalReport) {
357
+ logger.log(
358
+ chalk.gray(
359
+ ` kernel ${canonicalReport.stage}/${canonicalReport.mode}: ` +
360
+ `${canonicalReport.selectedItems} selected, ${canonicalReport.droppedItems} dropped, ` +
361
+ `${canonicalReport.selectedTokens}/${canonicalReport.inputBudget} tokens`,
362
+ ),
363
+ );
364
+ }
294
365
  if (total > window) {
295
366
  logger.log(
296
367
  chalk.red(
@@ -1,9 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import {
4
- defaultRolloutStoreDirectory,
5
- JsonlRolloutStore,
6
- } from "../lib/app-server/rollout-store.js";
3
+ import { defaultRolloutStoreDirectory } from "../lib/app-server/rollout-store.js";
4
+ import { createRolloutStore } from "../lib/app-server/rollout-store-factory.js";
7
5
  import { GraphCutoverAuthorityResolver } from "../lib/graph-kernel/cutover-authority-resolver.js";
8
6
  import { GraphCutoverLedger } from "../lib/graph-kernel/cutover-ledger.js";
9
7
  import {
@@ -22,16 +20,18 @@ import {
22
20
  evaluateGraphProjection,
23
21
  } from "../lib/graph-kernel/eval.js";
24
22
 
25
- function graphEventStore(directory) {
23
+ function graphEventStore(directory, backend) {
26
24
  return new GraphEventStore({
27
- rolloutStore: new JsonlRolloutStore({
25
+ rolloutStore: createRolloutStore({
26
+ backend,
28
27
  directory: path.resolve(directory || defaultGraphEventStoreDirectory()),
29
28
  }),
30
29
  });
31
30
  }
32
31
 
33
- function cutoverStore(directory) {
34
- return new JsonlRolloutStore({
32
+ function cutoverStore(directory, backend) {
33
+ return createRolloutStore({
34
+ backend,
35
35
  directory: path.resolve(directory || defaultRolloutStoreDirectory()),
36
36
  });
37
37
  }
@@ -99,11 +99,14 @@ export function registerGraphCommand(program) {
99
99
  "Project a durable GraphRun into Agent/Task/Artifact/Trace views",
100
100
  )
101
101
  .option("--state-dir <path>", "Graph rollout directory")
102
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
102
103
  .option("--at-seq <n>", "Time-travel through a durable event sequence")
103
104
  .option("--blocked-root <nodeId>", "Locate a deterministic blocked root")
104
105
  .option("--include-content", "Include message and HumanTask content")
105
106
  .action((runId, options) => {
106
- const events = graphEventStore(options.stateDir).read(runId);
107
+ const events = graphEventStore(options.stateDir, options.store).read(
108
+ runId,
109
+ );
107
110
  const projection = options.atSeq
108
111
  ? timeTravelGraphTrace(events, Number(options.atSeq), {
109
112
  includeContent: options.includeContent === true,
@@ -127,8 +130,11 @@ export function registerGraphCommand(program) {
127
130
  .requiredOption("--from-seq <n>", "First durable event sequence")
128
131
  .requiredOption("--to-seq <n>", "Second durable event sequence")
129
132
  .option("--state-dir <path>", "Graph rollout directory")
133
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
130
134
  .action((runId, options) => {
131
- const events = graphEventStore(options.stateDir).read(runId);
135
+ const events = graphEventStore(options.stateDir, options.store).read(
136
+ runId,
137
+ );
132
138
  print(
133
139
  diffGraphTrace(
134
140
  timeTravelGraphTrace(events, Number(options.fromSeq)),
@@ -143,13 +149,14 @@ export function registerGraphCommand(program) {
143
149
  "Evaluate a durable GraphRun and optionally enforce thresholds",
144
150
  )
145
151
  .option("--state-dir <path>", "Graph rollout directory")
152
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
146
153
  .option(
147
154
  "--thresholds <json>",
148
155
  'Metric threshold object, e.g. \'{"deadlocked":{"max":0}}\'',
149
156
  )
150
157
  .action((runId, options) => {
151
158
  const projection = reduceGraphTrace(
152
- graphEventStore(options.stateDir).read(runId),
159
+ graphEventStore(options.stateDir, options.store).read(runId),
153
160
  );
154
161
  const report = evaluateGraphProjection(projection);
155
162
  const gate = options.thresholds
@@ -167,6 +174,7 @@ export function registerGraphCommand(program) {
167
174
  .command("init")
168
175
  .description("Bind declared runtime entries to the durable cutover ledger")
169
176
  .option("--state-dir <path>", "Cutover ledger directory")
177
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
170
178
  .option("--surface <name>", "Initialize one origin surface")
171
179
  .option("--entry <id>", "Initialize one entry id")
172
180
  .option(
@@ -176,7 +184,7 @@ export function registerGraphCommand(program) {
176
184
  .action((options) => {
177
185
  const manifest = loadGraphRuntimeSurfaceManifest();
178
186
  const ledger = new GraphCutoverLedger({
179
- store: cutoverStore(options.stateDir),
187
+ store: cutoverStore(options.stateDir, options.store),
180
188
  });
181
189
  const selected = selectedCutoverEntries(manifest, options).filter(
182
190
  ({ surface }) =>
@@ -205,12 +213,13 @@ export function registerGraphCommand(program) {
205
213
  .command("status")
206
214
  .description("List manifest bindings and durable cutover stages")
207
215
  .option("--state-dir <path>", "Cutover ledger directory")
216
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
208
217
  .option("--surface <name>", "Inspect one origin surface")
209
218
  .option("--entry <id>", "Inspect one entry id")
210
219
  .action((options) => {
211
220
  const manifest = loadGraphRuntimeSurfaceManifest();
212
221
  const ledger = new GraphCutoverLedger({
213
- store: cutoverStore(options.stateDir),
222
+ store: cutoverStore(options.stateDir, options.store),
214
223
  });
215
224
  const entries = selectedCutoverEntries(manifest, options).map(
216
225
  ({ surface, entry }) => {
@@ -251,6 +260,7 @@ export function registerGraphCommand(program) {
251
260
  .command("authority <surface> <entryId>")
252
261
  .description("Resolve one new run through the durable entry ledger")
253
262
  .option("--state-dir <path>", "Cutover ledger directory")
263
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
254
264
  .option("--run-key <key>", "Stable logical run identity")
255
265
  .option("--opt-in", "Explicitly enroll an opt-in-only canary run")
256
266
  .option("--fallback <mode>", "Pre-ledger feature-flag fallback")
@@ -259,7 +269,7 @@ export function registerGraphCommand(program) {
259
269
  const resolver = cutoverResolver({
260
270
  manifest,
261
271
  ledger: new GraphCutoverLedger({
262
- store: cutoverStore(options.stateDir),
272
+ store: cutoverStore(options.stateDir, options.store),
263
273
  }),
264
274
  surface,
265
275
  entryId,
@@ -278,11 +288,12 @@ export function registerGraphCommand(program) {
278
288
  .description("Advance or roll back one entry using durable JSON evidence")
279
289
  .requiredOption("--evidence <path>", "Evidence JSON file")
280
290
  .option("--state-dir <path>", "Cutover ledger directory")
291
+ .option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
281
292
  .option("--expected-head <digest>", "Expected ledger event head CAS")
282
293
  .action((surface, entryId, stage, options) => {
283
294
  const manifest = loadGraphRuntimeSurfaceManifest();
284
295
  const ledger = new GraphCutoverLedger({
285
- store: cutoverStore(options.stateDir),
296
+ store: cutoverStore(options.stateDir, options.store),
286
297
  });
287
298
  const resolver = cutoverResolver({
288
299
  manifest,
@@ -8,6 +8,10 @@ import { numericOption } from "../lib/cli-numeric.js";
8
8
  import ora from "ora";
9
9
  import { logger } from "../lib/logger.js";
10
10
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
11
+ import {
12
+ assertLegacyMutationAllowed,
13
+ resolveCliContextMemoryCutover,
14
+ } from "../lib/context-memory-kernel/authority.js";
11
15
  import {
12
16
  storeMemory,
13
17
  recallMemory,
@@ -41,6 +45,23 @@ export function registerHmemoryCommand(program) {
41
45
  .command("hmemory")
42
46
  .description("Hierarchical Memory 2.0 — four-layer memory system");
43
47
 
48
+ // This namespace is the pre-Kernel store. Even recall mutates access counts
49
+ // and forgetting state, so the entire surface is fenced once canonical owns
50
+ // the scope. Historical data remains available through the canonical
51
+ // one-time importer and `cc memory recall`.
52
+ hmemory.hook("preAction", (_thisCommand, actionCommand) => {
53
+ const decision = resolveCliContextMemoryCutover({
54
+ scopeKey: `cli:hmemory:${actionCommand.name()}`,
55
+ });
56
+ try {
57
+ assertLegacyMutationAllowed(decision);
58
+ } catch (error) {
59
+ error.message += "; use `cc memory store|recall|consolidate`";
60
+ error.replacement = "cc memory";
61
+ throw error;
62
+ }
63
+ });
64
+
44
65
  // hmemory store <content>
45
66
  hmemory
46
67
  .command("store")