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.
- package/README.md +33 -0
- package/bin/chainlesschain.js +5 -0
- package/package.json +4 -2
- package/src/assets/web-panel/assets/{AIOps-CLYBDAGv.js → AIOps-C8SyFhOo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Dup5gFK0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-8FyOWA7V.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-DBzdU9dg.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-C_0Z8gNy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-Cf2a-58m.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-M7w-2zgB.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-CCTHQXoL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-DjXpeFwJ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-cAvchsJU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-DvEvxlZv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DKs6qvOn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-DlkA7b9X.js} +1 -1
- package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-CkfdKhyJ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-iNXMHzj6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-DQxPEd09.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-CSKvMCjs.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-CkWqazpD.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-k6W8IzhB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-C8MS1OuY.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-DJuCcgiQ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-LeThKzp3.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-BvxwgpE4.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-n3e_a1M3.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-509W6W6v.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-xgZReQm0.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-jZOhKcQx.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-Jo0ULzHv.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-BsRcyWQP.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-JlpMYTAk.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CUEz872-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-DgrvvEDU.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-Df-KY4U3.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-kPZDTOeI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-CRRzPqNX.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-D6pNSkg9.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-g-pvtwRC.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bzayfrfe.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-B7S3W-XL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-B8OMEWVb.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-CowRp7GH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-BkQNyi4c.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-Cm7gtkKz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-CbPTVh9m.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-Dswi26mJ.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-BkjQ9yy7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-DmRFXP7Y.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-DQE1toAu.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BujyoDRG.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-xSjfOaiU.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-B9ICLqVP.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-CUNwyN9E.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-SOoCricX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-CSaFul0F.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-CueiB_oe.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-BOeXvU7y.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-CTqf_31h.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-C8ZP31E9.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-CPgn4713.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-8_e0zw0i.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-iT7lbGqw.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-B4q9SUOz.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-CA_nASyL.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cwb0E3yv.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-D9iVsOxJ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-DPLbYchG.js} +3 -3
- package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-DGMVL_LF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-B_6kym0D.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-Ds6r0dXB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-BLHAbBhb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-CZuddd14.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-CdBq7oSl.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-DfT60Nyl.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-RLfsKy2V.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-Cw8xCNLE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-BOUkNu4f.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CgGZWaRm.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-CpwjVyir.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DL21H-eb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-B3ffFclW.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-CkBeb5aI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-U2iVaE3r.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-CQk2wzYd.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYIuIYzT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-tg1c2mZQ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-CtL61spq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-DKpbeo8s.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-gPZsrswt.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CfHlwzVr.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-MV47g_6X.js} +1 -1
- package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-6G0ETFTW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BBw52sEl.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BN-wxSQ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-BOyGUuBE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BQp5M0s1.js} +1 -1
- package/src/assets/web-panel/assets/index-BcK8o4ke.js +1 -0
- package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-BjlPD7GO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-C4lF-f_z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C6nC_DyY.js} +1 -1
- package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-C9RF4ieu.js} +1 -1
- package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-C9gtY4nG.js} +3 -3
- package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-CB1HnbNK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-CRv_uMLV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-C_B9LiKs.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Cjv0kKCU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-CmM9jqwe.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-CmPJpLoD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-CzfxTSPW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-D1XB5-t5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-DGtEBodr.js} +1 -1
- package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-DIeJmlAA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-DMMvlLp9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-DU4rZpiK.js} +1 -1
- package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D_Pl1GnW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-Dd19vRwy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-Ddcpj1El.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-Df9sWKpl.js} +1 -1
- package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-DfLyHCWi.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DnZ_zS1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-DsH-i_3d.js} +1 -1
- package/src/assets/web-panel/assets/index-DvbAjyYI.js +1 -0
- package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-ExAGPAnX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-Rb7CRMw9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-Zvkt9xqi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-bSFrAszw.js} +1 -1
- package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-fYcS7NS0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-srBc9U_s.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-xUlgG0Xe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-yxxXlqBA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-BeOZoSZ4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-BXE8VMKx.js} +1 -1
- package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-I9sdvPGX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-d25zrJd0.js} +1 -1
- package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-D71V_T4e.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-BNZKpIAR.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-jOcgxTTz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-pta_O8AU.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-Dlq6om7z.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-BnkO_yRv.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-p8NfWmcG.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-KcjZZ5U7.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-gqonDMWB.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-jIIfE4go.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-Dyo7fBrM.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-6l8BMg9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/commands/agent.js +76 -23
- package/src/commands/compact.js +349 -3
- package/src/commands/context.js +72 -1
- package/src/commands/graph.js +26 -15
- package/src/commands/hmemory.js +21 -0
- package/src/commands/hook.js +256 -28
- package/src/commands/memory.js +209 -42
- package/src/commands/promcomp.js +17 -0
- package/src/commands/record-replay.js +772 -0
- package/src/commands/serve.js +94 -10
- package/src/commands/session.js +2 -3
- package/src/commands/skill.js +3 -0
- package/src/commands/team.js +7 -1
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/session-core-protocol.js +62 -3
- package/src/gateways/ws/session-protocol.js +123 -15
- package/src/gateways/ws/ws-agent-handler.js +157 -9
- package/src/gateways/ws/ws-session-gateway.js +204 -30
- package/src/generated/cc-agent-protocol.schema.json +2094 -4
- package/src/harness/prompt-compressor.js +5 -55
- package/src/lib/agent-sandbox.js +8 -2
- package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
- package/src/lib/agent-team/team-message-tools.js +23 -5
- package/src/lib/app-server/context-memory-notifications.js +54 -0
- package/src/lib/app-server/rollout-store-factory.js +115 -0
- package/src/lib/app-server/rollout-store.js +310 -23
- package/src/lib/app-server/server.js +184 -7
- package/src/lib/app-server/sqlite-rollout-store.js +59 -16
- package/src/lib/auto-mode-config.js +26 -0
- package/src/lib/causal-observability.js +13 -1
- package/src/lib/context-memory-kernel/authority.js +95 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
- package/src/lib/context-memory-kernel/index.js +8 -0
- package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
- package/src/lib/context-memory-kernel/live-compaction.js +375 -0
- package/src/lib/context-memory-kernel/memory-service.js +667 -0
- package/src/lib/context-memory-kernel/message-adapter.js +451 -0
- package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
- package/src/lib/context-memory-kernel/provider-context.js +192 -0
- package/src/lib/context-memory-kernel/runtime.js +61 -0
- package/src/lib/direct-model-usage.js +22 -18
- package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
- package/src/lib/graph-kernel/cutover-ledger.js +2 -2
- package/src/lib/graph-kernel/event-store.js +3 -5
- package/src/lib/graph-kernel/migration-saga.js +2 -2
- package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
- package/src/lib/hierarchical-memory.js +22 -0
- package/src/lib/hook-audit-store.js +170 -0
- package/src/lib/hook-event-bus.cjs +0 -0
- package/src/lib/hook-manager.js +25 -83
- package/src/lib/hook-runtime-adapters.js +233 -0
- package/src/lib/hook-runtime-contract.cjs +291 -0
- package/src/lib/hook-runtime-contract.js +21 -0
- package/src/lib/hook-trust.js +210 -0
- package/src/lib/hooks-v2-producers.js +52 -6
- package/src/lib/hooks-v2-runtime.js +443 -178
- package/src/lib/llm-pricing.js +10 -0
- package/src/lib/memory-manager.js +29 -4
- package/src/lib/model-context-window.js +52 -0
- package/src/lib/permanent-memory.js +17 -0
- package/src/lib/plan-mode.js +8 -4
- package/src/lib/process-execution-broker/credential-transport.js +31 -0
- package/src/lib/process-execution-broker/index.js +282 -16
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +7 -3
- package/src/lib/record-replay/browser-target-policy.js +406 -0
- package/src/lib/record-replay/index.js +4 -0
- package/src/lib/record-replay/playwright-ui-driver.js +83 -20
- package/src/lib/record-replay/playwright-ui-recorder.js +611 -0
- package/src/lib/record-replay/recorded-skill-package.js +486 -0
- package/src/lib/record-replay/recorded-skill-store.js +1166 -0
- package/src/lib/record-replay/skill-recorder.js +634 -64
- package/src/lib/runtime-usage-ledger.js +20 -0
- package/src/lib/session-consolidator.js +59 -0
- package/src/lib/session-core-singletons.js +17 -4
- package/src/lib/session-hooks.js +29 -2
- package/src/lib/session-transcript-migration.js +188 -0
- package/src/lib/settings-hook-events.cjs +37 -401
- package/src/lib/settings-hook-events.js +210 -8
- package/src/lib/settings-hooks.cjs +42 -83
- package/src/lib/ws-session-manager.js +4 -1
- package/src/repl/agent-repl.js +186 -53
- package/src/runtime/agent-core.js +376 -350
- package/src/runtime/headless-runner.js +112 -84
- package/src/runtime/headless-stream.js +131 -30
- package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
- package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
- package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
- 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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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
|
|
691
|
-
metadata.
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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
|
}
|