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
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import {
|
|
2
|
+
canonicalDigest,
|
|
3
|
+
canonicalJson,
|
|
4
|
+
normalizeContextItem,
|
|
5
|
+
} from "@chainlesschain/context-memory-kernel";
|
|
6
|
+
import { getContextWindow } from "../model-context-window.js";
|
|
7
|
+
import { createCliContextMemoryRuntime } from "./runtime.js";
|
|
8
|
+
import {
|
|
9
|
+
contextItemsToMessages,
|
|
10
|
+
memoryRecordsToContextItems,
|
|
11
|
+
messagesToContextItems,
|
|
12
|
+
} from "./message-adapter.js";
|
|
13
|
+
|
|
14
|
+
function defaultAdmissions(sessionId, options) {
|
|
15
|
+
const candidates = [
|
|
16
|
+
{ scope: "session", scopeId: sessionId },
|
|
17
|
+
{ scope: "agent", scopeId: options.agentId || sessionId },
|
|
18
|
+
{ scope: "user", scopeId: options.userId || "local-user" },
|
|
19
|
+
];
|
|
20
|
+
const configured = options.contextMemoryScopeAdmissions;
|
|
21
|
+
const admissions = Array.isArray(configured) && configured.length > 0
|
|
22
|
+
? configured
|
|
23
|
+
: candidates;
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
return admissions.filter((entry) => {
|
|
26
|
+
const key = `${entry.scope}\0${entry.scopeId || ""}`;
|
|
27
|
+
if (seen.has(key)) return false;
|
|
28
|
+
seen.add(key);
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function toolDefinitionsToContextItems(definitionsInput, { sessionId, sink }) {
|
|
34
|
+
const definitions = Array.isArray(definitionsInput) ? definitionsInput : [];
|
|
35
|
+
return definitions.map((definition, index) => {
|
|
36
|
+
const content = canonicalJson(definition);
|
|
37
|
+
const name = String(
|
|
38
|
+
definition?.function?.name || definition?.name || `tool-${index}`,
|
|
39
|
+
);
|
|
40
|
+
const sourceDigest = canonicalDigest(
|
|
41
|
+
definition,
|
|
42
|
+
"chainlesschain.cli-tool-schema/v1",
|
|
43
|
+
);
|
|
44
|
+
return normalizeContextItem({
|
|
45
|
+
schemaVersion: 1,
|
|
46
|
+
itemId: `cli-tool-${sourceDigest.slice(7, 39)}`,
|
|
47
|
+
kind: "tool-schema",
|
|
48
|
+
scope: "session",
|
|
49
|
+
scopeId: sessionId,
|
|
50
|
+
sourceRef: {
|
|
51
|
+
store: "cli-tool-registry",
|
|
52
|
+
id: name,
|
|
53
|
+
digest: sourceDigest,
|
|
54
|
+
},
|
|
55
|
+
provenance: {
|
|
56
|
+
source: "cli-tool-registry",
|
|
57
|
+
observedAt: "1970-01-01T00:00:00.000Z",
|
|
58
|
+
},
|
|
59
|
+
trust: "host",
|
|
60
|
+
sensitivity: "internal",
|
|
61
|
+
allowedSinks: [sink],
|
|
62
|
+
tokenEstimate: Math.max(
|
|
63
|
+
1,
|
|
64
|
+
Math.ceil(Buffer.byteLength(content, "utf8") / 4),
|
|
65
|
+
),
|
|
66
|
+
priority: Math.max(500_000, 600_000 - index),
|
|
67
|
+
pinned: false,
|
|
68
|
+
createdAt: "1970-01-01T00:00:00.000Z",
|
|
69
|
+
content,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Bind every paid provider request to one canonical plan and memory revision.
|
|
76
|
+
* The returned messages are ephemeral; the authoritative transcript remains
|
|
77
|
+
* the JSONL/session port and recalled memories remain independently deletable.
|
|
78
|
+
*/
|
|
79
|
+
export async function prepareCanonicalProviderContext(
|
|
80
|
+
messagesInput,
|
|
81
|
+
options = {},
|
|
82
|
+
) {
|
|
83
|
+
const messages = Array.isArray(messagesInput) ? messagesInput : [];
|
|
84
|
+
const sessionId = String(options.sessionId || "ephemeral-cli-session");
|
|
85
|
+
const runtime = createCliContextMemoryRuntime({
|
|
86
|
+
env: options.contextMemoryEnv || process.env,
|
|
87
|
+
sessionId,
|
|
88
|
+
scopeKey: `cli:provider:${sessionId}`,
|
|
89
|
+
...(options.contextMemoryFilePath
|
|
90
|
+
? { memoryFilePath: options.contextMemoryFilePath }
|
|
91
|
+
: {}),
|
|
92
|
+
});
|
|
93
|
+
if (!runtime.decision.canonical || options.contextMemorySkipPlanning === true) {
|
|
94
|
+
return { messages, plan: null, recall: null, decision: runtime.decision };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const provider = String(options.provider || "local");
|
|
98
|
+
const sink = String(options.contextMemorySink || `provider.${provider}`);
|
|
99
|
+
const scopeAdmissions = defaultAdmissions(sessionId, options);
|
|
100
|
+
const lastUser = [...messages]
|
|
101
|
+
.reverse()
|
|
102
|
+
.find((message) => message?.role === "user");
|
|
103
|
+
const query =
|
|
104
|
+
typeof lastUser?.content === "string" && lastUser.content.trim()
|
|
105
|
+
? lastUser.content.trim().slice(0, 32 * 1024)
|
|
106
|
+
: "*";
|
|
107
|
+
const recall = await runtime.kernel.recallMemory({
|
|
108
|
+
query,
|
|
109
|
+
sink,
|
|
110
|
+
scopeAdmissions,
|
|
111
|
+
limit: Math.max(1, Math.min(32, Number(options.contextMemoryRecallLimit) || 12)),
|
|
112
|
+
tokenBudget: Math.max(
|
|
113
|
+
1,
|
|
114
|
+
Math.min(32_768, Number(options.contextMemoryRecallTokens) || 4096),
|
|
115
|
+
),
|
|
116
|
+
});
|
|
117
|
+
const messageItems = messagesToContextItems(messages, {
|
|
118
|
+
sessionId,
|
|
119
|
+
allowedSinks: [sink],
|
|
120
|
+
trustCurrentSystemPolicy: true,
|
|
121
|
+
trustedSystemIndexes: options.contextMemoryTrustedSystemIndexes,
|
|
122
|
+
});
|
|
123
|
+
const memoryItems = memoryRecordsToContextItems(
|
|
124
|
+
recall.results.map((entry) => entry.record),
|
|
125
|
+
{ insertionSequence: Math.max(0, messages.length - 1) },
|
|
126
|
+
);
|
|
127
|
+
const toolItems = toolDefinitionsToContextItems(
|
|
128
|
+
options.contextMemoryToolDefinitions,
|
|
129
|
+
{ sessionId, sink },
|
|
130
|
+
);
|
|
131
|
+
const items = [...messageItems, ...memoryItems, ...toolItems];
|
|
132
|
+
const modelWindowTokens = Math.max(
|
|
133
|
+
1024,
|
|
134
|
+
Number(options.contextMemoryModelWindowTokens) ||
|
|
135
|
+
getContextWindow(options.model, provider) ||
|
|
136
|
+
128 * 1024,
|
|
137
|
+
);
|
|
138
|
+
const reservedOutputTokens = Math.min(
|
|
139
|
+
modelWindowTokens - 1,
|
|
140
|
+
Math.max(256, Number(options.maxOutputTokens) || 4096),
|
|
141
|
+
);
|
|
142
|
+
const safetyMarginTokens = Math.min(
|
|
143
|
+
modelWindowTokens - reservedOutputTokens - 1,
|
|
144
|
+
Math.max(64, Math.floor(modelWindowTokens * 0.05)),
|
|
145
|
+
);
|
|
146
|
+
const inputBudget =
|
|
147
|
+
modelWindowTokens - reservedOutputTokens - safetyMarginTokens;
|
|
148
|
+
const recoveryReserveTokens = Math.min(
|
|
149
|
+
Math.max(32, Math.floor(inputBudget * 0.05)),
|
|
150
|
+
Math.max(0, inputBudget - 1),
|
|
151
|
+
);
|
|
152
|
+
const sessionHead =
|
|
153
|
+
options.contextMemorySessionHead ||
|
|
154
|
+
canonicalDigest(
|
|
155
|
+
messageItems.map((item) => item.digest),
|
|
156
|
+
"chainlesschain.cli-provider-context-head/v1",
|
|
157
|
+
);
|
|
158
|
+
const plan = await runtime.kernel.planContext({
|
|
159
|
+
modelWindowTokens,
|
|
160
|
+
reservedOutputTokens,
|
|
161
|
+
safetyMarginTokens,
|
|
162
|
+
recoveryReserveTokens,
|
|
163
|
+
items,
|
|
164
|
+
sink,
|
|
165
|
+
scopeAdmissions,
|
|
166
|
+
partitionCeilings: {
|
|
167
|
+
"trusted-system": inputBudget,
|
|
168
|
+
"working-state": inputBudget,
|
|
169
|
+
"tools-and-skills": inputBudget,
|
|
170
|
+
conversation: inputBudget,
|
|
171
|
+
"tool-evidence": inputBudget,
|
|
172
|
+
"memory-and-rules": Math.max(1, Math.floor(inputBudget * 0.12)),
|
|
173
|
+
},
|
|
174
|
+
policyVersion: String(options.contextMemoryPolicyVersion || "cli-provider-v1"),
|
|
175
|
+
modelProfile: `${provider}:${String(options.model || "default")}`.slice(0, 256),
|
|
176
|
+
sessionHead,
|
|
177
|
+
memoryRevision: recall.memoryRevision,
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
messages: contextItemsToMessages(
|
|
181
|
+
plan.selected.filter((item) => item.kind !== "tool-schema"),
|
|
182
|
+
),
|
|
183
|
+
selectedToolNames: toolItems
|
|
184
|
+
.filter((item) => plan.selectedItemIds.includes(item.itemId))
|
|
185
|
+
.map((item) => item.sourceRef.id),
|
|
186
|
+
plan,
|
|
187
|
+
recall,
|
|
188
|
+
decision: runtime.decision,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export { defaultAdmissions, toolDefinitionsToContextItems };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ContextMemoryKernel } from "@chainlesschain/context-memory-kernel";
|
|
2
|
+
import { DurableJsonMemoryPort } from "./durable-memory-port.js";
|
|
3
|
+
import { JsonlSessionContextPort } from "./jsonl-session-context-port.js";
|
|
4
|
+
import { CliLegacyMemoryPrivacyPurgePort } from "./privacy-purge-port.js";
|
|
5
|
+
import {
|
|
6
|
+
createCliAuthority,
|
|
7
|
+
resolveCliContextMemoryCutover,
|
|
8
|
+
} from "./authority.js";
|
|
9
|
+
|
|
10
|
+
export function createCliContextMemoryRuntime(options = {}) {
|
|
11
|
+
const scopeKey = options.scopeKey ||
|
|
12
|
+
(options.sessionId ? `cli:session:${options.sessionId}` : "cli:memory");
|
|
13
|
+
const decision = resolveCliContextMemoryCutover({
|
|
14
|
+
env: options.env,
|
|
15
|
+
scopeKey,
|
|
16
|
+
});
|
|
17
|
+
const authority = createCliAuthority({
|
|
18
|
+
decision,
|
|
19
|
+
now: options.clock || Date.now,
|
|
20
|
+
});
|
|
21
|
+
const memoryPort =
|
|
22
|
+
options.memoryPort ||
|
|
23
|
+
new DurableJsonMemoryPort({
|
|
24
|
+
...(options.memoryFilePath ? { filePath: options.memoryFilePath } : {}),
|
|
25
|
+
});
|
|
26
|
+
const sessionPort =
|
|
27
|
+
options.sessionPort ||
|
|
28
|
+
(options.sessionId
|
|
29
|
+
? new JsonlSessionContextPort({
|
|
30
|
+
sessionId: options.sessionId,
|
|
31
|
+
allowedSinks: options.allowedSinks || ["*"],
|
|
32
|
+
})
|
|
33
|
+
: null);
|
|
34
|
+
const purgePorts = options.purgePorts || [
|
|
35
|
+
new CliLegacyMemoryPrivacyPurgePort({
|
|
36
|
+
...(options.legacyMemoryStorePath
|
|
37
|
+
? { memoryStorePath: options.legacyMemoryStorePath }
|
|
38
|
+
: {}),
|
|
39
|
+
...(options.legacyDb ? { legacyDb: options.legacyDb } : {}),
|
|
40
|
+
}),
|
|
41
|
+
];
|
|
42
|
+
const kernel = new ContextMemoryKernel({
|
|
43
|
+
sessionPort,
|
|
44
|
+
memoryPort,
|
|
45
|
+
reconciliationPort: memoryPort,
|
|
46
|
+
authorityRegistry: authority.registry,
|
|
47
|
+
writer: authority.writer,
|
|
48
|
+
mode: decision.canonical ? "canonical" : "shadow",
|
|
49
|
+
clock: options.clock || Date.now,
|
|
50
|
+
...(options.randomUUID ? { randomUUID: options.randomUUID } : {}),
|
|
51
|
+
purgePorts,
|
|
52
|
+
});
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
decision,
|
|
55
|
+
kernel,
|
|
56
|
+
memoryPort,
|
|
57
|
+
sessionPort,
|
|
58
|
+
authorityRegistry: authority.registry,
|
|
59
|
+
writer: authority.writer,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
@@ -36,9 +36,16 @@ async function persistUsageEvent(persist, type, event) {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
function unknownUsageEvent({
|
|
39
|
+
function unknownUsageEvent({
|
|
40
|
+
callId,
|
|
41
|
+
provider,
|
|
42
|
+
model,
|
|
43
|
+
source,
|
|
44
|
+
operationId,
|
|
45
|
+
code,
|
|
46
|
+
}) {
|
|
40
47
|
return projectRuntimeUsageBoundary(
|
|
41
|
-
{ callId, provider, model, source, code },
|
|
48
|
+
{ callId, provider, model, source, operationId, code },
|
|
42
49
|
"unknown",
|
|
43
50
|
);
|
|
44
51
|
}
|
|
@@ -54,6 +61,7 @@ export async function runMeteredDirectModelCall({
|
|
|
54
61
|
provider,
|
|
55
62
|
model,
|
|
56
63
|
source = "model",
|
|
64
|
+
operationId = undefined,
|
|
57
65
|
sessionBudget = null,
|
|
58
66
|
call,
|
|
59
67
|
}) {
|
|
@@ -77,11 +85,14 @@ export async function runMeteredDirectModelCall({
|
|
|
77
85
|
await persistUsageEvent(
|
|
78
86
|
persist,
|
|
79
87
|
runtimeUsageEventType("started"),
|
|
80
|
-
projectRuntimeUsageBoundary(
|
|
88
|
+
projectRuntimeUsageBoundary(
|
|
89
|
+
{ callId, provider, model, source, operationId },
|
|
90
|
+
"started",
|
|
91
|
+
),
|
|
81
92
|
);
|
|
82
93
|
beginSessionBudgetUsage(
|
|
83
94
|
sessionBudget,
|
|
84
|
-
{ callId, provider, model, source },
|
|
95
|
+
{ callId, provider, model, source, operationId },
|
|
85
96
|
`direct model call ${source}`,
|
|
86
97
|
);
|
|
87
98
|
let result;
|
|
@@ -93,13 +104,10 @@ export async function runMeteredDirectModelCall({
|
|
|
93
104
|
provider,
|
|
94
105
|
model,
|
|
95
106
|
source,
|
|
107
|
+
operationId,
|
|
96
108
|
code: "provider_call_failed",
|
|
97
109
|
});
|
|
98
|
-
await persistUsageEvent(
|
|
99
|
-
persist,
|
|
100
|
-
runtimeUsageEventType("unknown"),
|
|
101
|
-
unknown,
|
|
102
|
-
);
|
|
110
|
+
await persistUsageEvent(persist, runtimeUsageEventType("unknown"), unknown);
|
|
103
111
|
markSessionBudgetUsageUnknown(sessionBudget, unknown);
|
|
104
112
|
throw error;
|
|
105
113
|
}
|
|
@@ -111,6 +119,7 @@ export async function runMeteredDirectModelCall({
|
|
|
111
119
|
provider,
|
|
112
120
|
model,
|
|
113
121
|
source,
|
|
122
|
+
operationId,
|
|
114
123
|
usage: result.usage,
|
|
115
124
|
});
|
|
116
125
|
} catch {
|
|
@@ -119,6 +128,7 @@ export async function runMeteredDirectModelCall({
|
|
|
119
128
|
provider,
|
|
120
129
|
model,
|
|
121
130
|
source,
|
|
131
|
+
operationId,
|
|
122
132
|
code: "provider_usage_missing",
|
|
123
133
|
});
|
|
124
134
|
await persistUsageEvent(
|
|
@@ -127,10 +137,7 @@ export async function runMeteredDirectModelCall({
|
|
|
127
137
|
unknown,
|
|
128
138
|
);
|
|
129
139
|
if (markSessionBudgetUsageUnknown(sessionBudget, unknown)) {
|
|
130
|
-
rejectSessionBudgetUsageUnknown(
|
|
131
|
-
unknown,
|
|
132
|
-
`direct model call ${source}`,
|
|
133
|
-
);
|
|
140
|
+
rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
|
|
134
141
|
}
|
|
135
142
|
return result;
|
|
136
143
|
}
|
|
@@ -146,13 +153,10 @@ export async function runMeteredDirectModelCall({
|
|
|
146
153
|
provider,
|
|
147
154
|
model,
|
|
148
155
|
source,
|
|
156
|
+
operationId,
|
|
149
157
|
code: "provider_usage_missing",
|
|
150
158
|
});
|
|
151
|
-
await persistUsageEvent(
|
|
152
|
-
persist,
|
|
153
|
-
runtimeUsageEventType("unknown"),
|
|
154
|
-
unknown,
|
|
155
|
-
);
|
|
159
|
+
await persistUsageEvent(persist, runtimeUsageEventType("unknown"), unknown);
|
|
156
160
|
if (markSessionBudgetUsageUnknown(sessionBudget, unknown)) {
|
|
157
161
|
rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
|
|
158
162
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
JsonlRolloutStore,
|
|
5
|
-
} from "../app-server/rollout-store.js";
|
|
2
|
+
import { defaultRolloutStoreDirectory } from "../app-server/rollout-store.js";
|
|
3
|
+
import { createRolloutStore } from "../app-server/rollout-store-factory.js";
|
|
6
4
|
import { GraphCutoverLedger } from "./cutover-ledger.js";
|
|
7
5
|
import {
|
|
8
6
|
graphRuntimeEntryManifestDigest,
|
|
@@ -230,7 +228,8 @@ export function createRuntimeGraphCutoverAuthorityResolver({
|
|
|
230
228
|
const resolvedLedger =
|
|
231
229
|
ledger ||
|
|
232
230
|
new GraphCutoverLedger({
|
|
233
|
-
store:
|
|
231
|
+
store: createRolloutStore({
|
|
232
|
+
backend: env.CHAINLESSCHAIN_ROLLOUT_STORE,
|
|
234
233
|
directory: path.resolve(
|
|
235
234
|
stateDirectory ||
|
|
236
235
|
env.CHAINLESSCHAIN_GRAPH_CUTOVER_STATE_DIR ||
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { createRolloutStore } from "../app-server/rollout-store-factory.js";
|
|
3
3
|
import { assertGraphCutoverTransition } from "./authority.js";
|
|
4
4
|
import { graphDigest } from "./compiler.js";
|
|
5
5
|
import {
|
|
@@ -478,7 +478,7 @@ function projection(state, events) {
|
|
|
478
478
|
}
|
|
479
479
|
|
|
480
480
|
export class GraphCutoverLedger {
|
|
481
|
-
constructor({ store =
|
|
481
|
+
constructor({ store = createRolloutStore(), now = Date.now } = {}) {
|
|
482
482
|
this.store = store;
|
|
483
483
|
this.now = now;
|
|
484
484
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
defaultRolloutStoreDirectory,
|
|
5
|
-
} from "../app-server/rollout-store.js";
|
|
2
|
+
import { defaultRolloutStoreDirectory } from "../app-server/rollout-store.js";
|
|
3
|
+
import { createRolloutStore } from "../app-server/rollout-store-factory.js";
|
|
6
4
|
|
|
7
5
|
export const GRAPH_EVENT_SCHEMA = "chainlesschain.graph-event/v1";
|
|
8
6
|
|
|
@@ -16,7 +14,7 @@ function clone(value) {
|
|
|
16
14
|
|
|
17
15
|
export class GraphEventStore {
|
|
18
16
|
constructor({
|
|
19
|
-
rolloutStore =
|
|
17
|
+
rolloutStore = createRolloutStore({
|
|
20
18
|
directory: defaultGraphEventStoreDirectory(),
|
|
21
19
|
}),
|
|
22
20
|
} = {}) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { createRolloutStore } from "../app-server/rollout-store-factory.js";
|
|
3
3
|
import { createGraphAuthorityBinding } from "./authority.js";
|
|
4
4
|
|
|
5
5
|
export const GRAPH_MIGRATION_SCHEMA =
|
|
@@ -84,7 +84,7 @@ function stateFromEvents(events, migrationId) {
|
|
|
84
84
|
* this API intentionally has no "fall back to legacy" operation.
|
|
85
85
|
*/
|
|
86
86
|
export class GraphAuthorityMigrationSaga {
|
|
87
|
-
constructor({ store =
|
|
87
|
+
constructor({ store = createRolloutStore(), now = Date.now } = {}) {
|
|
88
88
|
this.store = store;
|
|
89
89
|
this.now = now;
|
|
90
90
|
}
|
|
@@ -797,6 +797,7 @@ export function normalizeGraphProductionCutoverEvidence(
|
|
|
797
797
|
expectedRepository = undefined,
|
|
798
798
|
expectedEnvironment = undefined,
|
|
799
799
|
expectedWorkflowRunId = undefined,
|
|
800
|
+
expectedWorkflowRunAttempt = undefined,
|
|
800
801
|
} = {},
|
|
801
802
|
) {
|
|
802
803
|
if (input?.schema !== GRAPH_PRODUCTION_CUTOVER_EVIDENCE_SCHEMA) {
|
|
@@ -832,7 +833,9 @@ export function normalizeGraphProductionCutoverEvidence(
|
|
|
832
833
|
(expectedRepository && provenance.repository !== expectedRepository) ||
|
|
833
834
|
(expectedEnvironment && provenance.environment !== expectedEnvironment) ||
|
|
834
835
|
(expectedWorkflowRunId !== undefined &&
|
|
835
|
-
provenance.workflowRunId !== Number(expectedWorkflowRunId))
|
|
836
|
+
provenance.workflowRunId !== Number(expectedWorkflowRunId)) ||
|
|
837
|
+
(expectedWorkflowRunAttempt !== undefined &&
|
|
838
|
+
provenance.workflowRunAttempt !== Number(expectedWorkflowRunAttempt))
|
|
836
839
|
) {
|
|
837
840
|
throw evidenceError(
|
|
838
841
|
"CC_GRAPH_PRODUCTION_PROVENANCE_MISMATCH",
|
|
@@ -844,6 +847,10 @@ export function normalizeGraphProductionCutoverEvidence(
|
|
|
844
847
|
expectedWorkflowRunId === undefined
|
|
845
848
|
? undefined
|
|
846
849
|
: Number(expectedWorkflowRunId),
|
|
850
|
+
expectedWorkflowRunAttempt:
|
|
851
|
+
expectedWorkflowRunAttempt === undefined
|
|
852
|
+
? undefined
|
|
853
|
+
: Number(expectedWorkflowRunAttempt),
|
|
847
854
|
actual: provenance,
|
|
848
855
|
},
|
|
849
856
|
);
|
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { escapeLike } from "./sql-like.js";
|
|
9
|
+
import {
|
|
10
|
+
assertLegacyMutationAllowed,
|
|
11
|
+
resolveCliContextMemoryCutover,
|
|
12
|
+
} from "./context-memory-kernel/authority.js";
|
|
13
|
+
|
|
14
|
+
function assertLegacyHierarchicalMemoryMutationAllowed(operation) {
|
|
15
|
+
assertLegacyMutationAllowed(
|
|
16
|
+
resolveCliContextMemoryCutover({
|
|
17
|
+
scopeKey: `cli:legacy-hierarchical-memory:${operation}`,
|
|
18
|
+
}),
|
|
19
|
+
);
|
|
20
|
+
}
|
|
9
21
|
|
|
10
22
|
// ─── Configuration ───────────────────────────────────────────────
|
|
11
23
|
export const MEMORY_CONFIG = {
|
|
@@ -123,6 +135,7 @@ function calcRetention(
|
|
|
123
135
|
* Create persistent memory tables for long-term / core / sharing
|
|
124
136
|
*/
|
|
125
137
|
export function ensureMemoryTables(db) {
|
|
138
|
+
assertLegacyHierarchicalMemoryMutationAllowed("ensure-tables");
|
|
126
139
|
db.exec(`
|
|
127
140
|
CREATE TABLE IF NOT EXISTS memory_long_term (
|
|
128
141
|
id TEXT PRIMARY KEY,
|
|
@@ -179,6 +192,7 @@ export function ensureMemoryTables(db) {
|
|
|
179
192
|
* @param {string} [options.namespace] - Namespace for in-memory isolation (default: "global")
|
|
180
193
|
*/
|
|
181
194
|
export function storeMemory(db, content, options = {}) {
|
|
195
|
+
assertLegacyHierarchicalMemoryMutationAllowed("store");
|
|
182
196
|
if (!content || !content.trim()) {
|
|
183
197
|
throw new Error("Memory content cannot be empty");
|
|
184
198
|
}
|
|
@@ -258,6 +272,7 @@ export function storeMemory(db, content, options = {}) {
|
|
|
258
272
|
* the default "global" namespace (backward compatible).
|
|
259
273
|
*/
|
|
260
274
|
export function recallMemory(db, query, options = {}) {
|
|
275
|
+
assertLegacyHierarchicalMemoryMutationAllowed("recall");
|
|
261
276
|
if (!query || !query.trim()) return [];
|
|
262
277
|
|
|
263
278
|
const limit = Math.max(1, parseInt(options.limit) || 20);
|
|
@@ -653,6 +668,7 @@ export function applyForgettingCurve(
|
|
|
653
668
|
* persisted to the DB — lives alongside the in-memory layer.
|
|
654
669
|
*/
|
|
655
670
|
export function attachMetadata(memoryId, metadata, namespace = DEFAULT_NS) {
|
|
671
|
+
assertLegacyHierarchicalMemoryMutationAllowed("attach-metadata");
|
|
656
672
|
if (!memoryId) throw new Error("memoryId is required");
|
|
657
673
|
if (!metadata || typeof metadata !== "object")
|
|
658
674
|
throw new Error("metadata must be an object");
|
|
@@ -682,6 +698,7 @@ function _locateInMemory(memoryId) {
|
|
|
682
698
|
* Promote a memory one layer up: working → short-term → long-term.
|
|
683
699
|
*/
|
|
684
700
|
export function promoteMemoryV2(db, memoryId) {
|
|
701
|
+
assertLegacyHierarchicalMemoryMutationAllowed("promote");
|
|
685
702
|
if (!memoryId) throw new Error("memoryId is required");
|
|
686
703
|
const loc = _locateInMemory(memoryId);
|
|
687
704
|
if (loc && loc.layer === MEMORY_LAYER.WORKING) {
|
|
@@ -728,6 +745,7 @@ export function promoteMemoryV2(db, memoryId) {
|
|
|
728
745
|
* (long-term/core demotion requires DB round-trip; not exposed here.)
|
|
729
746
|
*/
|
|
730
747
|
export function demoteMemoryV2(memoryId) {
|
|
748
|
+
assertLegacyHierarchicalMemoryMutationAllowed("demote");
|
|
731
749
|
if (!memoryId) throw new Error("memoryId is required");
|
|
732
750
|
for (const [ns, nsMap] of _shortTermNS) {
|
|
733
751
|
if (nsMap.has(memoryId)) {
|
|
@@ -790,6 +808,7 @@ export function shareMemoryV2(
|
|
|
790
808
|
}
|
|
791
809
|
|
|
792
810
|
export function revokeShare(shareId) {
|
|
811
|
+
assertLegacyHierarchicalMemoryMutationAllowed("revoke-share");
|
|
793
812
|
const record = _v2Shares.find((s) => s.id === shareId);
|
|
794
813
|
if (!record) throw new Error(`Share not found: ${shareId}`);
|
|
795
814
|
if (record.revokedAt) throw new Error(`Share already revoked`);
|
|
@@ -896,6 +915,7 @@ export function searchSemanticV2(db, options = {}) {
|
|
|
896
915
|
* Delegates to existing consolidateMemory() for promotion logic.
|
|
897
916
|
*/
|
|
898
917
|
export function consolidateV2(db, options = {}) {
|
|
918
|
+
assertLegacyHierarchicalMemoryMutationAllowed("consolidate-v2");
|
|
899
919
|
const id = `consol-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
900
920
|
const record = {
|
|
901
921
|
id,
|
|
@@ -949,6 +969,7 @@ export function listConsolidations(options = {}) {
|
|
|
949
969
|
* Prune with per-layer scope + custom threshold.
|
|
950
970
|
*/
|
|
951
971
|
export function pruneV2(db, options = {}) {
|
|
972
|
+
assertLegacyHierarchicalMemoryMutationAllowed("prune-v2");
|
|
952
973
|
const { layer, maxAge = 720, threshold } = options;
|
|
953
974
|
if (layer && !_LAYER_VALUES.has(layer))
|
|
954
975
|
throw new Error(`Invalid layer: ${layer}`);
|
|
@@ -1000,6 +1021,7 @@ export function startConsolidationTimer({
|
|
|
1000
1021
|
db,
|
|
1001
1022
|
onTick,
|
|
1002
1023
|
} = {}) {
|
|
1024
|
+
assertLegacyHierarchicalMemoryMutationAllowed("start-consolidation-timer");
|
|
1003
1025
|
if (_consolidationTimer) return _consolidationTimer;
|
|
1004
1026
|
if (!db) throw new Error("db is required for consolidation timer");
|
|
1005
1027
|
_consolidationTimer = setInterval(() => {
|