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.
- 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-BN25cNOD.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Da9IP-m5.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-D7hkEvQm.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-CCV4Xnbc.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-CVSnVJeA.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-CuYdw5Ag.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-cV9FdpTy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-BRnv6YSp.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-Bw5w87P4.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-C0GjtUAw.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DaoTqcdt.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-B4dYcEIi.js} +1 -1
- package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-mAhuOeuD.js} +1 -1
- package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-BK6KEdBk.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-CCglmNu5.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-Cm8S4of7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-Dhs1QLMe.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-CLlhmXWk.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-BnHVbaNs.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-UzQP9-0O.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-CBdlPClz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-axIRPdq1.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-DUalW5rx.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-C1yP-uEu.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-Xh6Ig5q8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-C_z63ixg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-BYqB33_3.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CEULuArm.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-DO9Hdcec.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-B8zyLiFe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-BLAN2mWW.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-CrQcFM7u.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-DVnyiiU-.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-qjCME5OD.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-4JE3C3It.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-CjBuak9I.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-BtPcYQcC.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-Cx653_Ba.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-CkuD3YzS.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-BgNgU7HH.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-Dmd4Hjxz.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-C_5DA-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-uwslV4XC.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-CuNgwVnX.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-CJayVX9H.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-Cb05H5go.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-BZlGKapZ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-BIzZWYzd.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-vEYYyQXQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-MZqTy5CC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-CRARUOl8.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-80VAK8PX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-CzRSoIwK.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-BpwQ2n4C.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-BC03TZ79.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-DE59-jaa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-DOHmeWyA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-hc5RZl1D.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cv5uMP7E.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-qohu7Ug0.js} +1 -1
- package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-drCPFWV5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-BAEgUeRy.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-CkJkKBlo.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-bMuKEpez.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-DxWQVHRC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-BpS8idmV.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-BPBLlW5v.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-C4SLEeUh.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-r-wfU39U.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-C7vjRmLN.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-DdzeFCV2.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CYyWN2KD.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-D8A9osUg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DBvrNlyS.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-DBVAGc7o.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-C1vQUCRJ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-BKs4dah4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-ByIuj3lD.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYlAFCm9.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-Dwyadd0c.js} +1 -1
- package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-Bm2f3s08.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-C8ORSh7V.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-1iVlnsM-.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CmqNyUSL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-rUMaX3Ul.js} +1 -1
- package/src/assets/web-panel/assets/index-9biMQ-tw.js +1 -0
- package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-B53c3diB.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-B59OWAs7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-B8BrB0Ls.js} +1 -1
- package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-BC32_0xT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-BC8Wb6cy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BCOhTILd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-BFniLMn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BIvM-uAX.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-BK-RY0-7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-BQL9r73Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BVtnizyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-Bf1PlIHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Bgw4Y2rU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-BgwLNxmr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-C-J5-pGH.js} +1 -1
- package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-C-ZIHi42.js} +1 -1
- package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-C3B1S-mW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C5RfRciU.js} +1 -1
- package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-CCEyz58d.js} +1 -1
- package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
- package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-CTfEmKK0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-CfiHyVyl.js} +1 -1
- package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-CkFvuAex.js} +3 -3
- package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D98FXb0w.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DDHk911Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-DJxtPFOh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-DVJ1uKf4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-Dcck8QfW.js} +1 -1
- package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-DgUE51Pz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-Dsve5Gkv.js} +1 -1
- package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-DvedhJeM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-DwMdWKiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-OcbzdRpT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-fPK6GFEg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-geQinnns.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-pHWA7bmM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-reUHhuz8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-tqTx5wXo.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-CuA-cpkL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-CimmE_9b.js} +1 -1
- package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-DlGlrltz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-CK6BJQ07.js} +1 -1
- package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-BKjBfZfB.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-B2chVYw9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-BW8aLJJ3.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-dXlPl66S.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-hSa89S4G.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-DM6KLt-s.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-C9MQAK15.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-C7rtRViA.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-Dm15xafq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-mEiEytw4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-DzPxflhY.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 +51 -20
- 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/serve.js +94 -10
- package/src/commands/session.js +2 -3
- package/src/commands/team.js +7 -1
- package/src/data/changelog.json +28 -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 +14 -4
- package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
- 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/index.js +208 -16
- 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 +40 -33
- 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
|
@@ -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
|
}
|