@remnic/core 9.7.14 → 9.8.0
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/dist/access-admin-ops-surface.d.ts +13 -6
- package/dist/access-admin-ops-surface.js +88 -74
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +35 -17
- package/dist/access-boundary.js +89 -77
- package/dist/access-citation.d.ts +28 -0
- package/dist/access-citation.js +9 -0
- package/dist/access-cli.js +197 -181
- package/dist/access-cli.js.map +1 -1
- package/dist/access-errors.d.ts +16 -1
- package/dist/access-errors.js +7 -3
- package/dist/access-http.d.ts +25 -19
- package/dist/access-http.js +103 -90
- package/dist/access-identity-continuity-surface.d.ts +13 -8
- package/dist/access-identity-continuity-surface.js +88 -74
- package/dist/access-lcm-surface.d.ts +16 -9
- package/dist/access-lcm-surface.js +88 -74
- package/dist/access-mcp.d.ts +23 -16
- package/dist/access-mcp.js +99 -87
- package/dist/access-memory-search-fanout.d.ts +93 -0
- package/dist/access-memory-search-fanout.js +18 -0
- package/dist/access-observe-write-surface.d.ts +26 -8
- package/dist/access-observe-write-surface.js +88 -74
- package/dist/access-operations-batch.js +95 -83
- package/dist/access-operations.d.ts +26 -19
- package/dist/access-operations.js +97 -85
- package/dist/access-recall-concurrency.d.ts +250 -0
- package/dist/access-recall-concurrency.js +157 -0
- package/dist/access-recall-response.d.ts +130 -0
- package/dist/access-recall-response.js +147 -0
- package/dist/access-recall-surface.d.ts +15 -7
- package/dist/access-recall-surface.js +88 -74
- package/dist/access-schema.d.ts +34 -34
- package/dist/access-schema.js +8 -6
- package/dist/{access-service-CPhSnLOH.d.ts → access-service-DEL4qCrc.d.ts} +25 -32
- package/dist/access-service.d.ts +13 -6
- package/dist/access-service.js +92 -75
- package/dist/access-surface-catalog.d.ts +23 -16
- package/dist/access-surface-catalog.js +1 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-token-capabilities.d.ts +2 -1
- package/dist/access-token-capabilities.js +4 -2
- package/dist/action-confidence.d.ts +3 -1
- package/dist/active-memory-bridge.d.ts +3 -1
- package/dist/active-memory-bridge.js +4 -4
- package/dist/active-recall.d.ts +4 -1
- package/dist/active-recall.js +23 -13
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
- package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
- package/dist/behavior-learner.d.ts +3 -1
- package/dist/behavior-signals.d.ts +3 -1
- package/dist/bootstrap.d.ts +12 -7
- package/dist/bootstrap.js +2 -2
- package/dist/bounded-jsonl-state.d.ts +54 -0
- package/dist/bounded-jsonl-state.js +10 -0
- package/dist/boxes.js +2 -2
- package/dist/briefing.d.ts +5 -2
- package/dist/briefing.js +37 -27
- package/dist/buffer-surprise-report.d.ts +3 -1
- package/dist/buffer.d.ts +60 -2
- package/dist/buffer.js +3 -3
- package/dist/bulk-import/index.d.ts +5 -3
- package/dist/calibration.d.ts +3 -1
- package/dist/calibration.js +6 -6
- package/dist/capabilities.d.ts +7 -7
- package/dist/capabilities.js +1 -1
- package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
- package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
- package/dist/{capsule-merge-Z2HUO6IK.js → capsule-merge-5KKJQBWQ.js} +4 -4
- package/dist/{catalog-uX9sT9ws.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +3 -1
- package/dist/causal-behavior.js +6 -6
- package/dist/causal-chain.js +4 -4
- package/dist/causal-consolidation.d.ts +3 -1
- package/dist/causal-consolidation.js +46 -37
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +6 -6
- package/dist/causal-trajectory-graph.d.ts +3 -1
- package/dist/causal-trajectory-graph.js +1 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
- package/dist/chunk-2CGLBUW3.js +15 -0
- package/dist/chunk-2CGLBUW3.js.map +1 -0
- package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
- package/dist/{chunk-ASKEM4AR.js → chunk-2EJOEICD.js} +1823 -1483
- package/dist/chunk-2EJOEICD.js.map +1 -0
- package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
- package/dist/{chunk-6CALL5VN.js → chunk-2UFO7X4Q.js} +7 -7
- package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
- package/dist/chunk-2Z24E5W2.js +22 -0
- package/dist/chunk-2Z24E5W2.js.map +1 -0
- package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
- package/dist/{chunk-5S7Z5SHA.js → chunk-34RC5RT7.js} +2 -2
- package/dist/{chunk-KGWXHWAH.js → chunk-3QAH2S33.js} +3 -3
- package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
- package/dist/chunk-3WCASNQZ.js.map +1 -0
- package/dist/{chunk-ZIDSD6VC.js → chunk-3Y224NYC.js} +3 -3
- package/dist/{chunk-RBQLJSJ7.js → chunk-44XZ75OQ.js} +46 -10
- package/dist/chunk-44XZ75OQ.js.map +1 -0
- package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
- package/dist/{chunk-7ICYQUOL.js → chunk-4BJQODZF.js} +2514 -1526
- package/dist/chunk-4BJQODZF.js.map +1 -0
- package/dist/{chunk-JMBVCAR4.js → chunk-57OWKFUQ.js} +17 -6
- package/dist/chunk-57OWKFUQ.js.map +1 -0
- package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
- package/dist/{chunk-2E6G7FCE.js → chunk-5Q7EVV4X.js} +7 -7
- package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
- package/dist/chunk-5SB7SC2G.js.map +1 -0
- package/dist/{chunk-VZ5OJE4X.js → chunk-5VQJBH2G.js} +2 -2
- package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
- package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
- package/dist/chunk-6KIQT7RG.js.map +1 -0
- package/dist/{chunk-4LEF6XWJ.js → chunk-6O22TZSB.js} +3 -3
- package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
- package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
- package/dist/chunk-6ZMAMSHS.js +20 -0
- package/dist/chunk-6ZMAMSHS.js.map +1 -0
- package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
- package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
- package/dist/chunk-72VAXGEI.js.map +1 -0
- package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
- package/dist/chunk-755Q3DGF.js.map +1 -0
- package/dist/{chunk-F7AU34FC.js → chunk-76GLCM57.js} +160 -127
- package/dist/chunk-76GLCM57.js.map +1 -0
- package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
- package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
- package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
- package/dist/chunk-7ON2JW73.js.map +1 -0
- package/dist/chunk-7RNBVZZO.js +270 -0
- package/dist/chunk-7RNBVZZO.js.map +1 -0
- package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
- package/dist/{chunk-TXVD7PLT.js → chunk-A72SWTWW.js} +7 -7
- package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
- package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
- package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
- package/dist/chunk-AIK5W3IW.js.map +1 -0
- package/dist/{chunk-OKUEZOGW.js → chunk-AITCS2RC.js} +2 -2
- package/dist/{chunk-OC35KQIN.js → chunk-AJ7QCSIS.js} +4 -4
- package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
- package/dist/chunk-AREGMX2J.js +50 -0
- package/dist/chunk-AREGMX2J.js.map +1 -0
- package/dist/chunk-AVPXXV6J.js +448 -0
- package/dist/chunk-AVPXXV6J.js.map +1 -0
- package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
- package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
- package/dist/chunk-BJMBJZ2Y.js.map +1 -0
- package/dist/{chunk-N3JDIRBW.js → chunk-BLAKS3CP.js} +4 -4
- package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
- package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
- package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
- package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
- package/dist/{chunk-FBNWOMCE.js → chunk-C6XBRYVD.js} +16 -15
- package/dist/chunk-C6XBRYVD.js.map +1 -0
- package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
- package/dist/chunk-CEN6DW6X.js.map +1 -0
- package/dist/chunk-CGASUJVP.js +421 -0
- package/dist/chunk-CGASUJVP.js.map +1 -0
- package/dist/{chunk-DDGV7NAX.js → chunk-CQMEM5CC.js} +2 -2
- package/dist/{chunk-A7B4RMQG.js → chunk-CXZQOVIE.js} +12 -12
- package/dist/chunk-D3V3UMET.js +44 -0
- package/dist/chunk-D3V3UMET.js.map +1 -0
- package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
- package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
- package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
- package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
- package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
- package/dist/chunk-EA2H5LML.js +72 -0
- package/dist/chunk-EA2H5LML.js.map +1 -0
- package/dist/{chunk-IFJ23BHU.js → chunk-EEC7UJPX.js} +112 -106
- package/dist/chunk-EEC7UJPX.js.map +1 -0
- package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
- package/dist/chunk-EKBNDKDY.js.map +1 -0
- package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
- package/dist/chunk-EQWEIIKQ.js.map +1 -0
- package/dist/{chunk-7MW3CVLD.js → chunk-ES36HTSC.js} +4 -4
- package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-7LFXDGLH.js → chunk-F7GAIWFA.js} +20 -20
- package/dist/{chunk-IKSELOIV.js → chunk-FFPJINJE.js} +7 -7
- package/dist/chunk-FMLKOL2Z.js +636 -0
- package/dist/chunk-FMLKOL2Z.js.map +1 -0
- package/dist/chunk-FQC3DHH2.js +20 -0
- package/dist/chunk-FQC3DHH2.js.map +1 -0
- package/dist/{chunk-V53GJUSL.js → chunk-FUTF72MJ.js} +15 -15
- package/dist/chunk-GCASGYIO.js +71 -0
- package/dist/chunk-GCASGYIO.js.map +1 -0
- package/dist/{chunk-5UNWK7KU.js → chunk-GFPZS3F5.js} +8 -8
- package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
- package/dist/chunk-GNVZQ5JN.js.map +1 -0
- package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
- package/dist/{chunk-HLTAPHZZ.js → chunk-HNZKVLAN.js} +2 -2
- package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
- package/dist/{chunk-ANADNYWK.js → chunk-IDZFBSHN.js} +8 -6
- package/dist/{chunk-ANADNYWK.js.map → chunk-IDZFBSHN.js.map} +1 -1
- package/dist/{chunk-XVLEGMJI.js → chunk-IFH6LWTO.js} +50 -8
- package/dist/chunk-IFH6LWTO.js.map +1 -0
- package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
- package/dist/chunk-ILGC6JH6.js.map +1 -0
- package/dist/chunk-IUM3VSHI.js +113 -0
- package/dist/chunk-IUM3VSHI.js.map +1 -0
- package/dist/{chunk-ND5M64JJ.js → chunk-IYNGIMVG.js} +101 -91
- package/dist/chunk-IYNGIMVG.js.map +1 -0
- package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
- package/dist/{chunk-HG32URJJ.js → chunk-JYIFGGEM.js} +2 -2
- package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
- package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
- package/dist/{chunk-MKDRQAA3.js → chunk-KAVBJSBQ.js} +4 -4
- package/dist/{chunk-EEARRVZ2.js → chunk-KF5EUVKQ.js} +16 -6
- package/dist/chunk-KF5EUVKQ.js.map +1 -0
- package/dist/chunk-KFZY2OFH.js +42 -0
- package/dist/chunk-KFZY2OFH.js.map +1 -0
- package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
- package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
- package/dist/{chunk-OBMR4VIX.js → chunk-L2DPF4DF.js} +186 -15
- package/dist/chunk-L2DPF4DF.js.map +1 -0
- package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
- package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
- package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
- package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
- package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
- package/dist/{chunk-NUWYOKS6.js → chunk-MC5Q3J7S.js} +398 -7
- package/dist/chunk-MC5Q3J7S.js.map +1 -0
- package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
- package/dist/chunk-MKQBXQKU.js +107 -0
- package/dist/chunk-MKQBXQKU.js.map +1 -0
- package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
- package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
- package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
- package/dist/{chunk-67ZCJLJY.js → chunk-MYFQ3ED4.js} +8 -8
- package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
- package/dist/chunk-NINSR6LX.js +83 -0
- package/dist/chunk-NINSR6LX.js.map +1 -0
- package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
- package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
- package/dist/{chunk-AD6AMF2N.js → chunk-OQJIB32H.js} +28 -23
- package/dist/chunk-OQJIB32H.js.map +1 -0
- package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
- package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
- package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
- package/dist/chunk-PIG4WJFQ.js +87 -0
- package/dist/chunk-PIG4WJFQ.js.map +1 -0
- package/dist/chunk-PQVCH2AE.js +76 -0
- package/dist/chunk-PQVCH2AE.js.map +1 -0
- package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
- package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
- package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
- package/dist/{chunk-AHLPZ2SF.js → chunk-QJAQNXWI.js} +44 -6
- package/dist/chunk-QJAQNXWI.js.map +1 -0
- package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
- package/dist/{chunk-VYOFVVNK.js → chunk-R26ZMXR2.js} +24 -24
- package/dist/{chunk-VYOFVVNK.js.map → chunk-R26ZMXR2.js.map} +1 -1
- package/dist/chunk-R3DJVOSM.js +34 -0
- package/dist/chunk-R3DJVOSM.js.map +1 -0
- package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
- package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
- package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/chunk-ROI7BK7H.js +88 -0
- package/dist/chunk-ROI7BK7H.js.map +1 -0
- package/dist/{chunk-UTRJFDP2.js → chunk-S2BBISHU.js} +4 -4
- package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
- package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
- package/dist/chunk-SCCO46KZ.js.map +1 -0
- package/dist/chunk-SICXL4MK.js +165 -0
- package/dist/chunk-SICXL4MK.js.map +1 -0
- package/dist/chunk-SK7AMF2J.js +168 -0
- package/dist/chunk-SK7AMF2J.js.map +1 -0
- package/dist/{chunk-GMSDQUCR.js → chunk-TDTXKOAJ.js} +6475 -5748
- package/dist/chunk-TDTXKOAJ.js.map +1 -0
- package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
- package/dist/chunk-TG6IHVE2.js.map +1 -0
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-PK5XBDA6.js → chunk-U3ZAVRP3.js} +2 -2
- package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
- package/dist/chunk-UFGFMWAD.js.map +1 -0
- package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
- package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-7XGSIUP5.js → chunk-W4FBGYGK.js} +1 -1
- package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
- package/dist/chunk-W4XJFLAL.js.map +1 -0
- package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
- package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
- package/dist/chunk-WG5HSQ4P.js.map +1 -0
- package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
- package/dist/chunk-WL5EBRDH.js.map +1 -0
- package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
- package/dist/{chunk-W5NKDU24.js → chunk-WON4APQY.js} +4 -4
- package/dist/{chunk-NKCPUHCI.js → chunk-WZFAPHIK.js} +6 -6
- package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
- package/dist/{chunk-X47LWMKA.js → chunk-XMMESCPD.js} +26 -1
- package/dist/chunk-XMMESCPD.js.map +1 -0
- package/dist/{chunk-4B4MUS5D.js → chunk-YROFNEG5.js} +7 -7
- package/dist/{chunk-WU46YPY6.js → chunk-YV32N67O.js} +1 -1
- package/dist/chunk-YV32N67O.js.map +1 -0
- package/dist/{chunk-B3F4CWQR.js → chunk-YVKF3HEW.js} +1 -1
- package/dist/chunk-YVKF3HEW.js.map +1 -0
- package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
- package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
- package/dist/chunk-ZOKZIR5K.js.map +1 -0
- package/dist/{cli-_Y2Bmt6A.d.ts → cli-C_pqqTCw.d.ts} +28 -12
- package/dist/cli.d.ts +16 -9
- package/dist/cli.js +145 -130
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +39 -29
- package/dist/compounding/preference-consolidator.d.ts +3 -1
- package/dist/compounding/preference-consolidator.js +1 -1
- package/dist/compression-optimizer.d.ts +3 -1
- package/dist/config-qmd.d.ts +8 -0
- package/dist/config-qmd.js +20 -0
- package/dist/config-qmd.js.map +1 -0
- package/dist/config.d.ts +3 -1
- package/dist/config.js +15 -10
- package/dist/connectors/codex-materialize-runner.d.ts +3 -1
- package/dist/connectors/codex-materialize-runner.js +39 -29
- package/dist/connectors/codex-materialize.d.ts +3 -1
- package/dist/connectors/codex-materialize.js +2 -2
- package/dist/connectors/index.d.ts +3 -1
- package/dist/connectors/index.js +44 -35
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +5 -2
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +5 -2
- package/dist/contradiction/index.js +10 -4
- package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
- package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/backend.js +5 -5
- package/dist/conversation-index/chunker.d.ts +3 -1
- package/dist/conversation-index/cleanup.js +2 -2
- package/dist/conversation-index/faiss-adapter.d.ts +3 -1
- package/dist/conversation-index/faiss-adapter.js +2 -2
- package/dist/conversation-index/indexer.d.ts +3 -1
- package/dist/conversation-index/indexer.js +2 -2
- package/dist/conversation-index/search.d.ts +3 -1
- package/dist/conversation-index/search.js +2 -2
- package/dist/cross-namespace-budget.d.ts +45 -1
- package/dist/cross-namespace-budget.js +5 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +3 -1
- package/dist/day-summary.js +3 -3
- package/dist/delinearize.d.ts +3 -1
- package/dist/direct-answer-wiring.d.ts +3 -1
- package/dist/direct-answer.d.ts +3 -1
- package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
- package/dist/dreams-ledger-567VKVOU.js.map +1 -0
- package/dist/embedding-fallback.d.ts +3 -1
- package/dist/embedding-fallback.js +3 -3
- package/dist/enrichment/index.d.ts +3 -1
- package/dist/entity-retrieval.d.ts +5 -2
- package/dist/entity-retrieval.js +38 -29
- package/dist/entity-schema.d.ts +3 -1
- package/dist/explicit-capture.d.ts +13 -8
- package/dist/explicit-capture.js +7 -3
- package/dist/extraction-faithfulness.d.ts +3 -1
- package/dist/extraction-faithfulness.js +5 -5
- package/dist/extraction-judge-telemetry.d.ts +3 -1
- package/dist/extraction-judge-telemetry.js +2 -2
- package/dist/extraction-judge-training.d.ts +3 -1
- package/dist/extraction-judge-training.js +2 -2
- package/dist/extraction-judge.d.ts +3 -1
- package/dist/extraction-judge.js +5 -5
- package/dist/extraction.d.ts +3 -1
- package/dist/extraction.js +13 -12
- package/dist/faithfulness-config.js +3 -2
- package/dist/fallback-llm.d.ts +3 -1
- package/dist/fallback-llm.js +4 -4
- package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
- package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
- package/dist/graph-dashboard-diff.d.ts +3 -1
- package/dist/graph-dashboard-key.d.ts +3 -1
- package/dist/graph-dashboard-parser.d.ts +3 -1
- package/dist/{graph-edge-decay-FO7AM4UR.js → graph-edge-decay-Z6ENALU2.js} +3 -3
- package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +3 -1
- package/dist/graph-snapshot.d.ts +3 -1
- package/dist/graph-snapshot.js +2 -2
- package/dist/graph.d.ts +57 -10
- package/dist/graph.js +1 -1
- package/dist/identity-continuity.d.ts +1 -2
- package/dist/importance.d.ts +3 -1
- package/dist/importers/index.d.ts +3 -1
- package/dist/in-flight-reads.d.ts +3 -1
- package/dist/index.d.ts +101 -92
- package/dist/index.js +290 -242
- package/dist/intent.d.ts +3 -1
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +3 -1
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.d.ts +3 -1
- package/dist/lcm/index.js +13 -13
- package/dist/lcm/schema.js +2 -2
- package/dist/lcm/summarizer.js +3 -3
- package/dist/lcm/tools.d.ts +3 -1
- package/dist/lifecycle.d.ts +3 -1
- package/dist/live-connectors-runner.d.ts +3 -1
- package/dist/local-llm.d.ts +5 -2
- package/dist/local-llm.js +3 -3
- package/dist/local-model-endpoint.d.ts +3 -1
- package/dist/logger.d.ts +3 -1
- package/dist/logger.js +7 -3
- package/dist/maintenance/archive-observations.js +2 -2
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +38 -28
- package/dist/maintenance/migrate-observations.js +3 -3
- package/dist/maintenance/observation-ledger-utils.js +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +40 -28
- package/dist/maintenance/rebuild-memory-projection.js +41 -31
- package/dist/maintenance/rebuild-observations.js +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +22 -15
- package/dist/memory-action-policy.d.ts +3 -1
- package/dist/memory-cache.d.ts +46 -2
- package/dist/memory-cache.js +7 -1
- package/dist/memory-corpus-version.js +2 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
- package/dist/memory-lifecycle-ledger-utils.js +11 -1
- package/dist/memory-projection-store.d.ts +3 -1
- package/dist/memory-projection-store.js +2 -2
- package/dist/memory-provenance.d.ts +3 -1
- package/dist/memory-worth-outcomes.d.ts +5 -2
- package/dist/model-registry.js +2 -2
- package/dist/models-json.d.ts +3 -1
- package/dist/models-json.js +2 -2
- package/dist/namespaces/migrate.d.ts +6 -3
- package/dist/namespaces/migrate.js +54 -45
- package/dist/namespaces/principal.d.ts +27 -2
- package/dist/namespaces/principal.js +6 -2
- package/dist/namespaces/search.d.ts +16 -2
- package/dist/namespaces/search.js +25 -21
- package/dist/namespaces/storage.d.ts +24 -3
- package/dist/namespaces/storage.js +38 -30
- package/dist/native-knowledge.d.ts +3 -1
- package/dist/native-knowledge.js +2 -2
- package/dist/negative.js +2 -2
- package/dist/offline-sync-exclude-globs.d.ts +13 -0
- package/dist/offline-sync-exclude-globs.js +10 -0
- package/dist/offline-sync-exclude-globs.js.map +1 -0
- package/dist/offline-sync-impression-drain.d.ts +78 -0
- package/dist/offline-sync-impression-drain.js +37 -0
- package/dist/offline-sync-impression-drain.js.map +1 -0
- package/dist/offline-sync.js +4 -2
- package/dist/operator-toolkit.d.ts +5 -2
- package/dist/operator-toolkit.js +73 -58
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
- package/dist/orchestration/compression-guideline-coordinator.js +3 -3
- package/dist/orchestration/maintenance.d.ts +121 -2
- package/dist/orchestration/maintenance.js +47 -34
- package/dist/{orchestrator-BbZ_dQSU.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
- package/dist/orchestrator.d.ts +13 -8
- package/dist/orchestrator.js +197 -180
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +3 -1
- package/dist/{pipeline-FRMDb1fn.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +3 -1
- package/dist/prioritized-embed.d.ts +19 -0
- package/dist/prioritized-embed.js +8 -0
- package/dist/prioritized-embed.js.map +1 -0
- package/dist/proactive-contention.d.ts +28 -0
- package/dist/proactive-contention.js +8 -0
- package/dist/proactive-contention.js.map +1 -0
- package/dist/profiling.js +2 -2
- package/dist/provenance.d.ts +3 -1
- package/dist/provenance.js +3 -2
- package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
- package/dist/{qmd-xJRrHFbA.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
- package/dist/qmd-preflight.d.ts +5 -2
- package/dist/qmd-recall-cache.d.ts +3 -1
- package/dist/qmd-status.d.ts +57 -0
- package/dist/qmd-status.js +18 -0
- package/dist/qmd-status.js.map +1 -0
- package/dist/qmd.d.ts +5 -2
- package/dist/qmd.js +8 -4
- package/dist/recall-concurrency-config.d.ts +16 -0
- package/dist/recall-concurrency-config.js +10 -0
- package/dist/recall-concurrency-config.js.map +1 -0
- package/dist/recall-disclosure-escalation.d.ts +3 -1
- package/dist/recall-explain-renderer.d.ts +4 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +26 -0
- package/dist/recall-memory-map.js +18 -0
- package/dist/recall-memory-map.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +3 -1
- package/dist/recall-planner-llm.js +4 -4
- package/dist/recall-qos.js +2 -2
- package/dist/recall-state.d.ts +163 -2
- package/dist/recall-state.js +6 -3
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-timings.d.ts +11 -2
- package/dist/recall-timings.js +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +3 -1
- package/dist/recall-xray.js +2 -2
- package/dist/relevance.js +3 -3
- package/dist/replay/normalizers/chatgpt.d.ts +3 -1
- package/dist/replay/normalizers/claude.d.ts +3 -1
- package/dist/replay/normalizers/openclaw.d.ts +3 -1
- package/dist/replay/normalizers/shared.d.ts +3 -1
- package/dist/replay/runner.d.ts +3 -1
- package/dist/replay/types.d.ts +3 -1
- package/dist/rerank.d.ts +8 -1
- package/dist/rerank.js +3 -1
- package/dist/resolution-3K27T4VO.js +18 -0
- package/dist/resolution-3K27T4VO.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +3 -1
- package/dist/resolve-provider-secret.js +2 -2
- package/dist/resume-bundles.js +19 -14
- package/dist/retrieval-agents.d.ts +19 -16
- package/dist/retrieval-agents.js +3 -3
- package/dist/retrieval-tiers.d.ts +3 -1
- package/dist/routing/engine.d.ts +3 -1
- package/dist/routing/store.d.ts +3 -1
- package/dist/routing/store.js +2 -2
- package/dist/salvage-envelope.d.ts +18 -0
- package/dist/salvage-envelope.js +15 -0
- package/dist/salvage-envelope.js.map +1 -0
- package/dist/schemas.d.ts +24 -24
- package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
- package/dist/search/document-scanner.js +3 -2
- package/dist/search/embed-helper.d.ts +3 -1
- package/dist/search/embed-helper.js +3 -3
- package/dist/search/factory.d.ts +3 -1
- package/dist/search/factory.js +19 -17
- package/dist/search/index.d.ts +3 -1
- package/dist/search/index.js +23 -21
- package/dist/search/lancedb-backend.d.ts +3 -1
- package/dist/search/lancedb-backend.js +6 -5
- package/dist/search/meilisearch-backend.d.ts +3 -1
- package/dist/search/meilisearch-backend.js +6 -5
- package/dist/search/noop-backend.d.ts +3 -1
- package/dist/search/orama-backend.d.ts +3 -1
- package/dist/search/orama-backend.js +6 -5
- package/dist/search/port.d.ts +27 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +3 -1
- package/dist/search/remote-backend.js +3 -3
- package/dist/secure-store/index.d.ts +12 -1
- package/dist/secure-store/index.js +6 -3
- package/dist/{semantic-consolidation-fvdZRa5Z.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +4 -2
- package/dist/semantic-consolidation.js +41 -32
- package/dist/semantic-rule-promotion.js +37 -27
- package/dist/semantic-rule-verifier.d.ts +3 -1
- package/dist/semantic-rule-verifier.js +38 -28
- package/dist/session-observer-bands.d.ts +3 -1
- package/dist/session-observer-state.d.ts +3 -1
- package/dist/session-observer-state.js +2 -2
- package/dist/session-transcript-migration.js +2 -2
- package/dist/shared-context/manager.d.ts +3 -1
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +3 -1
- package/dist/{storage-CrvzaM9C.d.ts → storage-NIyKYD8g.d.ts} +505 -110
- package/dist/storage-guards.js +2 -2
- package/dist/storage.d.ts +6 -3
- package/dist/storage.js +41 -29
- package/dist/structured-attributes.d.ts +23 -1
- package/dist/structured-attributes.js +7 -1
- package/dist/summarizer.d.ts +3 -1
- package/dist/summarizer.js +11 -11
- package/dist/summary-snapshot.d.ts +3 -1
- package/dist/summary-snapshot.js +2 -2
- package/dist/temporal-index-batch.d.ts +1 -0
- package/dist/temporal-index-batch.js +10 -0
- package/dist/temporal-index-batch.js.map +1 -0
- package/dist/temporal-index-compat.d.ts +279 -1
- package/dist/temporal-index-compat.js +1 -1
- package/dist/temporal-index.d.ts +1 -225
- package/dist/temporal-index.js +35 -3
- package/dist/temporal-supersession.d.ts +5 -2
- package/dist/temporal-supersession.js +2 -2
- package/dist/temporal-timeline-recall.d.ts +3 -1
- package/dist/temporal-validity.d.ts +3 -1
- package/dist/threading.d.ts +3 -1
- package/dist/threading.js +2 -2
- package/dist/tier-migration.d.ts +5 -2
- package/dist/tier-routing.d.ts +3 -1
- package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
- package/dist/tokens.js +3 -3
- package/dist/topics.d.ts +3 -1
- package/dist/transcript.d.ts +3 -1
- package/dist/transcript.js +2 -2
- package/dist/transfer/backup.js +3 -3
- package/dist/transfer/capsule-export.js +3 -3
- package/dist/transfer/capsule-import.js +6 -6
- package/dist/transfer/types.d.ts +24 -24
- package/dist/trust-score-stage.d.ts +75 -38
- package/dist/trust-score-stage.js +11 -3
- package/dist/trust-score.d.ts +3 -1
- package/dist/{types-Bl4BWDM8.d.ts → types-D_fG2ix8.d.ts} +49 -63
- package/dist/types-continuity.d.ts +52 -0
- package/dist/types-continuity.js +1 -0
- package/dist/types-continuity.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +3 -1
- package/dist/utils/serialize-mutations.d.ts +31 -2
- package/dist/utils/serialize-mutations.js +1 -1
- package/dist/verified-recall.js +39 -29
- package/dist/write-envelope.d.ts +282 -0
- package/dist/write-envelope.js +35 -0
- package/dist/write-envelope.js.map +1 -0
- package/dist/write-quarantine.d.ts +79 -0
- package/dist/write-quarantine.js +11 -0
- package/dist/write-quarantine.js.map +1 -0
- package/dist/write-rate-limiter.d.ts +45 -0
- package/dist/write-rate-limiter.js +9 -0
- package/dist/write-rate-limiter.js.map +1 -0
- package/package.json +37 -2
- package/src/access-admin-ops-surface.ts +17 -7
- package/src/access-boundary.test.ts +28 -0
- package/src/access-boundary.ts +31 -2
- package/src/access-citation.test.ts +72 -0
- package/src/access-citation.ts +139 -0
- package/src/access-errors.ts +21 -0
- package/src/access-fingerprint-parity.test.ts +211 -0
- package/src/access-http-cancellation.test.ts +59 -21
- package/src/access-http.test.ts +90 -0
- package/src/access-http.ts +79 -79
- package/src/access-mcp-cancellation.test.ts +16 -7
- package/src/access-memory-search-fanout.test.ts +220 -0
- package/src/access-memory-search-fanout.ts +168 -0
- package/src/access-observe-quarantine.test.ts +120 -0
- package/src/access-observe-write-surface.ts +130 -11
- package/src/access-operations-batch.ts +2 -0
- package/src/access-recall-concurrency.ts +773 -0
- package/src/access-recall-response.ts +307 -0
- package/src/access-recall-surface.ts +100 -252
- package/src/access-service-coding-write.test.ts +22 -4
- package/src/access-service-health.test.ts +49 -0
- package/src/access-service-namespace.test.ts +486 -8
- package/src/access-service-observe-scope.test.ts +4 -0
- package/src/access-service-recall-concurrency.test.ts +1990 -0
- package/src/access-service.ts +182 -175
- package/src/access-surface-catalog.ts +1 -0
- package/src/access-token-capabilities.ts +16 -9
- package/src/active-recall.test.ts +35 -0
- package/src/active-recall.ts +7 -0
- package/src/bounded-jsonl-state.ts +93 -0
- package/src/buffer-session.test.ts +422 -5
- package/src/buffer-surprise-trigger.test.ts +41 -0
- package/src/buffer.ts +218 -3
- package/src/capabilities-cluster-b.test.ts +1 -0
- package/src/capabilities.ts +5 -6
- package/src/cli.ts +21 -22
- package/src/coding/architecture-surfaces.test.ts +6 -3
- package/src/coding/architecture-surfaces.ts +36 -25
- package/src/coding/decision-surfaces.ts +42 -34
- package/src/compounding/engine.test.ts +5 -1
- package/src/compounding/engine.ts +7 -7
- package/src/config-qmd.ts +89 -0
- package/src/config.test.ts +136 -0
- package/src/config.ts +122 -118
- package/src/connector-provenance-lifecycle.test.ts +4 -4
- package/src/connectors/coerce.test.ts +131 -0
- package/src/connectors/coerce.ts +80 -7
- package/src/contradiction/contradiction.test.ts +10 -6
- package/src/contradiction/resolution.ts +17 -4
- package/src/correction/correction-access-wiring.ts +62 -18
- package/src/cross-namespace-budget.test.ts +35 -0
- package/src/cross-namespace-budget.ts +86 -19
- package/src/explicit-capture.ts +54 -17
- package/src/extraction.ts +2 -3
- package/src/faithfulness-graph-guard.test.ts +16 -69
- package/src/graph-recall.test.ts +31 -0
- package/src/graph.test.ts +137 -1
- package/src/graph.ts +274 -17
- package/src/index.ts +22 -2
- package/src/local-llm.ts +4 -6
- package/src/logger.ts +16 -0
- package/src/maintenance/dreams-ledger.ts +100 -49
- package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
- package/src/memory-cache.ts +70 -0
- package/src/memory-lifecycle-ledger-utils.ts +51 -5
- package/src/namespaces/principal.test.ts +37 -1
- package/src/namespaces/principal.ts +48 -0
- package/src/namespaces/search.test.ts +79 -5
- package/src/namespaces/search.ts +59 -6
- package/src/namespaces/storage.ts +45 -1
- package/src/offline-sync-exclude-globs.ts +58 -0
- package/src/offline-sync-impression-drain.test.ts +316 -0
- package/src/offline-sync-impression-drain.ts +260 -0
- package/src/offline-sync.test.ts +32 -5
- package/src/offline-sync.ts +1 -14
- package/src/operator-toolkit.ts +1 -1
- package/src/orchestration/batch-deindex-flush.test.ts +146 -0
- package/src/orchestration/consolidation-run.ts +96 -85
- package/src/orchestration/extraction-envelope.ts +94 -0
- package/src/orchestration/extraction-persist-promotion.ts +134 -0
- package/src/orchestration/extraction-persist.ts +325 -260
- package/src/orchestration/extraction-run.test.ts +1 -1
- package/src/orchestration/extraction-run.ts +2 -2
- package/src/orchestration/graph-recall-coordinator.ts +18 -7
- package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
- package/src/orchestration/maintenance.test.ts +2103 -3
- package/src/orchestration/maintenance.ts +581 -2
- package/src/orchestration/namespace-read-fanout.ts +14 -8
- package/src/orchestration/orchestrator-helpers.ts +8 -1
- package/src/orchestration/orchestrator-init.ts +22 -6
- package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
- package/src/orchestration/persistence-index.ts +64 -9
- package/src/orchestration/qmd-result-resolver.ts +27 -0
- package/src/orchestration/recall-entry.ts +34 -19
- package/src/orchestration/recall-internal.ts +207 -79
- package/src/orchestration/recall-rerank-coordinator.ts +229 -82
- package/src/orchestration/recall-result-formatter.ts +76 -20
- package/src/orchestration/recall-search-pipeline.test.ts +70 -0
- package/src/orchestration/recall-search-pipeline.ts +102 -129
- package/src/orchestration/recall-section-coordinator.ts +315 -85
- package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
- package/src/orchestration/session-context.ts +21 -0
- package/src/orchestration/workspace-ops.test.ts +348 -0
- package/src/orchestration/workspace-ops.ts +172 -34
- package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
- package/src/orchestrator-connector-dedup.test.ts +1061 -40
- package/src/orchestrator-flush.test.ts +155 -39
- package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
- package/src/orchestrator-source-attribution.test.ts +9 -9
- package/src/orchestrator.ts +166 -150
- package/src/prioritized-embed.ts +123 -0
- package/src/proactive-contention.test.ts +80 -0
- package/src/proactive-contention.ts +39 -0
- package/src/procedural/procedure-miner.test.ts +19 -14
- package/src/procedural/procedure-miner.ts +44 -13
- package/src/qmd-client.test.ts +111 -1
- package/src/qmd-status.ts +186 -0
- package/src/qmd.test.ts +22 -0
- package/src/qmd.ts +60 -48
- package/src/recall-budget-config.test.ts +30 -0
- package/src/recall-cold-deadline.test.ts +149 -0
- package/src/recall-concurrency-config.ts +28 -0
- package/src/recall-memory-map.ts +74 -0
- package/src/recall-rerank-coordinator.test.ts +508 -0
- package/src/recall-state.test.ts +825 -1
- package/src/recall-state.ts +406 -7
- package/src/recall-timings-access.test.ts +41 -0
- package/src/recall-timings.ts +16 -0
- package/src/relay/mission-access.test.ts +5 -5
- package/src/rerank.ts +22 -0
- package/src/retrieval-agents.test.ts +79 -0
- package/src/retrieval-agents.ts +71 -19
- package/src/salvage-envelope.ts +28 -0
- package/src/scopes/scope-plan.test.ts +42 -0
- package/src/scopes/scope-plan.ts +45 -0
- package/src/search/port.ts +24 -0
- package/src/secure-store/index.ts +1 -0
- package/src/secure-store/secure-fs.ts +48 -0
- package/src/secure-store/secure-store.test.ts +40 -0
- package/src/semantic-rule-promotion.ts +13 -4
- package/src/storage/content-hash-index.ts +655 -0
- package/src/storage/entity-timeline.ts +473 -0
- package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
- package/src/storage/secure-line-reader.test.ts +197 -0
- package/src/storage/secure-line-reader.ts +181 -3
- package/src/storage-append-header-sniff.test.ts +195 -0
- package/src/storage-behavior-signals-cache.test.ts +237 -0
- package/src/storage-contract/cache-coherence.test.ts +96 -1
- package/src/storage-contract/content-hash.test.ts +47 -2
- package/src/storage-fact-hash-index-defer.test.ts +1200 -0
- package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
- package/src/storage.ts +942 -903
- package/src/structured-attributes.ts +52 -0
- package/src/temporal-index-batch.ts +112 -0
- package/src/temporal-index.test.ts +193 -0
- package/src/temporal-index.ts +49 -53
- package/src/testing/lifecycle-matrix.test.ts +212 -0
- package/src/testing/lifecycle-matrix.ts +271 -0
- package/src/testing/orchestrator-lite.ts +236 -0
- package/src/testing/subjects/dreams-ledger.test.ts +67 -0
- package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
- package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
- package/src/testing/subjects/recall-budget.test.ts +461 -0
- package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
- package/src/trust-score-stage.test.ts +154 -0
- package/src/trust-score-stage.ts +216 -53
- package/src/types-continuity.ts +57 -0
- package/src/types.ts +66 -77
- package/src/utils/path-containment.test.ts +75 -0
- package/src/utils/path-containment.ts +76 -0
- package/src/utils/serialize-mutations.test.ts +122 -0
- package/src/utils/serialize-mutations.ts +68 -3
- package/src/wearables/memory-gen.test.ts +31 -9
- package/src/wearables/memory-gen.ts +95 -55
- package/src/wearables/pipeline.test.ts +10 -7
- package/src/wearables/service.test.ts +6 -8
- package/src/wearables/service.ts +2 -2
- package/src/write-envelope.extension.test.ts +111 -0
- package/src/write-envelope.test.ts +683 -0
- package/src/write-envelope.ts +902 -0
- package/src/write-quarantine.test.ts +193 -0
- package/src/write-quarantine.ts +241 -0
- package/src/write-rate-limiter.test.ts +105 -0
- package/src/write-rate-limiter.ts +135 -0
- package/src/write-sealed-parity.test.ts +204 -0
- package/dist/chunk-2VN4JAX7.js.map +0 -1
- package/dist/chunk-37CTGERM.js.map +0 -1
- package/dist/chunk-7ICYQUOL.js.map +0 -1
- package/dist/chunk-AD6AMF2N.js.map +0 -1
- package/dist/chunk-AHLPZ2SF.js.map +0 -1
- package/dist/chunk-ASKEM4AR.js.map +0 -1
- package/dist/chunk-B3F4CWQR.js.map +0 -1
- package/dist/chunk-BCDKBDSY.js.map +0 -1
- package/dist/chunk-BFPETA3S.js.map +0 -1
- package/dist/chunk-BFVEEB7W.js.map +0 -1
- package/dist/chunk-E5BK6CGV.js +0 -335
- package/dist/chunk-E5BK6CGV.js.map +0 -1
- package/dist/chunk-EEARRVZ2.js.map +0 -1
- package/dist/chunk-F7AU34FC.js.map +0 -1
- package/dist/chunk-FBNWOMCE.js.map +0 -1
- package/dist/chunk-FTYDWKO6.js.map +0 -1
- package/dist/chunk-GMSDQUCR.js.map +0 -1
- package/dist/chunk-GWTFLF2P.js.map +0 -1
- package/dist/chunk-IFJ23BHU.js.map +0 -1
- package/dist/chunk-IKQTFQMI.js.map +0 -1
- package/dist/chunk-J2HSAU72.js.map +0 -1
- package/dist/chunk-JMBVCAR4.js.map +0 -1
- package/dist/chunk-KQDNAXOM.js.map +0 -1
- package/dist/chunk-KSBEEMQF.js.map +0 -1
- package/dist/chunk-KSNVDPDF.js.map +0 -1
- package/dist/chunk-LC7OODWZ.js.map +0 -1
- package/dist/chunk-LTJAMRGI.js.map +0 -1
- package/dist/chunk-ND5M64JJ.js.map +0 -1
- package/dist/chunk-NUWYOKS6.js.map +0 -1
- package/dist/chunk-NWTGD4AN.js.map +0 -1
- package/dist/chunk-OBMR4VIX.js.map +0 -1
- package/dist/chunk-ODPLEWB6.js.map +0 -1
- package/dist/chunk-PHK3HARR.js +0 -32
- package/dist/chunk-PHK3HARR.js.map +0 -1
- package/dist/chunk-RANHFI3P.js +0 -8
- package/dist/chunk-RANHFI3P.js.map +0 -1
- package/dist/chunk-RBQLJSJ7.js.map +0 -1
- package/dist/chunk-RULE4VG5.js.map +0 -1
- package/dist/chunk-SVOZFLIQ.js +0 -16
- package/dist/chunk-SVOZFLIQ.js.map +0 -1
- package/dist/chunk-TXLGHDHS.js.map +0 -1
- package/dist/chunk-UN3CH3CO.js +0 -118
- package/dist/chunk-UN3CH3CO.js.map +0 -1
- package/dist/chunk-VSMRDBFT.js +0 -17
- package/dist/chunk-VSMRDBFT.js.map +0 -1
- package/dist/chunk-WU46YPY6.js.map +0 -1
- package/dist/chunk-X47LWMKA.js.map +0 -1
- package/dist/chunk-X64YLC24.js.map +0 -1
- package/dist/chunk-XVLEGMJI.js.map +0 -1
- package/dist/chunk-YF6FMLBT.js.map +0 -1
- package/dist/resolution-VH4NGENZ.js +0 -12
- /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
- /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
- /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
- /package/dist/{graph-edge-decay-FO7AM4UR.js.map → access-recall-response.js.map} +0 -0
- /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
- /package/dist/{capsule-merge-Z2HUO6IK.js.map → capsule-merge-5KKJQBWQ.js.map} +0 -0
- /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
- /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
- /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
- /package/dist/{chunk-6CALL5VN.js.map → chunk-2UFO7X4Q.js.map} +0 -0
- /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
- /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
- /package/dist/{chunk-5S7Z5SHA.js.map → chunk-34RC5RT7.js.map} +0 -0
- /package/dist/{chunk-KGWXHWAH.js.map → chunk-3QAH2S33.js.map} +0 -0
- /package/dist/{chunk-ZIDSD6VC.js.map → chunk-3Y224NYC.js.map} +0 -0
- /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
- /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
- /package/dist/{chunk-2E6G7FCE.js.map → chunk-5Q7EVV4X.js.map} +0 -0
- /package/dist/{chunk-VZ5OJE4X.js.map → chunk-5VQJBH2G.js.map} +0 -0
- /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
- /package/dist/{chunk-4LEF6XWJ.js.map → chunk-6O22TZSB.js.map} +0 -0
- /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
- /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
- /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
- /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
- /package/dist/{chunk-TXVD7PLT.js.map → chunk-A72SWTWW.js.map} +0 -0
- /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
- /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
- /package/dist/{chunk-OKUEZOGW.js.map → chunk-AITCS2RC.js.map} +0 -0
- /package/dist/{chunk-OC35KQIN.js.map → chunk-AJ7QCSIS.js.map} +0 -0
- /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
- /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
- /package/dist/{chunk-N3JDIRBW.js.map → chunk-BLAKS3CP.js.map} +0 -0
- /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
- /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
- /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
- /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
- /package/dist/{chunk-DDGV7NAX.js.map → chunk-CQMEM5CC.js.map} +0 -0
- /package/dist/{chunk-A7B4RMQG.js.map → chunk-CXZQOVIE.js.map} +0 -0
- /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
- /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
- /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
- /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
- /package/dist/{chunk-7MW3CVLD.js.map → chunk-ES36HTSC.js.map} +0 -0
- /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-7LFXDGLH.js.map → chunk-F7GAIWFA.js.map} +0 -0
- /package/dist/{chunk-IKSELOIV.js.map → chunk-FFPJINJE.js.map} +0 -0
- /package/dist/{chunk-V53GJUSL.js.map → chunk-FUTF72MJ.js.map} +0 -0
- /package/dist/{chunk-5UNWK7KU.js.map → chunk-GFPZS3F5.js.map} +0 -0
- /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
- /package/dist/{chunk-HLTAPHZZ.js.map → chunk-HNZKVLAN.js.map} +0 -0
- /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
- /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
- /package/dist/{chunk-HG32URJJ.js.map → chunk-JYIFGGEM.js.map} +0 -0
- /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
- /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
- /package/dist/{chunk-MKDRQAA3.js.map → chunk-KAVBJSBQ.js.map} +0 -0
- /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
- /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
- /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
- /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
- /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
- /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
- /package/dist/{chunk-67ZCJLJY.js.map → chunk-MYFQ3ED4.js.map} +0 -0
- /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
- /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
- /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
- /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
- /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
- /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
- /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
- /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
- /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
- /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
- /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
- /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-UTRJFDP2.js.map → chunk-S2BBISHU.js.map} +0 -0
- /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-PK5XBDA6.js.map → chunk-U3ZAVRP3.js.map} +0 -0
- /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
- /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-7XGSIUP5.js.map → chunk-W4FBGYGK.js.map} +0 -0
- /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
- /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
- /package/dist/{chunk-W5NKDU24.js.map → chunk-WON4APQY.js.map} +0 -0
- /package/dist/{chunk-NKCPUHCI.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
- /package/dist/{chunk-4B4MUS5D.js.map → chunk-YROFNEG5.js.map} +0 -0
- /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
- /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
- /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
- /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
|
@@ -7,25 +7,51 @@ import {
|
|
|
7
7
|
ensureProceduralMiningCron,
|
|
8
8
|
graphEdgeDecayCadenceToCronExpr
|
|
9
9
|
} from "./chunk-666A3MOW.js";
|
|
10
|
+
import {
|
|
11
|
+
rebuildMemoryLifecycleLedger
|
|
12
|
+
} from "./chunk-7RNBVZZO.js";
|
|
10
13
|
import {
|
|
11
14
|
planNamespaceMaintenance,
|
|
12
15
|
runNamespaceMaintenanceBatchPlan
|
|
13
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-GFPZS3F5.js";
|
|
17
|
+
import {
|
|
18
|
+
STATE_FILE_MAX_DECRYPT_BYTES,
|
|
19
|
+
drainPendingLifecycleLedgerIfAny,
|
|
20
|
+
pendingLifecycleLedgerDir
|
|
21
|
+
} from "./chunk-AVPXXV6J.js";
|
|
22
|
+
import {
|
|
23
|
+
namespaceIdentityFromToken
|
|
24
|
+
} from "./chunk-EGGE52UU.js";
|
|
25
|
+
import {
|
|
26
|
+
assertPathInsideRoot,
|
|
27
|
+
listContainedSpillFiles
|
|
28
|
+
} from "./chunk-GCASGYIO.js";
|
|
29
|
+
import {
|
|
30
|
+
resolveHomeDir
|
|
31
|
+
} from "./chunk-JUC24CTX.js";
|
|
32
|
+
import {
|
|
33
|
+
SECURE_STORE_ENVELOPE_OVERHEAD_BYTES,
|
|
34
|
+
probeEncryptedRegularFileHeader
|
|
35
|
+
} from "./chunk-AIK5W3IW.js";
|
|
36
|
+
import {
|
|
37
|
+
isErrnoCode
|
|
38
|
+
} from "./chunk-5UZXUTVO.js";
|
|
39
|
+
import {
|
|
40
|
+
isSafeRouteNamespace
|
|
41
|
+
} from "./chunk-U3PN77QT.js";
|
|
14
42
|
import {
|
|
15
43
|
resolveConsolidationCapabilities,
|
|
16
44
|
resolveNamespaceCapabilities,
|
|
17
45
|
resolveQmdCapabilities,
|
|
18
46
|
resolveRecallAuxiliaryCapabilities
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import {
|
|
21
|
-
resolveHomeDir
|
|
22
|
-
} from "./chunk-JUC24CTX.js";
|
|
47
|
+
} from "./chunk-SCCO46KZ.js";
|
|
23
48
|
import {
|
|
24
49
|
log
|
|
25
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-3WCASNQZ.js";
|
|
26
51
|
|
|
27
52
|
// src/orchestration/maintenance.ts
|
|
28
53
|
import { existsSync } from "fs";
|
|
54
|
+
import { appendFile, lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from "fs/promises";
|
|
29
55
|
import path from "path";
|
|
30
56
|
function qmdMaintenanceSkipReasonForError(error) {
|
|
31
57
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -46,6 +72,15 @@ var MaintenanceScheduler = class {
|
|
|
46
72
|
qmdMaintenanceInFlight = false;
|
|
47
73
|
lastQmdEmbedAtMs = 0;
|
|
48
74
|
lastQmdEmbedAtMsByNamespace = /* @__PURE__ */ new Map();
|
|
75
|
+
// ── Lifecycle-ledger auto-compaction state (issue #1910) ──
|
|
76
|
+
lifecycleCompactionInFlight = false;
|
|
77
|
+
lastLifecycleCompactionAtMs = 0;
|
|
78
|
+
// Upper bound on a rewritten ledger; a preserving compaction is bounded to
|
|
79
|
+
// this so it can never leave the ledger over the whole-file read/decrypt cap
|
|
80
|
+
// (#2033). Defaults to the decrypt cap; overridable in focused tests to drive
|
|
81
|
+
// the bounding + post-write verification deterministically without a 400MB
|
|
82
|
+
// fixture.
|
|
83
|
+
lifecycleLedgerMaxBytes = STATE_FILE_MAX_DECRYPT_BYTES;
|
|
49
84
|
// ───────────────────────────────────────────────────────────────────────
|
|
50
85
|
// Cron auto-registration
|
|
51
86
|
// ───────────────────────────────────────────────────────────────────────
|
|
@@ -334,6 +369,9 @@ var MaintenanceScheduler = class {
|
|
|
334
369
|
const msg = err instanceof Error ? err.message : String(err);
|
|
335
370
|
log.warn(`qmd maintenance request failed (${reason}): ${msg}`);
|
|
336
371
|
}
|
|
372
|
+
void this.maybeCompactMemoryLifecycleLedger().catch(
|
|
373
|
+
(err) => log.debug(`lifecycle ledger auto-compaction check failed (non-fatal): ${err}`)
|
|
374
|
+
);
|
|
337
375
|
}
|
|
338
376
|
/** Internal: run a single QMD maintenance pass under singleflight guard. */
|
|
339
377
|
async runQmdMaintenance() {
|
|
@@ -421,6 +459,359 @@ var MaintenanceScheduler = class {
|
|
|
421
459
|
}
|
|
422
460
|
}
|
|
423
461
|
}
|
|
462
|
+
/**
|
|
463
|
+
* Size-gated, throttled, single-flighted auto-compaction of the lifecycle
|
|
464
|
+
* ledger (issue #1910). Compacts the root ledger AND every namespace ledger
|
|
465
|
+
* (`memoryDir/namespaces/<token>/state/`) when namespaces are enabled, each
|
|
466
|
+
* through the existing `rebuildMemoryLifecycleLedger` so the
|
|
467
|
+
* archive-then-atomic-write discipline is reused verbatim. `0` disables.
|
|
468
|
+
*
|
|
469
|
+
* Before compacting, drain EVERY target's durable pending-append spill (the
|
|
470
|
+
* root ledger AND each namespace ledger) so a lifecycle event that spilled
|
|
471
|
+
* while a prior long rewrite held the lock is folded back into its ledger and
|
|
472
|
+
* cannot be silently lost (issue #2033). Draining is independent of both the
|
|
473
|
+
* compaction threshold and the min-interval throttle: targets are enumerated
|
|
474
|
+
* through the same safe (symlink/containment-checked) resolver and every
|
|
475
|
+
* eligible queue is drained BEFORE any throttle return, so a namespace spill
|
|
476
|
+
* created after the previous pass never waits out the whole interval.
|
|
477
|
+
* Encrypted-store safety is preserved — a keyed target drains through its
|
|
478
|
+
* secure StorageManager, a filesystem-fallback target only through a plaintext
|
|
479
|
+
* context that refuses encrypted ledgers/spills. Work stays bounded: one
|
|
480
|
+
* target enumeration plus a bounded per-queue drain.
|
|
481
|
+
*
|
|
482
|
+
* The min-interval throttle timestamp advances ONLY after real, fully
|
|
483
|
+
* successful compaction work: a failed OR deferred target leaves the throttle
|
|
484
|
+
* un-advanced so it stays eligible on the next maintenance pass, while
|
|
485
|
+
* `lifecycleCompactionInFlight` still prevents overlapping runs. A "deferred"
|
|
486
|
+
* target is oversized but could not be compacted because its encrypted ledger
|
|
487
|
+
* has no unlocked secure store — arming the throttle for it would suppress the
|
|
488
|
+
* retry of that still-oversized ledger for the whole interval (#2033).
|
|
489
|
+
*
|
|
490
|
+
* The min-interval throttle is bypassed for one case: an encrypted ledger
|
|
491
|
+
* already at/over the whole-file decrypt cap is unreadable, so it must be
|
|
492
|
+
* clamped on the next pass rather than wait out the interval. Ordinary
|
|
493
|
+
* below-cap (or plaintext) targets stay throttled (#2033).
|
|
494
|
+
*/
|
|
495
|
+
async maybeCompactMemoryLifecycleLedger() {
|
|
496
|
+
const targets = await this.resolveLifecycleCompactionTargets();
|
|
497
|
+
for (const target of targets) {
|
|
498
|
+
await this.drainPendingForTarget(target);
|
|
499
|
+
}
|
|
500
|
+
const threshold = this.deps.config.memoryLifecycleLedgerCompactBytes;
|
|
501
|
+
if (!(threshold > 0)) return;
|
|
502
|
+
if (this.lifecycleCompactionInFlight) return;
|
|
503
|
+
const now = Date.now();
|
|
504
|
+
if (now - this.lastLifecycleCompactionAtMs < this.deps.config.memoryLifecycleLedgerCompactMinIntervalMs && !await this.hasOverCapEncryptedLifecycleLedger(targets)) {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
if (this.lifecycleCompactionInFlight) return;
|
|
508
|
+
this.lifecycleCompactionInFlight = true;
|
|
509
|
+
try {
|
|
510
|
+
let compacted = 0;
|
|
511
|
+
let failed = 0;
|
|
512
|
+
let deferred = 0;
|
|
513
|
+
for (const target of targets) {
|
|
514
|
+
const outcome = await this.compactLifecycleLedgerTarget(target, threshold);
|
|
515
|
+
if (outcome === "compacted") compacted += 1;
|
|
516
|
+
else if (outcome === "failed") failed += 1;
|
|
517
|
+
else if (outcome === "deferred") deferred += 1;
|
|
518
|
+
}
|
|
519
|
+
if (compacted > 0 && failed === 0 && deferred === 0) {
|
|
520
|
+
this.lastLifecycleCompactionAtMs = now;
|
|
521
|
+
}
|
|
522
|
+
} finally {
|
|
523
|
+
this.lifecycleCompactionInFlight = false;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* True when any lifecycle target's ledger is encrypted at rest AND its
|
|
528
|
+
* on-disk size is at/over the whole-file decrypt cap. Such a ledger is already
|
|
529
|
+
* unreadable (the secure reader refuses at/over the cap), so it must reach the
|
|
530
|
+
* bounded compaction path on the next maintenance pass regardless of the
|
|
531
|
+
* global min-interval throttle — otherwise the throttle could keep an
|
|
532
|
+
* unreadable ledger un-clamped for a whole interval (#2033). Ordinary
|
|
533
|
+
* below-cap or plaintext targets never match, so the throttle still governs
|
|
534
|
+
* them. A stat/probe failure yields "no forced target" and is left to the
|
|
535
|
+
* normal compaction path, which classifies it as failed and retries.
|
|
536
|
+
*/
|
|
537
|
+
async hasOverCapEncryptedLifecycleLedger(targets) {
|
|
538
|
+
for (const target of targets) {
|
|
539
|
+
const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
540
|
+
let size;
|
|
541
|
+
try {
|
|
542
|
+
size = (await stat(ledgerPath)).size;
|
|
543
|
+
} catch {
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
if (size < this.lifecycleLedgerMaxBytes) continue;
|
|
547
|
+
try {
|
|
548
|
+
if (await probeEncryptedRegularFileHeader(ledgerPath)) return true;
|
|
549
|
+
} catch {
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Drain one compaction target's durable pending spill. A catalog-backed
|
|
557
|
+
* target folds through its secure StorageManager; a filesystem-fallback
|
|
558
|
+
* target (no storage) folds through a path-scoped plaintext context that
|
|
559
|
+
* refuses encrypted ledgers/spills so a keyless drain never downgrades an
|
|
560
|
+
* encrypted ledger (issue #2033).
|
|
561
|
+
*/
|
|
562
|
+
async drainPendingForTarget(target) {
|
|
563
|
+
if (target.storage) {
|
|
564
|
+
await this.drainPendingLifecycleAppends(target.storage);
|
|
565
|
+
} else {
|
|
566
|
+
await this.drainPendingLifecycleAppendsForPath(target.memoryDir);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
/** Drain a target's durable pending lifecycle-append spill into its ledger
|
|
570
|
+
* (issue #2033); non-fatal and a fast no-op when nothing is pending. */
|
|
571
|
+
async drainPendingLifecycleAppends(storage) {
|
|
572
|
+
if (!storage) return;
|
|
573
|
+
try {
|
|
574
|
+
await storage.drainPendingMemoryLifecycleEvents();
|
|
575
|
+
} catch (err) {
|
|
576
|
+
log.debug(`lifecycle pending drain failed (non-fatal): ${err}`);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Drain a filesystem-fallback target's pending lifecycle-append spill when no
|
|
581
|
+
* secure StorageManager is available (catalog-disabled namespace; issue
|
|
582
|
+
* #2033). Uses the safe path-scoped PLAINTEXT context this fallback already
|
|
583
|
+
* operates in: a keyless drain can only fold plaintext spills into a plaintext
|
|
584
|
+
* ledger, so it refuses when the ledger or ANY spill is encrypted at rest,
|
|
585
|
+
* leaving those pending for a keyed (catalog-path) drain — exactly mirroring
|
|
586
|
+
* the fallback compaction's encrypted-ledger deferral. Non-fatal; a fast
|
|
587
|
+
* no-op when nothing is pending. The shared spill lister enforces the symlink/
|
|
588
|
+
* containment guard on every spill file it reads or deletes.
|
|
589
|
+
*/
|
|
590
|
+
async drainPendingLifecycleAppendsForPath(memoryDir) {
|
|
591
|
+
const ledgerPath = path.join(memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
592
|
+
const spillDir = pendingLifecycleLedgerDir(ledgerPath);
|
|
593
|
+
let spillFiles;
|
|
594
|
+
let claimedOrphans;
|
|
595
|
+
try {
|
|
596
|
+
spillFiles = await listContainedSpillFiles(spillDir);
|
|
597
|
+
claimedOrphans = await listContainedSpillFiles(spillDir, ".jsonl.claimed");
|
|
598
|
+
} catch (err) {
|
|
599
|
+
log.debug(`fallback lifecycle pending scan failed (non-fatal) for ${memoryDir}: ${err}`);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
if (spillFiles.length === 0 && claimedOrphans.length === 0) return;
|
|
603
|
+
const io = {
|
|
604
|
+
writeSecure: async (filePath, payload) => {
|
|
605
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
606
|
+
await writeFile(filePath, payload, "utf-8");
|
|
607
|
+
},
|
|
608
|
+
readSecure: async (filePath) => {
|
|
609
|
+
if (await probeEncryptedRegularFileHeader(filePath)) {
|
|
610
|
+
throw new Error(`fallback lifecycle drain deferred: encrypted spill at ${filePath}`);
|
|
611
|
+
}
|
|
612
|
+
return readFile(filePath, "utf-8");
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
try {
|
|
616
|
+
await drainPendingLifecycleLedgerIfAny(
|
|
617
|
+
ledgerPath,
|
|
618
|
+
io,
|
|
619
|
+
async (payload) => {
|
|
620
|
+
if (await probeEncryptedRegularFileHeader(ledgerPath)) {
|
|
621
|
+
throw new Error(`fallback lifecycle drain deferred: ledger became encrypted at ${ledgerPath}`);
|
|
622
|
+
}
|
|
623
|
+
await appendFile(ledgerPath, payload, "utf-8");
|
|
624
|
+
},
|
|
625
|
+
async () => {
|
|
626
|
+
await mkdir(path.dirname(ledgerPath), { recursive: true });
|
|
627
|
+
}
|
|
628
|
+
);
|
|
629
|
+
} catch (err) {
|
|
630
|
+
log.debug(`fallback lifecycle pending drain failed (non-fatal) for ${memoryDir}: ${err}`);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Enumerate the lifecycle ledgers to consider for compaction: the root
|
|
635
|
+
* (through the secure-configured root storage when available) plus every
|
|
636
|
+
* cataloged namespace ledger when namespaces are enabled. Deduplicated by
|
|
637
|
+
* resolved storage dir so a namespace that collapses onto the root is not
|
|
638
|
+
* compacted twice. Namespace resolution failures are non-fatal.
|
|
639
|
+
*/
|
|
640
|
+
async resolveLifecycleCompactionTargets() {
|
|
641
|
+
const targets = [];
|
|
642
|
+
const seen = /* @__PURE__ */ new Set();
|
|
643
|
+
const addTarget = (memoryDir, storage) => {
|
|
644
|
+
const key = path.resolve(memoryDir);
|
|
645
|
+
if (seen.has(key)) return;
|
|
646
|
+
seen.add(key);
|
|
647
|
+
targets.push({ memoryDir, storage });
|
|
648
|
+
};
|
|
649
|
+
const rootStorage = this.deps.getStorage?.();
|
|
650
|
+
addTarget(rootStorage ? rootStorage.dir : this.deps.config.memoryDir, rootStorage);
|
|
651
|
+
const resolveNamespaceStorage = this.deps.storageForNamespace;
|
|
652
|
+
if (resolveNamespaceStorage && this.deps.namespaceCatalog?.enabled) {
|
|
653
|
+
let records = [];
|
|
654
|
+
try {
|
|
655
|
+
records = await this.deps.namespaceCatalog.listNamespaces();
|
|
656
|
+
} catch (err) {
|
|
657
|
+
log.debug(`lifecycle compaction: namespace enumeration failed (non-fatal): ${err}`);
|
|
658
|
+
}
|
|
659
|
+
for (const record of records) {
|
|
660
|
+
const namespace = record.namespace.trim();
|
|
661
|
+
if (!namespace) continue;
|
|
662
|
+
try {
|
|
663
|
+
const storage = await resolveNamespaceStorage(namespace);
|
|
664
|
+
addTarget(storage.dir, storage);
|
|
665
|
+
} catch (err) {
|
|
666
|
+
log.debug(
|
|
667
|
+
`lifecycle compaction: storage resolve failed for namespace ${namespace} (non-fatal): ${err}`
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
if (resolveNamespaceCapabilities(this.deps.config).namespaces) {
|
|
673
|
+
const namespacesBase = path.join(this.deps.config.memoryDir, "namespaces");
|
|
674
|
+
let memoryDirReal;
|
|
675
|
+
try {
|
|
676
|
+
memoryDirReal = await realpath(this.deps.config.memoryDir);
|
|
677
|
+
const baseStat = await lstat(namespacesBase);
|
|
678
|
+
if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {
|
|
679
|
+
throw new Error("namespaces base is a symlink or not a directory");
|
|
680
|
+
}
|
|
681
|
+
assertPathInsideRoot(memoryDirReal, await realpath(namespacesBase), namespacesBase);
|
|
682
|
+
} catch (err) {
|
|
683
|
+
if (!isErrnoCode(err, "ENOENT")) {
|
|
684
|
+
log.debug(`lifecycle compaction: namespaces base rejected (non-fatal): ${err}`);
|
|
685
|
+
}
|
|
686
|
+
return targets;
|
|
687
|
+
}
|
|
688
|
+
let entries = [];
|
|
689
|
+
try {
|
|
690
|
+
entries = await readdir(namespacesBase, { withFileTypes: true });
|
|
691
|
+
} catch (err) {
|
|
692
|
+
if (!isErrnoCode(err, "ENOENT")) {
|
|
693
|
+
log.debug(`lifecycle compaction: namespaces dir scan failed (non-fatal): ${err}`);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
697
|
+
if (!entry.isDirectory() || entry.isSymbolicLink()) continue;
|
|
698
|
+
const childPath = path.join(namespacesBase, entry.name);
|
|
699
|
+
try {
|
|
700
|
+
assertPathInsideRoot(memoryDirReal, await realpath(childPath), childPath);
|
|
701
|
+
} catch (err) {
|
|
702
|
+
log.debug(`lifecycle compaction: skipping out-of-root namespace dir ${childPath}: ${err}`);
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
const decodedNamespace = namespaceIdentityFromToken(entry.name);
|
|
706
|
+
const routeNamespace = decodedNamespace !== null ? decodedNamespace : isSafeRouteNamespace(entry.name) ? entry.name : null;
|
|
707
|
+
if (resolveNamespaceStorage && routeNamespace !== null) {
|
|
708
|
+
try {
|
|
709
|
+
const storage = await resolveNamespaceStorage(routeNamespace);
|
|
710
|
+
if (path.resolve(storage.dir) === path.resolve(childPath)) {
|
|
711
|
+
addTarget(storage.dir, storage);
|
|
712
|
+
continue;
|
|
713
|
+
}
|
|
714
|
+
log.debug(
|
|
715
|
+
`lifecycle compaction: fallback resolver routed ${childPath} to ${storage.dir}; using keyless target`
|
|
716
|
+
);
|
|
717
|
+
} catch (err) {
|
|
718
|
+
log.debug(
|
|
719
|
+
`lifecycle compaction: fallback storage resolve failed for ${childPath} (non-fatal): ${err}`
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
addTarget(childPath);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
return targets;
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Compact one lifecycle ledger when it is at/over `threshold`. Returns
|
|
730
|
+
* `"skipped"` (absent or below threshold — nothing to do), `"compacted"`
|
|
731
|
+
* (rewritten and verified under the read/decrypt cap), `"failed"`
|
|
732
|
+
* (rebuild/probe threw, or the rewritten ledger is STILL over the cap — an
|
|
733
|
+
* ineffective compaction — non-fatal, retried next pass), or `"deferred"`
|
|
734
|
+
* (oversized but its encrypted ledger cannot be rewritten because no unlocked
|
|
735
|
+
* secure store is available — real work still pending, so the caller must NOT
|
|
736
|
+
* arm the throttle). #2033: a deferred/failed target is distinct from a genuine
|
|
737
|
+
* no-op so one namespace compacting cannot suppress retries for another, and
|
|
738
|
+
* an over-cap rewrite never arms the throttle.
|
|
739
|
+
*/
|
|
740
|
+
async compactLifecycleLedgerTarget(target, threshold) {
|
|
741
|
+
const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
742
|
+
let size = 0;
|
|
743
|
+
try {
|
|
744
|
+
size = (await stat(ledgerPath)).size;
|
|
745
|
+
} catch (err) {
|
|
746
|
+
if (isErrnoCode(err, "ENOENT")) return "skipped";
|
|
747
|
+
log.warn(
|
|
748
|
+
`lifecycle ledger size check failed (non-fatal) for ${target.memoryDir}: ${err}`
|
|
749
|
+
);
|
|
750
|
+
return "failed";
|
|
751
|
+
}
|
|
752
|
+
if (size < Math.min(threshold, this.lifecycleLedgerMaxBytes)) return "skipped";
|
|
753
|
+
let encrypted;
|
|
754
|
+
try {
|
|
755
|
+
encrypted = await probeEncryptedRegularFileHeader(ledgerPath);
|
|
756
|
+
} catch (err) {
|
|
757
|
+
log.warn(`lifecycle ledger encryption probe failed (non-fatal) for ${ledgerPath}: ${err}`);
|
|
758
|
+
return "failed";
|
|
759
|
+
}
|
|
760
|
+
const effectiveThreshold = encrypted ? Math.min(threshold, this.lifecycleLedgerMaxBytes) : threshold;
|
|
761
|
+
if (size < effectiveThreshold) return "skipped";
|
|
762
|
+
if (encrypted && !(target.storage?.isSecureStoreUnlocked() ?? false)) {
|
|
763
|
+
log.warn(
|
|
764
|
+
`lifecycle ledger at ${ledgerPath} is encrypted at rest but no unlocked secure storage is available; deferring auto-compaction to avoid a plaintext rewrite. Run 'remnic rebuild-memory-lifecycle-ledger --write' after unlocking.`
|
|
765
|
+
);
|
|
766
|
+
return "deferred";
|
|
767
|
+
}
|
|
768
|
+
const replacementEncrypted = encrypted || (target.storage?.willEncryptStateWrites() ?? false);
|
|
769
|
+
const plaintextBudget = replacementEncrypted ? this.lifecycleLedgerMaxBytes - SECURE_STORE_ENVELOPE_OVERHEAD_BYTES - 1 : this.lifecycleLedgerMaxBytes - 1;
|
|
770
|
+
try {
|
|
771
|
+
const result = await rebuildMemoryLifecycleLedger({
|
|
772
|
+
memoryDir: target.memoryDir,
|
|
773
|
+
dryRun: false,
|
|
774
|
+
storage: target.storage,
|
|
775
|
+
// Background compaction must not lose append-only history that
|
|
776
|
+
// frontmatter cannot reconstruct (issue #1910); the manual CLI repair
|
|
777
|
+
// rebuild now preserves and bounds identically (#2033).
|
|
778
|
+
preserveExistingEvents: true,
|
|
779
|
+
// Bound the PLAINTEXT rewrite to a budget that reserves the secure-store
|
|
780
|
+
// envelope, so the on-disk ledger (plaintext, or plaintext+envelope when
|
|
781
|
+
// encrypted) is strictly below the read/decrypt cap; overflow lands in
|
|
782
|
+
// the verbatim backup (#2033 findings 2+4).
|
|
783
|
+
maxLedgerBytes: plaintextBudget
|
|
784
|
+
});
|
|
785
|
+
let rewrittenSize = 0;
|
|
786
|
+
try {
|
|
787
|
+
rewrittenSize = (await stat(ledgerPath)).size;
|
|
788
|
+
} catch (err) {
|
|
789
|
+
log.warn(`lifecycle ledger post-compaction size check failed (non-fatal) for ${target.memoryDir}: ${err}`);
|
|
790
|
+
return "failed";
|
|
791
|
+
}
|
|
792
|
+
if (rewrittenSize >= this.lifecycleLedgerMaxBytes) {
|
|
793
|
+
log.warn(
|
|
794
|
+
`lifecycle ledger auto-compaction ineffective for ${target.memoryDir}: rewritten ledger is ${rewrittenSize}B, still at/over the ${this.lifecycleLedgerMaxBytes}-byte read/decrypt cap; leaving the throttle un-armed to retry.`
|
|
795
|
+
);
|
|
796
|
+
return "failed";
|
|
797
|
+
}
|
|
798
|
+
if (result.rewritten === false) {
|
|
799
|
+
log.debug(
|
|
800
|
+
`lifecycle ledger already compact for ${target.memoryDir}: ${rewrittenSize}B, no rewrite needed (throttle armed to avoid re-archiving an unchanged ledger).`
|
|
801
|
+
);
|
|
802
|
+
} else {
|
|
803
|
+
log.info(
|
|
804
|
+
`lifecycle ledger auto-compacted (${target.memoryDir}): ${size}B -> ${rewrittenSize}B, ${result.rebuiltRows} rows (${result.preservedAppendOnlyRows ?? 0} append-only preserved, ${result.archivedOverflowRows ?? 0} overflow archived), backup=${result.backupPath ?? "none"}`
|
|
805
|
+
);
|
|
806
|
+
}
|
|
807
|
+
return "compacted";
|
|
808
|
+
} catch (err) {
|
|
809
|
+
log.warn(
|
|
810
|
+
`lifecycle ledger auto-compaction failed (non-fatal) for ${target.memoryDir}: ${err}`
|
|
811
|
+
);
|
|
812
|
+
return "failed";
|
|
813
|
+
}
|
|
814
|
+
}
|
|
424
815
|
/** Build the namespace-aware maintenance plan for one job. */
|
|
425
816
|
async namespaceMaintenancePlan(jobName) {
|
|
426
817
|
return planNamespaceMaintenance(this.deps.config, {
|
|
@@ -447,4 +838,4 @@ var MaintenanceScheduler = class {
|
|
|
447
838
|
export {
|
|
448
839
|
MaintenanceScheduler
|
|
449
840
|
};
|
|
450
|
-
//# sourceMappingURL=chunk-
|
|
841
|
+
//# sourceMappingURL=chunk-MC5Q3J7S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestration/maintenance.ts"],"sourcesContent":["/**\n * Maintenance scheduler — extracted from the orchestrator (issue #1526 PR1).\n *\n * Owns the WHEN of memory maintenance:\n * - cron auto-registration (writes jobs.json entries the OpenClaw cron\n * daemon picks up)\n * - debounced + singleflight QMD index maintenance (re-index + embed\n * after writes)\n * - consolidation scheduling trigger (count + interval gated)\n *\n * Does NOT own the WHAT — the actual job runners (runSemanticConsolidation,\n * runPatternReinforcement, runDeepSleepGovernanceNow, runConsolidation)\n * remain on the orchestrator because they need the full LLM + extraction\n * dependency surface. The scheduler invokes consolidation through a\n * callback so the orchestrator stays the source of truth for that work.\n *\n * Behavior-preserving move from orchestrator.ts. No logic changes — the\n * orchestrator keeps thin delegating methods so existing tests that stub\n * `orchestrator.requestQmdMaintenance` etc. continue to work.\n */\n\nimport { resolveNamespaceCapabilities,\n resolveQmdCapabilities,resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities } from \"../capabilities.js\";\nimport { existsSync, type Dirent } from \"node:fs\";\nimport { appendFile, lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { PluginConfig } from \"../types.js\";\nimport type { SearchBackend } from \"../search/port.js\";\nimport type { StorageManager } from \"../index.js\";\nimport {\n NamespaceSearchRouter,\n type NamespaceUpdateResult,\n} from \"../namespaces/search.js\";\nimport type { NamespaceCatalog, NamespaceRecord } from \"../namespaces/catalog.js\";\nimport { namespaceIdentityFromToken } from \"../namespaces/identity.js\";\nimport { isSafeRouteNamespace } from \"../routing/engine.js\";\nimport {\n planNamespaceMaintenance,\n runNamespaceMaintenanceBatchPlan,\n type NamespaceMaintenancePlan,\n type NamespaceMaintenanceSkipReason,\n} from \"../maintenance/namespace-planner.js\";\nimport {\n ensureContradictionScanCron,\n ensureDaySummaryCron,\n ensureGraphEdgeDecayCron,\n ensureNightlyGovernanceCron,\n ensurePatternReinforcementCron,\n ensureProceduralMiningCron,\n graphEdgeDecayCadenceToCronExpr,\n} from \"../maintenance/memory-governance-cron.js\";\nimport { rebuildMemoryLifecycleLedger } from \"../maintenance/rebuild-memory-lifecycle-ledger.js\";\nimport {\n drainPendingLifecycleLedgerIfAny,\n pendingLifecycleLedgerDir,\n type LifecyclePendingIo,\n} from \"../storage/memory-lifecycle-ledger-access.js\";\nimport { STATE_FILE_MAX_DECRYPT_BYTES } from \"../storage/secure-line-reader.js\";\nimport { resolveHomeDir } from \"../runtime/env.js\";\nimport { log } from \"../logger.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { assertPathInsideRoot, listContainedSpillFiles } from \"../utils/path-containment.js\";\nimport {\n probeEncryptedRegularFileHeader,\n SECURE_STORE_ENVELOPE_OVERHEAD_BYTES,\n} from \"../secure-store/secure-fs.js\";\n\n/** Reason a QMD maintenance pass was skipped, used for status recording. */\nfunction qmdMaintenanceSkipReasonForError(\n error: unknown,\n): NamespaceMaintenanceSkipReason | null {\n const message = error instanceof Error ? error.message : String(error);\n return /^QMD (?:update|embed) skipped by .*min-interval gate$/.test(message)\n ? \"throttled\"\n : null;\n}\n\n/** Dependencies injected by the orchestrator. All stable references. */\nexport interface MaintenanceSchedulerDeps {\n config: PluginConfig;\n /** Live accessor — the orchestrator can reassign its qmd backend after\n * construction (e.g. swap to NoopSearchBackend when the collection is\n * missing), and the scheduler must always observe the current backend. */\n getQmd: () => SearchBackend;\n namespaceSearchRouter: NamespaceSearchRouter;\n namespaceCatalog: NamespaceCatalog;\n /**\n * Root storage (secure-store configured). Threaded so lifecycle-ledger\n * auto-compaction (#1910) rebuilds through the live secure context: encrypted\n * memories stay decryptable and the rewritten ledger stays encrypted at rest.\n * Omitted in focused tests, where compaction falls back to a fresh plaintext\n * StorageManager (the CLI-equivalent path).\n */\n getStorage?: () => StorageManager;\n /**\n * Resolve a namespace's (secure-store aware) storage. Threaded so\n * auto-compaction also bounds per-namespace lifecycle ledgers under\n * `memoryDir/namespaces/<token>/state/`, not just the root state path\n * (#1910). Consulted only when namespaces are enabled.\n */\n storageForNamespace?: (namespace: string) => Promise<StorageManager>;\n}\n\n/**\n * Schedules and debounces memory maintenance work. Owns the cadence +\n * singleflight state that previously lived as private orchestrator fields.\n *\n * The orchestrator constructs one instance in its constructor and delegates\n * the public scheduling entrypoints to it. Job execution stays on the\n * orchestrator (LLM-heavy) and is invoked through callbacks.\n */\nexport class MaintenanceScheduler {\n // ── Consolidation scheduling state ──\n private nonZeroExtractionsSinceConsolidation = 0;\n private lastConsolidationRunAtMs = 0;\n private consolidationInFlight = false;\n\n // ── QMD maintenance scheduling state ──\n private qmdMaintenanceTimer: NodeJS.Timeout | null = null;\n private qmdMaintenancePending = false;\n private qmdMaintenanceInFlight = false;\n private lastQmdEmbedAtMs = 0;\n private lastQmdEmbedAtMsByNamespace = new Map<string, number>();\n\n // ── Lifecycle-ledger auto-compaction state (issue #1910) ──\n private lifecycleCompactionInFlight = false;\n private lastLifecycleCompactionAtMs = 0;\n // Upper bound on a rewritten ledger; a preserving compaction is bounded to\n // this so it can never leave the ledger over the whole-file read/decrypt cap\n // (#2033). Defaults to the decrypt cap; overridable in focused tests to drive\n // the bounding + post-write verification deterministically without a 400MB\n // fixture.\n private lifecycleLedgerMaxBytes = STATE_FILE_MAX_DECRYPT_BYTES;\n\n constructor(private readonly deps: MaintenanceSchedulerDeps) {}\n\n // ───────────────────────────────────────────────────────────────────────\n // Cron auto-registration\n // ───────────────────────────────────────────────────────────────────────\n\n /**\n * Register every cron job the daemon should run, gated by its config flag.\n * Each registration is independent and non-fatal — a failure in one does\n * not block the others (mirrors the orchestrator's prior sequential try/\n * catch behavior exactly).\n *\n * Returns when all eligible registrations have completed so callers that\n * `await deferredReady` can rely on jobs.json being current.\n */\n async autoRegisterCrons(_signal: AbortSignal): Promise<void> {\n if (resolveRecallAuxiliaryCapabilities(this.deps.config).daySummary) {\n try {\n await this.autoRegisterDaySummaryCron();\n } catch (err) {\n log.debug(`day-summary cron auto-register failed (non-fatal): ${err}`);\n }\n }\n if (this.deps.config.nightlyGovernanceCronAutoRegister) {\n try {\n await this.autoRegisterNightlyGovernanceCron();\n } catch (err) {\n log.debug(`nightly governance cron auto-register failed (non-fatal): ${err}`);\n }\n }\n if (this.deps.config.procedural?.proceduralMiningCronAutoRegister) {\n try {\n await this.autoRegisterProceduralMiningCron();\n } catch (err) {\n log.debug(`procedural mining cron auto-register failed (non-fatal): ${err}`);\n }\n }\n if (this.deps.config.contradictionScan?.enabled) {\n try {\n await this.autoRegisterContradictionScanCron();\n } catch (err) {\n log.debug(`contradiction scan cron auto-register failed (non-fatal): ${err}`);\n }\n }\n if (resolveConsolidationCapabilities(this.deps.config).patternReinforcement) {\n try {\n await this.autoRegisterPatternReinforcementCron();\n } catch (err) {\n log.debug(`pattern reinforcement cron auto-register failed (non-fatal): ${err}`);\n }\n }\n if (resolveConsolidationCapabilities(this.deps.config).graphEdgeDecay) {\n try {\n await this.autoRegisterGraphEdgeDecayCron();\n } catch (err) {\n log.debug(`graph edge decay cron auto-register failed (non-fatal): ${err}`);\n }\n }\n }\n\n async autoRegisterDaySummaryCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"day-summary cron: jobs.json not found, skipping auto-register\");\n return;\n }\n\n // Resolve an OpenClaw cron-routing model only in gateway mode. In plugin\n // mode, summaryModel is a direct-client model id for Remnic's own LLM\n // calls and may be unroutable as an OpenClaw agentTurn model.\n const rawSummaryModel = this.deps.config.summaryModel;\n const taskPrimary = this.deps.config.taskModelChain?.primary;\n const isGateway = this.deps.config.modelSource === \"gateway\";\n const model = isGateway ? (rawSummaryModel || taskPrimary || undefined) : undefined;\n // Attach task-chain fallbacks only when the model matches the task-chain\n // primary. If summaryModel is a distinct override, its fallbacks would\n // be unrelated to the task chain. Also append gateway default models as\n // tail fallbacks (de-duped) so a task-chain outage doesn't stop the cron\n // before reaching the gateway default chain. Mirrors hourly cron pattern.\n const fallbacks: string[] = [];\n if (model && taskPrimary && model === taskPrimary) {\n const seen = new Set<string>(model ? [model] : []);\n const addUnique = (value: string | undefined) => {\n if (typeof value !== \"string\") return;\n const trimmed = value.trim();\n if (trimmed.length > 0 && !seen.has(trimmed)) {\n seen.add(trimmed);\n fallbacks.push(trimmed);\n }\n };\n for (const fb of this.deps.config.taskModelChain?.fallbacks ?? []) addUnique(fb);\n const gwDefaults = this.deps.config.gatewayConfig?.agents?.defaults?.model;\n addUnique(gwDefaults?.primary);\n if (Array.isArray(gwDefaults?.fallbacks)) {\n for (const fb of gwDefaults.fallbacks) addUnique(fb);\n }\n }\n\n const timezone =\n this.deps.config.daySummaryTimezone ||\n Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const result = await ensureDaySummaryCron(jobsPath, {\n timezone,\n ...(model ? { model } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n });\n if (result.created) {\n log.info(\n `day-summary cron auto-registered (${result.jobId}, 23:47 ${timezone}${model ? `, model: ${model}` : \"\"})`,\n );\n } else if (result.updated) {\n log.info(\n `day-summary cron reconciled (${result.jobId}, timezone: ${timezone}${model ? `, model: ${model}` : \"\"})`,\n );\n } else {\n log.debug(\"day-summary cron already up to date\");\n }\n } catch (err) {\n log.debug(`day-summary cron auto-register error: ${err}`);\n }\n }\n\n async autoRegisterNightlyGovernanceCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"nightly governance cron: jobs.json not found, skipping auto-register\");\n return;\n }\n\n const created = await ensureNightlyGovernanceCron(jobsPath, {\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n if (created.created) {\n log.info(\n `nightly governance cron auto-registered (${created.jobId}, 02:23 ${Intl.DateTimeFormat().resolvedOptions().timeZone})`,\n );\n } else {\n log.debug(\"nightly governance cron already exists, skipping auto-register\");\n }\n } catch (err) {\n log.debug(`nightly governance cron auto-register error: ${err}`);\n }\n }\n\n async autoRegisterProceduralMiningCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"procedural mining cron: jobs.json not found, skipping auto-register\");\n return;\n }\n const created = await ensureProceduralMiningCron(jobsPath, {\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n if (created.created) {\n log.info(`procedural mining cron auto-registered (${created.jobId})`);\n } else {\n log.debug(\"procedural mining cron already exists, skipping auto-register\");\n }\n } catch (err) {\n log.debug(`procedural mining cron auto-register error: ${err}`);\n }\n }\n\n async autoRegisterContradictionScanCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"contradiction scan cron: jobs.json not found, skipping auto-register\");\n return;\n }\n const created = await ensureContradictionScanCron(jobsPath, {\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n if (created.created) {\n log.info(`contradiction scan cron auto-registered (${created.jobId})`);\n } else {\n log.debug(\"contradiction scan cron already exists, skipping auto-register\");\n }\n } catch (err) {\n log.debug(`contradiction scan cron auto-register error: ${err}`);\n }\n }\n\n async autoRegisterPatternReinforcementCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"pattern reinforcement cron: jobs.json not found, skipping auto-register\");\n return;\n }\n const created = await ensurePatternReinforcementCron(jobsPath, {\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n if (created.created) {\n log.info(`pattern reinforcement cron auto-registered (${created.jobId})`);\n } else {\n log.debug(\"pattern reinforcement cron already exists, skipping auto-register\");\n }\n } catch (err) {\n log.debug(`pattern reinforcement cron auto-register error: ${err}`);\n }\n }\n\n async autoRegisterGraphEdgeDecayCron(): Promise<void> {\n const home = resolveHomeDir();\n const jobsPath = path.join(home, \".openclaw\", \"cron\", \"jobs.json\");\n try {\n if (!existsSync(jobsPath)) {\n log.debug(\"graph edge decay cron: jobs.json not found, skipping auto-register\");\n return;\n }\n const scheduleExpr = graphEdgeDecayCadenceToCronExpr(\n this.deps.config.graphEdgeDecayCadenceMs,\n );\n const created = await ensureGraphEdgeDecayCron(jobsPath, {\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n scheduleExpr,\n });\n if (created.created) {\n log.info(`graph edge decay cron auto-registered (${created.jobId}, ${scheduleExpr})`);\n } else {\n log.debug(\"graph edge decay cron already exists, skipping auto-register\");\n }\n } catch (err) {\n log.debug(`graph edge decay cron auto-register error: ${err}`);\n }\n }\n\n // ───────────────────────────────────────────────────────────────────────\n // Consolidation scheduling\n // ───────────────────────────────────────────────────────────────────────\n\n /**\n * Maybe trigger a background consolidation pass after an extraction.\n * Counted + interval gated so a burst of extractions does not fan into a\n * burst of consolidation passes. The consolidation runner itself is\n * passed in as a callback because it lives on the orchestrator (LLM +\n * storage dependency surface) and is not owned by this module.\n */\n maybeScheduleConsolidation(\n nonZeroExtraction: boolean,\n runConsolidation: () => Promise<unknown>,\n ): void {\n if (nonZeroExtraction) this.nonZeroExtractionsSinceConsolidation += 1;\n if (\n this.deps.config.consolidationRequireNonZeroExtraction &&\n !nonZeroExtraction\n ) {\n return;\n }\n if (\n this.nonZeroExtractionsSinceConsolidation <\n this.deps.config.consolidateEveryN\n ) {\n return;\n }\n\n const now = Date.now();\n if (\n now - this.lastConsolidationRunAtMs <\n this.deps.config.consolidationMinIntervalMs\n ) {\n return;\n }\n if (this.consolidationInFlight) return;\n\n this.consolidationInFlight = true;\n this.lastConsolidationRunAtMs = now;\n this.nonZeroExtractionsSinceConsolidation = 0;\n runConsolidation()\n .catch((err) => log.error(\"background consolidation failed\", err))\n .finally(() => {\n this.consolidationInFlight = false;\n });\n }\n\n /** Whether a background consolidation pass is currently running. Exposed so\n * the orchestrator's waitForConsolidationIdle can poll idle state without\n * owning the cadence state (issue #1526 PR1). */\n isConsolidationInFlight(): boolean {\n return this.consolidationInFlight;\n }\n\n /** Whether a debounced QMD maintenance pass is armed and waiting for the\n * debounce timer. Exposed so drain/teardown diagnostics (e.g. the bench\n * adapter) can observe scheduler idle state after the #1526 PR1 extraction\n * moved this flag off the orchestrator. */\n isQmdMaintenancePending(): boolean {\n return this.qmdMaintenancePending;\n }\n\n /** Whether a QMD maintenance pass is currently running (singleflight guard).\n * Exposed for drain/teardown diagnostics (see isQmdMaintenancePending). */\n isQmdMaintenanceInFlight(): boolean {\n return this.qmdMaintenanceInFlight;\n }\n // ───────────────────────────────────────────────────────────────────────\n // QMD maintenance scheduling (debounced + singleflight)\n // ───────────────────────────────────────────────────────────────────────\n\n /** Internal: queue a debounced QMD maintenance pass. */\n private requestQmdMaintenance(): void {\n if (!this.deps.getQmd().isAvailable()) return;\n if (!resolveQmdCapabilities(this.deps.config).qmdMaintenance) return;\n\n this.qmdMaintenancePending = true;\n if (this.qmdMaintenanceTimer) return;\n\n this.qmdMaintenanceTimer = setTimeout(() => {\n this.qmdMaintenanceTimer = null;\n this.runQmdMaintenance().catch((err) =>\n log.debug(`background qmd maintenance failed: ${err}`),\n );\n }, this.deps.config.qmdMaintenanceDebounceMs);\n }\n\n /**\n * Public entrypoint for tool-driven QMD maintenance requests.\n * Routes through existing debounced/singleflight maintenance controls.\n */\n requestQmdMaintenanceForTool(reason: string): void {\n try {\n this.requestQmdMaintenance();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(`qmd maintenance request failed (${reason}): ${msg}`);\n }\n // Lifecycle-ledger auto-compaction (#1910) must run independently of QMD.\n // When QMD is unavailable or its maintenance capability is off,\n // requestQmdMaintenance() short-circuits and runQmdMaintenance() never\n // fires — so a compaction check living only in that path would never run.\n // Fire it here on every maintenance request (throttled, size-gated,\n // single-flighted, never awaited, never throws) so a QMD-off deployment\n // still bounds the lifecycle ledger.\n void this.maybeCompactMemoryLifecycleLedger().catch((err) =>\n log.debug(`lifecycle ledger auto-compaction check failed (non-fatal): ${err}`),\n );\n }\n\n /** Internal: run a single QMD maintenance pass under singleflight guard. */\n async runQmdMaintenance(): Promise<void> {\n if (this.qmdMaintenanceInFlight) return;\n if (!this.qmdMaintenancePending) return;\n this.qmdMaintenanceInFlight = true;\n this.qmdMaintenancePending = false;\n\n try {\n if (resolveNamespaceCapabilities(this.deps.config).namespaces) {\n // Include cataloged dynamic namespaces, not just the configured set\n // (NGnei), but run through the namespace-aware maintenance planner so\n // each namespace is budgeted, lock-protected, and status-recorded\n // independently (issue #1500).\n const plan = await this.namespaceMaintenancePlan(\"qmd\");\n const now = Date.now();\n const lastEmbedAtByNamespace = this.lastQmdEmbedAtMsByNamespace;\n const dueEmbedNamespaces = (namespaces: string[]): string[] => {\n if (!resolveQmdCapabilities(this.deps.config).qmdAutoEmbed) return [];\n return namespaces.filter(\n (namespace) =>\n now - (lastEmbedAtByNamespace.get(namespace) ?? 0) >=\n this.deps.config.qmdEmbedMinIntervalMs,\n );\n };\n const markEmbedded = (namespaces: string[]): void => {\n if (namespaces.length === 0) return;\n for (const namespace of namespaces) {\n lastEmbedAtByNamespace.set(namespace, now);\n }\n this.lastQmdEmbedAtMs = now;\n };\n await runNamespaceMaintenanceBatchPlan(\n this.deps.config,\n plan,\n async (candidates) => {\n const namespaces = candidates.map((candidate) => candidate.namespace);\n const embedNamespaces = dueEmbedNamespaces(namespaces);\n let result: NamespaceUpdateResult;\n try {\n result = await this.deps.namespaceSearchRouter.updateNamespacesDetailed(\n namespaces,\n undefined,\n { strict: true },\n );\n } catch (error) {\n if (\n embedNamespaces.length > 0 &&\n qmdMaintenanceSkipReasonForError(error) === \"throttled\"\n ) {\n await this.deps.namespaceSearchRouter.embedNamespaces(embedNamespaces, {\n strict: true,\n });\n markEmbedded(embedNamespaces);\n }\n throw error;\n }\n if (result.backendCount <= 0) {\n throw new Error(\"no eligible QMD backend for selected namespaces\");\n }\n if (result.eligibleNamespaces.length !== namespaces.length) {\n const eligible = new Set(result.eligibleNamespaces);\n const missing = namespaces.filter(\n (namespace) => !eligible.has(namespace),\n );\n throw new Error(\n `QMD backend ineligible for selected namespaces (${missing.length})`,\n );\n }\n if (embedNamespaces.length > 0) {\n await this.deps.namespaceSearchRouter.embedNamespaces(embedNamespaces, {\n strict: true,\n });\n markEmbedded(embedNamespaces);\n }\n return { itemCount: result.backendCount };\n },\n this.deps.namespaceCatalog,\n {\n skipReasonForError: qmdMaintenanceSkipReasonForError,\n },\n );\n } else {\n await this.deps.getQmd().update();\n const now = Date.now();\n if (\n resolveQmdCapabilities(this.deps.config).qmdAutoEmbed &&\n now - this.lastQmdEmbedAtMs >= this.deps.config.qmdEmbedMinIntervalMs\n ) {\n await this.deps.getQmd().embed();\n this.lastQmdEmbedAtMs = now;\n }\n }\n // Note: a successful QMD update/embed clears the global QMD result caches\n // itself (QmdClient.runUpdateForCollection / runEmbedForCollection), so\n // this scheduler does not invalidate them here — every refresh path\n // (direct update, namespace router, wearable/OpenClaw sync) funnels through\n // the backend and clears centrally. A no-op pass (throttle/unavailable/\n // backoff) does not advance lastUpdateRanAtMs, so it leaves caches warm\n // (#1904, Codex/Cursor).\n } finally {\n this.qmdMaintenanceInFlight = false;\n if (this.qmdMaintenancePending) {\n this.requestQmdMaintenance();\n }\n // Lifecycle-ledger auto-compaction is triggered from\n // requestQmdMaintenanceForTool (every maintenance request, QMD or not),\n // so it does not need to be re-fired here (issue #1910).\n }\n }\n\n /**\n * Size-gated, throttled, single-flighted auto-compaction of the lifecycle\n * ledger (issue #1910). Compacts the root ledger AND every namespace ledger\n * (`memoryDir/namespaces/<token>/state/`) when namespaces are enabled, each\n * through the existing `rebuildMemoryLifecycleLedger` so the\n * archive-then-atomic-write discipline is reused verbatim. `0` disables.\n *\n * Before compacting, drain EVERY target's durable pending-append spill (the\n * root ledger AND each namespace ledger) so a lifecycle event that spilled\n * while a prior long rewrite held the lock is folded back into its ledger and\n * cannot be silently lost (issue #2033). Draining is independent of both the\n * compaction threshold and the min-interval throttle: targets are enumerated\n * through the same safe (symlink/containment-checked) resolver and every\n * eligible queue is drained BEFORE any throttle return, so a namespace spill\n * created after the previous pass never waits out the whole interval.\n * Encrypted-store safety is preserved — a keyed target drains through its\n * secure StorageManager, a filesystem-fallback target only through a plaintext\n * context that refuses encrypted ledgers/spills. Work stays bounded: one\n * target enumeration plus a bounded per-queue drain.\n *\n * The min-interval throttle timestamp advances ONLY after real, fully\n * successful compaction work: a failed OR deferred target leaves the throttle\n * un-advanced so it stays eligible on the next maintenance pass, while\n * `lifecycleCompactionInFlight` still prevents overlapping runs. A \"deferred\"\n * target is oversized but could not be compacted because its encrypted ledger\n * has no unlocked secure store — arming the throttle for it would suppress the\n * retry of that still-oversized ledger for the whole interval (#2033).\n *\n * The min-interval throttle is bypassed for one case: an encrypted ledger\n * already at/over the whole-file decrypt cap is unreadable, so it must be\n * clamped on the next pass rather than wait out the interval. Ordinary\n * below-cap (or plaintext) targets stay throttled (#2033).\n */\n private async maybeCompactMemoryLifecycleLedger(): Promise<void> {\n // Enumerate every lifecycle target (root + namespaces) through the safe,\n // containment-checked resolver, and fold each one's durable pending spill\n // back into its ledger BEFORE any threshold or throttle return (#2033). A\n // spill created after the previous pass must land promptly even while\n // compaction is throttled or disabled; draining is bounded per queue and\n // never bypasses encrypted-store safety.\n const targets = await this.resolveLifecycleCompactionTargets();\n for (const target of targets) {\n await this.drainPendingForTarget(target);\n }\n\n const threshold = this.deps.config.memoryLifecycleLedgerCompactBytes;\n if (!(threshold > 0)) return; // 0 / negative / non-numeric disables compaction.\n if (this.lifecycleCompactionInFlight) return;\n const now = Date.now();\n if (\n now - this.lastLifecycleCompactionAtMs <\n this.deps.config.memoryLifecycleLedgerCompactMinIntervalMs &&\n !(await this.hasOverCapEncryptedLifecycleLedger(targets))\n ) {\n // Throttled: no ordinary target is due yet. The exception is an encrypted\n // ledger already at/over the whole-file decrypt cap — it is unreadable, so\n // the global min-interval must not defer clamping it for a whole interval.\n // The guard above lets such a target through immediately (compaction then\n // clamps it via the cap-aware effective threshold) while ordinary\n // below-cap targets stay throttled (#2033).\n return;\n }\n // The over-cap probe above awaits, so a second maintenance request can pass\n // the early `lifecycleCompactionInFlight` guard and reach here during that\n // await. Recheck the guard immediately before claiming it — otherwise two\n // racing requests both see an over-cap ledger and run duplicate 400MB-class\n // compactions/backups back-to-back (#2033). The set below is synchronous\n // with this recheck (no await between), so exactly one caller wins.\n if (this.lifecycleCompactionInFlight) return;\n this.lifecycleCompactionInFlight = true;\n try {\n let compacted = 0;\n let failed = 0;\n let deferred = 0;\n for (const target of targets) {\n const outcome = await this.compactLifecycleLedgerTarget(target, threshold);\n if (outcome === \"compacted\") compacted += 1;\n else if (outcome === \"failed\") failed += 1;\n else if (outcome === \"deferred\") deferred += 1;\n }\n // Arm the throttle only when at least one ledger actually compacted AND\n // nothing failed AND nothing was deferred. A below-threshold no-op\n // (compacted === 0), any failure, or a deferred oversized ledger (locked\n // encrypted store, still pending) leaves the throttle where it was so the\n // next pass retries the untouched targets (#2033).\n if (compacted > 0 && failed === 0 && deferred === 0) {\n this.lastLifecycleCompactionAtMs = now;\n }\n } finally {\n this.lifecycleCompactionInFlight = false;\n }\n }\n\n /**\n * True when any lifecycle target's ledger is encrypted at rest AND its\n * on-disk size is at/over the whole-file decrypt cap. Such a ledger is already\n * unreadable (the secure reader refuses at/over the cap), so it must reach the\n * bounded compaction path on the next maintenance pass regardless of the\n * global min-interval throttle — otherwise the throttle could keep an\n * unreadable ledger un-clamped for a whole interval (#2033). Ordinary\n * below-cap or plaintext targets never match, so the throttle still governs\n * them. A stat/probe failure yields \"no forced target\" and is left to the\n * normal compaction path, which classifies it as failed and retries.\n */\n private async hasOverCapEncryptedLifecycleLedger(\n targets: Array<{ memoryDir: string; storage?: StorageManager }>,\n ): Promise<boolean> {\n for (const target of targets) {\n const ledgerPath = path.join(target.memoryDir, \"state\", \"memory-lifecycle-ledger.jsonl\");\n let size: number;\n try {\n size = (await stat(ledgerPath)).size;\n } catch {\n continue; // absent/unstattable — nothing to force here.\n }\n if (size < this.lifecycleLedgerMaxBytes) continue;\n try {\n if (await probeEncryptedRegularFileHeader(ledgerPath)) return true;\n } catch {\n continue; // probe failure — the normal compaction path reports it.\n }\n }\n return false;\n }\n\n /**\n * Drain one compaction target's durable pending spill. A catalog-backed\n * target folds through its secure StorageManager; a filesystem-fallback\n * target (no storage) folds through a path-scoped plaintext context that\n * refuses encrypted ledgers/spills so a keyless drain never downgrades an\n * encrypted ledger (issue #2033).\n */\n private async drainPendingForTarget(\n target: { memoryDir: string; storage?: StorageManager },\n ): Promise<void> {\n if (target.storage) {\n await this.drainPendingLifecycleAppends(target.storage);\n } else {\n await this.drainPendingLifecycleAppendsForPath(target.memoryDir);\n }\n }\n\n /** Drain a target's durable pending lifecycle-append spill into its ledger\n * (issue #2033); non-fatal and a fast no-op when nothing is pending. */\n private async drainPendingLifecycleAppends(storage: StorageManager | undefined): Promise<void> {\n if (!storage) return;\n try {\n await storage.drainPendingMemoryLifecycleEvents();\n } catch (err) {\n log.debug(`lifecycle pending drain failed (non-fatal): ${err}`);\n }\n }\n\n /**\n * Drain a filesystem-fallback target's pending lifecycle-append spill when no\n * secure StorageManager is available (catalog-disabled namespace; issue\n * #2033). Uses the safe path-scoped PLAINTEXT context this fallback already\n * operates in: a keyless drain can only fold plaintext spills into a plaintext\n * ledger, so it refuses when the ledger or ANY spill is encrypted at rest,\n * leaving those pending for a keyed (catalog-path) drain — exactly mirroring\n * the fallback compaction's encrypted-ledger deferral. Non-fatal; a fast\n * no-op when nothing is pending. The shared spill lister enforces the symlink/\n * containment guard on every spill file it reads or deletes.\n */\n private async drainPendingLifecycleAppendsForPath(memoryDir: string): Promise<void> {\n const ledgerPath = path.join(memoryDir, \"state\", \"memory-lifecycle-ledger.jsonl\");\n const spillDir = pendingLifecycleLedgerDir(ledgerPath);\n // Enumerate spills through the SAME guarded lister the actual drain uses\n // (listContainedSpillFiles): it rejects a symlinked/non-directory spill dir\n // and skips any symlink/FIFO/device/escaping entry, returning only regular\n // files contained in the dir. Never raw-readdir + open() an untrusted name:\n // opening a FIFO would block until a writer appears and a symlink would\n // redirect the probe outside the dir (#2033). Enumerate BOTH live `*.jsonl`\n // spills and crash-orphaned `*.jsonl.claimed` files: a drain that died\n // between claiming a spill (rename to `.claimed`) and committing it leaves\n // the ONLY copy of those rows as a claimed orphan. Gating solely on live\n // spills would early-return here whenever the pending dir holds nothing but\n // orphans, stranding those rows forever; proceeding lets\n // drainPendingLifecycleLedgerIfAny -> recoverOrphanedClaims restore and\n // re-commit them under the ledger lock (#2033).\n let spillFiles: string[];\n let claimedOrphans: string[];\n try {\n spillFiles = await listContainedSpillFiles(spillDir);\n claimedOrphans = await listContainedSpillFiles(spillDir, \".jsonl.claimed\");\n } catch (err) {\n log.debug(`fallback lifecycle pending scan failed (non-fatal) for ${memoryDir}: ${err}`);\n return;\n }\n if (spillFiles.length === 0 && claimedOrphans.length === 0) return;\n // The pending encryption state is authoritative only UNDER the ledger lock:\n // drainPendingLifecycleLedgerIfAny waits for the lock and re-enumerates the\n // pending dir, so a secure-store writer that spills an encrypted file — or a\n // keyed compaction that rewrites the ledger encrypted — while this fallback\n // waits would defeat any pre-lock probe (#2033). Probe each file at the\n // moment of use inside the held lock instead: readSecure refuses an\n // encrypted spill (the fold reads each spill lazily and propagates the throw\n // BEFORE claiming that spill, leaving it intact) and the append refuses a\n // ledger that became encrypted (the fold rolls the claims back). Either way\n // the plaintext IO\n // never reads or writes ciphertext; the keyed catalog-path drain handles the\n // deferred rows.\n const io: LifecyclePendingIo = {\n writeSecure: async (filePath, payload) => {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, payload, \"utf-8\");\n },\n readSecure: async (filePath) => {\n if (await probeEncryptedRegularFileHeader(filePath)) {\n throw new Error(`fallback lifecycle drain deferred: encrypted spill at ${filePath}`);\n }\n return readFile(filePath, \"utf-8\");\n },\n };\n try {\n await drainPendingLifecycleLedgerIfAny(\n ledgerPath,\n io,\n async (payload) => {\n if (await probeEncryptedRegularFileHeader(ledgerPath)) {\n throw new Error(`fallback lifecycle drain deferred: ledger became encrypted at ${ledgerPath}`);\n }\n await appendFile(ledgerPath, payload, \"utf-8\");\n },\n async () => {\n await mkdir(path.dirname(ledgerPath), { recursive: true });\n },\n );\n } catch (err) {\n log.debug(`fallback lifecycle pending drain failed (non-fatal) for ${memoryDir}: ${err}`);\n }\n }\n\n /**\n * Enumerate the lifecycle ledgers to consider for compaction: the root\n * (through the secure-configured root storage when available) plus every\n * cataloged namespace ledger when namespaces are enabled. Deduplicated by\n * resolved storage dir so a namespace that collapses onto the root is not\n * compacted twice. Namespace resolution failures are non-fatal.\n */\n private async resolveLifecycleCompactionTargets(): Promise<\n Array<{ memoryDir: string; storage?: StorageManager }>\n > {\n const targets: Array<{ memoryDir: string; storage?: StorageManager }> = [];\n const seen = new Set<string>();\n const addTarget = (memoryDir: string, storage?: StorageManager): void => {\n const key = path.resolve(memoryDir);\n if (seen.has(key)) return;\n seen.add(key);\n targets.push({ memoryDir, storage });\n };\n\n const rootStorage = this.deps.getStorage?.();\n addTarget(rootStorage ? rootStorage.dir : this.deps.config.memoryDir, rootStorage);\n\n const resolveNamespaceStorage = this.deps.storageForNamespace;\n if (resolveNamespaceStorage && this.deps.namespaceCatalog?.enabled) {\n let records: NamespaceRecord[] = [];\n try {\n records = await this.deps.namespaceCatalog.listNamespaces();\n } catch (err) {\n log.debug(`lifecycle compaction: namespace enumeration failed (non-fatal): ${err}`);\n }\n for (const record of records) {\n const namespace = record.namespace.trim();\n if (!namespace) continue;\n try {\n const storage = await resolveNamespaceStorage(namespace);\n addTarget(storage.dir, storage);\n } catch (err) {\n log.debug(\n `lifecycle compaction: storage resolve failed for namespace ${namespace} (non-fatal): ${err}`,\n );\n }\n }\n }\n\n // Filesystem fallback (codex P2): when namespaces are enabled but the\n // catalog is disabled (namespaceCatalogEnabled=false) — or a namespace is\n // not yet cataloged — the catalog walk above finds nothing, yet per-namespace\n // ledgers still grow under <memoryDir>/namespaces/<token>/state/. Scan that\n // base directly so those ledgers are still bounded. Deduped by resolved dir,\n // so a namespace already added via the catalog is not compacted twice.\n if (resolveNamespaceCapabilities(this.deps.config).namespaces) {\n const namespacesBase = path.join(this.deps.config.memoryDir, \"namespaces\");\n // Symlink/traversal containment (issue #2033 codex P2): a symlinked\n // <memoryDir>/namespaces (or a symlinked child) must not redirect the scan\n // — and later backup/ledger rewrites — outside memoryDir. Resolve the\n // memory root and the scan base through realpath, reject a symlinked or\n // escaping base, and skip any symlinked/escaping child, mirroring the\n // memory-store walkers' hardening (utils/path-containment).\n let memoryDirReal: string;\n try {\n memoryDirReal = await realpath(this.deps.config.memoryDir);\n const baseStat = await lstat(namespacesBase);\n if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {\n throw new Error(\"namespaces base is a symlink or not a directory\");\n }\n assertPathInsideRoot(memoryDirReal, await realpath(namespacesBase), namespacesBase);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) {\n log.debug(`lifecycle compaction: namespaces base rejected (non-fatal): ${err}`);\n }\n return targets;\n }\n let entries: Dirent[] = [];\n try {\n entries = await readdir(namespacesBase, { withFileTypes: true });\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) {\n log.debug(`lifecycle compaction: namespaces dir scan failed (non-fatal): ${err}`);\n }\n }\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (!entry.isDirectory() || entry.isSymbolicLink()) continue;\n const childPath = path.join(namespacesBase, entry.name);\n try {\n assertPathInsideRoot(memoryDirReal, await realpath(childPath), childPath);\n } catch (err) {\n log.debug(`lifecycle compaction: skipping out-of-root namespace dir ${childPath}: ${err}`);\n continue;\n }\n // Resolve the namespace's secure-store-aware storage so an encrypted\n // fallback ledger compacts through the correct root key/context instead\n // of deferring forever behind a keyless plaintext StorageManager (#2033\n // thread PRRT_kwDORJXyws6SE5fv). The on-disk dir name is EITHER a\n // namespace identity TOKEN (ns-<hex>) OR a legacy raw namespace dir name\n // written before tokenization (namespaces/<name>/). Decode a token back\n // to its canonical namespace; treat a non-token dir as a raw namespace\n // only when it is a safe route namespace (isSafeRouteNamespace), so a\n // garbage/traversal dir name is never handed to the resolver. Passing the\n // raw token to the resolver would re-tokenize an already-tokenized value\n // and (for namespaces longer than 30 bytes) exceed the router's 64-char\n // safe-route limit, so the resolver throws and the encrypted over-cap\n // ledger defers forever — hence decode first. Resolve the route namespace\n // and accept the keyed storage only when it roots at THIS dir: the secure\n // store keys one master key per memory ROOT (not per namespace), the\n // router routes a token to namespaces/<token>/ and an existing legacy raw\n // name to its namespaces/<name>/ root, so a correct resolve returns THIS\n // childPath; anything else is an unexpected re-route we refuse (keeping\n // namespace isolation and never compacting the wrong ledger). A dir that\n // neither decodes nor is a safe raw namespace, or no resolver wired\n // (focused tests / plaintext deployments), leaves the keyless target\n // standing: the rebuild chokepoint still refuses to downgrade an\n // encrypted ledger, so plaintext behavior holds.\n const decodedNamespace = namespaceIdentityFromToken(entry.name);\n const routeNamespace =\n decodedNamespace !== null\n ? decodedNamespace\n : isSafeRouteNamespace(entry.name)\n ? entry.name\n : null;\n if (resolveNamespaceStorage && routeNamespace !== null) {\n try {\n const storage = await resolveNamespaceStorage(routeNamespace);\n if (path.resolve(storage.dir) === path.resolve(childPath)) {\n addTarget(storage.dir, storage);\n continue;\n }\n log.debug(\n `lifecycle compaction: fallback resolver routed ${childPath} to ${storage.dir}; `\n + \"using keyless target\",\n );\n } catch (err) {\n log.debug(\n `lifecycle compaction: fallback storage resolve failed for ${childPath} (non-fatal): ${err}`,\n );\n }\n }\n addTarget(childPath);\n }\n }\n return targets;\n }\n\n /**\n * Compact one lifecycle ledger when it is at/over `threshold`. Returns\n * `\"skipped\"` (absent or below threshold — nothing to do), `\"compacted\"`\n * (rewritten and verified under the read/decrypt cap), `\"failed\"`\n * (rebuild/probe threw, or the rewritten ledger is STILL over the cap — an\n * ineffective compaction — non-fatal, retried next pass), or `\"deferred\"`\n * (oversized but its encrypted ledger cannot be rewritten because no unlocked\n * secure store is available — real work still pending, so the caller must NOT\n * arm the throttle). #2033: a deferred/failed target is distinct from a genuine\n * no-op so one namespace compacting cannot suppress retries for another, and\n * an over-cap rewrite never arms the throttle.\n */\n private async compactLifecycleLedgerTarget(\n target: { memoryDir: string; storage?: StorageManager },\n threshold: number,\n ): Promise<\"skipped\" | \"compacted\" | \"failed\" | \"deferred\"> {\n const ledgerPath = path.join(target.memoryDir, \"state\", \"memory-lifecycle-ledger.jsonl\");\n let size = 0;\n try {\n size = (await stat(ledgerPath)).size;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return \"skipped\"; // absent — nothing to compact yet.\n log.warn(\n `lifecycle ledger size check failed (non-fatal) for ${target.memoryDir}: ${err}`,\n );\n return \"failed\";\n }\n // #2033 finding (1): an encrypted ledger becomes unreadable once its on-disk\n // size reaches the whole-file decrypt cap (the reader refuses at/over it), so\n // the effective compaction trigger for an encrypted target is clamped to that\n // cap even when the configured threshold is LARGER — otherwise a ledger that\n // grows past the cap but stays below a bigger threshold would never compact\n // and stay permanently unreadable. Plaintext streaming is unaffected at any\n // size, so a plaintext target keeps the configured threshold. The cheap\n // pre-check skips anything below the smaller of the two before paying for the\n // extra lstat/open the encryption probe costs.\n if (size < Math.min(threshold, this.lifecycleLedgerMaxBytes)) return \"skipped\";\n let encrypted: boolean;\n try {\n encrypted = await probeEncryptedRegularFileHeader(ledgerPath);\n } catch (err) {\n log.warn(`lifecycle ledger encryption probe failed (non-fatal) for ${ledgerPath}: ${err}`);\n return \"failed\";\n }\n const effectiveThreshold = encrypted\n ? Math.min(threshold, this.lifecycleLedgerMaxBytes)\n : threshold;\n if (size < effectiveThreshold) return \"skipped\";\n // No plaintext rewrite of an encrypted-at-rest ledger (#2033): rebuilding an\n // encrypted ledger without an unlocked secure StorageManager would either\n // fail the preserve-read (locked store) or downgrade the ledger to plaintext.\n // Report \"deferred\" (NOT \"skipped\"): the ledger is over threshold and still\n // needs compaction, so the throttle must stay un-armed and retry once a key\n // is available — a \"skipped\" here would let another target's success arm the\n // throttle and suppress this pending work for the whole interval (#2033).\n if (encrypted && !(target.storage?.isSecureStoreUnlocked() ?? false)) {\n log.warn(\n `lifecycle ledger at ${ledgerPath} is encrypted at rest but no unlocked secure `\n + `storage is available; deferring auto-compaction to avoid a plaintext rewrite. `\n + `Run 'remnic rebuild-memory-lifecycle-ledger --write' after unlocking.`,\n );\n return \"deferred\";\n }\n // #2033 findings (2)+(4): the rewrite budget bounds the PLAINTEXT payload, but\n // an encrypted-at-rest target adds a fixed secure-store envelope on disk.\n // Reserve that envelope (plus one byte) from the plaintext budget so the\n // encrypted file lands STRICTLY below the reader's refusal cap and the\n // post-write check — which stats the on-disk (encrypted) size against the cap\n // — cannot fail forever on a plaintext budget that equals the cap (the\n // endless-retry bug). Base this on whether the REPLACEMENT will be encrypted\n // (the storage write mode), NOT only on the current file header: a\n // plaintext ledger rewritten under `secureStoreEncryptOnWrite` with the key\n // set becomes encrypted, so it needs the reserve even though its current\n // header is plaintext (#2033 write-mode finding).\n const replacementEncrypted =\n encrypted || (target.storage?.willEncryptStateWrites() ?? false);\n const plaintextBudget = replacementEncrypted\n ? this.lifecycleLedgerMaxBytes - SECURE_STORE_ENVELOPE_OVERHEAD_BYTES - 1\n : this.lifecycleLedgerMaxBytes - 1;\n try {\n const result = await rebuildMemoryLifecycleLedger({\n memoryDir: target.memoryDir,\n dryRun: false,\n storage: target.storage,\n // Background compaction must not lose append-only history that\n // frontmatter cannot reconstruct (issue #1910); the manual CLI repair\n // rebuild now preserves and bounds identically (#2033).\n preserveExistingEvents: true,\n // Bound the PLAINTEXT rewrite to a budget that reserves the secure-store\n // envelope, so the on-disk ledger (plaintext, or plaintext+envelope when\n // encrypted) is strictly below the read/decrypt cap; overflow lands in\n // the verbatim backup (#2033 findings 2+4).\n maxLedgerBytes: plaintextBudget,\n });\n // Verify the rewritten ledger is actually bounded. A compaction that left\n // the ledger at/over the read/decrypt cap is ineffective (the ledger would\n // be unreadable) — report \"failed\" so the throttle stays un-armed and the\n // next pass retries rather than declaring success (#2033).\n let rewrittenSize = 0;\n try {\n rewrittenSize = (await stat(ledgerPath)).size;\n } catch (err) {\n log.warn(`lifecycle ledger post-compaction size check failed (non-fatal) for ${target.memoryDir}: ${err}`);\n return \"failed\";\n }\n if (rewrittenSize >= this.lifecycleLedgerMaxBytes) {\n log.warn(\n `lifecycle ledger auto-compaction ineffective for ${target.memoryDir}: rewritten `\n + `ledger is ${rewrittenSize}B, still at/over the ${this.lifecycleLedgerMaxBytes}-byte `\n + `read/decrypt cap; leaving the throttle un-armed to retry.`,\n );\n return \"failed\";\n }\n if (result.rewritten === false) {\n // No-op pass (#2033 thread PRRT_kwDORJXyws6SExst): a preserving rebuild\n // would reproduce the current ledger byte-for-byte, so it skipped the\n // backup+rewrite. The ledger stays over the trigger but under the cap;\n // report \"compacted\" so the throttle still arms (nothing more can be\n // done until the ledger grows), which stops the periodic re-archive/\n // rewrite churn the review flagged — the archive no longer grows.\n log.debug(\n `lifecycle ledger already compact for ${target.memoryDir}: ${rewrittenSize}B, `\n + `no rewrite needed (throttle armed to avoid re-archiving an unchanged ledger).`,\n );\n } else {\n log.info(\n `lifecycle ledger auto-compacted (${target.memoryDir}): ${size}B -> `\n + `${rewrittenSize}B, ${result.rebuiltRows} rows `\n + `(${result.preservedAppendOnlyRows ?? 0} append-only preserved, `\n + `${result.archivedOverflowRows ?? 0} overflow archived), `\n + `backup=${result.backupPath ?? \"none\"}`,\n );\n }\n return \"compacted\";\n } catch (err) {\n log.warn(\n `lifecycle ledger auto-compaction failed (non-fatal) for ${target.memoryDir}: ${err}`,\n );\n return \"failed\";\n }\n }\n\n /** Build the namespace-aware maintenance plan for one job. */\n private async namespaceMaintenancePlan(\n jobName: string,\n ): Promise<NamespaceMaintenancePlan> {\n return planNamespaceMaintenance(this.deps.config, {\n jobName,\n catalog: this.deps.namespaceCatalog,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────────────\n\n /**\n * Clear any pending debounce timer. Called from the orchestrator's\n * destroy() so a late tick does not fire on a torn-down instance.\n */\n dispose(): void {\n if (this.qmdMaintenanceTimer) {\n clearTimeout(this.qmdMaintenanceTimer);\n this.qmdMaintenanceTimer = null;\n }\n this.qmdMaintenancePending = false;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
writeFileAtomically
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-R6YJI3HE.js";
|
|
4
4
|
|
|
5
5
|
// src/maintenance/archive-observations.ts
|
|
6
6
|
import path from "path";
|
|
@@ -131,4 +131,4 @@ async function archiveObservations(options) {
|
|
|
131
131
|
export {
|
|
132
132
|
archiveObservations
|
|
133
133
|
};
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
134
|
+
//# sourceMappingURL=chunk-MC6XO7T4.js.map
|