chainlesschain 0.166.129 → 0.166.131
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 +24 -2
- package/package.json +2 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
- package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
- package/src/assets/web-panel/assets/{ActionButton-_zlP_Z6z.js → ActionButton-nhMNWW_d.js} +1 -1
- package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
- package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
- package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
- package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
- package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
- package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
- package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
- package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
- package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
- package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
- package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-nMgYkH8H.js → Checkbox-B4g_ckJq.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
- package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
- package/src/assets/web-panel/assets/{Col-i0owJaGP.js → Col-IO1NEUYL.js} +1 -1
- package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
- package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
- package/src/assets/web-panel/assets/{Compact-DDXrvvm-.js → Compact-DYs0a9k7.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
- package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
- package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
- package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
- package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
- package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
- package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
- package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
- package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
- package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
- package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
- package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
- package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
- package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
- package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
- package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
- package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
- package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
- package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
- package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
- package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
- package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
- package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
- package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
- package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
- package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
- package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
- package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
- package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
- package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
- package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
- package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
- package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
- package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
- package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
- package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
- package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
- package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
- package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
- package/src/assets/web-panel/assets/{Overflow-CaRUAOY_.js → Overflow-DH4QPEoI.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
- package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
- package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
- package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
- package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
- package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
- package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
- package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
- package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
- package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
- package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
- package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
- package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
- package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
- package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
- package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-fFkycCT4.js → QrScannerModal-CxifoeD5.js} +1 -1
- package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
- package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
- package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
- package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
- package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
- package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
- package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
- package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
- package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
- package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
- package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
- package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
- package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
- package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
- package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
- package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
- package/src/assets/web-panel/assets/{Skeleton-ASRgSh_Y.js → Skeleton-DfN6BFzt.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
- package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
- package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
- package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
- package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
- package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
- package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
- package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
- package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
- package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
- package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
- package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-DgGU_D0o.js → Trigger-CLym84HI.js} +1 -1
- package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
- package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
- package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
- package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
- package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
- package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
- package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C_kELmV6.js → chat-BdYOI4gM.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DE-ZxAv_.js → colors-DcTBrGvS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BowulLDi.js → compact-item-Dn2ktVuj.js} +1 -1
- package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
- package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
- package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
- package/src/assets/web-panel/assets/{hasIn-Be7mK-iw.js → hasIn-CFRNsYQd.js} +1 -1
- package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
- package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
- package/src/assets/web-panel/assets/{index-nLHTuHoT.js → index-8METW_Wr.js} +1 -1
- package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
- package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
- package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
- package/src/assets/web-panel/assets/{index-DMKo49Um.js → index-BSqydcDa.js} +1 -1
- package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
- package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
- package/src/assets/web-panel/assets/{index-DjC2TJeH.js → index-Brc0BF-k.js} +2 -2
- package/src/assets/web-panel/assets/{index-3Ql7xQLn.js → index-CG9YLDmI.js} +1 -1
- package/src/assets/web-panel/assets/{index-lN916819.js → index-CNHWMMDX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLCzaLH4.js → index-COuEJdmr.js} +3 -3
- package/src/assets/web-panel/assets/{index-BdzVLz-c.js → index-CRW3AWdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-_cYsz4df.js → index-CUT4h5JB.js} +2 -2
- package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
- package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
- package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
- package/src/assets/web-panel/assets/{index-OH54KMLN.js → index-CjHA_Q7s.js} +1 -1
- package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
- package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
- package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
- package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
- package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
- package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
- package/src/assets/web-panel/assets/{index-DEDVYN7D.js → index-DQEu7uW0.js} +1 -1
- package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
- package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
- package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
- package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
- package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
- package/src/assets/web-panel/assets/{index-Ao-LXr-d.js → index-Vo7A4aiN.js} +4 -4
- package/src/assets/web-panel/assets/{index-LVrxqU88.js → index-XdlYkgCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-4KkYmFy5.js → index-ir2ZwWz5.js} +2 -2
- package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
- package/src/assets/web-panel/assets/{index-Cvy4vdVW.js → index-lnTt0Jps.js} +2 -2
- package/src/assets/web-panel/assets/{index-D3lOYd9_.js → index-ma-rJkfE.js} +1 -1
- package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
- package/src/assets/web-panel/assets/{index-CXvy8HrM.js → index-r5sNECM5.js} +1 -1
- package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
- package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-BNhziAal.js → initDefaultProps-mdL0oeZa.js} +1 -1
- package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
- package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
- package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
- package/src/assets/web-panel/assets/{move-rFx211Cl.js → move-A_28O5T2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CEP1wN3R.js → mtc-parser-0zlMjabo.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DacHd_Zm.js → omit-DF7mU3yG.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Dqp58Ep2.js → pickAttrs-Cmt8liJP.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Cv6Rm0pV.js → placementArrow-DaMDC57b.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-rNE0p9ZW.js → responsiveObserve-CHw_f2d3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C97JxD4S.js → slide-DJS9fFQq.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Cxk1gV9M.js → statusUtils-Bk3XdZwh.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CbtKKsPo.js → styleChecker-DMybAFsA.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
- package/src/assets/web-panel/assets/{useFs-6c7qrpE_.js → useFs-KPklVptS.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-OjxtBGe7.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
- package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
- package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
- package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
- package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
- package/src/assets/web-panel/assets/{zoom-Cc1qKiSZ.js → zoom-C8rAdf81.js} +1 -1
- package/src/assets/web-panel/index.html +4 -4
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +1 -1
- package/src/commands/governed-skill-marketplace.js +24 -10
- package/src/commands/llm.js +4 -3
- package/src/constants.js +1 -1
- package/src/data/changelog.json +27 -1
- package/src/harness/worktree-isolator.js +4 -1
- package/src/lib/compaction-host-provenance.js +24 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
- package/src/lib/context-memory-kernel/live-compaction.js +12 -3
- package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
- package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
- package/src/lib/context-memory-kernel/memory-service.js +30 -16
- package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
- package/src/lib/context-memory-kernel/provider-context.js +55 -24
- package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
- package/src/lib/cost-budget.js +2 -0
- package/src/lib/ephemeral-worktree-scope.js +24 -0
- package/src/lib/evolution/evolution-deployment-loader.js +6 -4
- package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
- package/src/lib/evolution/governed-skill-marketplace.js +47 -24
- package/src/lib/goal-assess.js +4 -1
- package/src/lib/goal-check-evidence.js +77 -9
- package/src/lib/goal-condition-engine.js +20 -3
- package/src/lib/goal-model-call.js +107 -0
- package/src/lib/goal-verification-command.js +221 -0
- package/src/lib/goal-verification-plan.js +372 -0
- package/src/lib/goal-workspace-evidence.js +299 -0
- package/src/lib/llm-connection-probe.js +12 -5
- package/src/lib/llm-onboarding-catalog.json +2 -2
- package/src/lib/llm-pricing.js +34 -8
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/mcp-tool-catalog-authority.js +244 -0
- package/src/lib/model-capabilities.js +6 -0
- package/src/lib/model-catalog-review.js +3 -0
- package/src/lib/model-context-catalog.js +44 -2
- package/src/lib/openai-responses.js +35 -6
- package/src/lib/sub-agent-context.js +12 -4
- package/src/lib/subagent-inheritance.js +162 -2
- package/src/lib/task-model-selector.js +1 -1
- package/src/lib/usage-pricing-context.js +34 -17
- package/src/repl/agent-repl.js +34 -2
- package/src/runtime/agent-core.js +226 -10
- package/src/runtime/compaction-host-context.js +72 -0
- package/src/runtime/headless-runner.js +331 -141
- package/src/runtime/headless-stream.js +38 -21
- package/src/runtime/mcp-agent-catalog.js +257 -0
- package/src/runtime/mcp-config.js +18 -69
- package/src/runtime/mcp-tool-search.js +16 -1
- package/src/runtime/system-prompt.js +9 -0
- package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
- package/src/assets/web-panel/assets/AIOps-CjPaaF2r.js +0 -1
- package/src/assets/web-panel/assets/Analytics-C7X31L8l.js +0 -3
- package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-BmYa34Se.js +0 -9
- package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
- package/src/assets/web-panel/assets/Artifacts-B_YKNjlp.js +0 -1
- package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
- package/src/assets/web-panel/assets/Audit-5JsI67XQ.js +0 -1
- package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents-BL3QbzvS.js +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
- package/src/assets/web-panel/assets/Backup-BRmg-gTa.js +0 -1
- package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
- package/src/assets/web-panel/assets/BaseInput-DNE7mT3K.js +0 -1
- package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
- package/src/assets/web-panel/assets/Chat-OYwAopdM.js +0 -8
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Dtxw3Wgt.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
- package/src/assets/web-panel/assets/Codegen-B9G2ngLI.js +0 -1
- package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
- package/src/assets/web-panel/assets/Community-B3Ta0mI_.js +0 -1
- package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
- package/src/assets/web-panel/assets/Compliance-Bn4Uq6U1.js +0 -1
- package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
- package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
- package/src/assets/web-panel/assets/Cowork-CO5NKD6r.js +0 -6
- package/src/assets/web-panel/assets/Cron-ByjNese0.js +0 -2
- package/src/assets/web-panel/assets/Crosschain-BN1FUYyi.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
- package/src/assets/web-panel/assets/DID-CUFX5RL3.js +0 -2
- package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-D_2FDPBP.js +0 -3
- package/src/assets/web-panel/assets/Dropdown-lGOMtIzb.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-DA3Qf1S2.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-DLcnicCr.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-BPOSaIN1.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
- package/src/assets/web-panel/assets/Federation-DzJUCQq8.js +0 -1
- package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
- package/src/assets/web-panel/assets/FormItemContext-DVx1XNKx.js +0 -2
- package/src/assets/web-panel/assets/GenericCardRenderer-BkqzO_lh.js +0 -1
- package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
- package/src/assets/web-panel/assets/Git-Dr_rdT_j.js +0 -2
- package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
- package/src/assets/web-panel/assets/Governance-DyVkZddw.js +0 -1
- package/src/assets/web-panel/assets/Inference-IN2YDd4v.js +0 -1
- package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-Ceiy4n6N.js +0 -1
- package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
- package/src/assets/web-panel/assets/Logs-d7pIEAX2.js +0 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DmSl0MNI.js +0 -1
- package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-uVE7U14g.js +0 -1
- package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
- package/src/assets/web-panel/assets/McpTools-DUfBM--y.js +0 -4
- package/src/assets/web-panel/assets/Memory-6gkcR02J.js +0 -2
- package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
- package/src/assets/web-panel/assets/MobileBridge-Cl6ys2O9.js +0 -1
- package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
- package/src/assets/web-panel/assets/MobileProjects-5P8jN4gf.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
- package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
- package/src/assets/web-panel/assets/Mtc-DtiT1Kol.js +0 -6
- package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
- package/src/assets/web-panel/assets/MtcAudit-DZz8iiTE.js +0 -19
- package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
- package/src/assets/web-panel/assets/Multisig-DFH3-fBJ.js +0 -13
- package/src/assets/web-panel/assets/NLProgramming-BYNuDOt-.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
- package/src/assets/web-panel/assets/Notes-BCY4jgYy.js +0 -7
- package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
- package/src/assets/web-panel/assets/NotificationSettings-Bk2ltghU.js +0 -1
- package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-OdeXEGAn.js +0 -1
- package/src/assets/web-panel/assets/Organization-CY4_mSiV.js +0 -4
- package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
- package/src/assets/web-panel/assets/P2P-Bd96rBWQ.js +0 -2
- package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-JjnExxan.js +0 -7
- package/src/assets/web-panel/assets/Permissions-CW1PUJB0.js +0 -4
- package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-BNn9alTk.js +0 -9
- package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
- package/src/assets/web-panel/assets/Pipeline-01_PBiUu.js +0 -1
- package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
- package/src/assets/web-panel/assets/Privacy-BP4DlVGb.js +0 -1
- package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-CAMnQj4n.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
- package/src/assets/web-panel/assets/ProjectSettings-DKxV5On_.js +0 -2
- package/src/assets/web-panel/assets/Projects-B_4kRnM8.js +0 -1
- package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
- package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
- package/src/assets/web-panel/assets/Providers-DeqqZyUv.js +0 -1
- package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
- package/src/assets/web-panel/assets/QuickAsk-Ln6qQidy.js +0 -1
- package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
- package/src/assets/web-panel/assets/Recommend-DeENA-y0.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-CRxSYxo4.js +0 -5
- package/src/assets/web-panel/assets/Reputation-B2kU2F0l.js +0 -1
- package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
- package/src/assets/web-panel/assets/Row-lV_nLlFq.js +0 -1
- package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
- package/src/assets/web-panel/assets/RssFeed-Df21mCdF.js +0 -3
- package/src/assets/web-panel/assets/Search-8_Dz4qU9.js +0 -1
- package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
- package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
- package/src/assets/web-panel/assets/Security-Cl5-PEcp.js +0 -4
- package/src/assets/web-panel/assets/Services-C5qgCqA7.js +0 -2
- package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
- package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
- package/src/assets/web-panel/assets/Skills-DWx01ZJ7.js +0 -1
- package/src/assets/web-panel/assets/Sla-I2gbgtW8.js +0 -1
- package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-BqTikzfe.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-D3zCpBFV.js +0 -2
- package/src/assets/web-panel/assets/Tasks-DjMWII45.js +0 -1
- package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
- package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
- package/src/assets/web-panel/assets/Templates-Cq7qDnHX.js +0 -1
- package/src/assets/web-panel/assets/Tenant-DEasKDpQ.js +0 -1
- package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
- package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
- package/src/assets/web-panel/assets/Terminal-J6fLkTzi.js +0 -3
- package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-CNvWrWN-.js +0 -1
- package/src/assets/web-panel/assets/Tokens-BSgHJCKH.js +0 -1
- package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
- package/src/assets/web-panel/assets/Trust-BANlv-uB.js +0 -1
- package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
- package/src/assets/web-panel/assets/UkeySign-qh8GPRsU.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
- package/src/assets/web-panel/assets/VideoEditing-DBiGTB4H.js +0 -1
- package/src/assets/web-panel/assets/Wallet-DMUFR7cL.js +0 -4
- package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-DP9nQQzW.js +0 -5
- package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-DT_6jDkL.js +0 -1
- package/src/assets/web-panel/assets/createContext-DCh8oMBQ.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +0 -1
- package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
- package/src/assets/web-panel/assets/index-6OluUVJJ.js +0 -55
- package/src/assets/web-panel/assets/index-B-3EDOlf.js +0 -1
- package/src/assets/web-panel/assets/index-B7IhCfsh.js +0 -1
- package/src/assets/web-panel/assets/index-BDIIR8g6.js +0 -1
- package/src/assets/web-panel/assets/index-BMrbe_Ey.js +0 -1
- package/src/assets/web-panel/assets/index-BlzMqaWB.js +0 -1
- package/src/assets/web-panel/assets/index-BwY31W-u.js +0 -12
- package/src/assets/web-panel/assets/index-C2pCquZC.js +0 -1
- package/src/assets/web-panel/assets/index-CKmC6ugN.js +0 -1
- package/src/assets/web-panel/assets/index-CL2hAUWh.js +0 -1
- package/src/assets/web-panel/assets/index-CUXfwAhF.js +0 -3
- package/src/assets/web-panel/assets/index-C_VnSUjh.js +0 -3
- package/src/assets/web-panel/assets/index-CecGCLWI.js +0 -31
- package/src/assets/web-panel/assets/index-Ck6MYKVN.js +0 -21
- package/src/assets/web-panel/assets/index-CwJfLNqv.js +0 -1
- package/src/assets/web-panel/assets/index-DMDaGPxG.js +0 -19
- package/src/assets/web-panel/assets/index-DN1AT3FH.js +0 -1
- package/src/assets/web-panel/assets/index-DOebEvgn.js +0 -1
- package/src/assets/web-panel/assets/index-DPX3N4T8.js +0 -13
- package/src/assets/web-panel/assets/index-DSRKtgJg.js +0 -1
- package/src/assets/web-panel/assets/index-DSqZBvQM.js +0 -12
- package/src/assets/web-panel/assets/index-DbrQO1p9.js +0 -21
- package/src/assets/web-panel/assets/index-Qx8cTReg.js +0 -75
- package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
- package/src/assets/web-panel/assets/motion-fUkbJz38.js +0 -11
- package/src/assets/web-panel/assets/useFlexGapSupport-CQATs2JQ.js +0 -1
- package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
- package/src/assets/web-panel/assets/vnode-CSlXfUSh.js +0 -1
|
@@ -40,6 +40,16 @@ import {
|
|
|
40
40
|
queryDigest,
|
|
41
41
|
selectQueryRows,
|
|
42
42
|
} from "./memory-query-index.js";
|
|
43
|
+
import {
|
|
44
|
+
checkMemoryQueryAborted,
|
|
45
|
+
createMemoryQueryCheckpoint,
|
|
46
|
+
} from "./memory-query-control.js";
|
|
47
|
+
import { MemoryShardSnapshots } from "./memory-shard-snapshots.js";
|
|
48
|
+
import {
|
|
49
|
+
createQueryBundlePlan,
|
|
50
|
+
readQueryBundle,
|
|
51
|
+
writeQueryBundle,
|
|
52
|
+
} from "./memory-query-bundle.js";
|
|
43
53
|
|
|
44
54
|
export const SEGMENTED_STORE_SCHEMA =
|
|
45
55
|
"chainlesschain.cli-context-memory-store/v2";
|
|
@@ -103,6 +113,7 @@ function regular(file) {
|
|
|
103
113
|
}
|
|
104
114
|
function directories(directory) {
|
|
105
115
|
let current = resolve(directory);
|
|
116
|
+
const requested = current;
|
|
106
117
|
while (true) {
|
|
107
118
|
const stat = lstatSync(current);
|
|
108
119
|
// macOS exposes its system temporary tree through the root-owned /var
|
|
@@ -115,28 +126,27 @@ function directories(directory) {
|
|
|
115
126
|
realpathSync(current) === `/private${current}`;
|
|
116
127
|
if (!systemAlias && (!stat.isDirectory() || stat.isSymbolicLink()))
|
|
117
128
|
throw corruptStore(current, "authority directory is unsafe");
|
|
118
|
-
if (process.platform === "win32") {
|
|
119
|
-
// Some Windows runtime adapters report an ordinary directory for a
|
|
120
|
-
// junction whose target cannot be decoded in their DOS namespace. Keep
|
|
121
|
-
// the lstat guard and independently reject a different native canonical
|
|
122
|
-
// coordinate before mkdir or lock acquisition. This is an additional
|
|
123
|
-
// consistency check, not a proof against every reparse tag or a race.
|
|
124
|
-
let canonical;
|
|
125
|
-
try {
|
|
126
|
-
canonical = realpathSync.native(current);
|
|
127
|
-
} catch {
|
|
128
|
-
throw corruptStore(current, "authority directory cannot be resolved");
|
|
129
|
-
}
|
|
130
|
-
if (
|
|
131
|
-
typeof canonical !== "string" ||
|
|
132
|
-
resolve(canonical).toLowerCase() !== current.toLowerCase()
|
|
133
|
-
)
|
|
134
|
-
throw corruptStore(current, "authority directory resolves elsewhere");
|
|
135
|
-
}
|
|
136
129
|
const parent = dirname(current);
|
|
137
130
|
if (parent === current) break;
|
|
138
131
|
current = parent;
|
|
139
132
|
}
|
|
133
|
+
if (process.platform === "win32") {
|
|
134
|
+
// Native resolution of the whole path follows redirects in every ancestor.
|
|
135
|
+
// Retain lstat on every ancestor, including adapters that misclassify a
|
|
136
|
+
// junction; avoid re-resolving all the same prefixes per shard. This is a
|
|
137
|
+
// consistency check, not a proof against every reparse tag or a race.
|
|
138
|
+
let canonical;
|
|
139
|
+
try {
|
|
140
|
+
canonical = realpathSync.native(requested);
|
|
141
|
+
} catch {
|
|
142
|
+
throw corruptStore(requested, "authority directory cannot be resolved");
|
|
143
|
+
}
|
|
144
|
+
if (
|
|
145
|
+
typeof canonical !== "string" ||
|
|
146
|
+
resolve(canonical).toLowerCase() !== requested.toLowerCase()
|
|
147
|
+
)
|
|
148
|
+
throw corruptStore(requested, "authority directory resolves elsewhere");
|
|
149
|
+
}
|
|
140
150
|
}
|
|
141
151
|
function identity(directory) {
|
|
142
152
|
const stat = lstatSync(directory);
|
|
@@ -166,11 +176,15 @@ function ensureSafeDirectory(directory) {
|
|
|
166
176
|
* authority. Audit events are retained, not truncated to buy record capacity.
|
|
167
177
|
*/
|
|
168
178
|
export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
179
|
+
#shardSnapshots;
|
|
180
|
+
|
|
169
181
|
constructor({
|
|
170
182
|
maxTotalBytes = DEFAULT_MAX_TOTAL_BYTES,
|
|
171
183
|
maxEvents = DEFAULT_SEGMENTED_MAX_EVENTS,
|
|
172
184
|
readOnly = false,
|
|
173
185
|
queryIndexCacheMode = "validate-disk",
|
|
186
|
+
queryIndexLayout = "bundle",
|
|
187
|
+
decodedShardCacheBytes,
|
|
174
188
|
...options
|
|
175
189
|
} = {}) {
|
|
176
190
|
super({ ...options, maxEvents });
|
|
@@ -181,12 +195,17 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
181
195
|
if (!["validate-disk", "verified-memory"].includes(queryIndexCacheMode))
|
|
182
196
|
throw new TypeError("Unknown query index cache mode");
|
|
183
197
|
this.queryIndexCacheMode = queryIndexCacheMode;
|
|
198
|
+
if (!["bundle", "individual"].includes(queryIndexLayout))
|
|
199
|
+
throw new TypeError("Unknown query index layout");
|
|
200
|
+
this.queryIndexLayout = queryIndexLayout;
|
|
184
201
|
this.filePath = resolve(this.filePath);
|
|
185
202
|
this.shardDirectory = `${this.filePath}.shards`;
|
|
186
203
|
this._queryIndexes = new Map();
|
|
204
|
+
this.#shardSnapshots = new MemoryShardSnapshots(decodedShardCacheBytes);
|
|
187
205
|
}
|
|
188
206
|
|
|
189
|
-
_locked(operation) {
|
|
207
|
+
_locked(operation, options = {}) {
|
|
208
|
+
checkMemoryQueryAborted(options.signal);
|
|
190
209
|
ensureSafeDirectory(dirname(this.filePath));
|
|
191
210
|
directories(dirname(this.filePath));
|
|
192
211
|
return super._locked(() => {
|
|
@@ -197,31 +216,34 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
197
216
|
: null;
|
|
198
217
|
if (existsSync(this.filePath)) regular(this.filePath);
|
|
199
218
|
return operation();
|
|
200
|
-
});
|
|
219
|
+
}, options);
|
|
201
220
|
}
|
|
202
221
|
|
|
203
222
|
_checkDirectories() {
|
|
204
|
-
|
|
223
|
+
// The shard path traversal already checks the authority parent and every
|
|
224
|
+
// ancestor, including native Windows resolution. Keep the separate identity
|
|
225
|
+
// comparisons below without traversing the same ancestry twice per read.
|
|
205
226
|
directories(this.shardDirectory);
|
|
227
|
+
const parentIdentity = identity(dirname(this.filePath));
|
|
228
|
+
const shardStat = lstatSync(this.shardDirectory);
|
|
229
|
+
const shardIdentity = `${shardStat.dev}:${shardStat.ino}`;
|
|
206
230
|
if (
|
|
207
|
-
|
|
208
|
-
(this._shardIdentity !== null &&
|
|
209
|
-
identity(this.shardDirectory) !== this._shardIdentity)
|
|
231
|
+
parentIdentity !== this._parentIdentity ||
|
|
232
|
+
(this._shardIdentity !== null && shardIdentity !== this._shardIdentity)
|
|
210
233
|
) {
|
|
211
234
|
throw corruptStore(
|
|
212
235
|
this.filePath,
|
|
213
236
|
"authority directory was replaced during an operation",
|
|
214
237
|
);
|
|
215
238
|
}
|
|
216
|
-
|
|
217
|
-
if (
|
|
218
|
-
process.platform !== "win32" &&
|
|
219
|
-
lstatSync(this.shardDirectory).mode & 0o077
|
|
220
|
-
)
|
|
239
|
+
if (process.platform !== "win32" && shardStat.mode & 0o077)
|
|
221
240
|
throw corruptStore(
|
|
222
241
|
this.shardDirectory,
|
|
223
242
|
"shard directory must be private",
|
|
224
243
|
);
|
|
244
|
+
// Publish precisely the identity we compared. A second lstat here could
|
|
245
|
+
// silently adopt a replacement between comparison and baseline update.
|
|
246
|
+
this._shardIdentity = shardIdentity;
|
|
225
247
|
}
|
|
226
248
|
|
|
227
249
|
_shardPath(bucket, descriptor) {
|
|
@@ -238,6 +260,44 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
238
260
|
);
|
|
239
261
|
}
|
|
240
262
|
|
|
263
|
+
_queryBundlePlan(manifest) {
|
|
264
|
+
if (
|
|
265
|
+
this.queryIndexLayout !== "bundle" ||
|
|
266
|
+
manifest.schema !== SEGMENTED_STORE_SCHEMA ||
|
|
267
|
+
!manifest.digest
|
|
268
|
+
)
|
|
269
|
+
return null;
|
|
270
|
+
const compatibilityBytes = Object.values(manifest.shards).reduce(
|
|
271
|
+
(sum, entry) => sum + (entry.queryBytes || 0),
|
|
272
|
+
0,
|
|
273
|
+
);
|
|
274
|
+
// The bundle is an additional derived copy. Preserve the existing total
|
|
275
|
+
// capacity instead of making a query fail merely because it cannot fit.
|
|
276
|
+
const available =
|
|
277
|
+
this.maxTotalBytes - manifest.totalBytes - compatibilityBytes;
|
|
278
|
+
if (!Number.isSafeInteger(available) || available <= 0) return null;
|
|
279
|
+
const plan = createQueryBundlePlan(manifest, {
|
|
280
|
+
maxFrameBytes: this.maxStoreBytes,
|
|
281
|
+
maxBundleBytes: available,
|
|
282
|
+
});
|
|
283
|
+
if (!plan) return null;
|
|
284
|
+
const file = join(this.shardDirectory, plan.name);
|
|
285
|
+
const normalize = (value) =>
|
|
286
|
+
process.platform === "win32"
|
|
287
|
+
? resolve(value).toLowerCase()
|
|
288
|
+
: resolve(value);
|
|
289
|
+
const authorityPaths = [
|
|
290
|
+
this.filePath,
|
|
291
|
+
...Object.entries(manifest.shards).flatMap(([bucket, entry]) => [
|
|
292
|
+
this._shardPath(bucket, entry),
|
|
293
|
+
...(entry.queryDigest ? [this._queryIndexPath(bucket, entry)] : []),
|
|
294
|
+
]),
|
|
295
|
+
];
|
|
296
|
+
if (authorityPaths.some((path) => normalize(path) === normalize(file)))
|
|
297
|
+
throw corruptStore(file, "query bundle path collides with authority");
|
|
298
|
+
return { ...plan, file };
|
|
299
|
+
}
|
|
300
|
+
|
|
241
301
|
_validateManifest(input) {
|
|
242
302
|
const invalid = () => {
|
|
243
303
|
throw corruptStore(this.filePath, "segmented manifest is invalid");
|
|
@@ -308,7 +368,10 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
308
368
|
}
|
|
309
369
|
|
|
310
370
|
_loadManifest() {
|
|
311
|
-
if (!existsSync(this.filePath))
|
|
371
|
+
if (!existsSync(this.filePath)) {
|
|
372
|
+
this.#shardSnapshots.observe(null);
|
|
373
|
+
return blankManifest();
|
|
374
|
+
}
|
|
312
375
|
regular(this.filePath);
|
|
313
376
|
// v1 can be larger than a manifest; preserve its existing read boundary.
|
|
314
377
|
let input;
|
|
@@ -324,6 +387,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
324
387
|
throw corruptStore(this.filePath, "authority cannot be parsed", cause);
|
|
325
388
|
}
|
|
326
389
|
if (input?.schema === STORE_SCHEMA) {
|
|
390
|
+
this.#shardSnapshots.observe(null);
|
|
327
391
|
if (bytes.length > this.maxStoreBytes)
|
|
328
392
|
throw corruptStore(
|
|
329
393
|
this.filePath,
|
|
@@ -337,6 +401,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
337
401
|
if (bytes.length > MANIFEST_LIMIT)
|
|
338
402
|
throw corruptStore(this.filePath, "manifest is too large");
|
|
339
403
|
this._checkDirectories();
|
|
404
|
+
this.#shardSnapshots.observe(this._snapshotGeneration(manifest));
|
|
340
405
|
if (!this.readOnly) this._collect(manifest);
|
|
341
406
|
return manifest;
|
|
342
407
|
}
|
|
@@ -399,6 +464,26 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
399
464
|
return state;
|
|
400
465
|
}
|
|
401
466
|
|
|
467
|
+
_snapshotGeneration(manifest) {
|
|
468
|
+
return manifest.digest
|
|
469
|
+
? JSON.stringify([
|
|
470
|
+
this.filePath,
|
|
471
|
+
this._parentIdentity,
|
|
472
|
+
this._shardIdentity,
|
|
473
|
+
manifest.digest,
|
|
474
|
+
])
|
|
475
|
+
: null;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
_queryShardSnapshot(manifest, bucket, bytes) {
|
|
479
|
+
return this.#shardSnapshots.read(
|
|
480
|
+
this._snapshotGeneration(manifest),
|
|
481
|
+
bucket,
|
|
482
|
+
bytes,
|
|
483
|
+
() => this._decodeShard(manifest, bucket, bytes),
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
|
|
402
487
|
_collect(manifest) {
|
|
403
488
|
this._checkDirectories();
|
|
404
489
|
const live = new Set(
|
|
@@ -409,6 +494,8 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
409
494
|
: []),
|
|
410
495
|
]),
|
|
411
496
|
);
|
|
497
|
+
const bundle = this._queryBundlePlan(manifest);
|
|
498
|
+
if (bundle) live.add(bundle.name);
|
|
412
499
|
// All readers hold the same authority lock. No reader can still be using
|
|
413
500
|
// a superseded shard here. Unknown files are never treated as our garbage.
|
|
414
501
|
const directory = opendirSync(this.shardDirectory);
|
|
@@ -449,6 +536,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
449
536
|
ensureSafeDirectory(this.shardDirectory);
|
|
450
537
|
this._checkDirectories();
|
|
451
538
|
this._collect(manifest);
|
|
539
|
+
const previousBundle = this._queryBundlePlan(manifest);
|
|
452
540
|
const next = cloneCanonical(manifest);
|
|
453
541
|
const pending = [];
|
|
454
542
|
let pendingBytes = manifest.totalBytes;
|
|
@@ -504,6 +592,19 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
504
592
|
);
|
|
505
593
|
next.digest = manifestDigest(next);
|
|
506
594
|
this._validateManifest(next);
|
|
595
|
+
this._queryBundlePlan(next);
|
|
596
|
+
if (
|
|
597
|
+
previousBundle &&
|
|
598
|
+
pending.some(
|
|
599
|
+
({ file }) =>
|
|
600
|
+
resolve(file).toLowerCase() ===
|
|
601
|
+
resolve(previousBundle.file).toLowerCase(),
|
|
602
|
+
)
|
|
603
|
+
)
|
|
604
|
+
throw corruptStore(
|
|
605
|
+
previousBundle.file,
|
|
606
|
+
"new query index path collides with the existing bundle",
|
|
607
|
+
);
|
|
507
608
|
const serialized = `${JSON.stringify(next)}\n`;
|
|
508
609
|
if (Buffer.byteLength(serialized) > MANIFEST_LIMIT)
|
|
509
610
|
throw limit("manifest exceeds byte limit");
|
|
@@ -546,6 +647,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
546
647
|
if (existsSync(this.filePath)) regular(this.filePath);
|
|
547
648
|
renameSync(temporary, this.filePath);
|
|
548
649
|
published = true;
|
|
650
|
+
this.#shardSnapshots.observe(this._snapshotGeneration(next));
|
|
549
651
|
syncDirectory(dirname(this.filePath));
|
|
550
652
|
directorySynced = true;
|
|
551
653
|
this._collect(next);
|
|
@@ -658,7 +760,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
658
760
|
);
|
|
659
761
|
}
|
|
660
762
|
|
|
661
|
-
_readQueryIndex(manifest, bucket) {
|
|
763
|
+
_readQueryIndex(manifest, bucket, validatedFrame) {
|
|
662
764
|
const descriptor = manifest.shards[bucket];
|
|
663
765
|
const binding = JSON.stringify([
|
|
664
766
|
manifest.digest,
|
|
@@ -673,14 +775,46 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
673
775
|
// decision based on filesystem timestamps. Re-read and verify the current
|
|
674
776
|
// manifest on every operation; any generation/authority change invalidates
|
|
675
777
|
// this binding. Selected authority shards are still read and verified.
|
|
676
|
-
//
|
|
677
|
-
// a
|
|
778
|
+
// validate-disk verifies the bytes of the active layout on every query.
|
|
779
|
+
// With a valid bundle, individual indexes are compatibility copies and
|
|
780
|
+
// are repaired when rebuilding the bundle. verified-memory remains opt-in.
|
|
678
781
|
if (
|
|
782
|
+
validatedFrame === undefined &&
|
|
679
783
|
this.queryIndexCacheMode === "verified-memory" &&
|
|
680
784
|
descriptor.queryDigest &&
|
|
681
785
|
cached?.binding === binding
|
|
682
786
|
)
|
|
683
787
|
return cached.index;
|
|
788
|
+
const bytes =
|
|
789
|
+
validatedFrame === undefined
|
|
790
|
+
? this._readQueryIndexBytes(manifest, bucket)
|
|
791
|
+
: validatedFrame;
|
|
792
|
+
// Bytes cross only the internal loader boundary: readQueryBundle hashes
|
|
793
|
+
// every on-disk frame before this callback; _readQueryIndexBytes validates
|
|
794
|
+
// or reproduces individual/read-only/rebuild frames. Do not hash the same
|
|
795
|
+
// frame twice. The compiled graph owns no Buffer views, so borrowed frame
|
|
796
|
+
// storage can be reused as soon as this synchronous decoder returns.
|
|
797
|
+
const digest = descriptor.queryDigest || queryDigest(bytes);
|
|
798
|
+
if (descriptor.queryDigest && bytes.length !== descriptor.queryBytes)
|
|
799
|
+
throw corruptStore(this.filePath, "query index frame changed");
|
|
800
|
+
if (cached?.digest === digest && cached.binding === binding)
|
|
801
|
+
return cached.index;
|
|
802
|
+
let index;
|
|
803
|
+
try {
|
|
804
|
+
index = compileQueryIndex(bytes, descriptor);
|
|
805
|
+
} catch (cause) {
|
|
806
|
+
throw corruptStore(
|
|
807
|
+
this.filePath,
|
|
808
|
+
"query index structure is invalid",
|
|
809
|
+
cause,
|
|
810
|
+
);
|
|
811
|
+
}
|
|
812
|
+
this._queryIndexes.set(bucket, { digest, binding, index });
|
|
813
|
+
return index;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
_readQueryIndexBytes(manifest, bucket) {
|
|
817
|
+
const descriptor = manifest.shards[bucket];
|
|
684
818
|
let bytes;
|
|
685
819
|
if (descriptor.queryDigest) {
|
|
686
820
|
const file = this._queryIndexPath(bucket, descriptor);
|
|
@@ -729,100 +863,158 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
729
863
|
} else {
|
|
730
864
|
bytes = encodeQueryIndex(this._readShard(manifest, bucket));
|
|
731
865
|
}
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
866
|
+
return bytes;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
async _readQueryBundleIndexes(manifest, checkpoint) {
|
|
870
|
+
if (this.queryIndexCacheMode === "verified-memory") return null;
|
|
871
|
+
const plan = this._queryBundlePlan(manifest);
|
|
872
|
+
if (!plan) return null;
|
|
873
|
+
const indexes = new Map();
|
|
874
|
+
const onFrame = (bucket, bytes) => {
|
|
875
|
+
indexes.set(bucket, this._readQueryIndex(manifest, bucket, bytes));
|
|
876
|
+
};
|
|
877
|
+
this._checkDirectories();
|
|
736
878
|
try {
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
879
|
+
await readQueryBundle(plan.file, plan, {
|
|
880
|
+
checkpoint,
|
|
881
|
+
onFrame,
|
|
882
|
+
reuseFrameBuffer: true,
|
|
883
|
+
});
|
|
884
|
+
return indexes;
|
|
885
|
+
} catch (error) {
|
|
886
|
+
if (
|
|
887
|
+
error.code !== "ENOENT" &&
|
|
888
|
+
error.code !== "CONTEXT_MEMORY_QUERY_BUNDLE_CORRUPT"
|
|
889
|
+
)
|
|
890
|
+
throw error;
|
|
891
|
+
} finally {
|
|
892
|
+
// Even an empty result must reject ancestor/directory redirection. On a
|
|
893
|
+
// content error, do this before deciding that rebuilding is safe.
|
|
894
|
+
this._checkDirectories();
|
|
744
895
|
}
|
|
745
|
-
|
|
746
|
-
|
|
896
|
+
await checkpoint(true);
|
|
897
|
+
indexes.clear();
|
|
898
|
+
if (this.readOnly) {
|
|
899
|
+
// A shadow query may validate the compatibility indexes in memory but
|
|
900
|
+
// never creates or repairs a bundle on disk.
|
|
901
|
+
for (const { bucket } of plan.frames) {
|
|
902
|
+
await checkpoint();
|
|
903
|
+
onFrame(bucket, this._readQueryIndexBytes(manifest, bucket));
|
|
904
|
+
}
|
|
905
|
+
return indexes;
|
|
906
|
+
}
|
|
907
|
+
await writeQueryBundle(plan.file, plan, {
|
|
908
|
+
checkpoint,
|
|
909
|
+
getFrame: (bucket) => {
|
|
910
|
+
const bytes = this._readQueryIndexBytes(manifest, bucket);
|
|
911
|
+
onFrame(bucket, bytes);
|
|
912
|
+
return bytes;
|
|
913
|
+
},
|
|
914
|
+
checkDirectories: () => this._checkDirectories(),
|
|
915
|
+
});
|
|
916
|
+
return indexes;
|
|
747
917
|
}
|
|
748
918
|
|
|
749
919
|
async _indexedRecords(
|
|
750
920
|
options = {},
|
|
751
921
|
{ limit: count = Infinity, cursor = null } = {},
|
|
752
922
|
) {
|
|
923
|
+
const { signal } = options;
|
|
924
|
+
const checkpoint = createMemoryQueryCheckpoint(signal);
|
|
925
|
+
checkMemoryQueryAborted(signal);
|
|
753
926
|
const query = normalizeListQuery(options);
|
|
754
|
-
const captured = await this._locked(
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
.
|
|
765
|
-
(
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
927
|
+
const captured = await this._locked(
|
|
928
|
+
async () => {
|
|
929
|
+
const manifest = this._ensureQueryIndexes(this._loadManifest());
|
|
930
|
+
const binding = listCursorBinding(
|
|
931
|
+
this.filePath,
|
|
932
|
+
manifest.digest || queryDigest(JSON.stringify(manifest)),
|
|
933
|
+
query,
|
|
934
|
+
);
|
|
935
|
+
const after = decodeListCursor(cursor, binding);
|
|
936
|
+
if (manifest.schema === STORE_SCHEMA) {
|
|
937
|
+
const matches = Object.values(manifest.records)
|
|
938
|
+
.filter(
|
|
939
|
+
(row) =>
|
|
940
|
+
matchesListQuery(row, query) &&
|
|
941
|
+
(!after || compareMemoryRows(row, after) > 0),
|
|
942
|
+
)
|
|
943
|
+
.sort(compareMemoryRows);
|
|
944
|
+
const records = matches.slice(0, count);
|
|
945
|
+
return {
|
|
946
|
+
legacy: records,
|
|
947
|
+
storeRevision: manifest.storeRevision,
|
|
948
|
+
nextCursor:
|
|
949
|
+
matches.length > count
|
|
950
|
+
? encodeListCursor(binding, records.at(-1))
|
|
951
|
+
: null,
|
|
952
|
+
};
|
|
953
|
+
}
|
|
954
|
+
// Merge each sorted posting lazily. Only the requested page is captured;
|
|
955
|
+
// every candidate has already passed scope, sink and lifecycle filters.
|
|
956
|
+
const bundleIndexes = await this._readQueryBundleIndexes(
|
|
957
|
+
manifest,
|
|
958
|
+
checkpoint,
|
|
959
|
+
);
|
|
960
|
+
const heads = [];
|
|
961
|
+
for (const bucket of Object.keys(manifest.shards)) {
|
|
962
|
+
await checkpoint();
|
|
963
|
+
const iterator = selectQueryRows(
|
|
964
|
+
bundleIndexes
|
|
965
|
+
? bundleIndexes.get(bucket)
|
|
966
|
+
: this._readQueryIndex(manifest, bucket),
|
|
967
|
+
query,
|
|
968
|
+
after,
|
|
969
|
+
);
|
|
970
|
+
const next = iterator.next();
|
|
971
|
+
if (!next.done) heads.push({ bucket, iterator, row: next.value });
|
|
972
|
+
}
|
|
973
|
+
const selected = [];
|
|
974
|
+
for (const row of mergeQueryRows(heads)) {
|
|
975
|
+
selected.push(row);
|
|
976
|
+
if (selected.length > count) break;
|
|
977
|
+
if (selected.length % 256 === 0) await checkpoint();
|
|
978
|
+
}
|
|
979
|
+
const more = selected.length > count;
|
|
980
|
+
if (more) selected.pop();
|
|
981
|
+
const shards = new Map();
|
|
982
|
+
for (const { bucket } of selected) {
|
|
983
|
+
if (!shards.has(bucket)) {
|
|
984
|
+
await checkpoint();
|
|
985
|
+
shards.set(bucket, this._readShardBytes(manifest, bucket));
|
|
986
|
+
}
|
|
987
|
+
}
|
|
771
988
|
return {
|
|
772
|
-
|
|
989
|
+
manifest,
|
|
990
|
+
selected,
|
|
991
|
+
shards,
|
|
773
992
|
storeRevision: manifest.storeRevision,
|
|
774
|
-
nextCursor:
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
: null,
|
|
993
|
+
nextCursor: more
|
|
994
|
+
? encodeListCursor(binding, selected.at(-1).row)
|
|
995
|
+
: null,
|
|
778
996
|
};
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
for (const bucket of Object.keys(manifest.shards)) {
|
|
784
|
-
const iterator = selectQueryRows(
|
|
785
|
-
this._readQueryIndex(manifest, bucket),
|
|
786
|
-
query,
|
|
787
|
-
after,
|
|
788
|
-
);
|
|
789
|
-
const next = iterator.next();
|
|
790
|
-
if (!next.done) heads.push({ bucket, iterator, row: next.value });
|
|
791
|
-
}
|
|
792
|
-
const selected = [];
|
|
793
|
-
for (const row of mergeQueryRows(heads)) {
|
|
794
|
-
selected.push(row);
|
|
795
|
-
if (selected.length > count) break;
|
|
796
|
-
}
|
|
797
|
-
const more = selected.length > count;
|
|
798
|
-
if (more) selected.pop();
|
|
799
|
-
const shards = new Map();
|
|
800
|
-
for (const { bucket } of selected)
|
|
801
|
-
if (!shards.has(bucket))
|
|
802
|
-
shards.set(bucket, this._readShardBytes(manifest, bucket));
|
|
803
|
-
return {
|
|
804
|
-
manifest,
|
|
805
|
-
selected,
|
|
806
|
-
shards,
|
|
807
|
-
storeRevision: manifest.storeRevision,
|
|
808
|
-
nextCursor: more
|
|
809
|
-
? encodeListCursor(binding, selected.at(-1).row)
|
|
810
|
-
: null,
|
|
811
|
-
};
|
|
812
|
-
});
|
|
997
|
+
},
|
|
998
|
+
{ signal },
|
|
999
|
+
);
|
|
1000
|
+
await checkpoint(true);
|
|
813
1001
|
if (captured.legacy)
|
|
814
1002
|
return {
|
|
815
1003
|
records: captured.legacy,
|
|
816
1004
|
nextCursor: captured.nextCursor,
|
|
817
1005
|
storeRevision: captured.storeRevision,
|
|
818
1006
|
};
|
|
819
|
-
const decoded = new Map(
|
|
820
|
-
|
|
1007
|
+
const decoded = new Map();
|
|
1008
|
+
for (const [bucket, bytes] of captured.shards) {
|
|
1009
|
+
await checkpoint();
|
|
1010
|
+
decoded.set(
|
|
821
1011
|
bucket,
|
|
822
|
-
this.
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
const records =
|
|
1012
|
+
this._queryShardSnapshot(captured.manifest, bucket, bytes),
|
|
1013
|
+
);
|
|
1014
|
+
}
|
|
1015
|
+
const records = [];
|
|
1016
|
+
for (const { bucket, row } of captured.selected) {
|
|
1017
|
+
if (records.length % 256 === 0) await checkpoint();
|
|
826
1018
|
const record = own(decoded.get(bucket).records, row.memoryId);
|
|
827
1019
|
if (
|
|
828
1020
|
!record ||
|
|
@@ -833,8 +1025,11 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
833
1025
|
this.filePath,
|
|
834
1026
|
"query index result disagrees with authority",
|
|
835
1027
|
);
|
|
836
|
-
|
|
837
|
-
|
|
1028
|
+
// The cached graph is host-owned. A caller may edit its returned record
|
|
1029
|
+
// without changing another query's verified snapshot.
|
|
1030
|
+
records.push(cloneCanonical(record));
|
|
1031
|
+
}
|
|
1032
|
+
await checkpoint(true);
|
|
838
1033
|
return {
|
|
839
1034
|
records,
|
|
840
1035
|
nextCursor: captured.nextCursor,
|
|
@@ -857,7 +1052,8 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
857
1052
|
});
|
|
858
1053
|
}
|
|
859
1054
|
|
|
860
|
-
async query(request) {
|
|
1055
|
+
async query(request, { signal } = {}) {
|
|
1056
|
+
checkMemoryQueryAborted(signal);
|
|
861
1057
|
if (request?.scopeAdmissions || request?.sink) {
|
|
862
1058
|
// Do not push recall's limit before lexical/semantic ranking in the
|
|
863
1059
|
// kernel. Push only gates that cannot discard an admissible result.
|
|
@@ -866,42 +1062,55 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
|
|
|
866
1062
|
scopeAdmissions: request.scopeAdmissions,
|
|
867
1063
|
sink: request.sink,
|
|
868
1064
|
states: ["active", "reinforced"],
|
|
1065
|
+
signal,
|
|
869
1066
|
})
|
|
870
1067
|
).records;
|
|
871
1068
|
}
|
|
872
|
-
const
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
)
|
|
891
|
-
|
|
892
|
-
|
|
1069
|
+
const checkpoint = createMemoryQueryCheckpoint(signal);
|
|
1070
|
+
const snapshot = await this._locked(
|
|
1071
|
+
async () => {
|
|
1072
|
+
const manifest = this._loadManifest();
|
|
1073
|
+
if (manifest.schema === STORE_SCHEMA) return { legacy: manifest };
|
|
1074
|
+
let capturedBytes = 0;
|
|
1075
|
+
const shards = [];
|
|
1076
|
+
for (const bucket of Object.keys(manifest.shards)) {
|
|
1077
|
+
await checkpoint();
|
|
1078
|
+
const bytes = this._readShardBytes(manifest, bucket);
|
|
1079
|
+
capturedBytes += bytes.length;
|
|
1080
|
+
if (
|
|
1081
|
+
capturedBytes > manifest.totalBytes ||
|
|
1082
|
+
capturedBytes > this.maxTotalBytes
|
|
1083
|
+
)
|
|
1084
|
+
throw limit("snapshot exceeds aggregate byte limit");
|
|
1085
|
+
shards.push([bucket, bytes]);
|
|
1086
|
+
}
|
|
1087
|
+
if (capturedBytes !== manifest.totalBytes)
|
|
1088
|
+
throw corruptStore(
|
|
1089
|
+
this.filePath,
|
|
1090
|
+
"snapshot byte count does not match manifest",
|
|
1091
|
+
);
|
|
1092
|
+
return { manifest, shards };
|
|
1093
|
+
},
|
|
1094
|
+
{ signal },
|
|
1095
|
+
);
|
|
1096
|
+
await checkpoint(true);
|
|
893
1097
|
if (snapshot.legacy) return Object.values(snapshot.legacy.records);
|
|
894
1098
|
// The lock protects capture of every byte in one manifest generation.
|
|
895
1099
|
// Expensive validation uses owned buffers after releasing the lock, so GC
|
|
896
1100
|
// and other readers/writers need not wait for whole-store JSON validation.
|
|
897
|
-
|
|
898
|
-
|
|
1101
|
+
const records = [];
|
|
1102
|
+
for (const [bucket, bytes] of snapshot.shards) {
|
|
1103
|
+
await checkpoint();
|
|
1104
|
+
for (const record of Object.values(
|
|
899
1105
|
this._decodeShard(snapshot.manifest, bucket, bytes).records,
|
|
900
|
-
)
|
|
901
|
-
|
|
1106
|
+
))
|
|
1107
|
+
records.push(record);
|
|
1108
|
+
}
|
|
1109
|
+
await checkpoint(true);
|
|
1110
|
+
return records;
|
|
902
1111
|
}
|
|
903
|
-
async getRevision() {
|
|
904
|
-
return this._locked(() => this._loadManifest().storeRevision);
|
|
1112
|
+
async getRevision({ signal } = {}) {
|
|
1113
|
+
return this._locked(() => this._loadManifest().storeRevision, { signal });
|
|
905
1114
|
}
|
|
906
1115
|
async exportSnapshot() {
|
|
907
1116
|
return this._locked(() => {
|