chainlesschain 0.166.10 → 0.166.14

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 (244) 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-C8SyFhOo.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Dup5gFK0.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-8FyOWA7V.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-DBzdU9dg.js} +3 -3
  8. package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-C_0Z8gNy.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-Cf2a-58m.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-M7w-2zgB.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-CCTHQXoL.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-DjXpeFwJ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-cAvchsJU.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-DvEvxlZv.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DKs6qvOn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-DlkA7b9X.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-CkfdKhyJ.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-iNXMHzj6.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-DQxPEd09.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-CSKvMCjs.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-CkWqazpD.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-k6W8IzhB.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-C8MS1OuY.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-DJuCcgiQ.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-LeThKzp3.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-BvxwgpE4.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-n3e_a1M3.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-509W6W6v.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-xgZReQm0.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-jZOhKcQx.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-Jo0ULzHv.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-BsRcyWQP.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-JlpMYTAk.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CUEz872-.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-DgrvvEDU.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-Df-KY4U3.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-kPZDTOeI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-CRRzPqNX.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-D6pNSkg9.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-g-pvtwRC.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-Bzayfrfe.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-B7S3W-XL.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-B8OMEWVb.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-CowRp7GH.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-BkQNyi4c.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-Cm7gtkKz.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-CbPTVh9m.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-Dswi26mJ.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-BkjQ9yy7.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-DmRFXP7Y.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-DQE1toAu.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-BujyoDRG.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-xSjfOaiU.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-B9ICLqVP.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-CUNwyN9E.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-SOoCricX.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-CSaFul0F.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-CueiB_oe.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-BOeXvU7y.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-CTqf_31h.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-C8ZP31E9.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-CPgn4713.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-8_e0zw0i.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-iT7lbGqw.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-B4q9SUOz.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-CA_nASyL.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cwb0E3yv.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-D9iVsOxJ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-DPLbYchG.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-DGMVL_LF.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-B_6kym0D.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-Ds6r0dXB.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-BLHAbBhb.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-CZuddd14.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-CdBq7oSl.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-DfT60Nyl.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-RLfsKy2V.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-Cw8xCNLE.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-BOUkNu4f.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CgGZWaRm.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-CpwjVyir.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DL21H-eb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-B3ffFclW.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-CkBeb5aI.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-U2iVaE3r.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-CQk2wzYd.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYIuIYzT.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-tg1c2mZQ.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-CtL61spq.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-DKpbeo8s.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-gPZsrswt.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CfHlwzVr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-MV47g_6X.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-6G0ETFTW.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BBw52sEl.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BN-wxSQ8.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-BOyGUuBE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BQp5M0s1.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BcK8o4ke.js +1 -0
  102. package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-BjlPD7GO.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-C4lF-f_z.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C6nC_DyY.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-C9RF4ieu.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-C9gtY4nG.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-CB1HnbNK.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-CRv_uMLV.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-C_B9LiKs.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Cjv0kKCU.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-CmM9jqwe.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-CmPJpLoD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-CzfxTSPW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-D1XB5-t5.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-DGtEBodr.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-DIeJmlAA.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-DMMvlLp9.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-DU4rZpiK.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D_Pl1GnW.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-Dd19vRwy.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-Ddcpj1El.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-Df9sWKpl.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-DfLyHCWi.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DnZ_zS1M.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-DsH-i_3d.js} +1 -1
  126. package/src/assets/web-panel/assets/index-DvbAjyYI.js +1 -0
  127. package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-ExAGPAnX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-Rb7CRMw9.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-Zvkt9xqi.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-bSFrAszw.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-fYcS7NS0.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-srBc9U_s.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-xUlgG0Xe.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-yxxXlqBA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-BeOZoSZ4.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-BXE8VMKx.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-I9sdvPGX.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-d25zrJd0.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-D71V_T4e.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-BNZKpIAR.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-jOcgxTTz.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-pta_O8AU.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-Dlq6om7z.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-BnkO_yRv.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-p8NfWmcG.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-KcjZZ5U7.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-gqonDMWB.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-jIIfE4go.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-Dyo7fBrM.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-6l8BMg9W.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 +76 -23
  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/record-replay.js +772 -0
  162. package/src/commands/serve.js +94 -10
  163. package/src/commands/session.js +2 -3
  164. package/src/commands/skill.js +3 -0
  165. package/src/commands/team.js +7 -1
  166. package/src/data/changelog.json +41 -2
  167. package/src/gateways/ws/session-core-protocol.js +62 -3
  168. package/src/gateways/ws/session-protocol.js +123 -15
  169. package/src/gateways/ws/ws-agent-handler.js +157 -9
  170. package/src/gateways/ws/ws-session-gateway.js +204 -30
  171. package/src/generated/cc-agent-protocol.schema.json +2094 -4
  172. package/src/harness/prompt-compressor.js +5 -55
  173. package/src/lib/agent-sandbox.js +8 -2
  174. package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
  175. package/src/lib/agent-team/team-message-tools.js +23 -5
  176. package/src/lib/app-server/context-memory-notifications.js +54 -0
  177. package/src/lib/app-server/rollout-store-factory.js +115 -0
  178. package/src/lib/app-server/rollout-store.js +310 -23
  179. package/src/lib/app-server/server.js +184 -7
  180. package/src/lib/app-server/sqlite-rollout-store.js +59 -16
  181. package/src/lib/auto-mode-config.js +26 -0
  182. package/src/lib/causal-observability.js +13 -1
  183. package/src/lib/context-memory-kernel/authority.js +95 -0
  184. package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
  185. package/src/lib/context-memory-kernel/index.js +8 -0
  186. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
  187. package/src/lib/context-memory-kernel/live-compaction.js +375 -0
  188. package/src/lib/context-memory-kernel/memory-service.js +667 -0
  189. package/src/lib/context-memory-kernel/message-adapter.js +451 -0
  190. package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
  191. package/src/lib/context-memory-kernel/provider-context.js +192 -0
  192. package/src/lib/context-memory-kernel/runtime.js +61 -0
  193. package/src/lib/direct-model-usage.js +22 -18
  194. package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
  195. package/src/lib/graph-kernel/cutover-ledger.js +2 -2
  196. package/src/lib/graph-kernel/event-store.js +3 -5
  197. package/src/lib/graph-kernel/migration-saga.js +2 -2
  198. package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
  199. package/src/lib/hierarchical-memory.js +22 -0
  200. package/src/lib/hook-audit-store.js +170 -0
  201. package/src/lib/hook-event-bus.cjs +0 -0
  202. package/src/lib/hook-manager.js +25 -83
  203. package/src/lib/hook-runtime-adapters.js +233 -0
  204. package/src/lib/hook-runtime-contract.cjs +291 -0
  205. package/src/lib/hook-runtime-contract.js +21 -0
  206. package/src/lib/hook-trust.js +210 -0
  207. package/src/lib/hooks-v2-producers.js +52 -6
  208. package/src/lib/hooks-v2-runtime.js +443 -178
  209. package/src/lib/llm-pricing.js +10 -0
  210. package/src/lib/memory-manager.js +29 -4
  211. package/src/lib/model-context-window.js +52 -0
  212. package/src/lib/permanent-memory.js +17 -0
  213. package/src/lib/plan-mode.js +8 -4
  214. package/src/lib/process-execution-broker/credential-transport.js +31 -0
  215. package/src/lib/process-execution-broker/index.js +282 -16
  216. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  217. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  218. package/src/lib/process-execution-broker/windows-sandbox.cs +7 -3
  219. package/src/lib/record-replay/browser-target-policy.js +406 -0
  220. package/src/lib/record-replay/index.js +4 -0
  221. package/src/lib/record-replay/playwright-ui-driver.js +83 -20
  222. package/src/lib/record-replay/playwright-ui-recorder.js +611 -0
  223. package/src/lib/record-replay/recorded-skill-package.js +486 -0
  224. package/src/lib/record-replay/recorded-skill-store.js +1166 -0
  225. package/src/lib/record-replay/skill-recorder.js +634 -64
  226. package/src/lib/runtime-usage-ledger.js +20 -0
  227. package/src/lib/session-consolidator.js +59 -0
  228. package/src/lib/session-core-singletons.js +17 -4
  229. package/src/lib/session-hooks.js +29 -2
  230. package/src/lib/session-transcript-migration.js +188 -0
  231. package/src/lib/settings-hook-events.cjs +37 -401
  232. package/src/lib/settings-hook-events.js +210 -8
  233. package/src/lib/settings-hooks.cjs +42 -83
  234. package/src/lib/ws-session-manager.js +4 -1
  235. package/src/repl/agent-repl.js +186 -53
  236. package/src/runtime/agent-core.js +376 -350
  237. package/src/runtime/headless-runner.js +112 -84
  238. package/src/runtime/headless-stream.js +131 -30
  239. package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
  240. package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
  241. package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
  242. package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
  243. package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
  244. package/src/assets/web-panel/assets/index-DL2EFx7m.js +0 -1
