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
|
@@ -8,6 +8,17 @@ export const ROLLOUT_EVENT_SCHEMA = "chainlesschain.rollout-event/v1";
|
|
|
8
8
|
export const ROLLOUT_STORE_SCHEMA = "chainlesschain.rollout-store/v1";
|
|
9
9
|
export const ROLLOUT_STORE_VERSION = 1;
|
|
10
10
|
export const ROLLOUT_STORE_MIN_VERSION = 1;
|
|
11
|
+
export const ROLLOUT_STORE_METHODS = Object.freeze([
|
|
12
|
+
"start",
|
|
13
|
+
"append",
|
|
14
|
+
"read",
|
|
15
|
+
"resume",
|
|
16
|
+
"fork",
|
|
17
|
+
"checkpoint",
|
|
18
|
+
"compact",
|
|
19
|
+
"archive",
|
|
20
|
+
"migrate",
|
|
21
|
+
]);
|
|
11
22
|
|
|
12
23
|
const ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u;
|
|
13
24
|
const IDEMPOTENCY_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u;
|
|
@@ -20,6 +31,32 @@ function storeError(code, message, details = {}) {
|
|
|
20
31
|
return error;
|
|
21
32
|
}
|
|
22
33
|
|
|
34
|
+
export function assertRolloutStore(store, { requireList = false } = {}) {
|
|
35
|
+
if (!store || typeof store !== "object") {
|
|
36
|
+
throw storeError(
|
|
37
|
+
"CC_ROLLOUT_ADAPTER_INVALID",
|
|
38
|
+
"rollout store adapter must be an object",
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
// `list` is a host discovery extension used by Thread/list and whole-store
|
|
42
|
+
// migration; the lifecycle contract itself intentionally remains the nine
|
|
43
|
+
// methods above so a remote adapter can migrate explicit thread ids.
|
|
44
|
+
const required = requireList
|
|
45
|
+
? [...ROLLOUT_STORE_METHODS, "list"]
|
|
46
|
+
: ROLLOUT_STORE_METHODS;
|
|
47
|
+
const missing = required.filter(
|
|
48
|
+
(method) => typeof store[method] !== "function",
|
|
49
|
+
);
|
|
50
|
+
if (missing.length > 0) {
|
|
51
|
+
throw storeError(
|
|
52
|
+
"CC_ROLLOUT_ADAPTER_INVALID",
|
|
53
|
+
`rollout store adapter is missing: ${missing.join(", ")}`,
|
|
54
|
+
{ missing },
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return store;
|
|
58
|
+
}
|
|
59
|
+
|
|
23
60
|
function identifier(value, label = "identifier") {
|
|
24
61
|
const output = String(value || "").trim();
|
|
25
62
|
if (!ID_PATTERN.test(output)) {
|
|
@@ -88,6 +125,21 @@ function timestamp(now) {
|
|
|
88
125
|
return new Date(now()).toISOString();
|
|
89
126
|
}
|
|
90
127
|
|
|
128
|
+
function boundedLimit(value, fallback) {
|
|
129
|
+
return Math.max(1, Math.min(100_000, Number(value) || fallback));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function startPayload({ title = null, parentThreadId = null, metadata = {} }) {
|
|
133
|
+
return {
|
|
134
|
+
title: title == null ? null : String(title).slice(0, 512),
|
|
135
|
+
parentThreadId:
|
|
136
|
+
parentThreadId == null
|
|
137
|
+
? null
|
|
138
|
+
: identifier(parentThreadId, "parentThreadId"),
|
|
139
|
+
metadata: stableValue(metadata || {}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
91
143
|
function buildRecord(input, previous, now) {
|
|
92
144
|
const threadId = identifier(input.threadId, "threadId");
|
|
93
145
|
const record = {
|
|
@@ -210,6 +262,194 @@ function projectThread(records) {
|
|
|
210
262
|
});
|
|
211
263
|
}
|
|
212
264
|
|
|
265
|
+
function recordInput(record) {
|
|
266
|
+
return {
|
|
267
|
+
threadId: record.thread_id,
|
|
268
|
+
turnId: record.turn_id,
|
|
269
|
+
itemId: record.item_id,
|
|
270
|
+
eventType: record.event_type,
|
|
271
|
+
toolUseId: record.tool_use_id,
|
|
272
|
+
approvalId: record.approval_id,
|
|
273
|
+
traceId: record.trace_id,
|
|
274
|
+
parentId: record.parent_id,
|
|
275
|
+
idempotencyKey: record.idempotency_key,
|
|
276
|
+
timestamp: record.timestamp,
|
|
277
|
+
payload: clone(record.payload),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function sameRecord(left, right) {
|
|
282
|
+
return Boolean(left && right && left.hash === right.hash);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function sameLocalAdapter(sourceStore, targetStore) {
|
|
286
|
+
if (
|
|
287
|
+
!["jsonl", "sqlite"].includes(sourceStore?.backend) ||
|
|
288
|
+
sourceStore.backend !== targetStore?.backend ||
|
|
289
|
+
!sourceStore.location ||
|
|
290
|
+
!targetStore.location
|
|
291
|
+
) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
const sourceLocation = path.resolve(sourceStore.location);
|
|
295
|
+
const targetLocation = path.resolve(targetStore.location);
|
|
296
|
+
return process.platform === "win32"
|
|
297
|
+
? sourceLocation.toLowerCase() === targetLocation.toLowerCase()
|
|
298
|
+
: sourceLocation === targetLocation;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function readAllRecords(store, threadId) {
|
|
302
|
+
const records = [];
|
|
303
|
+
let afterSeq = 0;
|
|
304
|
+
for (;;) {
|
|
305
|
+
const batch = store.read(threadId, { afterSeq, limit: 100_000 });
|
|
306
|
+
if (batch.length === 0) break;
|
|
307
|
+
records.push(...batch);
|
|
308
|
+
const nextSeq = Number(batch.at(-1)?.event_seq);
|
|
309
|
+
if (!Number.isInteger(nextSeq) || nextSeq <= afterSeq) {
|
|
310
|
+
throw storeError(
|
|
311
|
+
"CC_ROLLOUT_CORRUPT",
|
|
312
|
+
`rollout adapter did not advance while reading ${threadId}`,
|
|
313
|
+
{ threadId, afterSeq },
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
afterSeq = nextSeq;
|
|
317
|
+
if (batch.length < 100_000) break;
|
|
318
|
+
}
|
|
319
|
+
return verifyRecords(records, threadId);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Copy canonical records between physical adapters without changing their
|
|
324
|
+
* event sequence or hash chain. Existing matching prefixes make the operation
|
|
325
|
+
* restartable after a crash; any divergent target fails closed.
|
|
326
|
+
*/
|
|
327
|
+
export function migrateRolloutStore({
|
|
328
|
+
sourceStore,
|
|
329
|
+
targetStore,
|
|
330
|
+
threadIds = null,
|
|
331
|
+
dryRun = true,
|
|
332
|
+
} = {}) {
|
|
333
|
+
assertRolloutStore(sourceStore, { requireList: threadIds == null });
|
|
334
|
+
assertRolloutStore(targetStore);
|
|
335
|
+
if (
|
|
336
|
+
sourceStore === targetStore ||
|
|
337
|
+
sameLocalAdapter(sourceStore, targetStore)
|
|
338
|
+
) {
|
|
339
|
+
throw storeError(
|
|
340
|
+
"CC_ROLLOUT_MIGRATION_INVALID",
|
|
341
|
+
"source and target rollout stores must be different physical stores",
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const ids = Array.isArray(threadIds)
|
|
346
|
+
? [...new Set(threadIds.map((value) => identifier(value, "threadId")))]
|
|
347
|
+
: sourceStore
|
|
348
|
+
.list({ includeArchived: true, limit: 100_000 })
|
|
349
|
+
.map((thread) => identifier(thread.id, "threadId"));
|
|
350
|
+
let events = 0;
|
|
351
|
+
let copiedEvents = 0;
|
|
352
|
+
let alreadyPresent = 0;
|
|
353
|
+
|
|
354
|
+
for (const threadId of ids) {
|
|
355
|
+
const sourceRecords = readAllRecords(sourceStore, threadId);
|
|
356
|
+
if (sourceRecords.length === 0) continue;
|
|
357
|
+
events += sourceRecords.length;
|
|
358
|
+
|
|
359
|
+
let targetRecords = [];
|
|
360
|
+
try {
|
|
361
|
+
targetRecords = readAllRecords(targetStore, threadId);
|
|
362
|
+
} catch (error) {
|
|
363
|
+
if (
|
|
364
|
+
error?.code !== "CC_ROLLOUT_THREAD_NOT_FOUND" &&
|
|
365
|
+
!/thread does not exist/u.test(String(error?.message || ""))
|
|
366
|
+
) {
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (targetRecords.length > sourceRecords.length) {
|
|
371
|
+
throw storeError(
|
|
372
|
+
"CC_ROLLOUT_MIGRATION_CONFLICT",
|
|
373
|
+
`target rollout is ahead of source: ${threadId}`,
|
|
374
|
+
{ threadId },
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
for (let index = 0; index < targetRecords.length; index += 1) {
|
|
378
|
+
if (!sameRecord(targetRecords[index], sourceRecords[index])) {
|
|
379
|
+
throw storeError(
|
|
380
|
+
"CC_ROLLOUT_MIGRATION_CONFLICT",
|
|
381
|
+
`target rollout diverged from source: ${threadId}`,
|
|
382
|
+
{ threadId, eventSeq: index + 1 },
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
alreadyPresent += targetRecords.length;
|
|
387
|
+
if (dryRun !== false) {
|
|
388
|
+
copiedEvents += sourceRecords.length - targetRecords.length;
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
let offset = targetRecords.length;
|
|
393
|
+
if (offset === 0) {
|
|
394
|
+
const first = sourceRecords[0];
|
|
395
|
+
if (first.event_type !== "thread.started") {
|
|
396
|
+
throw storeError(
|
|
397
|
+
"CC_ROLLOUT_CORRUPT",
|
|
398
|
+
`rollout does not begin with thread.started: ${threadId}`,
|
|
399
|
+
{ threadId },
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
targetStore.start({
|
|
403
|
+
threadId,
|
|
404
|
+
title: first.payload?.title ?? null,
|
|
405
|
+
parentThreadId: first.payload?.parentThreadId ?? null,
|
|
406
|
+
metadata: clone(first.payload?.metadata || {}),
|
|
407
|
+
timestamp: first.timestamp,
|
|
408
|
+
});
|
|
409
|
+
const copied = targetStore.read(threadId, { limit: 1 })[0];
|
|
410
|
+
if (!sameRecord(copied, first)) {
|
|
411
|
+
throw storeError(
|
|
412
|
+
"CC_ROLLOUT_MIGRATION_CONFLICT",
|
|
413
|
+
`target adapter changed the canonical start record: ${threadId}`,
|
|
414
|
+
{ threadId, eventSeq: 1 },
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
copiedEvents += 1;
|
|
418
|
+
offset = 1;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
for (let index = offset; index < sourceRecords.length; index += 1) {
|
|
422
|
+
const previous = sourceRecords[index - 1];
|
|
423
|
+
const expected = sourceRecords[index];
|
|
424
|
+
const copied = targetStore.append({
|
|
425
|
+
...recordInput(expected),
|
|
426
|
+
expectedRevision: previous.event_seq,
|
|
427
|
+
expectedHeadHash: previous.hash,
|
|
428
|
+
});
|
|
429
|
+
if (!sameRecord(copied, expected)) {
|
|
430
|
+
throw storeError(
|
|
431
|
+
"CC_ROLLOUT_MIGRATION_CONFLICT",
|
|
432
|
+
`target adapter changed a canonical event: ${threadId}`,
|
|
433
|
+
{ threadId, eventSeq: expected.event_seq },
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
copiedEvents += 1;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return Object.freeze({
|
|
441
|
+
schema: ROLLOUT_STORE_SCHEMA,
|
|
442
|
+
fromVersion: ROLLOUT_STORE_VERSION,
|
|
443
|
+
toVersion: ROLLOUT_STORE_VERSION,
|
|
444
|
+
dryRun: dryRun !== false,
|
|
445
|
+
threads: ids.length,
|
|
446
|
+
events,
|
|
447
|
+
copiedEvents,
|
|
448
|
+
alreadyPresent,
|
|
449
|
+
backupRequired: false,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
|
|
213
453
|
export function defaultRolloutStoreDirectory() {
|
|
214
454
|
return path.join(getHomeDir(), "app-server", "rollouts");
|
|
215
455
|
}
|
|
@@ -274,6 +514,7 @@ export class JsonlRolloutStore {
|
|
|
274
514
|
title = null,
|
|
275
515
|
parentThreadId = null,
|
|
276
516
|
metadata = {},
|
|
517
|
+
timestamp: startedAt = null,
|
|
277
518
|
} = {}) {
|
|
278
519
|
const safeThreadId = identifier(threadId, "threadId");
|
|
279
520
|
this._ensureDirectory();
|
|
@@ -288,14 +529,8 @@ export class JsonlRolloutStore {
|
|
|
288
529
|
threadId: safeThreadId,
|
|
289
530
|
eventType: "thread.started",
|
|
290
531
|
idempotencyKey: `thread:${safeThreadId}`,
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
parentThreadId:
|
|
294
|
-
parentThreadId == null
|
|
295
|
-
? null
|
|
296
|
-
: identifier(parentThreadId, "parentThreadId"),
|
|
297
|
-
metadata: stableValue(metadata),
|
|
298
|
-
},
|
|
532
|
+
timestamp: startedAt || undefined,
|
|
533
|
+
payload: startPayload({ title, parentThreadId, metadata }),
|
|
299
534
|
},
|
|
300
535
|
null,
|
|
301
536
|
this.now,
|
|
@@ -349,7 +584,7 @@ export class JsonlRolloutStore {
|
|
|
349
584
|
}
|
|
350
585
|
|
|
351
586
|
read(threadId, { afterSeq = 0, limit = 10_000 } = {}) {
|
|
352
|
-
const safeLimit =
|
|
587
|
+
const safeLimit = boundedLimit(limit, 10_000);
|
|
353
588
|
return clone(
|
|
354
589
|
this._readUnsafe(threadId)
|
|
355
590
|
.filter((record) => record.event_seq > Number(afterSeq || 0))
|
|
@@ -387,7 +622,7 @@ export class JsonlRolloutStore {
|
|
|
387
622
|
}
|
|
388
623
|
return output
|
|
389
624
|
.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))
|
|
390
|
-
.slice(0,
|
|
625
|
+
.slice(0, boundedLimit(limit, 100));
|
|
391
626
|
}
|
|
392
627
|
|
|
393
628
|
forkThread(sourceThreadId, { threadId = randomUUID(), title = null } = {}) {
|
|
@@ -412,6 +647,10 @@ export class JsonlRolloutStore {
|
|
|
412
647
|
return this.resume(target.id);
|
|
413
648
|
}
|
|
414
649
|
|
|
650
|
+
fork(sourceThreadId, options = {}) {
|
|
651
|
+
return this.forkThread(sourceThreadId, options);
|
|
652
|
+
}
|
|
653
|
+
|
|
415
654
|
checkpoint(threadId, payload = {}) {
|
|
416
655
|
return this.append({
|
|
417
656
|
threadId,
|
|
@@ -450,14 +689,27 @@ export class JsonlRolloutStore {
|
|
|
450
689
|
}
|
|
451
690
|
|
|
452
691
|
migrate({
|
|
453
|
-
fromVersion,
|
|
692
|
+
fromVersion = ROLLOUT_STORE_VERSION,
|
|
454
693
|
toVersion = ROLLOUT_STORE_VERSION,
|
|
455
694
|
dryRun = true,
|
|
695
|
+
targetStore = null,
|
|
696
|
+
threadIds = null,
|
|
456
697
|
} = {}) {
|
|
698
|
+
if (targetStore) {
|
|
699
|
+
return migrateRolloutStore({
|
|
700
|
+
sourceStore: this,
|
|
701
|
+
targetStore,
|
|
702
|
+
threadIds,
|
|
703
|
+
dryRun,
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
const normalizedFromVersion = Number(fromVersion);
|
|
707
|
+
const normalizedToVersion = Number(toVersion);
|
|
457
708
|
if (
|
|
458
|
-
Number(
|
|
459
|
-
|
|
460
|
-
|
|
709
|
+
!Number.isInteger(normalizedFromVersion) ||
|
|
710
|
+
normalizedFromVersion < ROLLOUT_STORE_MIN_VERSION ||
|
|
711
|
+
normalizedFromVersion > ROLLOUT_STORE_VERSION ||
|
|
712
|
+
normalizedToVersion !== ROLLOUT_STORE_VERSION
|
|
461
713
|
) {
|
|
462
714
|
throw storeError(
|
|
463
715
|
"CC_ROLLOUT_MIGRATION_UNSUPPORTED",
|
|
@@ -466,8 +718,8 @@ export class JsonlRolloutStore {
|
|
|
466
718
|
}
|
|
467
719
|
return Object.freeze({
|
|
468
720
|
schema: ROLLOUT_STORE_SCHEMA,
|
|
469
|
-
fromVersion:
|
|
470
|
-
toVersion:
|
|
721
|
+
fromVersion: normalizedFromVersion,
|
|
722
|
+
toVersion: normalizedToVersion,
|
|
471
723
|
dryRun: dryRun !== false,
|
|
472
724
|
changes: 0,
|
|
473
725
|
backupRequired: false,
|
|
@@ -486,6 +738,7 @@ export class MemoryRolloutStore {
|
|
|
486
738
|
title = null,
|
|
487
739
|
parentThreadId = null,
|
|
488
740
|
metadata = {},
|
|
741
|
+
timestamp: startedAt = null,
|
|
489
742
|
} = {}) {
|
|
490
743
|
const safeThreadId = identifier(threadId, "threadId");
|
|
491
744
|
if (this.records.has(safeThreadId)) return this.resume(safeThreadId);
|
|
@@ -494,7 +747,8 @@ export class MemoryRolloutStore {
|
|
|
494
747
|
threadId: safeThreadId,
|
|
495
748
|
eventType: "thread.started",
|
|
496
749
|
idempotencyKey: `thread:${safeThreadId}`,
|
|
497
|
-
|
|
750
|
+
timestamp: startedAt || undefined,
|
|
751
|
+
payload: startPayload({ title, parentThreadId, metadata }),
|
|
498
752
|
},
|
|
499
753
|
null,
|
|
500
754
|
this.now,
|
|
@@ -546,7 +800,7 @@ export class MemoryRolloutStore {
|
|
|
546
800
|
return clone(
|
|
547
801
|
records
|
|
548
802
|
.filter((record) => record.event_seq > Number(afterSeq || 0))
|
|
549
|
-
.slice(0, limit),
|
|
803
|
+
.slice(0, boundedLimit(limit, 10_000)),
|
|
550
804
|
);
|
|
551
805
|
}
|
|
552
806
|
|
|
@@ -559,7 +813,7 @@ export class MemoryRolloutStore {
|
|
|
559
813
|
.map((threadId) => this.resume(threadId))
|
|
560
814
|
.filter((thread) => includeArchived || thread.status !== "archived")
|
|
561
815
|
.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))
|
|
562
|
-
.slice(0, limit);
|
|
816
|
+
.slice(0, boundedLimit(limit, 100));
|
|
563
817
|
}
|
|
564
818
|
|
|
565
819
|
forkThread(sourceThreadId, { threadId = randomUUID(), title = null } = {}) {
|
|
@@ -583,6 +837,10 @@ export class MemoryRolloutStore {
|
|
|
583
837
|
return this.resume(target.id);
|
|
584
838
|
}
|
|
585
839
|
|
|
840
|
+
fork(sourceThreadId, options = {}) {
|
|
841
|
+
return this.forkThread(sourceThreadId, options);
|
|
842
|
+
}
|
|
843
|
+
|
|
586
844
|
checkpoint(threadId, payload = {}) {
|
|
587
845
|
return this.append({
|
|
588
846
|
threadId,
|
|
@@ -593,13 +851,19 @@ export class MemoryRolloutStore {
|
|
|
593
851
|
}
|
|
594
852
|
|
|
595
853
|
compact(threadId, options = {}) {
|
|
854
|
+
if (typeof options.summary !== "string" || !options.summary.trim()) {
|
|
855
|
+
throw storeError(
|
|
856
|
+
"CC_ROLLOUT_INVALID_ARGUMENT",
|
|
857
|
+
"compaction summary is required",
|
|
858
|
+
);
|
|
859
|
+
}
|
|
596
860
|
return this.append({
|
|
597
861
|
threadId,
|
|
598
862
|
eventType: "rollout.compacted",
|
|
599
863
|
idempotencyKey: options.idempotencyKey || null,
|
|
600
864
|
payload: {
|
|
601
|
-
summary:
|
|
602
|
-
retainedState: options.retainedState
|
|
865
|
+
summary: options.summary,
|
|
866
|
+
retainedState: options.retainedState ?? {},
|
|
603
867
|
},
|
|
604
868
|
});
|
|
605
869
|
}
|
|
@@ -615,10 +879,31 @@ export class MemoryRolloutStore {
|
|
|
615
879
|
}
|
|
616
880
|
|
|
617
881
|
migrate(options = {}) {
|
|
882
|
+
if (options.targetStore) {
|
|
883
|
+
return migrateRolloutStore({
|
|
884
|
+
sourceStore: this,
|
|
885
|
+
targetStore: options.targetStore,
|
|
886
|
+
threadIds: options.threadIds || null,
|
|
887
|
+
dryRun: options.dryRun,
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
const fromVersion = Number(options.fromVersion ?? ROLLOUT_STORE_VERSION);
|
|
891
|
+
const toVersion = Number(options.toVersion ?? ROLLOUT_STORE_VERSION);
|
|
892
|
+
if (
|
|
893
|
+
!Number.isInteger(fromVersion) ||
|
|
894
|
+
fromVersion < ROLLOUT_STORE_MIN_VERSION ||
|
|
895
|
+
fromVersion > ROLLOUT_STORE_VERSION ||
|
|
896
|
+
toVersion !== ROLLOUT_STORE_VERSION
|
|
897
|
+
) {
|
|
898
|
+
throw storeError(
|
|
899
|
+
"CC_ROLLOUT_MIGRATION_UNSUPPORTED",
|
|
900
|
+
`rollout migration ${fromVersion} -> ${toVersion} is unsupported`,
|
|
901
|
+
);
|
|
902
|
+
}
|
|
618
903
|
return Object.freeze({
|
|
619
904
|
schema: ROLLOUT_STORE_SCHEMA,
|
|
620
|
-
fromVersion
|
|
621
|
-
toVersion
|
|
905
|
+
fromVersion,
|
|
906
|
+
toVersion,
|
|
622
907
|
dryRun: options.dryRun !== false,
|
|
623
908
|
changes: 0,
|
|
624
909
|
backupRequired: false,
|
|
@@ -627,9 +912,11 @@ export class MemoryRolloutStore {
|
|
|
627
912
|
}
|
|
628
913
|
|
|
629
914
|
export const _rolloutStoreInternals = Object.freeze({
|
|
915
|
+
assertExpectedHead,
|
|
630
916
|
buildRecord,
|
|
631
917
|
canonicalJson,
|
|
632
918
|
digest,
|
|
633
919
|
projectThread,
|
|
920
|
+
startPayload,
|
|
634
921
|
verifyRecords,
|
|
635
922
|
});
|