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
package/src/commands/memory.js
CHANGED
|
@@ -69,6 +69,31 @@ export function openMemoryEditor(editor, filePath, deps = _deps) {
|
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
async function resolveCanonicalMemory(ctx) {
|
|
73
|
+
const { createCliCanonicalMemoryService } =
|
|
74
|
+
await import("../lib/context-memory-kernel/index.js");
|
|
75
|
+
const legacyDb = ctx?.db?.getDatabase?.() || null;
|
|
76
|
+
const service = createCliCanonicalMemoryService({ legacyDb });
|
|
77
|
+
if (service.decision.canonical && ctx?.db) {
|
|
78
|
+
await service.migrateLegacyEntries(exportMemory(ctx.db.getDatabase()));
|
|
79
|
+
}
|
|
80
|
+
return service;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function resolveScopedMemory() {
|
|
84
|
+
const [{ createCliCanonicalMemoryService }, { getMemoryStore }] =
|
|
85
|
+
await Promise.all([
|
|
86
|
+
import("../lib/context-memory-kernel/index.js"),
|
|
87
|
+
import("../lib/session-core-singletons.js"),
|
|
88
|
+
]);
|
|
89
|
+
const service = createCliCanonicalMemoryService();
|
|
90
|
+
const legacyStore = getMemoryStore();
|
|
91
|
+
if (service.decision.canonical) {
|
|
92
|
+
await service.migrateLegacyScopedEntries(legacyStore.list());
|
|
93
|
+
}
|
|
94
|
+
return { service, legacyStore };
|
|
95
|
+
}
|
|
96
|
+
|
|
72
97
|
export function registerMemoryCommand(program) {
|
|
73
98
|
const memory = program
|
|
74
99
|
.command("memory")
|
|
@@ -145,15 +170,20 @@ export function registerMemoryCommand(program) {
|
|
|
145
170
|
.action(async (options) => {
|
|
146
171
|
try {
|
|
147
172
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
148
|
-
|
|
173
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
174
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
149
175
|
logger.error("Database not available");
|
|
150
176
|
process.exit(1);
|
|
151
177
|
}
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
178
|
+
const entries = service.decision.canonical
|
|
179
|
+
? await service.list({
|
|
180
|
+
limit: Math.max(1, parseInt(options.limit) || 20),
|
|
181
|
+
category: options.category,
|
|
182
|
+
})
|
|
183
|
+
: listMemory(ctx.db.getDatabase(), {
|
|
184
|
+
limit: Math.max(1, parseInt(options.limit) || 20),
|
|
185
|
+
category: options.category,
|
|
186
|
+
});
|
|
157
187
|
|
|
158
188
|
if (options.json) {
|
|
159
189
|
console.log(JSON.stringify(entries, null, 2));
|
|
@@ -193,11 +223,14 @@ export function registerMemoryCommand(program) {
|
|
|
193
223
|
.action(async (options) => {
|
|
194
224
|
try {
|
|
195
225
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
196
|
-
|
|
226
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
227
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
197
228
|
logger.error("Database not available");
|
|
198
229
|
process.exit(1);
|
|
199
230
|
}
|
|
200
|
-
const entries =
|
|
231
|
+
const entries = service.decision.canonical
|
|
232
|
+
? await service.export()
|
|
233
|
+
: exportMemory(ctx.db.getDatabase());
|
|
201
234
|
if (options.output) {
|
|
202
235
|
const fs = await import("fs");
|
|
203
236
|
fs.writeFileSync(options.output, JSON.stringify(entries), "utf-8");
|
|
@@ -240,11 +273,14 @@ export function registerMemoryCommand(program) {
|
|
|
240
273
|
throw new Error("import: expected a JSON array of memory entries");
|
|
241
274
|
}
|
|
242
275
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
243
|
-
|
|
276
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
277
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
244
278
|
logger.error("Database not available");
|
|
245
279
|
process.exit(1);
|
|
246
280
|
}
|
|
247
|
-
const result =
|
|
281
|
+
const result = service.decision.canonical
|
|
282
|
+
? await service.import(entries)
|
|
283
|
+
: importMemory(ctx.db.getDatabase(), entries);
|
|
248
284
|
if (options.json) {
|
|
249
285
|
console.log(JSON.stringify(result));
|
|
250
286
|
} else {
|
|
@@ -269,18 +305,27 @@ export function registerMemoryCommand(program) {
|
|
|
269
305
|
.action(async (text, options) => {
|
|
270
306
|
try {
|
|
271
307
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
272
|
-
|
|
308
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
309
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
273
310
|
logger.error("Database not available");
|
|
274
311
|
process.exit(1);
|
|
275
312
|
}
|
|
276
|
-
const
|
|
277
|
-
const entry = addMemory(db, text, {
|
|
313
|
+
const normalizedOptions = {
|
|
278
314
|
category: options.category,
|
|
279
315
|
importance: Math.max(
|
|
280
316
|
1,
|
|
281
317
|
Math.min(5, parseInt(options.importance) || 3),
|
|
282
318
|
),
|
|
283
|
-
}
|
|
319
|
+
};
|
|
320
|
+
let entry;
|
|
321
|
+
if (service.decision.canonical) {
|
|
322
|
+
entry = await service.add(text, normalizedOptions);
|
|
323
|
+
} else {
|
|
324
|
+
if (service.decision.shadow) {
|
|
325
|
+
service.validateLegacyProposal(text, normalizedOptions);
|
|
326
|
+
}
|
|
327
|
+
entry = addMemory(ctx.db.getDatabase(), text, normalizedOptions);
|
|
328
|
+
}
|
|
284
329
|
|
|
285
330
|
if (options.json) {
|
|
286
331
|
console.log(JSON.stringify(entry, null, 2));
|
|
@@ -307,14 +352,18 @@ export function registerMemoryCommand(program) {
|
|
|
307
352
|
.action(async (query, options) => {
|
|
308
353
|
try {
|
|
309
354
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
310
|
-
|
|
355
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
356
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
311
357
|
logger.error("Database not available");
|
|
312
358
|
process.exit(1);
|
|
313
359
|
}
|
|
314
|
-
const
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
360
|
+
const limit = Math.max(1, parseInt(options.limit) || 20);
|
|
361
|
+
const recalled = service.decision.canonical
|
|
362
|
+
? await service.search(query, { limit })
|
|
363
|
+
: null;
|
|
364
|
+
const results = service.decision.canonical
|
|
365
|
+
? recalled.entries
|
|
366
|
+
: searchMemory(ctx.db.getDatabase(), query, { limit });
|
|
318
367
|
|
|
319
368
|
if (options.json) {
|
|
320
369
|
console.log(JSON.stringify(results, null, 2));
|
|
@@ -351,14 +400,28 @@ export function registerMemoryCommand(program) {
|
|
|
351
400
|
.action(async (id) => {
|
|
352
401
|
try {
|
|
353
402
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
354
|
-
|
|
403
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
404
|
+
if (!ctx.db && !service.decision.canonical) {
|
|
355
405
|
logger.error("Database not available");
|
|
356
406
|
process.exit(1);
|
|
357
407
|
}
|
|
358
|
-
const
|
|
359
|
-
|
|
408
|
+
const deletion = service.decision.canonical
|
|
409
|
+
? await service.delete(id)
|
|
410
|
+
: null;
|
|
411
|
+
const ok = service.decision.canonical
|
|
412
|
+
? deletion?.status === "purged"
|
|
413
|
+
: deleteMemory(ctx.db.getDatabase(), id);
|
|
360
414
|
if (ok) {
|
|
361
|
-
logger.success(
|
|
415
|
+
logger.success(
|
|
416
|
+
service.decision.canonical
|
|
417
|
+
? `Memory entry deleted (${deletion.digest})`
|
|
418
|
+
: "Memory entry deleted",
|
|
419
|
+
);
|
|
420
|
+
} else if (deletion) {
|
|
421
|
+
logger.warn(
|
|
422
|
+
`Memory deletion is ${deletion.status}; reconcile request ${deletion.requestId} before treating it as globally purged`,
|
|
423
|
+
);
|
|
424
|
+
process.exitCode = 2;
|
|
362
425
|
} else {
|
|
363
426
|
logger.error(`Memory entry not found: ${id}`);
|
|
364
427
|
}
|
|
@@ -370,6 +433,35 @@ export function registerMemoryCommand(program) {
|
|
|
370
433
|
}
|
|
371
434
|
});
|
|
372
435
|
|
|
436
|
+
memory
|
|
437
|
+
.command("reconcile")
|
|
438
|
+
.description("Resume a pending canonical memory deletion")
|
|
439
|
+
.argument("<operation-id>", "Deletion request ID")
|
|
440
|
+
.option("--json", "Output the reconciliation receipt as JSON")
|
|
441
|
+
.action(async (operationId, options) => {
|
|
442
|
+
try {
|
|
443
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
444
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
445
|
+
if (!service.decision.canonical) {
|
|
446
|
+
throw new Error("memory reconcile requires canonical Context/Memory");
|
|
447
|
+
}
|
|
448
|
+
const result = await service.reconcile(operationId);
|
|
449
|
+
if (options.json) console.log(JSON.stringify(result, null, 2));
|
|
450
|
+
else if (result.status === "purged") {
|
|
451
|
+
logger.success(`Memory deletion reconciled: ${result.digest}`);
|
|
452
|
+
} else {
|
|
453
|
+
logger.warn(
|
|
454
|
+
`Memory deletion remains ${result.status}: ${result.reason || operationId}`,
|
|
455
|
+
);
|
|
456
|
+
process.exitCode = 2;
|
|
457
|
+
}
|
|
458
|
+
await shutdown();
|
|
459
|
+
} catch (err) {
|
|
460
|
+
logger.error(`Failed: ${err.message}`);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
|
|
373
465
|
// memory daily
|
|
374
466
|
memory
|
|
375
467
|
.command("daily")
|
|
@@ -382,6 +474,7 @@ export function registerMemoryCommand(program) {
|
|
|
382
474
|
try {
|
|
383
475
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
384
476
|
const memoryDir = getMemoryDir(ctx.env.dataDir);
|
|
477
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
385
478
|
|
|
386
479
|
if (options.list) {
|
|
387
480
|
const notes = listDailyNotes(memoryDir);
|
|
@@ -402,8 +495,21 @@ export function registerMemoryCommand(program) {
|
|
|
402
495
|
}
|
|
403
496
|
|
|
404
497
|
if (options.append) {
|
|
405
|
-
const
|
|
406
|
-
|
|
498
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
499
|
+
if (service.decision.canonical) {
|
|
500
|
+
await service.addScoped(options.append, {
|
|
501
|
+
scope: "user",
|
|
502
|
+
scopeId: "local-user",
|
|
503
|
+
category: "daily-note",
|
|
504
|
+
tags: ["daily-note", `date:${today}`],
|
|
505
|
+
source: "cli-memory-daily",
|
|
506
|
+
evidenceStore: "cli-command",
|
|
507
|
+
evidenceId: `daily-${today}`,
|
|
508
|
+
});
|
|
509
|
+
} else {
|
|
510
|
+
appendDailyNote(memoryDir, options.append);
|
|
511
|
+
}
|
|
512
|
+
logger.success(`Added to daily note: ${chalk.cyan(today)}`);
|
|
407
513
|
await shutdown();
|
|
408
514
|
return;
|
|
409
515
|
}
|
|
@@ -443,23 +549,23 @@ export function registerMemoryCommand(program) {
|
|
|
443
549
|
.option("--json", "Output as JSON")
|
|
444
550
|
.action(async (query, options) => {
|
|
445
551
|
try {
|
|
446
|
-
const {
|
|
447
|
-
await import("../lib/session-core-singletons.js");
|
|
448
|
-
const store = getMemoryStore();
|
|
552
|
+
const { service, legacyStore } = await resolveScopedMemory();
|
|
449
553
|
const tags = options.tags
|
|
450
554
|
? options.tags
|
|
451
555
|
.split(",")
|
|
452
556
|
.map((t) => t.trim())
|
|
453
557
|
.filter(Boolean)
|
|
454
558
|
: null;
|
|
455
|
-
const
|
|
456
|
-
query: query || "",
|
|
559
|
+
const recallOptions = {
|
|
457
560
|
scope: options.scope,
|
|
458
561
|
scopeId: options.scopeId,
|
|
459
562
|
category: options.category,
|
|
460
563
|
tags,
|
|
461
564
|
limit: Math.max(1, parseInt(options.limit) || 10),
|
|
462
|
-
}
|
|
565
|
+
};
|
|
566
|
+
const results = service.decision.canonical
|
|
567
|
+
? (await service.recallScoped(query || "", recallOptions)).results
|
|
568
|
+
: legacyStore.recall({ query: query || "", ...recallOptions });
|
|
463
569
|
|
|
464
570
|
if (options.json) {
|
|
465
571
|
console.log(JSON.stringify(results, null, 2));
|
|
@@ -494,22 +600,28 @@ export function registerMemoryCommand(program) {
|
|
|
494
600
|
.option("--json", "Output as JSON")
|
|
495
601
|
.action(async (content, options) => {
|
|
496
602
|
try {
|
|
497
|
-
const {
|
|
498
|
-
await import("../lib/session-core-singletons.js");
|
|
499
|
-
const store = getMemoryStore();
|
|
603
|
+
const { service, legacyStore } = await resolveScopedMemory();
|
|
500
604
|
const tags = options.tags
|
|
501
605
|
? options.tags
|
|
502
606
|
.split(",")
|
|
503
607
|
.map((t) => t.trim())
|
|
504
608
|
.filter(Boolean)
|
|
505
609
|
: [];
|
|
506
|
-
const
|
|
610
|
+
const proposal = {
|
|
507
611
|
scope: options.scope,
|
|
508
612
|
scopeId: options.scopeId || null,
|
|
509
613
|
category: options.category,
|
|
510
|
-
content,
|
|
511
614
|
tags,
|
|
512
|
-
}
|
|
615
|
+
};
|
|
616
|
+
let m;
|
|
617
|
+
if (service.decision.canonical) {
|
|
618
|
+
m = await service.addScoped(content, proposal);
|
|
619
|
+
} else {
|
|
620
|
+
if (service.decision.shadow) {
|
|
621
|
+
service.validateLegacyScopedProposal(content, proposal);
|
|
622
|
+
}
|
|
623
|
+
m = legacyStore.add({ content, ...proposal });
|
|
624
|
+
}
|
|
513
625
|
if (options.json) console.log(JSON.stringify(m, null, 2));
|
|
514
626
|
else
|
|
515
627
|
logger.success(
|
|
@@ -576,11 +688,58 @@ export function registerMemoryCommand(program) {
|
|
|
576
688
|
return;
|
|
577
689
|
}
|
|
578
690
|
|
|
579
|
-
const
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
691
|
+
const { service } = await resolveScopedMemory();
|
|
692
|
+
let result;
|
|
693
|
+
if (service.decision.canonical) {
|
|
694
|
+
const { readEvents } =
|
|
695
|
+
await import("../harness/jsonl-session-store.js");
|
|
696
|
+
const { defaultMemoryExtractor } =
|
|
697
|
+
await import("@chainlesschain/session-core");
|
|
698
|
+
const events = readEvents(options.session);
|
|
699
|
+
const trace = buildTraceStoreFromJsonl(options.session, events);
|
|
700
|
+
const traceEvents = trace.query(options.session, {
|
|
701
|
+
limit: Number.MAX_SAFE_INTEGER,
|
|
702
|
+
});
|
|
703
|
+
const facts = defaultMemoryExtractor(traceEvents);
|
|
704
|
+
const scope = options.scope || "agent";
|
|
705
|
+
const scopeId =
|
|
706
|
+
scope === "global"
|
|
707
|
+
? null
|
|
708
|
+
: options.scopeId ||
|
|
709
|
+
(scope === "session"
|
|
710
|
+
? options.session
|
|
711
|
+
: options.agentId || options.session);
|
|
712
|
+
const written = [];
|
|
713
|
+
for (const [index, fact] of facts.entries()) {
|
|
714
|
+
written.push(
|
|
715
|
+
await service.addScoped(String(fact.content || ""), {
|
|
716
|
+
scope,
|
|
717
|
+
scopeId,
|
|
718
|
+
category: fact.category || "general",
|
|
719
|
+
tags: fact.tags || [],
|
|
720
|
+
score: fact.score,
|
|
721
|
+
source: "cli-session-consolidator",
|
|
722
|
+
evidenceStore: "cli-jsonl-session",
|
|
723
|
+
evidenceId: `${options.session}-${index}`,
|
|
724
|
+
}),
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
result = {
|
|
728
|
+
sessionId: options.session,
|
|
729
|
+
scope,
|
|
730
|
+
scopeId,
|
|
731
|
+
eventCount: traceEvents.length,
|
|
732
|
+
factCount: facts.length,
|
|
733
|
+
writtenCount: written.length,
|
|
734
|
+
written,
|
|
735
|
+
};
|
|
736
|
+
} else {
|
|
737
|
+
result = await consolidateJsonlSession(options.session, {
|
|
738
|
+
scope: options.scope,
|
|
739
|
+
scopeId: options.scopeId || null,
|
|
740
|
+
agentId: options.agentId || null,
|
|
741
|
+
});
|
|
742
|
+
}
|
|
584
743
|
await new Promise((r) => setImmediate(r)); // let adapter flush
|
|
585
744
|
|
|
586
745
|
if (options.json) {
|
|
@@ -613,8 +772,16 @@ export function registerMemoryCommand(program) {
|
|
|
613
772
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
614
773
|
const memoryDir = getMemoryDir(ctx.env.dataDir);
|
|
615
774
|
const content = getMemoryFile(memoryDir);
|
|
775
|
+
const service = await resolveCanonicalMemory(ctx);
|
|
616
776
|
|
|
617
777
|
if (options.edit) {
|
|
778
|
+
if (service.decision.canonical) {
|
|
779
|
+
const error = new Error(
|
|
780
|
+
"MEMORY.md is a read-only legacy projection after canonical cutover; use 'cc memory add' instead",
|
|
781
|
+
);
|
|
782
|
+
error.code = "legacy_writer_fenced";
|
|
783
|
+
throw error;
|
|
784
|
+
}
|
|
618
785
|
const editor =
|
|
619
786
|
process.env.EDITOR ||
|
|
620
787
|
process.env.VISUAL ||
|
package/src/commands/promcomp.js
CHANGED
|
@@ -31,12 +31,29 @@ import {
|
|
|
31
31
|
autoFailStuckPcompRunsV2,
|
|
32
32
|
getPromptCompressorGovStatsV2,
|
|
33
33
|
} from "../lib/prompt-compressor.js";
|
|
34
|
+
import {
|
|
35
|
+
assertLegacyMutationAllowed,
|
|
36
|
+
resolveCliContextMemoryCutover,
|
|
37
|
+
} from "../lib/context-memory-kernel/authority.js";
|
|
34
38
|
|
|
35
39
|
export function registerPromcompCommand(program) {
|
|
36
40
|
const pc = program
|
|
37
41
|
.command("promcomp")
|
|
38
42
|
.description("Prompt Compressor V2 governance (in-memory, CLI v0.143.0)");
|
|
39
43
|
|
|
44
|
+
pc.hook("preAction", (_thisCommand, actionCommand) => {
|
|
45
|
+
const decision = resolveCliContextMemoryCutover({
|
|
46
|
+
scopeKey: `cli:promcomp:${actionCommand.name()}`,
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
assertLegacyMutationAllowed(decision);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
error.message += "; use `cc context` or `cc compact`";
|
|
52
|
+
error.replacement = "cc compact";
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
40
57
|
pc.command("enums-v2")
|
|
41
58
|
.description("Show V2 enums")
|
|
42
59
|
.action(() =>
|
package/src/commands/serve.js
CHANGED
|
@@ -8,7 +8,7 @@ import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
|
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
|
|
10
10
|
export function registerServeCommand(program) {
|
|
11
|
-
program
|
|
11
|
+
const serve = program
|
|
12
12
|
.command("serve")
|
|
13
13
|
.description("Start WebSocket server for remote CLI access")
|
|
14
14
|
.option(
|
|
@@ -21,7 +21,15 @@ export function registerServeCommand(program) {
|
|
|
21
21
|
)
|
|
22
22
|
.option(
|
|
23
23
|
"--app-server-state-dir <path>",
|
|
24
|
-
"Owner-controlled rollout directory
|
|
24
|
+
"Owner-controlled rollout directory (JSONL directory or SQLite parent)",
|
|
25
|
+
)
|
|
26
|
+
.option(
|
|
27
|
+
"--app-server-state-path <path>",
|
|
28
|
+
"Exact JSONL directory or SQLite database path for --app-server",
|
|
29
|
+
)
|
|
30
|
+
.option(
|
|
31
|
+
"--app-server-store <backend>",
|
|
32
|
+
"Physical rollout adapter: jsonl or sqlite (default: jsonl)",
|
|
25
33
|
)
|
|
26
34
|
.option(
|
|
27
35
|
"--app-server-queue-cap <n>",
|
|
@@ -74,20 +82,32 @@ export function registerServeCommand(program) {
|
|
|
74
82
|
if (opts.appServerWebsocket && !opts.appServer) {
|
|
75
83
|
throw new Error("--app-server-websocket requires --app-server");
|
|
76
84
|
}
|
|
85
|
+
if (opts.appServerStateDir && opts.appServerStatePath) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
"--app-server-state-dir and --app-server-state-path are mutually exclusive",
|
|
88
|
+
);
|
|
89
|
+
}
|
|
77
90
|
if (opts.appServer) {
|
|
78
91
|
const [
|
|
79
92
|
{ runStdioAppServer },
|
|
80
|
-
{
|
|
93
|
+
{ closeRolloutStore, createRolloutStore },
|
|
81
94
|
{ CliAgentKernelAdapter },
|
|
82
95
|
] = await Promise.all([
|
|
83
96
|
import("../lib/app-server/stdio-transport.js"),
|
|
84
|
-
import("../lib/app-server/rollout-store.js"),
|
|
97
|
+
import("../lib/app-server/rollout-store-factory.js"),
|
|
85
98
|
import("../lib/app-server/cli-agent-kernel-adapter.js"),
|
|
86
99
|
]);
|
|
87
100
|
const stateDirectory = opts.appServerStateDir
|
|
88
101
|
? path.resolve(opts.appServerStateDir)
|
|
89
102
|
: undefined;
|
|
90
|
-
const
|
|
103
|
+
const statePath = opts.appServerStatePath
|
|
104
|
+
? path.resolve(opts.appServerStatePath)
|
|
105
|
+
: undefined;
|
|
106
|
+
const store = createRolloutStore({
|
|
107
|
+
backend: opts.appServerStore,
|
|
108
|
+
directory: stateDirectory,
|
|
109
|
+
location: statePath,
|
|
110
|
+
});
|
|
91
111
|
const cwd = opts.project ? path.resolve(opts.project) : process.cwd();
|
|
92
112
|
const maxQueuedRequests = Math.max(
|
|
93
113
|
1,
|
|
@@ -127,14 +147,19 @@ export function registerServeCommand(program) {
|
|
|
127
147
|
process.off("SIGTERM", shutdown);
|
|
128
148
|
host.off("error", fail);
|
|
129
149
|
await host.close();
|
|
150
|
+
closeRolloutStore(store);
|
|
130
151
|
}
|
|
131
152
|
return;
|
|
132
153
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
154
|
+
try {
|
|
155
|
+
await runStdioAppServer({
|
|
156
|
+
store,
|
|
157
|
+
kernel: new CliAgentKernelAdapter({ cwd }),
|
|
158
|
+
maxQueuedRequests,
|
|
159
|
+
});
|
|
160
|
+
} finally {
|
|
161
|
+
closeRolloutStore(store);
|
|
162
|
+
}
|
|
138
163
|
return;
|
|
139
164
|
}
|
|
140
165
|
const runtime = createAgentRuntimeFactory().createServerRuntime({
|
|
@@ -156,4 +181,63 @@ export function registerServeCommand(program) {
|
|
|
156
181
|
process.exit(1);
|
|
157
182
|
}
|
|
158
183
|
});
|
|
184
|
+
|
|
185
|
+
serve
|
|
186
|
+
.command("migrate-rollouts")
|
|
187
|
+
.description(
|
|
188
|
+
"Verify or copy canonical rollouts between physical storage adapters",
|
|
189
|
+
)
|
|
190
|
+
.requiredOption("--from <backend>", "Source adapter: jsonl or sqlite")
|
|
191
|
+
.requiredOption(
|
|
192
|
+
"--from-path <path>",
|
|
193
|
+
"Source JSONL directory or SQLite database file",
|
|
194
|
+
)
|
|
195
|
+
.requiredOption("--to <backend>", "Target adapter: jsonl or sqlite")
|
|
196
|
+
.requiredOption(
|
|
197
|
+
"--to-path <path>",
|
|
198
|
+
"Target JSONL directory or SQLite database file",
|
|
199
|
+
)
|
|
200
|
+
.option(
|
|
201
|
+
"--thread <id...>",
|
|
202
|
+
"Migrate only the named thread ids (otherwise enumerate the source)",
|
|
203
|
+
)
|
|
204
|
+
.option(
|
|
205
|
+
"--apply",
|
|
206
|
+
"Copy verified records; without this flag the command is a dry run",
|
|
207
|
+
)
|
|
208
|
+
.action(async (opts) => {
|
|
209
|
+
const { closeRolloutStore, createRolloutStore } =
|
|
210
|
+
await import("../lib/app-server/rollout-store-factory.js");
|
|
211
|
+
let source;
|
|
212
|
+
let target;
|
|
213
|
+
try {
|
|
214
|
+
source = createRolloutStore({
|
|
215
|
+
backend: opts.from,
|
|
216
|
+
location: path.resolve(opts.fromPath),
|
|
217
|
+
});
|
|
218
|
+
target = createRolloutStore({
|
|
219
|
+
backend: opts.to,
|
|
220
|
+
location: path.resolve(opts.toPath),
|
|
221
|
+
});
|
|
222
|
+
const result = source.migrate({
|
|
223
|
+
targetStore: target,
|
|
224
|
+
threadIds: opts.thread || null,
|
|
225
|
+
dryRun: opts.apply !== true,
|
|
226
|
+
});
|
|
227
|
+
process.stdout.write(
|
|
228
|
+
`${JSON.stringify(
|
|
229
|
+
{
|
|
230
|
+
...result,
|
|
231
|
+
source: { backend: source.backend, location: source.location },
|
|
232
|
+
target: { backend: target.backend, location: target.location },
|
|
233
|
+
},
|
|
234
|
+
null,
|
|
235
|
+
2,
|
|
236
|
+
)}\n`,
|
|
237
|
+
);
|
|
238
|
+
} finally {
|
|
239
|
+
closeRolloutStore(target);
|
|
240
|
+
closeRolloutStore(source);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
159
243
|
}
|
package/src/commands/session.js
CHANGED
|
@@ -1463,9 +1463,8 @@ export function registerSessionCommand(program) {
|
|
|
1463
1463
|
await import("../lib/session-core-singletons.js");
|
|
1464
1464
|
const gate = await getApprovalGate();
|
|
1465
1465
|
if (options.set) {
|
|
1466
|
-
gate.setSessionPolicy(id, options.set);
|
|
1467
|
-
|
|
1468
|
-
await new Promise((r) => setImmediate(r));
|
|
1466
|
+
await gate.setSessionPolicy(id, options.set);
|
|
1467
|
+
await gate.awaitPersistence?.();
|
|
1469
1468
|
logger.success(
|
|
1470
1469
|
`Session ${chalk.gray(id.slice(0, 12))} policy → ${chalk.cyan(options.set)}`,
|
|
1471
1470
|
);
|
package/src/commands/team.js
CHANGED
|
@@ -3283,6 +3283,13 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
3283
3283
|
tasksByGovernanceKey.get(governanceKey)?.push(task);
|
|
3284
3284
|
}
|
|
3285
3285
|
for (const [key, tasks] of tasksByGovernanceKey) {
|
|
3286
|
+
// A unit settled by afterTask is immutable. Graph cancellation can
|
|
3287
|
+
// subsequently project the registry task as cancelled; do not mask
|
|
3288
|
+
// the original terminal outcome with a forbidden second settlement.
|
|
3289
|
+
const currentStatus = collaborationUnits.get(key)?.status;
|
|
3290
|
+
if (["completed", "failed", "cancelled"].includes(currentStatus)) {
|
|
3291
|
+
continue;
|
|
3292
|
+
}
|
|
3286
3293
|
const states = tasks.map((task) =>
|
|
3287
3294
|
String(task.status || "").toLowerCase(),
|
|
3288
3295
|
);
|
|
@@ -3295,7 +3302,6 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
3295
3302
|
)
|
|
3296
3303
|
? "cancelled"
|
|
3297
3304
|
: "failed";
|
|
3298
|
-
if (collaborationUnits.get(key)?.status === status) continue;
|
|
3299
3305
|
settleGovernance(key, status, {
|
|
3300
3306
|
endedAt: Date.now(),
|
|
3301
3307
|
});
|