chainlesschain 0.166.9 → 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 +5 -2
- package/src/assets/web-panel/assets/{AIOps-DJvpifGx.js → AIOps-BN25cNOD.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D2UhuF_A.js → ActionButton-Da9IP-m5.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C9ho9obu.js → Analytics-D7hkEvQm.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BvRCpFK3.js → AppLayout-CCV4Xnbc.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-jxrySvpk.js → Artifacts-CVSnVJeA.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-ovEw0ZYl.js → Audit-CuYdw5Ag.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D7H5z6zS.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BuXob8za.js → Backup-cV9FdpTy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CtnszuQ2.js → BaseInput-BRnv6YSp.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B_mYE8fJ.js → Chat-Bw5w87P4.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C0GjtUAw.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-ierdtcJD.js → Checkbox-DaoTqcdt.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3VKPJD_B.js → Codegen-B4dYcEIi.js} +1 -1
- package/src/assets/web-panel/assets/{Col-1EdMyf5P.js → Col-mAhuOeuD.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D6H7UA8K.js → Community-BK6KEdBk.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BBAZvYIm.js → Compact-CCglmNu5.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CgsTrAoj.js → Compliance-Cm8S4of7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-tnZgLoTE.js → Cowork-Dhs1QLMe.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CPpZw2Nh.js → Cron-CLlhmXWk.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BymBcp5z.js → Crosschain-BnHVbaNs.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DKPxS_K1.js → DID-UzQP9-0O.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DvJhEmH9.js → Dashboard-CBdlPClz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-b8iQyQIZ.js → Dropdown-axIRPdq1.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer--0-A-zKb.js → EmailListRenderer-DUalW5rx.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C12iDN06.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BRhaE2Z8.js → Federation-C1yP-uEu.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C4dnq7yf.js → FormItemContext-Xh6Ig5q8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CGAdbR5n.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
- package/src/assets/web-panel/assets/{Git-4eA2fYzL.js → Git-C_z63ixg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJuY9Y-9.js → Governance-BYqB33_3.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DZ5Dy4up.js → Inference-CEULuArm.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BMTjRs4A.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BKEeQEfJ.js → Logs-DO9Hdcec.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dhho4fEg.js → Marketplace-B8zyLiFe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BW6xxSlU.js → McpTools-BLAN2mWW.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mPqlpSkq.js → Memory-CrQcFM7u.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Cb9N_DQI.js → MobileBridge-DVnyiiU-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BNs8tah_.js → MobileProjects-qjCME5OD.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CaxBt8tn.js → Mtc-4JE3C3It.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DRPQbp3t.js → MtcAudit-CjBuak9I.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CRm-d8bK.js → Multisig-BtPcYQcC.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BCCk3LPs.js → NLProgramming-Cx653_Ba.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cv8SN8gN.js → Notes-CkuD3YzS.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CggIvTh5.js → NotificationSettings-BgNgU7HH.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BW3_bV12.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BuRE-VCO.js → Organization-Dmd4Hjxz.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DBrm1gju.js → Overflow-C_5DA-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CWVnDYgS.js → P2P-uwslV4XC.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-8RKUIpte.js → PdhVaultBrowser-CuNgwVnX.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-tDUAxogW.js → Permissions-CJayVX9H.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dv2-CFis.js → PersonalDataHub-Cb05H5go.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DM6kvFni.js → Pipeline-BZlGKapZ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzK-yL0d.js → Privacy-BIzZWYzd.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B5UrNpkj.js → ProjectInit-vEYYyQXQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxJD43oW.js → ProjectSettings-MZqTy5CC.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CRARUOl8.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CYl4jRYK.js → Providers-80VAK8PX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DeH2T0fH.js → QrScannerModal-CzRSoIwK.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bw9k_kTk.js → QuickAsk-BpwQ2n4C.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bl_jGwoi.js → Recommend-BC03TZ79.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-d6u01Kq0.js → RemoteSession-DE59-jaa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Ds_Dfr-k.js → Reputation-DOHmeWyA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BpQUQTNj.js → Row-hc5RZl1D.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BatpZBGt.js → RssFeed-Cv5uMP7E.js} +3 -3
- package/src/assets/web-panel/assets/{Search-D7hOObzi.js → Search-qohu7Ug0.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dXQ4FKNt.js → Security-drCPFWV5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D8wInGPa.js → Services-BAEgUeRy.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DXQCoYpM.js → Skeleton-CkJkKBlo.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D3oLRIVn.js → Skills-bMuKEpez.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BmP4-LnJ.js → Sla-DxWQVHRC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DLj-xzro.js → SpeechSettings-BpS8idmV.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-8KKaaRMr.js → SyncSettings-BPBLlW5v.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-GyK42I7C.js → Tasks-C4SLEeUh.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-n1y_8UBG.js → Templates-r-wfU39U.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-B39nBph8.js → Tenant-C7vjRmLN.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DCQoOKXe.js → Terminal-DdzeFCV2.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkhbDfXk.js → TimelineRenderer-CYyWN2KD.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BeHIIU8D.js → Tokens-D8A9osUg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHvWXVOb.js → Trigger-DBvrNlyS.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-y2WaOSto.js → Trust-DBVAGc7o.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DBFeJBzt.js → UkeySign-C1vQUCRJ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BEOWitC-.js → VideoEditing-BKs4dah4.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BITedTe6.js → Wallet-ByIuj3lD.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DMwlJVin.js → WebAuthn-DYlAFCm9.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-CKfGFEu1.js → WorkflowEditor-Dwyadd0c.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DR6gnBGF.js → chat-Bm2f3s08.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C_Hw5NCn.js → colors-C8ORSh7V.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B8IPwsEu.js → compact-item-1iVlnsM-.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D-u4JVnJ.js → createContext-CmqNyUSL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CZubdS4D.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-C25rOz7O.js → index-B53c3diB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfniPP5p.js → index-B59OWAs7.js} +1 -1
- package/src/assets/web-panel/assets/{index-11ASqx-A.js → index-B8BrB0Ls.js} +1 -1
- package/src/assets/web-panel/assets/{index-auyNYjLo.js → index-BC32_0xT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ctje8Vl3.js → index-BC8Wb6cy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cg2bCeol.js → index-BCOhTILd.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1w96gg9.js → index-BFniLMn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-k1Xa5iw1.js → index-BIvM-uAX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuOU5apg.js → index-BK-RY0-7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D47jt8ET.js → index-BQL9r73Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2VmtNaQ.js → index-BVtnizyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bizm87cX.js → index-Bf1PlIHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt-w3xQ7.js → index-Bgw4Y2rU.js} +1 -1
- package/src/assets/web-panel/assets/{index-ffe7bvqP.js → index-BgwLNxmr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cl5RpreD.js → index-C-J5-pGH.js} +1 -1
- package/src/assets/web-panel/assets/{index-idZKyADQ.js → index-C-ZIHi42.js} +1 -1
- package/src/assets/web-panel/assets/{index-LvjAKDSl.js → index-C3B1S-mW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmRcgiYT.js → index-C5RfRciU.js} +1 -1
- package/src/assets/web-panel/assets/{index-rYBHSDcJ.js → index-CCEyz58d.js} +1 -1
- package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
- package/src/assets/web-panel/assets/{index-DcFjRT-K.js → index-CTfEmKK0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjRrqooR.js → index-CfiHyVyl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpjHpRoq.js → index-CkFvuAex.js} +3 -3
- package/src/assets/web-panel/assets/{index-BzoFanEQ.js → index-D98FXb0w.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbm8F0M2.js → index-DDHk911Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXS6wYJZ.js → index-DJxtPFOh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY6MHo9D.js → index-DVJ1uKf4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiXkhOkY.js → index-Dcck8QfW.js} +1 -1
- package/src/assets/web-panel/assets/{index-mYZJxGH6.js → index-DgUE51Pz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqmLw8cs.js → index-Dsve5Gkv.js} +1 -1
- package/src/assets/web-panel/assets/{index-xoNssgz_.js → index-DvedhJeM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfnzrUxU.js → index-DwMdWKiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi21Etg4.js → index-OcbzdRpT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJ6pG79m.js → index-fPK6GFEg.js} +1 -1
- package/src/assets/web-panel/assets/{index-_nL79NT8.js → index-geQinnns.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTosx2Wu.js → index-pHWA7bmM.js} +1 -1
- package/src/assets/web-panel/assets/{index-cVqbas5C.js → index-reUHhuz8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv2132PO.js → index-tqTx5wXo.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-lcU_dT2r.js → initDefaultProps-CuA-cpkL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dc7UNXZ1.js → motion-CimmE_9b.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cll8ZXaL.js → move-DlGlrltz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CAb_yLIM.js → mtc-parser-CK6BJQ07.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DurYMyTe.js → omit-BKjBfZfB.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BITQyOlw.js → pickAttrs-B2chVYw9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dg1rH91i.js → placementArrow-BW8aLJJ3.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D_EWIeac.js → responsiveObserve-dXlPl66S.js} +1 -1
- package/src/assets/web-panel/assets/{slide-lK4d3zsh.js → slide-hSa89S4G.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bflq-Git.js → statusUtils-DM6KLt-s.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Ccp0I-wt.js → styleChecker-C9MQAK15.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CYZbByYA.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B_x0nxFD.js → useFs-C7rtRViA.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DW55rL85.js → usePersonalDataHub-Dm15xafq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Ca6MH3W8.js → vnode-mEiEytw4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-NdHelOog.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 +41 -2
- package/src/gateways/ws/session-core-protocol.js +62 -3
- package/src/gateways/ws/session-protocol.js +123 -15
- package/src/gateways/ws/ws-agent-handler.js +157 -9
- package/src/gateways/ws/ws-session-gateway.js +204 -30
- package/src/generated/cc-agent-protocol.schema.json +2094 -4
- package/src/harness/prompt-compressor.js +5 -55
- package/src/lib/agent-sandbox.js +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/index.js +2 -0
- package/src/lib/graph-kernel/migration-saga.js +2 -2
- package/src/lib/graph-kernel/production-cutover-evidence.js +976 -0
- package/src/lib/graph-kernel/retirement-evidence.js +12 -4
- 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/ChatBubbleRenderer-DaiA6CsX.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +0 -1
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +0 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +0 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +0 -1
package/src/commands/compact.js
CHANGED
|
@@ -27,10 +27,20 @@ import {
|
|
|
27
27
|
readVerifiedProjection,
|
|
28
28
|
sessionExists,
|
|
29
29
|
} from "../harness/jsonl-session-store.js";
|
|
30
|
-
import {
|
|
30
|
+
import {
|
|
31
|
+
estimateMessagesTokens,
|
|
32
|
+
getContextWindow,
|
|
33
|
+
PromptCompressor,
|
|
34
|
+
} from "../harness/prompt-compressor.js";
|
|
31
35
|
import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
|
|
32
36
|
import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
|
|
33
37
|
import { chatWithTools } from "../runtime/agent-core.js";
|
|
38
|
+
import { canonicalDigest } from "@chainlesschain/context-memory-kernel";
|
|
39
|
+
import {
|
|
40
|
+
contextItemsToMessages,
|
|
41
|
+
createCliContextMemoryRuntime,
|
|
42
|
+
createSummaryContextItem,
|
|
43
|
+
} from "../lib/context-memory-kernel/index.js";
|
|
34
44
|
|
|
35
45
|
/** Build a compressor sized to the session (or explicit overrides). */
|
|
36
46
|
function buildCompressor(options, recorded, llmQuery) {
|
|
@@ -75,7 +85,7 @@ function attachMeteringMetadata(value, { callId, settled }) {
|
|
|
75
85
|
}
|
|
76
86
|
}
|
|
77
87
|
|
|
78
|
-
function buildSemanticQuery(options, recorded, sessionId, ledger) {
|
|
88
|
+
function buildSemanticQuery(options, recorded, sessionId, operationId, ledger) {
|
|
79
89
|
const provider = options.provider || recorded.provider || undefined;
|
|
80
90
|
const model = options.model || recorded.model || undefined;
|
|
81
91
|
// A preview must be both write-free and spend-free. It uses the same
|
|
@@ -92,6 +102,7 @@ function buildSemanticQuery(options, recorded, sessionId, ledger) {
|
|
|
92
102
|
provider,
|
|
93
103
|
model,
|
|
94
104
|
source: "semantic-compaction",
|
|
105
|
+
operationId,
|
|
95
106
|
persist: async (type, data) => {
|
|
96
107
|
const appended = appendEventIfHead(
|
|
97
108
|
sessionId,
|
|
@@ -138,6 +149,201 @@ function buildSemanticQuery(options, recorded, sessionId, ledger) {
|
|
|
138
149
|
};
|
|
139
150
|
}
|
|
140
151
|
|
|
152
|
+
function kernelBudget(options, recorded, compressor) {
|
|
153
|
+
const model = options.model || recorded.model || undefined;
|
|
154
|
+
const provider = options.provider || recorded.provider || undefined;
|
|
155
|
+
const modelWindowTokens = getContextWindow(model, provider);
|
|
156
|
+
const reservedOutputTokens = Math.max(
|
|
157
|
+
1,
|
|
158
|
+
Math.min(2048, Math.floor(modelWindowTokens / 10)),
|
|
159
|
+
);
|
|
160
|
+
const maximumInput = Math.max(1, modelWindowTokens - reservedOutputTokens);
|
|
161
|
+
const targetInput = Math.max(
|
|
162
|
+
1,
|
|
163
|
+
Math.min(
|
|
164
|
+
maximumInput,
|
|
165
|
+
Math.trunc(Number(compressor.maxTokens)) || maximumInput,
|
|
166
|
+
),
|
|
167
|
+
);
|
|
168
|
+
const safetyMarginTokens = Math.max(
|
|
169
|
+
0,
|
|
170
|
+
modelWindowTokens - reservedOutputTokens - targetInput,
|
|
171
|
+
);
|
|
172
|
+
const recoveryReserveTokens =
|
|
173
|
+
targetInput <= 1
|
|
174
|
+
? 0
|
|
175
|
+
: Math.min(256, Math.max(1, Math.floor(targetInput * 0.05)));
|
|
176
|
+
return {
|
|
177
|
+
modelWindowTokens,
|
|
178
|
+
reservedOutputTokens,
|
|
179
|
+
safetyMarginTokens,
|
|
180
|
+
recoveryReserveTokens,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function buildKernelSummarizer({
|
|
185
|
+
llmQuery,
|
|
186
|
+
provider,
|
|
187
|
+
model,
|
|
188
|
+
compressor,
|
|
189
|
+
ledger,
|
|
190
|
+
sessionPort,
|
|
191
|
+
}) {
|
|
192
|
+
if (typeof llmQuery !== "function") return undefined;
|
|
193
|
+
return async (droppedItems, context) => {
|
|
194
|
+
if (ledger.headHash !== context.inputHead) {
|
|
195
|
+
const error = new Error("session changed before semantic compaction");
|
|
196
|
+
error.code = "SESSION_REVISION_STALE";
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
const droppedMessages = contextItemsToMessages(droppedItems);
|
|
200
|
+
if (droppedMessages.length < 3) {
|
|
201
|
+
return { items: [], usageReceipt: { outcome: "not_metered" } };
|
|
202
|
+
}
|
|
203
|
+
const summaryCompressor = new PromptCompressor({
|
|
204
|
+
maxMessages: 4,
|
|
205
|
+
maxTokens: Math.max(256, Math.floor(compressor.maxTokens / 4)),
|
|
206
|
+
llmQuery,
|
|
207
|
+
});
|
|
208
|
+
let compacted;
|
|
209
|
+
try {
|
|
210
|
+
compacted = await compactConversationWithProvider(droppedMessages, {
|
|
211
|
+
compressor: summaryCompressor,
|
|
212
|
+
provider,
|
|
213
|
+
model,
|
|
214
|
+
});
|
|
215
|
+
} finally {
|
|
216
|
+
if (ledger.headHash !== context.inputHead) {
|
|
217
|
+
sessionPort.registerOwnedHeadAdvance({
|
|
218
|
+
operationId: context.operationId,
|
|
219
|
+
fromHead: context.inputHead,
|
|
220
|
+
toHead: ledger.headHash,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const { messages, stats } = compacted;
|
|
225
|
+
if (stats.summaryUsageUnknown === true) {
|
|
226
|
+
const error = new Error(
|
|
227
|
+
stats.summaryUsageUnknownReason || "provider usage outcome is unknown",
|
|
228
|
+
);
|
|
229
|
+
error.code = "reconciliation_required";
|
|
230
|
+
error.outcomeUnknown = true;
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
const providerWasCalled = Boolean(stats.summaryCallId);
|
|
234
|
+
if (providerWasCalled && stats.summaryUsageLedgerSettled !== true) {
|
|
235
|
+
const error = new Error("semantic compaction usage ledger is unsettled");
|
|
236
|
+
error.code = "provider_usage_unsettled";
|
|
237
|
+
error.outcomeUnknown = true;
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
const reduced =
|
|
241
|
+
Number(stats.saved || 0) > 0 || messages.length < droppedMessages.length;
|
|
242
|
+
const item = reduced
|
|
243
|
+
? createSummaryContextItem({
|
|
244
|
+
messages,
|
|
245
|
+
parents: droppedItems,
|
|
246
|
+
operationId: context.operationId,
|
|
247
|
+
now: new Date().toISOString(),
|
|
248
|
+
})
|
|
249
|
+
: null;
|
|
250
|
+
const usageReceipt = providerWasCalled
|
|
251
|
+
? {
|
|
252
|
+
outcome: "settled",
|
|
253
|
+
callId: stats.summaryCallId,
|
|
254
|
+
...(stats.summaryProvider || provider
|
|
255
|
+
? { provider: stats.summaryProvider || provider }
|
|
256
|
+
: {}),
|
|
257
|
+
...(stats.summaryModel || model
|
|
258
|
+
? { model: stats.summaryModel || model }
|
|
259
|
+
: {}),
|
|
260
|
+
inputTokens: stats.summaryUsage?.inputTokens || 0,
|
|
261
|
+
outputTokens: stats.summaryUsage?.outputTokens || 0,
|
|
262
|
+
ledgerDigest: canonicalDigest(
|
|
263
|
+
{ callId: stats.summaryCallId, headHash: ledger.headHash },
|
|
264
|
+
"chainlesschain.cli-compaction-usage/v1",
|
|
265
|
+
),
|
|
266
|
+
}
|
|
267
|
+
: { outcome: "not_metered" };
|
|
268
|
+
return { items: item ? [item] : [], usageReceipt };
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function compactionRequest({
|
|
273
|
+
sessionId,
|
|
274
|
+
operationId,
|
|
275
|
+
options,
|
|
276
|
+
source,
|
|
277
|
+
compressor,
|
|
278
|
+
memoryRevision,
|
|
279
|
+
summarizer,
|
|
280
|
+
}) {
|
|
281
|
+
const provider =
|
|
282
|
+
options.provider || source.recorded.provider || "provider.local";
|
|
283
|
+
const model = options.model || source.recorded.model || "default";
|
|
284
|
+
return {
|
|
285
|
+
operationId,
|
|
286
|
+
sessionId,
|
|
287
|
+
...kernelBudget(options, source.recorded, compressor),
|
|
288
|
+
sink: provider,
|
|
289
|
+
scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
|
|
290
|
+
policyVersion: "cli-context-policy-v1",
|
|
291
|
+
modelProfile: model,
|
|
292
|
+
memoryRevision,
|
|
293
|
+
allowFallback: false,
|
|
294
|
+
...(summarizer ? { summarizer } : {}),
|
|
295
|
+
metadata: {
|
|
296
|
+
inputMessageCount: source.messages.length,
|
|
297
|
+
originalTokens: estimateMessagesTokens(source.messages),
|
|
298
|
+
provider,
|
|
299
|
+
model,
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function dryRunKernelPlan(runtime, request) {
|
|
305
|
+
const snapshot = await runtime.sessionPort.readSnapshot(request.sessionId);
|
|
306
|
+
const plan = await runtime.kernel.planContext({
|
|
307
|
+
modelWindowTokens: request.modelWindowTokens,
|
|
308
|
+
reservedOutputTokens: request.reservedOutputTokens,
|
|
309
|
+
safetyMarginTokens: request.safetyMarginTokens,
|
|
310
|
+
recoveryReserveTokens: request.recoveryReserveTokens,
|
|
311
|
+
items: snapshot.items,
|
|
312
|
+
sink: request.sink,
|
|
313
|
+
scopeAdmissions: request.scopeAdmissions,
|
|
314
|
+
...(request.partitionCeilings
|
|
315
|
+
? { partitionCeilings: request.partitionCeilings }
|
|
316
|
+
: {}),
|
|
317
|
+
...(request.partitionMinimums
|
|
318
|
+
? { partitionMinimums: request.partitionMinimums }
|
|
319
|
+
: {}),
|
|
320
|
+
policyVersion: request.policyVersion,
|
|
321
|
+
modelProfile: request.modelProfile,
|
|
322
|
+
sessionHead: snapshot.head,
|
|
323
|
+
memoryRevision: request.memoryRevision ?? snapshot.memoryRevision,
|
|
324
|
+
...(request.now ? { now: request.now } : {}),
|
|
325
|
+
});
|
|
326
|
+
return {
|
|
327
|
+
plan,
|
|
328
|
+
messages: contextItemsToMessages(plan.selected),
|
|
329
|
+
stats: {
|
|
330
|
+
strategy: "canonical-deterministic-selection",
|
|
331
|
+
originalMessages: snapshot.items.length,
|
|
332
|
+
compressedMessages: plan.selected.length,
|
|
333
|
+
originalTokens: snapshot.items.reduce(
|
|
334
|
+
(total, item) => total + item.tokenEstimate,
|
|
335
|
+
0,
|
|
336
|
+
),
|
|
337
|
+
compressedTokens: plan.selectedTokens,
|
|
338
|
+
saved:
|
|
339
|
+
snapshot.items.reduce((total, item) => total + item.tokenEstimate, 0) -
|
|
340
|
+
plan.selectedTokens,
|
|
341
|
+
dropped: plan.dropped,
|
|
342
|
+
digest: plan.digest,
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
141
347
|
function readCompactSource(sessionId) {
|
|
142
348
|
return readVerifiedProjection(sessionId, () => {
|
|
143
349
|
let recorded = Object.freeze({ model: "", provider: "" });
|
|
@@ -192,6 +398,10 @@ export function registerCompactCommand(program) {
|
|
|
192
398
|
"Disable provider summarization and stay deterministic",
|
|
193
399
|
)
|
|
194
400
|
.option("--base-url <url>", "Provider base URL for semantic compaction")
|
|
401
|
+
.option(
|
|
402
|
+
"--operation-id <id>",
|
|
403
|
+
"Stable idempotency key (default: derived from session head)",
|
|
404
|
+
)
|
|
195
405
|
.option("--json", "Output as JSON")
|
|
196
406
|
.action(async (sessionId, options) => {
|
|
197
407
|
try {
|
|
@@ -204,6 +414,10 @@ export function registerCompactCommand(program) {
|
|
|
204
414
|
|
|
205
415
|
const source = readCompactSource(sessionId);
|
|
206
416
|
const messages = source.messages;
|
|
417
|
+
const operationId =
|
|
418
|
+
options.operationId ||
|
|
419
|
+
`compact-${sessionId}-${String(source.headHash).slice(-24)}`;
|
|
420
|
+
const runtime = createCliContextMemoryRuntime({ sessionId });
|
|
207
421
|
const ledger = {
|
|
208
422
|
headHash: source.headHash,
|
|
209
423
|
callId: null,
|
|
@@ -214,9 +428,133 @@ export function registerCompactCommand(program) {
|
|
|
214
428
|
options,
|
|
215
429
|
source.recorded,
|
|
216
430
|
sessionId,
|
|
431
|
+
operationId,
|
|
217
432
|
ledger,
|
|
218
433
|
);
|
|
219
434
|
const compressor = buildCompressor(options, source.recorded, llmQuery);
|
|
435
|
+
const memoryRevision =
|
|
436
|
+
runtime.decision.canonical && !options.dryRun
|
|
437
|
+
? await runtime.memoryPort.getRevision()
|
|
438
|
+
: 0;
|
|
439
|
+
const summarizer = buildKernelSummarizer({
|
|
440
|
+
llmQuery,
|
|
441
|
+
provider: options.provider || source.recorded.provider || undefined,
|
|
442
|
+
model: options.model || source.recorded.model || undefined,
|
|
443
|
+
compressor,
|
|
444
|
+
ledger,
|
|
445
|
+
sessionPort: runtime.sessionPort,
|
|
446
|
+
});
|
|
447
|
+
const request = compactionRequest({
|
|
448
|
+
sessionId,
|
|
449
|
+
operationId,
|
|
450
|
+
options,
|
|
451
|
+
source,
|
|
452
|
+
compressor,
|
|
453
|
+
memoryRevision,
|
|
454
|
+
summarizer,
|
|
455
|
+
});
|
|
456
|
+
const canonicalPreview = await dryRunKernelPlan(runtime, request);
|
|
457
|
+
|
|
458
|
+
if (runtime.decision.canonical) {
|
|
459
|
+
const reduced = canonicalPreview.plan.dropped.length > 0;
|
|
460
|
+
if (!reduced || options.dryRun) {
|
|
461
|
+
if (options.json) {
|
|
462
|
+
console.log(
|
|
463
|
+
JSON.stringify(
|
|
464
|
+
{
|
|
465
|
+
sessionId,
|
|
466
|
+
operationId,
|
|
467
|
+
compacted: false,
|
|
468
|
+
dryRun: Boolean(options.dryRun),
|
|
469
|
+
cutover: runtime.decision,
|
|
470
|
+
stats: canonicalPreview.stats,
|
|
471
|
+
},
|
|
472
|
+
null,
|
|
473
|
+
2,
|
|
474
|
+
),
|
|
475
|
+
);
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
logger.log(
|
|
479
|
+
chalk.gray(
|
|
480
|
+
reduced
|
|
481
|
+
? `Would compact ${canonicalPreview.plan.dropped.length} canonical item(s).`
|
|
482
|
+
: `Nothing to compact - ${messages.length} message(s) are within the canonical budget.`,
|
|
483
|
+
),
|
|
484
|
+
);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
const receipt = await runtime.kernel.compactContext(request);
|
|
489
|
+
if (["stale", "reconciliation_required"].includes(receipt.status)) {
|
|
490
|
+
if (options.json) {
|
|
491
|
+
console.log(
|
|
492
|
+
JSON.stringify(
|
|
493
|
+
{
|
|
494
|
+
sessionId,
|
|
495
|
+
operationId,
|
|
496
|
+
cutover: runtime.decision,
|
|
497
|
+
receipt,
|
|
498
|
+
},
|
|
499
|
+
null,
|
|
500
|
+
2,
|
|
501
|
+
),
|
|
502
|
+
);
|
|
503
|
+
} else {
|
|
504
|
+
logger.error(
|
|
505
|
+
chalk.yellow(
|
|
506
|
+
`Compaction requires ${receipt.status === "stale" ? "a retry" : "reconciliation"}: ${operationId}`,
|
|
507
|
+
),
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
process.exitCode = receipt.status === "stale" ? 1 : 2;
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const committed = await runtime.sessionPort.readSnapshot(sessionId);
|
|
514
|
+
const compressedTokens = committed.items.reduce(
|
|
515
|
+
(total, item) => total + item.tokenEstimate,
|
|
516
|
+
0,
|
|
517
|
+
);
|
|
518
|
+
const stats = {
|
|
519
|
+
strategy: "canonical-context-memory-kernel",
|
|
520
|
+
originalMessages: messages.length,
|
|
521
|
+
compressedMessages: committed.items.length,
|
|
522
|
+
originalTokens: canonicalPreview.stats.originalTokens,
|
|
523
|
+
compressedTokens,
|
|
524
|
+
saved: canonicalPreview.stats.originalTokens - compressedTokens,
|
|
525
|
+
dropped: canonicalPreview.plan.dropped,
|
|
526
|
+
};
|
|
527
|
+
if (options.json) {
|
|
528
|
+
console.log(
|
|
529
|
+
JSON.stringify(
|
|
530
|
+
{
|
|
531
|
+
sessionId,
|
|
532
|
+
operationId,
|
|
533
|
+
compacted: true,
|
|
534
|
+
cutover: runtime.decision,
|
|
535
|
+
stats,
|
|
536
|
+
receipt,
|
|
537
|
+
},
|
|
538
|
+
null,
|
|
539
|
+
2,
|
|
540
|
+
),
|
|
541
|
+
);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
logger.log(chalk.green(`Compacted ${sessionId}`));
|
|
545
|
+
logger.log(
|
|
546
|
+
chalk.gray(
|
|
547
|
+
` ${stats.originalMessages} -> ${stats.compressedMessages} messages` +
|
|
548
|
+
`, ${stats.originalTokens} -> ${stats.compressedTokens} tokens` +
|
|
549
|
+
` (saved ${stats.saved}, canonical kernel)`,
|
|
550
|
+
),
|
|
551
|
+
);
|
|
552
|
+
logger.log(
|
|
553
|
+
chalk.gray(` resume with: cc agent --resume ${sessionId}`),
|
|
554
|
+
);
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
|
|
220
558
|
// llmQuery already persisted a complete call ledger. The provider
|
|
221
559
|
// helper only carries its metadata through stats; its projected usage
|
|
222
560
|
// event is intentionally not appended a second time here.
|
|
@@ -260,7 +598,15 @@ export function registerCompactCommand(program) {
|
|
|
260
598
|
if (options.json) {
|
|
261
599
|
console.log(
|
|
262
600
|
JSON.stringify(
|
|
263
|
-
{
|
|
601
|
+
{
|
|
602
|
+
sessionId,
|
|
603
|
+
dryRun: !!options.dryRun,
|
|
604
|
+
cutover: runtime.decision,
|
|
605
|
+
stats,
|
|
606
|
+
...(runtime.decision.shadow
|
|
607
|
+
? { canonicalShadow: canonicalPreview.stats }
|
|
608
|
+
: {}),
|
|
609
|
+
},
|
|
264
610
|
null,
|
|
265
611
|
2,
|
|
266
612
|
),
|
package/src/commands/context.js
CHANGED
|
@@ -74,7 +74,7 @@ export function registerContextCommand(program) {
|
|
|
74
74
|
.action(async (id, options) => {
|
|
75
75
|
const { rebuildMessages, getLastSessionId, sessionExists, readEvents } =
|
|
76
76
|
await import("../harness/jsonl-session-store.js");
|
|
77
|
-
const { estimateTokens, getContextWindow } =
|
|
77
|
+
const { adaptiveThresholds, estimateTokens, getContextWindow } =
|
|
78
78
|
await import("../harness/prompt-compressor.js");
|
|
79
79
|
|
|
80
80
|
const sessionId = id || getLastSessionId();
|
|
@@ -118,6 +118,61 @@ export function registerContextCommand(program) {
|
|
|
118
118
|
const provider = options.provider || recordedProvider || "ollama";
|
|
119
119
|
const window = getContextWindow(model, provider);
|
|
120
120
|
|
|
121
|
+
let canonicalReport = null;
|
|
122
|
+
try {
|
|
123
|
+
const { createCliContextMemoryRuntime } =
|
|
124
|
+
await import("../lib/context-memory-kernel/index.js");
|
|
125
|
+
const runtime = createCliContextMemoryRuntime({ sessionId });
|
|
126
|
+
const snapshot = await runtime.sessionPort.readSnapshot(sessionId);
|
|
127
|
+
const threshold = adaptiveThresholds(window).maxTokens;
|
|
128
|
+
const reservedOutputTokens = Math.max(
|
|
129
|
+
1,
|
|
130
|
+
Math.min(2048, Math.floor(window / 10)),
|
|
131
|
+
);
|
|
132
|
+
const safetyMarginTokens = Math.max(
|
|
133
|
+
0,
|
|
134
|
+
window - reservedOutputTokens - threshold,
|
|
135
|
+
);
|
|
136
|
+
const recoveryReserveTokens = Math.min(
|
|
137
|
+
256,
|
|
138
|
+
Math.max(1, Math.floor(threshold * 0.05)),
|
|
139
|
+
);
|
|
140
|
+
const plan = await runtime.kernel.planContext({
|
|
141
|
+
modelWindowTokens: window,
|
|
142
|
+
reservedOutputTokens,
|
|
143
|
+
safetyMarginTokens,
|
|
144
|
+
recoveryReserveTokens,
|
|
145
|
+
items: snapshot.items,
|
|
146
|
+
sink: provider,
|
|
147
|
+
scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
|
|
148
|
+
policyVersion: "cli-context-policy-v1",
|
|
149
|
+
modelProfile: model || "default",
|
|
150
|
+
sessionHead: snapshot.head,
|
|
151
|
+
memoryRevision: snapshot.memoryRevision,
|
|
152
|
+
});
|
|
153
|
+
canonicalReport = {
|
|
154
|
+
stage: runtime.decision.stage,
|
|
155
|
+
mode: runtime.decision.mode,
|
|
156
|
+
shadow: runtime.decision.shadow,
|
|
157
|
+
planDigest: plan.digest,
|
|
158
|
+
policyVersion: plan.policyVersion,
|
|
159
|
+
selectedItems: plan.selected.length,
|
|
160
|
+
droppedItems: plan.dropped.length,
|
|
161
|
+
selectedTokens: plan.selectedTokens,
|
|
162
|
+
inputBudget: plan.inputBudget,
|
|
163
|
+
selectableBudget: plan.selectableBudget,
|
|
164
|
+
partitions: plan.partitions,
|
|
165
|
+
minimumShortfalls: plan.minimumShortfalls,
|
|
166
|
+
dropped: plan.dropped,
|
|
167
|
+
};
|
|
168
|
+
} catch (error) {
|
|
169
|
+
canonicalReport = {
|
|
170
|
+
status: "rejected",
|
|
171
|
+
code: error?.code || "context_plan_failed",
|
|
172
|
+
message: error?.message || String(error),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
121
176
|
const { buckets, counts, total } = categorizeContext(
|
|
122
177
|
messages,
|
|
123
178
|
estimateTokens,
|
|
@@ -227,6 +282,7 @@ export function registerContextCommand(program) {
|
|
|
227
282
|
breakdown: buckets,
|
|
228
283
|
counts,
|
|
229
284
|
overflows: total > window,
|
|
285
|
+
contextMemoryKernel: canonicalReport,
|
|
230
286
|
...(sourceReport
|
|
231
287
|
? {
|
|
232
288
|
sources: sourceReport.ranked,
|
|
@@ -291,6 +347,21 @@ export function registerContextCommand(program) {
|
|
|
291
347
|
` headroom ${String(remaining).padStart(7)} tokens remaining`,
|
|
292
348
|
),
|
|
293
349
|
);
|
|
350
|
+
if (canonicalReport?.status === "rejected") {
|
|
351
|
+
logger.log(
|
|
352
|
+
chalk.red(
|
|
353
|
+
` canonical plan rejected: ${canonicalReport.code} - ${canonicalReport.message}`,
|
|
354
|
+
),
|
|
355
|
+
);
|
|
356
|
+
} else if (canonicalReport) {
|
|
357
|
+
logger.log(
|
|
358
|
+
chalk.gray(
|
|
359
|
+
` kernel ${canonicalReport.stage}/${canonicalReport.mode}: ` +
|
|
360
|
+
`${canonicalReport.selectedItems} selected, ${canonicalReport.droppedItems} dropped, ` +
|
|
361
|
+
`${canonicalReport.selectedTokens}/${canonicalReport.inputBudget} tokens`,
|
|
362
|
+
),
|
|
363
|
+
);
|
|
364
|
+
}
|
|
294
365
|
if (total > window) {
|
|
295
366
|
logger.log(
|
|
296
367
|
chalk.red(
|
package/src/commands/graph.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
JsonlRolloutStore,
|
|
6
|
-
} from "../lib/app-server/rollout-store.js";
|
|
3
|
+
import { defaultRolloutStoreDirectory } from "../lib/app-server/rollout-store.js";
|
|
4
|
+
import { createRolloutStore } from "../lib/app-server/rollout-store-factory.js";
|
|
7
5
|
import { GraphCutoverAuthorityResolver } from "../lib/graph-kernel/cutover-authority-resolver.js";
|
|
8
6
|
import { GraphCutoverLedger } from "../lib/graph-kernel/cutover-ledger.js";
|
|
9
7
|
import {
|
|
@@ -22,16 +20,18 @@ import {
|
|
|
22
20
|
evaluateGraphProjection,
|
|
23
21
|
} from "../lib/graph-kernel/eval.js";
|
|
24
22
|
|
|
25
|
-
function graphEventStore(directory) {
|
|
23
|
+
function graphEventStore(directory, backend) {
|
|
26
24
|
return new GraphEventStore({
|
|
27
|
-
rolloutStore:
|
|
25
|
+
rolloutStore: createRolloutStore({
|
|
26
|
+
backend,
|
|
28
27
|
directory: path.resolve(directory || defaultGraphEventStoreDirectory()),
|
|
29
28
|
}),
|
|
30
29
|
});
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
function cutoverStore(directory) {
|
|
34
|
-
return
|
|
32
|
+
function cutoverStore(directory, backend) {
|
|
33
|
+
return createRolloutStore({
|
|
34
|
+
backend,
|
|
35
35
|
directory: path.resolve(directory || defaultRolloutStoreDirectory()),
|
|
36
36
|
});
|
|
37
37
|
}
|
|
@@ -99,11 +99,14 @@ export function registerGraphCommand(program) {
|
|
|
99
99
|
"Project a durable GraphRun into Agent/Task/Artifact/Trace views",
|
|
100
100
|
)
|
|
101
101
|
.option("--state-dir <path>", "Graph rollout directory")
|
|
102
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
102
103
|
.option("--at-seq <n>", "Time-travel through a durable event sequence")
|
|
103
104
|
.option("--blocked-root <nodeId>", "Locate a deterministic blocked root")
|
|
104
105
|
.option("--include-content", "Include message and HumanTask content")
|
|
105
106
|
.action((runId, options) => {
|
|
106
|
-
const events = graphEventStore(options.stateDir).read(
|
|
107
|
+
const events = graphEventStore(options.stateDir, options.store).read(
|
|
108
|
+
runId,
|
|
109
|
+
);
|
|
107
110
|
const projection = options.atSeq
|
|
108
111
|
? timeTravelGraphTrace(events, Number(options.atSeq), {
|
|
109
112
|
includeContent: options.includeContent === true,
|
|
@@ -127,8 +130,11 @@ export function registerGraphCommand(program) {
|
|
|
127
130
|
.requiredOption("--from-seq <n>", "First durable event sequence")
|
|
128
131
|
.requiredOption("--to-seq <n>", "Second durable event sequence")
|
|
129
132
|
.option("--state-dir <path>", "Graph rollout directory")
|
|
133
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
130
134
|
.action((runId, options) => {
|
|
131
|
-
const events = graphEventStore(options.stateDir).read(
|
|
135
|
+
const events = graphEventStore(options.stateDir, options.store).read(
|
|
136
|
+
runId,
|
|
137
|
+
);
|
|
132
138
|
print(
|
|
133
139
|
diffGraphTrace(
|
|
134
140
|
timeTravelGraphTrace(events, Number(options.fromSeq)),
|
|
@@ -143,13 +149,14 @@ export function registerGraphCommand(program) {
|
|
|
143
149
|
"Evaluate a durable GraphRun and optionally enforce thresholds",
|
|
144
150
|
)
|
|
145
151
|
.option("--state-dir <path>", "Graph rollout directory")
|
|
152
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
146
153
|
.option(
|
|
147
154
|
"--thresholds <json>",
|
|
148
155
|
'Metric threshold object, e.g. \'{"deadlocked":{"max":0}}\'',
|
|
149
156
|
)
|
|
150
157
|
.action((runId, options) => {
|
|
151
158
|
const projection = reduceGraphTrace(
|
|
152
|
-
graphEventStore(options.stateDir).read(runId),
|
|
159
|
+
graphEventStore(options.stateDir, options.store).read(runId),
|
|
153
160
|
);
|
|
154
161
|
const report = evaluateGraphProjection(projection);
|
|
155
162
|
const gate = options.thresholds
|
|
@@ -167,6 +174,7 @@ export function registerGraphCommand(program) {
|
|
|
167
174
|
.command("init")
|
|
168
175
|
.description("Bind declared runtime entries to the durable cutover ledger")
|
|
169
176
|
.option("--state-dir <path>", "Cutover ledger directory")
|
|
177
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
170
178
|
.option("--surface <name>", "Initialize one origin surface")
|
|
171
179
|
.option("--entry <id>", "Initialize one entry id")
|
|
172
180
|
.option(
|
|
@@ -176,7 +184,7 @@ export function registerGraphCommand(program) {
|
|
|
176
184
|
.action((options) => {
|
|
177
185
|
const manifest = loadGraphRuntimeSurfaceManifest();
|
|
178
186
|
const ledger = new GraphCutoverLedger({
|
|
179
|
-
store: cutoverStore(options.stateDir),
|
|
187
|
+
store: cutoverStore(options.stateDir, options.store),
|
|
180
188
|
});
|
|
181
189
|
const selected = selectedCutoverEntries(manifest, options).filter(
|
|
182
190
|
({ surface }) =>
|
|
@@ -205,12 +213,13 @@ export function registerGraphCommand(program) {
|
|
|
205
213
|
.command("status")
|
|
206
214
|
.description("List manifest bindings and durable cutover stages")
|
|
207
215
|
.option("--state-dir <path>", "Cutover ledger directory")
|
|
216
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
208
217
|
.option("--surface <name>", "Inspect one origin surface")
|
|
209
218
|
.option("--entry <id>", "Inspect one entry id")
|
|
210
219
|
.action((options) => {
|
|
211
220
|
const manifest = loadGraphRuntimeSurfaceManifest();
|
|
212
221
|
const ledger = new GraphCutoverLedger({
|
|
213
|
-
store: cutoverStore(options.stateDir),
|
|
222
|
+
store: cutoverStore(options.stateDir, options.store),
|
|
214
223
|
});
|
|
215
224
|
const entries = selectedCutoverEntries(manifest, options).map(
|
|
216
225
|
({ surface, entry }) => {
|
|
@@ -251,6 +260,7 @@ export function registerGraphCommand(program) {
|
|
|
251
260
|
.command("authority <surface> <entryId>")
|
|
252
261
|
.description("Resolve one new run through the durable entry ledger")
|
|
253
262
|
.option("--state-dir <path>", "Cutover ledger directory")
|
|
263
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
254
264
|
.option("--run-key <key>", "Stable logical run identity")
|
|
255
265
|
.option("--opt-in", "Explicitly enroll an opt-in-only canary run")
|
|
256
266
|
.option("--fallback <mode>", "Pre-ledger feature-flag fallback")
|
|
@@ -259,7 +269,7 @@ export function registerGraphCommand(program) {
|
|
|
259
269
|
const resolver = cutoverResolver({
|
|
260
270
|
manifest,
|
|
261
271
|
ledger: new GraphCutoverLedger({
|
|
262
|
-
store: cutoverStore(options.stateDir),
|
|
272
|
+
store: cutoverStore(options.stateDir, options.store),
|
|
263
273
|
}),
|
|
264
274
|
surface,
|
|
265
275
|
entryId,
|
|
@@ -278,11 +288,12 @@ export function registerGraphCommand(program) {
|
|
|
278
288
|
.description("Advance or roll back one entry using durable JSON evidence")
|
|
279
289
|
.requiredOption("--evidence <path>", "Evidence JSON file")
|
|
280
290
|
.option("--state-dir <path>", "Cutover ledger directory")
|
|
291
|
+
.option("--store <backend>", "Physical rollout adapter: jsonl or sqlite")
|
|
281
292
|
.option("--expected-head <digest>", "Expected ledger event head CAS")
|
|
282
293
|
.action((surface, entryId, stage, options) => {
|
|
283
294
|
const manifest = loadGraphRuntimeSurfaceManifest();
|
|
284
295
|
const ledger = new GraphCutoverLedger({
|
|
285
|
-
store: cutoverStore(options.stateDir),
|
|
296
|
+
store: cutoverStore(options.stateDir, options.store),
|
|
286
297
|
});
|
|
287
298
|
const resolver = cutoverResolver({
|
|
288
299
|
manifest,
|
package/src/commands/hmemory.js
CHANGED
|
@@ -8,6 +8,10 @@ import { numericOption } from "../lib/cli-numeric.js";
|
|
|
8
8
|
import ora from "ora";
|
|
9
9
|
import { logger } from "../lib/logger.js";
|
|
10
10
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
11
|
+
import {
|
|
12
|
+
assertLegacyMutationAllowed,
|
|
13
|
+
resolveCliContextMemoryCutover,
|
|
14
|
+
} from "../lib/context-memory-kernel/authority.js";
|
|
11
15
|
import {
|
|
12
16
|
storeMemory,
|
|
13
17
|
recallMemory,
|
|
@@ -41,6 +45,23 @@ export function registerHmemoryCommand(program) {
|
|
|
41
45
|
.command("hmemory")
|
|
42
46
|
.description("Hierarchical Memory 2.0 — four-layer memory system");
|
|
43
47
|
|
|
48
|
+
// This namespace is the pre-Kernel store. Even recall mutates access counts
|
|
49
|
+
// and forgetting state, so the entire surface is fenced once canonical owns
|
|
50
|
+
// the scope. Historical data remains available through the canonical
|
|
51
|
+
// one-time importer and `cc memory recall`.
|
|
52
|
+
hmemory.hook("preAction", (_thisCommand, actionCommand) => {
|
|
53
|
+
const decision = resolveCliContextMemoryCutover({
|
|
54
|
+
scopeKey: `cli:hmemory:${actionCommand.name()}`,
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
assertLegacyMutationAllowed(decision);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
error.message += "; use `cc memory store|recall|consolidate`";
|
|
60
|
+
error.replacement = "cc memory";
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
44
65
|
// hmemory store <content>
|
|
45
66
|
hmemory
|
|
46
67
|
.command("store")
|