@@ -42,6 +42,12 @@ import { createWsApprovalGate } from "./ws-approval-gate.js";
42
42
  import { createSessionMcpLedgerSink } from "../../lib/mcp-call-ledger-store.js";
43
43
  import { createMcpHostRecoveryRuntime } from "../../lib/mcp-host-recovery-runtime.js";
44
44
  import { compactConversationWithProvider } from "../../harness/provider-backed-compaction.js";
45
+ import {
46
+ estimateMessagesTokens,
47
+ PromptCompressor,
48
+ } from "../../harness/prompt-compressor.js";
49
+ import { resolveCliContextMemoryCutover } from "../../lib/context-memory-kernel/authority.js";
50
+ import { compactLiveMessagesCanonical } from "../../lib/context-memory-kernel/live-compaction.js";
45
51
  import { projectCanonicalResumeMessages } from "../../lib/session-message-provenance.js";
46
52
  import { feature } from "../../lib/feature-flags.js";
47
53
  import { classifyStreamRetryReason } from "../../lib/stream-retry.js";
@@ -586,6 +592,124 @@ export class WSAgentHandler {
586
592
  return block;
587
593
  }
588
594
 
595
+ _contextMemoryCutover() {
596
+ return resolveCliContextMemoryCutover({
597
+ env: this.session.contextMemoryEnv || process.env,
598
+ scopeKey: `cli:session:${this.session.id}`,
599
+ });
600
+ }
601
+
602
+ async _compactContextMemory(messages, providerOptions, trigger) {
603
+ const cutover = this._contextMemoryCutover();
604
+ if (!cutover.canonical) {
605
+ return compactConversationWithProvider(messages, providerOptions);
606
+ }
607
+ const probe = new PromptCompressor({
608
+ model: providerOptions.model,
609
+ provider: providerOptions.provider,
610
+ ...(providerOptions.maxMessages
611
+ ? { maxMessages: providerOptions.maxMessages }
612
+ : {}),
613
+ ...(providerOptions.maxTokens
614
+ ? { maxTokens: providerOptions.maxTokens }
615
+ : {}),
616
+ });
617
+ if (
618
+ providerOptions.onlyIfNeeded === true &&
619
+ !probe.shouldAutoCompact(messages)
620
+ ) {
621
+ const tokens = estimateMessagesTokens(messages);
622
+ return {
623
+ messages: [...messages],
624
+ stats: {
625
+ strategy: "none",
626
+ originalMessages: messages.length,
627
+ compressedMessages: messages.length,
628
+ originalTokens: tokens,
629
+ compressedTokens: tokens,
630
+ saved: 0,
631
+ },
632
+ degradedEvent: null,
633
+ usageEvent: null,
634
+ usageUnknownEvent: null,
635
+ };
636
+ }
637
+
638
+ let compatibilityResult = null;
639
+ const canonical = await compactLiveMessagesCanonical(messages, {
640
+ compressor: {
641
+ maxTokens: probe.maxTokens,
642
+ compress: async (dropped) => {
643
+ compatibilityResult = await compactConversationWithProvider(
644
+ dropped,
645
+ providerOptions,
646
+ );
647
+ await providerOptions.onContextMemorySummarySettled?.(
648
+ compatibilityResult,
649
+ );
650
+ return compatibilityResult;
651
+ },
652
+ },
653
+ sessionId: this.session.id,
654
+ operationId: `${trigger}-${randomUUID()}`,
655
+ provider: this.session.provider,
656
+ model: this.session.model,
657
+ env: this.session.contextMemoryEnv || process.env,
658
+ persist: this.session.canonicalJsonlSession === true,
659
+ trigger,
660
+ ...(this.session.canonicalJsonlSession === true
661
+ ? {
662
+ commit: (stats, output, settlement) => {
663
+ this._sessionHostLease?.assert?.();
664
+ const result =
665
+ this._canonicalSessionStore.appendCompactEventIfMessagesMatch(
666
+ this.session.id,
667
+ {
668
+ ...stats,
669
+ trigger,
670
+ messages: projectCanonicalResumeMessages(output, {
671
+ strict: true,
672
+ }),
673
+ },
674
+ settlement.expectedMessages,
675
+ );
676
+ if (result && typeof result.then === "function") {
677
+ void Promise.resolve(result).catch(() => {});
678
+ const error = new TypeError(
679
+ "Canonical compact settlement must be synchronous",
680
+ );
681
+ error.code = "CC_COMPACTION_SETTLEMENT_ASYNC";
682
+ throw error;
683
+ }
684
+ return result;
685
+ },
686
+ }
687
+ : {}),
688
+ });
689
+ if (canonical.receipt.status === "stale") {
690
+ const error = new Error(
691
+ "session messages changed during canonical compaction",
692
+ );
693
+ error.code = "SESSION_REVISION_STALE";
694
+ throw error;
695
+ }
696
+ if (
697
+ canonical.receipt.status === "reconciliation_required" &&
698
+ !compatibilityResult?.usageUnknownEvent
699
+ ) {
700
+ const error = new Error("canonical compaction requires reconciliation");
701
+ error.code = "CC_COMPACTION_RECONCILIATION_REQUIRED";
702
+ throw error;
703
+ }
704
+ return {
705
+ messages: canonical.messages,
706
+ stats: canonical.stats,
707
+ degradedEvent: compatibilityResult?.degradedEvent || null,
708
+ usageEvent: compatibilityResult?.usageEvent || null,
709
+ usageUnknownEvent: compatibilityResult?.usageUnknownEvent || null,
710
+ };
711
+ }
712
+
589
713
  _canonicalTurnFromAuthority(state, requestId, userMessage, inputDigest) {
590
714
  const status = state?.status || (state?.turn ? "completed" : "none");
591
715
  this._applyCanonicalMessages(state?.messages || []);
@@ -630,7 +754,8 @@ export class WSAgentHandler {
630
754
  const { session } = this;
631
755
  if (
632
756
  session.autoCompact === false ||
633
- !feature("PROMPT_COMPRESSOR") ||
757
+ (!feature("PROMPT_COMPRESSOR") &&
758
+ !this._contextMemoryCutover().canonical) ||
634
759
  this._compactionSettlementBlock?.commitState === "provider-usage-unknown"
635
760
  ) {
636
761
  return true;
@@ -647,7 +772,7 @@ export class WSAgentHandler {
647
772
  let result;
648
773
  try {
649
774
  this._sessionHostLease?.assert?.();
650
- result = await compactConversationWithProvider(session.messages, {
775
+ result = await this._compactContextMemory(session.messages, {
651
776
  provider: session.provider,
652
777
  model: session.model,
653
778
  baseUrl: session.baseUrl,
@@ -675,8 +800,17 @@ export class WSAgentHandler {
675
800
  maxTokens: session.compactionMaxTokens,
676
801
  maxOutputTokens: session.compactionMaxOutputTokens,
677
802
  summaryInputMaxChars: session.compactionInputMaxChars,
678
- });
679
- if (compactionUsageCall) {
803
+ onContextMemorySummarySettled: (summaryResult) => {
804
+ if (compactionUsageCall && !compactionUsageSettled) {
805
+ this._settleCanonicalCompactionUsage(
806
+ compactionUsageCall,
807
+ summaryResult,
808
+ );
809
+ compactionUsageSettled = true;
810
+ }
811
+ },
812
+ }, "auto");
813
+ if (compactionUsageCall && !compactionUsageSettled) {
680
814
  this._settleCanonicalCompactionUsage(compactionUsageCall, result);
681
815
  compactionUsageSettled = true;
682
816
  }
@@ -747,7 +881,11 @@ export class WSAgentHandler {
747
881
  );
748
882
  const shouldSettle = stats?.strategy !== "none" && stats?.saved > 0;
749
883
  let settlementError = null;
750
- if (!messagesChanged && shouldSettle) {
884
+ if (
885
+ !messagesChanged &&
886
+ shouldSettle &&
887
+ stats?.canonicalAlreadySettled !== true
888
+ ) {
751
889
  try {
752
890
  const settlement =
753
891
  this._canonicalSessionStore.appendCompactEventIfMessagesMatch(
@@ -1977,7 +2115,7 @@ export class WSAgentHandler {
1977
2115
  try {
1978
2116
  this.assertSessionBudgetAdmission("WebSocket compaction");
1979
2117
  this._sessionHostLease?.assert?.();
1980
- result = await compactConversationWithProvider(session.messages, {
2118
+ result = await this._compactContextMemory(session.messages, {
1981
2119
  provider: session.provider,
1982
2120
  model: session.model,
1983
2121
  baseUrl: session.baseUrl,
@@ -2002,8 +2140,17 @@ export class WSAgentHandler {
2002
2140
  : {}),
2003
2141
  maxOutputTokens: session.compactionMaxOutputTokens,
2004
2142
  summaryInputMaxChars: session.compactionInputMaxChars,
2005
- });
2006
- if (compactionUsageCall) {
2143
+ onContextMemorySummarySettled: (summaryResult) => {
2144
+ if (compactionUsageCall && !compactionUsageSettled) {
2145
+ this._settleCanonicalCompactionUsage(
2146
+ compactionUsageCall,
2147
+ summaryResult,
2148
+ );
2149
+ compactionUsageSettled = true;
2150
+ }
2151
+ },
2152
+ }, "manual");
2153
+ if (compactionUsageCall && !compactionUsageSettled) {
2007
2154
  this._settleCanonicalCompactionUsage(compactionUsageCall, result);
2008
2155
  compactionUsageSettled = true;
2009
2156
  }
@@ -2068,7 +2215,8 @@ export class WSAgentHandler {
2068
2215
  if (
2069
2216
  !commandError &&
2070
2217
  !messagesChanged &&
2071
- session.canonicalJsonlSession === true
2218
+ session.canonicalJsonlSession === true &&
2219
+ stats?.canonicalAlreadySettled !== true
2072
2220
  ) {
2073
2221
  if (stats?.strategy !== "none") {
2074
2222
  try {
@@ -20,6 +20,7 @@ import {
20
20
  } from "../../lib/plan-mode.js";
21
21
  import { CLIContextEngineering } from "../../lib/cli-context-engineering.js";
22
22
  import { CLIPermanentMemory } from "../../lib/permanent-memory.js";
23
+ import { resolveCliContextMemoryCutover } from "../../lib/context-memory-kernel/authority.js";
23
24
  import {
24
25
  createTrustedMcpServerMap,
25
26
  resolveMcpServerPolicy,
@@ -61,7 +62,48 @@ import {
61
62
  hydrateWsSessionState,
62
63
  recoverWsSessionState,
63
64
  serializeWsSessionState,
65
+ WS_SESSION_STATE_SCHEMA,
66
+ WS_SESSION_STATE_VERSION,
64
67
  } from "./ws-session-state.js";
68
+ import {
69
+ appendEvent as appendCanonicalSessionEvent,
70
+ findLatestEvent as findLatestCanonicalSessionEvent,
71
+ } from "../../harness/jsonl-session-store.js";
72
+
73
+ export const WS_SESSION_ROLLOUT_EVENT = "ws_session_state";
74
+ const WS_SESSION_ROLLOUT_SCHEMA = "chainlesschain.ws-session-rollout/v1";
75
+
76
+ function canonicalWsStateError(code, message) {
77
+ const error = new Error(message);
78
+ error.name = "CanonicalWsSessionStateError";
79
+ error.code = code;
80
+ return error;
81
+ }
82
+
83
+ function hydrateCanonicalWsSessionState(value) {
84
+ if (
85
+ !value ||
86
+ typeof value !== "object" ||
87
+ value.schema !== WS_SESSION_STATE_SCHEMA ||
88
+ value.version !== WS_SESSION_STATE_VERSION ||
89
+ !value.snapshot ||
90
+ typeof value.snapshot !== "object" ||
91
+ !Array.isArray(value.events)
92
+ ) {
93
+ throw canonicalWsStateError(
94
+ "CC_WS_CANONICAL_STATE_CORRUPT",
95
+ "canonical WebSocket session state has an invalid envelope",
96
+ );
97
+ }
98
+ const journal = hydrateWsSessionState(value);
99
+ if (journal.events.length !== value.events.length) {
100
+ throw canonicalWsStateError(
101
+ "CC_WS_CANONICAL_STATE_CORRUPT",
102
+ "canonical WebSocket session state contains a revision gap",
103
+ );
104
+ }
105
+ return journal;
106
+ }
65
107
 
66
108
  function normalizeHostWorkspaceRoot(workspaceRoot) {
67
109
  if (
@@ -181,6 +223,11 @@ export class WSSessionManager {
181
223
  );
182
224
  this.defaultSystemPromptExtension =
183
225
  options.defaultSystemPromptExtension || null;
226
+ this.canonicalSessionStore = {
227
+ appendEvent: appendCanonicalSessionEvent,
228
+ findLatestEvent: findLatestCanonicalSessionEvent,
229
+ ...(options.canonicalSessionStore || {}),
230
+ };
184
231
 
185
232
  /** @type {Map<string, Session>} */
186
233
  this.sessions = new Map();
@@ -410,7 +457,15 @@ export class WSSessionManager {
410
457
  `max_sessions_exceeded: ${this.maxSessions} concurrent sessions reached — close some before creating more`,
411
458
  );
412
459
  }
413
- const sessionId = this._generateId();
460
+ const sessionId = options.sessionId || this._generateId();
461
+ if (this.sessions.has(sessionId)) {
462
+ const error = new Error(`session already exists: ${sessionId}`);
463
+ error.code = "CC_WS_SESSION_EXISTS";
464
+ throw error;
465
+ }
466
+ const contextMemoryCutover = resolveCliContextMemoryCutover({
467
+ scopeKey: `cli:ws-session:${sessionId}`,
468
+ });
414
469
  const requireDurable = options.requireDurable === true;
415
470
  if (requireDurable && !this.db) {
416
471
  const error = new Error(
@@ -458,15 +513,17 @@ export class WSSessionManager {
458
513
  // Create context engine
459
514
  let contextEngine = null;
460
515
  let permanentMemory = null;
461
- try {
462
- const memoryDir = path.join(projectRoot, "memory");
463
- permanentMemory = new CLIPermanentMemory({
464
- db: this.db,
465
- memoryDir,
466
- });
467
- permanentMemory.initialize();
468
- } catch (_err) {
469
- // Non-critical
516
+ if (!contextMemoryCutover.canonical) {
517
+ try {
518
+ const memoryDir = path.join(projectRoot, "memory");
519
+ permanentMemory = new CLIPermanentMemory({
520
+ db: this.db,
521
+ memoryDir,
522
+ });
523
+ permanentMemory.initialize();
524
+ } catch (_err) {
525
+ permanentMemory = null;
526
+ }
470
527
  }
471
528
 
472
529
  try {
@@ -687,33 +744,44 @@ export class WSSessionManager {
687
744
  metadata,
688
745
  );
689
746
  const planManager = this._hydratePlanManager(metadata.planSnapshot);
690
- const sessionStateJournal = hydrateWsSessionState(
691
- metadata.sessionState,
692
- Object.prototype.hasOwnProperty.call(metadata, "planSnapshot")
693
- ? {
694
- // Legacy/current metadata migration is pass-through only.
695
- // PlanModeManager remains the sole owner of Plan hydration and
696
- // persistence.
697
- planSnapshot: metadata.planSnapshot,
698
- }
699
- : {},
700
- );
747
+ const canonicalSessionState =
748
+ metadata.canonicalJsonlSession === true
749
+ ? this._readCanonicalSessionState(dbSession.id, { required: true })
750
+ : null;
751
+ const sessionStateJournal = canonicalSessionState
752
+ ? hydrateCanonicalWsSessionState(canonicalSessionState)
753
+ : hydrateWsSessionState(
754
+ metadata.sessionState,
755
+ Object.prototype.hasOwnProperty.call(metadata, "planSnapshot")
756
+ ? {
757
+ // Legacy/current metadata migration is pass-through only.
758
+ // PlanModeManager remains the sole owner of Plan hydration and
759
+ // persistence.
760
+ planSnapshot: metadata.planSnapshot,
761
+ }
762
+ : {},
763
+ );
701
764
  const stateRecovery = recoverWsSessionState(sessionStateJournal, {
702
765
  reason: "process_restart",
703
766
  });
704
767
  const externalTools = this._buildSessionExternalTools();
768
+ const contextMemoryCutover = resolveCliContextMemoryCutover({
769
+ scopeKey: `cli:ws-session:${dbSession.id}`,
770
+ });
705
771
  let contextEngine = null;
706
772
  let permanentMemory = null;
707
773
 
708
- try {
709
- const memoryDir = path.join(workspace.projectRoot, "memory");
710
- permanentMemory = new CLIPermanentMemory({
711
- db: this.db,
712
- memoryDir,
713
- });
714
- permanentMemory.initialize();
715
- } catch (_err) {
716
- // Non-critical
774
+ if (!contextMemoryCutover.canonical) {
775
+ try {
776
+ const memoryDir = path.join(workspace.projectRoot, "memory");
777
+ permanentMemory = new CLIPermanentMemory({
778
+ db: this.db,
779
+ memoryDir,
780
+ });
781
+ permanentMemory.initialize();
782
+ } catch (_err) {
783
+ permanentMemory = null;
784
+ }
717
785
  }
718
786
 
719
787
  try {
@@ -756,6 +824,9 @@ export class WSSessionManager {
756
824
  patchHistory: this._boundPatchHistory(metadata.patchHistory),
757
825
  taskGraph: this._hydrateTaskGraph(metadata.taskGraph),
758
826
  interaction: null,
827
+ canonicalJsonlSession:
828
+ canonicalSessionState != null ||
829
+ metadata.canonicalJsonlSession === true,
759
830
  createdAt: dbSession.created_at,
760
831
  lastActivity: new Date().toISOString(),
761
832
  };
@@ -779,6 +850,7 @@ export class WSSessionManager {
779
850
  this._bindPlanManagerPersistence(session);
780
851
  this.sessions.set(session.id, session);
781
852
  if (stateRecovery.changed) {
853
+ this._persistCanonicalSessionState(session, sessionStateJournal);
782
854
  this._persistSessionState(session.id);
783
855
  }
784
856
  return session;
@@ -787,6 +859,47 @@ export class WSSessionManager {
787
859
  }
788
860
  }
789
861
 
862
+ /** Build the local compatibility projection for a verified canonical-only session. */
863
+ resumeCanonicalSession(sessionId, options = {}) {
864
+ if (this.sessions.has(sessionId)) return this.resumeSession(sessionId);
865
+ // Read and validate any canonical WS journal before creating a DB/cache
866
+ // projection. An invalid journal must never be replaced by empty state.
867
+ const canonicalSessionState = this._readCanonicalSessionState(sessionId);
868
+ const canonicalJournal = canonicalSessionState
869
+ ? hydrateCanonicalWsSessionState(canonicalSessionState)
870
+ : null;
871
+ const stateRecovery = canonicalJournal
872
+ ? recoverWsSessionState(canonicalJournal, {
873
+ reason: "process_restart",
874
+ })
875
+ : { changed: false };
876
+ const created = this.createSession({
877
+ sessionId,
878
+ type: options.type || "agent",
879
+ provider: options.provider,
880
+ model: options.model,
881
+ baseUrl: options.baseUrl,
882
+ projectRoot: options.projectRoot,
883
+ requireDurable: false,
884
+ });
885
+ const session = this.sessions.get(created.sessionId) || null;
886
+ if (session && canonicalJournal) {
887
+ try {
888
+ session.canonicalJsonlSession = true;
889
+ this._bindSessionStateJournal(session, canonicalJournal);
890
+ if (stateRecovery.changed) {
891
+ this._persistCanonicalSessionState(session, canonicalJournal);
892
+ }
893
+ this._persistSessionState(session.id);
894
+ } catch (error) {
895
+ this.sessions.delete(session.id);
896
+ this._discardSessionResources(session);
897
+ throw error;
898
+ }
899
+ }
900
+ return session;
901
+ }
902
+
790
903
  /**
791
904
  * Close a session and persist final state.
792
905
  *
@@ -1641,6 +1754,7 @@ export class WSSessionManager {
1641
1754
  baseUrl: session.baseUrl || null,
1642
1755
  hostManagedToolPolicy: session.hostManagedToolPolicy || null,
1643
1756
  sessionBudgetRoot: session.sessionBudgetRoot || null,
1757
+ canonicalJsonlSession: session.canonicalJsonlSession === true,
1644
1758
  enabledToolNames: session.enabledToolNames || [],
1645
1759
  canonicalHostSystemPrefix: Array.isArray(
1646
1760
  session._canonicalHostSystemPrefix,
@@ -1689,12 +1803,72 @@ export class WSSessionManager {
1689
1803
  return session._sessionStateJournal;
1690
1804
  }
1691
1805
 
1806
+ _readCanonicalSessionState(sessionId, { required = false } = {}) {
1807
+ const event = this.canonicalSessionStore.findLatestEvent(
1808
+ sessionId,
1809
+ WS_SESSION_ROLLOUT_EVENT,
1810
+ );
1811
+ if (!event) {
1812
+ if (required) {
1813
+ throw canonicalWsStateError(
1814
+ "CC_WS_CANONICAL_STATE_MISSING",
1815
+ `canonical WebSocket session state is missing: ${sessionId}`,
1816
+ );
1817
+ }
1818
+ return null;
1819
+ }
1820
+ if (event.data?.schema !== WS_SESSION_ROLLOUT_SCHEMA) {
1821
+ throw canonicalWsStateError(
1822
+ "CC_WS_CANONICAL_STATE_CORRUPT",
1823
+ `canonical WebSocket session state has an invalid schema: ${sessionId}`,
1824
+ );
1825
+ }
1826
+ return event.data.journal;
1827
+ }
1828
+
1829
+ _persistCanonicalSessionState(session, journal) {
1830
+ if (session?.canonicalJsonlSession !== true) return null;
1831
+ return this.canonicalSessionStore.appendEvent(
1832
+ session.id,
1833
+ WS_SESSION_ROLLOUT_EVENT,
1834
+ {
1835
+ schema: WS_SESSION_ROLLOUT_SCHEMA,
1836
+ journal: serializeWsSessionState(journal),
1837
+ },
1838
+ );
1839
+ }
1840
+
1841
+ markCanonicalSession(sessionId) {
1842
+ const session = this.sessions.get(sessionId);
1843
+ if (!session) return null;
1844
+ const previous = session.canonicalJsonlSession === true;
1845
+ session.canonicalJsonlSession = true;
1846
+ try {
1847
+ this._persistCanonicalSessionState(
1848
+ session,
1849
+ this._ensureSessionStateJournal(session),
1850
+ );
1851
+ this._persistSessionState(sessionId);
1852
+ return session;
1853
+ } catch (error) {
1854
+ session.canonicalJsonlSession = previous;
1855
+ throw error;
1856
+ }
1857
+ }
1858
+
1692
1859
  /** Record a recovery event and atomically persist it with session messages. */
1693
1860
  recordSessionStateEvent(sessionId, type, payload = {}) {
1694
1861
  const session = this.sessions.get(sessionId);
1695
1862
  if (!session) return null;
1696
1863
  const journal = this._ensureSessionStateJournal(session);
1864
+ const before = serializeWsSessionState(journal);
1697
1865
  appendWsSessionStateEvent(journal, type, payload);
1866
+ try {
1867
+ this._persistCanonicalSessionState(session, journal);
1868
+ } catch (error) {
1869
+ this._bindSessionStateJournal(session, hydrateWsSessionState(before));
1870
+ throw error;
1871
+ }
1698
1872
  this._persistSessionState(sessionId);
1699
1873
  return getWsSessionStateSnapshot(journal);
1700
1874
  }