@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
|
@@ -21,16 +21,20 @@
|
|
|
21
21
|
|
|
22
22
|
import { resolveNamespaceCapabilities,
|
|
23
23
|
resolveQmdCapabilities,resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities } from "../capabilities.js";
|
|
24
|
-
import { existsSync } from "node:fs";
|
|
24
|
+
import { existsSync, type Dirent } from "node:fs";
|
|
25
|
+
import { appendFile, lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
|
|
25
26
|
import path from "node:path";
|
|
26
27
|
|
|
27
28
|
import type { PluginConfig } from "../types.js";
|
|
28
29
|
import type { SearchBackend } from "../search/port.js";
|
|
30
|
+
import type { StorageManager } from "../index.js";
|
|
29
31
|
import {
|
|
30
32
|
NamespaceSearchRouter,
|
|
31
33
|
type NamespaceUpdateResult,
|
|
32
34
|
} from "../namespaces/search.js";
|
|
33
|
-
import type { NamespaceCatalog } from "../namespaces/catalog.js";
|
|
35
|
+
import type { NamespaceCatalog, NamespaceRecord } from "../namespaces/catalog.js";
|
|
36
|
+
import { namespaceIdentityFromToken } from "../namespaces/identity.js";
|
|
37
|
+
import { isSafeRouteNamespace } from "../routing/engine.js";
|
|
34
38
|
import {
|
|
35
39
|
planNamespaceMaintenance,
|
|
36
40
|
runNamespaceMaintenanceBatchPlan,
|
|
@@ -46,8 +50,21 @@ import {
|
|
|
46
50
|
ensureProceduralMiningCron,
|
|
47
51
|
graphEdgeDecayCadenceToCronExpr,
|
|
48
52
|
} from "../maintenance/memory-governance-cron.js";
|
|
53
|
+
import { rebuildMemoryLifecycleLedger } from "../maintenance/rebuild-memory-lifecycle-ledger.js";
|
|
54
|
+
import {
|
|
55
|
+
drainPendingLifecycleLedgerIfAny,
|
|
56
|
+
pendingLifecycleLedgerDir,
|
|
57
|
+
type LifecyclePendingIo,
|
|
58
|
+
} from "../storage/memory-lifecycle-ledger-access.js";
|
|
59
|
+
import { STATE_FILE_MAX_DECRYPT_BYTES } from "../storage/secure-line-reader.js";
|
|
49
60
|
import { resolveHomeDir } from "../runtime/env.js";
|
|
50
61
|
import { log } from "../logger.js";
|
|
62
|
+
import { isErrnoCode } from "../utils/errno.js";
|
|
63
|
+
import { assertPathInsideRoot, listContainedSpillFiles } from "../utils/path-containment.js";
|
|
64
|
+
import {
|
|
65
|
+
probeEncryptedRegularFileHeader,
|
|
66
|
+
SECURE_STORE_ENVELOPE_OVERHEAD_BYTES,
|
|
67
|
+
} from "../secure-store/secure-fs.js";
|
|
51
68
|
|
|
52
69
|
/** Reason a QMD maintenance pass was skipped, used for status recording. */
|
|
53
70
|
function qmdMaintenanceSkipReasonForError(
|
|
@@ -68,6 +85,21 @@ export interface MaintenanceSchedulerDeps {
|
|
|
68
85
|
getQmd: () => SearchBackend;
|
|
69
86
|
namespaceSearchRouter: NamespaceSearchRouter;
|
|
70
87
|
namespaceCatalog: NamespaceCatalog;
|
|
88
|
+
/**
|
|
89
|
+
* Root storage (secure-store configured). Threaded so lifecycle-ledger
|
|
90
|
+
* auto-compaction (#1910) rebuilds through the live secure context: encrypted
|
|
91
|
+
* memories stay decryptable and the rewritten ledger stays encrypted at rest.
|
|
92
|
+
* Omitted in focused tests, where compaction falls back to a fresh plaintext
|
|
93
|
+
* StorageManager (the CLI-equivalent path).
|
|
94
|
+
*/
|
|
95
|
+
getStorage?: () => StorageManager;
|
|
96
|
+
/**
|
|
97
|
+
* Resolve a namespace's (secure-store aware) storage. Threaded so
|
|
98
|
+
* auto-compaction also bounds per-namespace lifecycle ledgers under
|
|
99
|
+
* `memoryDir/namespaces/<token>/state/`, not just the root state path
|
|
100
|
+
* (#1910). Consulted only when namespaces are enabled.
|
|
101
|
+
*/
|
|
102
|
+
storageForNamespace?: (namespace: string) => Promise<StorageManager>;
|
|
71
103
|
}
|
|
72
104
|
|
|
73
105
|
/**
|
|
@@ -91,6 +123,16 @@ export class MaintenanceScheduler {
|
|
|
91
123
|
private lastQmdEmbedAtMs = 0;
|
|
92
124
|
private lastQmdEmbedAtMsByNamespace = new Map<string, number>();
|
|
93
125
|
|
|
126
|
+
// ── Lifecycle-ledger auto-compaction state (issue #1910) ──
|
|
127
|
+
private lifecycleCompactionInFlight = false;
|
|
128
|
+
private lastLifecycleCompactionAtMs = 0;
|
|
129
|
+
// Upper bound on a rewritten ledger; a preserving compaction is bounded to
|
|
130
|
+
// this so it can never leave the ledger over the whole-file read/decrypt cap
|
|
131
|
+
// (#2033). Defaults to the decrypt cap; overridable in focused tests to drive
|
|
132
|
+
// the bounding + post-write verification deterministically without a 400MB
|
|
133
|
+
// fixture.
|
|
134
|
+
private lifecycleLedgerMaxBytes = STATE_FILE_MAX_DECRYPT_BYTES;
|
|
135
|
+
|
|
94
136
|
constructor(private readonly deps: MaintenanceSchedulerDeps) {}
|
|
95
137
|
|
|
96
138
|
// ───────────────────────────────────────────────────────────────────────
|
|
@@ -429,6 +471,16 @@ export class MaintenanceScheduler {
|
|
|
429
471
|
const msg = err instanceof Error ? err.message : String(err);
|
|
430
472
|
log.warn(`qmd maintenance request failed (${reason}): ${msg}`);
|
|
431
473
|
}
|
|
474
|
+
// Lifecycle-ledger auto-compaction (#1910) must run independently of QMD.
|
|
475
|
+
// When QMD is unavailable or its maintenance capability is off,
|
|
476
|
+
// requestQmdMaintenance() short-circuits and runQmdMaintenance() never
|
|
477
|
+
// fires — so a compaction check living only in that path would never run.
|
|
478
|
+
// Fire it here on every maintenance request (throttled, size-gated,
|
|
479
|
+
// single-flighted, never awaited, never throws) so a QMD-off deployment
|
|
480
|
+
// still bounds the lifecycle ledger.
|
|
481
|
+
void this.maybeCompactMemoryLifecycleLedger().catch((err) =>
|
|
482
|
+
log.debug(`lifecycle ledger auto-compaction check failed (non-fatal): ${err}`),
|
|
483
|
+
);
|
|
432
484
|
}
|
|
433
485
|
|
|
434
486
|
/** Internal: run a single QMD maintenance pass under singleflight guard. */
|
|
@@ -523,11 +575,538 @@ export class MaintenanceScheduler {
|
|
|
523
575
|
this.lastQmdEmbedAtMs = now;
|
|
524
576
|
}
|
|
525
577
|
}
|
|
578
|
+
// Note: a successful QMD update/embed clears the global QMD result caches
|
|
579
|
+
// itself (QmdClient.runUpdateForCollection / runEmbedForCollection), so
|
|
580
|
+
// this scheduler does not invalidate them here — every refresh path
|
|
581
|
+
// (direct update, namespace router, wearable/OpenClaw sync) funnels through
|
|
582
|
+
// the backend and clears centrally. A no-op pass (throttle/unavailable/
|
|
583
|
+
// backoff) does not advance lastUpdateRanAtMs, so it leaves caches warm
|
|
584
|
+
// (#1904, Codex/Cursor).
|
|
526
585
|
} finally {
|
|
527
586
|
this.qmdMaintenanceInFlight = false;
|
|
528
587
|
if (this.qmdMaintenancePending) {
|
|
529
588
|
this.requestQmdMaintenance();
|
|
530
589
|
}
|
|
590
|
+
// Lifecycle-ledger auto-compaction is triggered from
|
|
591
|
+
// requestQmdMaintenanceForTool (every maintenance request, QMD or not),
|
|
592
|
+
// so it does not need to be re-fired here (issue #1910).
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Size-gated, throttled, single-flighted auto-compaction of the lifecycle
|
|
598
|
+
* ledger (issue #1910). Compacts the root ledger AND every namespace ledger
|
|
599
|
+
* (`memoryDir/namespaces/<token>/state/`) when namespaces are enabled, each
|
|
600
|
+
* through the existing `rebuildMemoryLifecycleLedger` so the
|
|
601
|
+
* archive-then-atomic-write discipline is reused verbatim. `0` disables.
|
|
602
|
+
*
|
|
603
|
+
* Before compacting, drain EVERY target's durable pending-append spill (the
|
|
604
|
+
* root ledger AND each namespace ledger) so a lifecycle event that spilled
|
|
605
|
+
* while a prior long rewrite held the lock is folded back into its ledger and
|
|
606
|
+
* cannot be silently lost (issue #2033). Draining is independent of both the
|
|
607
|
+
* compaction threshold and the min-interval throttle: targets are enumerated
|
|
608
|
+
* through the same safe (symlink/containment-checked) resolver and every
|
|
609
|
+
* eligible queue is drained BEFORE any throttle return, so a namespace spill
|
|
610
|
+
* created after the previous pass never waits out the whole interval.
|
|
611
|
+
* Encrypted-store safety is preserved — a keyed target drains through its
|
|
612
|
+
* secure StorageManager, a filesystem-fallback target only through a plaintext
|
|
613
|
+
* context that refuses encrypted ledgers/spills. Work stays bounded: one
|
|
614
|
+
* target enumeration plus a bounded per-queue drain.
|
|
615
|
+
*
|
|
616
|
+
* The min-interval throttle timestamp advances ONLY after real, fully
|
|
617
|
+
* successful compaction work: a failed OR deferred target leaves the throttle
|
|
618
|
+
* un-advanced so it stays eligible on the next maintenance pass, while
|
|
619
|
+
* `lifecycleCompactionInFlight` still prevents overlapping runs. A "deferred"
|
|
620
|
+
* target is oversized but could not be compacted because its encrypted ledger
|
|
621
|
+
* has no unlocked secure store — arming the throttle for it would suppress the
|
|
622
|
+
* retry of that still-oversized ledger for the whole interval (#2033).
|
|
623
|
+
*
|
|
624
|
+
* The min-interval throttle is bypassed for one case: an encrypted ledger
|
|
625
|
+
* already at/over the whole-file decrypt cap is unreadable, so it must be
|
|
626
|
+
* clamped on the next pass rather than wait out the interval. Ordinary
|
|
627
|
+
* below-cap (or plaintext) targets stay throttled (#2033).
|
|
628
|
+
*/
|
|
629
|
+
private async maybeCompactMemoryLifecycleLedger(): Promise<void> {
|
|
630
|
+
// Enumerate every lifecycle target (root + namespaces) through the safe,
|
|
631
|
+
// containment-checked resolver, and fold each one's durable pending spill
|
|
632
|
+
// back into its ledger BEFORE any threshold or throttle return (#2033). A
|
|
633
|
+
// spill created after the previous pass must land promptly even while
|
|
634
|
+
// compaction is throttled or disabled; draining is bounded per queue and
|
|
635
|
+
// never bypasses encrypted-store safety.
|
|
636
|
+
const targets = await this.resolveLifecycleCompactionTargets();
|
|
637
|
+
for (const target of targets) {
|
|
638
|
+
await this.drainPendingForTarget(target);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
const threshold = this.deps.config.memoryLifecycleLedgerCompactBytes;
|
|
642
|
+
if (!(threshold > 0)) return; // 0 / negative / non-numeric disables compaction.
|
|
643
|
+
if (this.lifecycleCompactionInFlight) return;
|
|
644
|
+
const now = Date.now();
|
|
645
|
+
if (
|
|
646
|
+
now - this.lastLifecycleCompactionAtMs <
|
|
647
|
+
this.deps.config.memoryLifecycleLedgerCompactMinIntervalMs &&
|
|
648
|
+
!(await this.hasOverCapEncryptedLifecycleLedger(targets))
|
|
649
|
+
) {
|
|
650
|
+
// Throttled: no ordinary target is due yet. The exception is an encrypted
|
|
651
|
+
// ledger already at/over the whole-file decrypt cap — it is unreadable, so
|
|
652
|
+
// the global min-interval must not defer clamping it for a whole interval.
|
|
653
|
+
// The guard above lets such a target through immediately (compaction then
|
|
654
|
+
// clamps it via the cap-aware effective threshold) while ordinary
|
|
655
|
+
// below-cap targets stay throttled (#2033).
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
// The over-cap probe above awaits, so a second maintenance request can pass
|
|
659
|
+
// the early `lifecycleCompactionInFlight` guard and reach here during that
|
|
660
|
+
// await. Recheck the guard immediately before claiming it — otherwise two
|
|
661
|
+
// racing requests both see an over-cap ledger and run duplicate 400MB-class
|
|
662
|
+
// compactions/backups back-to-back (#2033). The set below is synchronous
|
|
663
|
+
// with this recheck (no await between), so exactly one caller wins.
|
|
664
|
+
if (this.lifecycleCompactionInFlight) return;
|
|
665
|
+
this.lifecycleCompactionInFlight = true;
|
|
666
|
+
try {
|
|
667
|
+
let compacted = 0;
|
|
668
|
+
let failed = 0;
|
|
669
|
+
let deferred = 0;
|
|
670
|
+
for (const target of targets) {
|
|
671
|
+
const outcome = await this.compactLifecycleLedgerTarget(target, threshold);
|
|
672
|
+
if (outcome === "compacted") compacted += 1;
|
|
673
|
+
else if (outcome === "failed") failed += 1;
|
|
674
|
+
else if (outcome === "deferred") deferred += 1;
|
|
675
|
+
}
|
|
676
|
+
// Arm the throttle only when at least one ledger actually compacted AND
|
|
677
|
+
// nothing failed AND nothing was deferred. A below-threshold no-op
|
|
678
|
+
// (compacted === 0), any failure, or a deferred oversized ledger (locked
|
|
679
|
+
// encrypted store, still pending) leaves the throttle where it was so the
|
|
680
|
+
// next pass retries the untouched targets (#2033).
|
|
681
|
+
if (compacted > 0 && failed === 0 && deferred === 0) {
|
|
682
|
+
this.lastLifecycleCompactionAtMs = now;
|
|
683
|
+
}
|
|
684
|
+
} finally {
|
|
685
|
+
this.lifecycleCompactionInFlight = false;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* True when any lifecycle target's ledger is encrypted at rest AND its
|
|
691
|
+
* on-disk size is at/over the whole-file decrypt cap. Such a ledger is already
|
|
692
|
+
* unreadable (the secure reader refuses at/over the cap), so it must reach the
|
|
693
|
+
* bounded compaction path on the next maintenance pass regardless of the
|
|
694
|
+
* global min-interval throttle — otherwise the throttle could keep an
|
|
695
|
+
* unreadable ledger un-clamped for a whole interval (#2033). Ordinary
|
|
696
|
+
* below-cap or plaintext targets never match, so the throttle still governs
|
|
697
|
+
* them. A stat/probe failure yields "no forced target" and is left to the
|
|
698
|
+
* normal compaction path, which classifies it as failed and retries.
|
|
699
|
+
*/
|
|
700
|
+
private async hasOverCapEncryptedLifecycleLedger(
|
|
701
|
+
targets: Array<{ memoryDir: string; storage?: StorageManager }>,
|
|
702
|
+
): Promise<boolean> {
|
|
703
|
+
for (const target of targets) {
|
|
704
|
+
const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
705
|
+
let size: number;
|
|
706
|
+
try {
|
|
707
|
+
size = (await stat(ledgerPath)).size;
|
|
708
|
+
} catch {
|
|
709
|
+
continue; // absent/unstattable — nothing to force here.
|
|
710
|
+
}
|
|
711
|
+
if (size < this.lifecycleLedgerMaxBytes) continue;
|
|
712
|
+
try {
|
|
713
|
+
if (await probeEncryptedRegularFileHeader(ledgerPath)) return true;
|
|
714
|
+
} catch {
|
|
715
|
+
continue; // probe failure — the normal compaction path reports it.
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
return false;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Drain one compaction target's durable pending spill. A catalog-backed
|
|
723
|
+
* target folds through its secure StorageManager; a filesystem-fallback
|
|
724
|
+
* target (no storage) folds through a path-scoped plaintext context that
|
|
725
|
+
* refuses encrypted ledgers/spills so a keyless drain never downgrades an
|
|
726
|
+
* encrypted ledger (issue #2033).
|
|
727
|
+
*/
|
|
728
|
+
private async drainPendingForTarget(
|
|
729
|
+
target: { memoryDir: string; storage?: StorageManager },
|
|
730
|
+
): Promise<void> {
|
|
731
|
+
if (target.storage) {
|
|
732
|
+
await this.drainPendingLifecycleAppends(target.storage);
|
|
733
|
+
} else {
|
|
734
|
+
await this.drainPendingLifecycleAppendsForPath(target.memoryDir);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/** Drain a target's durable pending lifecycle-append spill into its ledger
|
|
739
|
+
* (issue #2033); non-fatal and a fast no-op when nothing is pending. */
|
|
740
|
+
private async drainPendingLifecycleAppends(storage: StorageManager | undefined): Promise<void> {
|
|
741
|
+
if (!storage) return;
|
|
742
|
+
try {
|
|
743
|
+
await storage.drainPendingMemoryLifecycleEvents();
|
|
744
|
+
} catch (err) {
|
|
745
|
+
log.debug(`lifecycle pending drain failed (non-fatal): ${err}`);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Drain a filesystem-fallback target's pending lifecycle-append spill when no
|
|
751
|
+
* secure StorageManager is available (catalog-disabled namespace; issue
|
|
752
|
+
* #2033). Uses the safe path-scoped PLAINTEXT context this fallback already
|
|
753
|
+
* operates in: a keyless drain can only fold plaintext spills into a plaintext
|
|
754
|
+
* ledger, so it refuses when the ledger or ANY spill is encrypted at rest,
|
|
755
|
+
* leaving those pending for a keyed (catalog-path) drain — exactly mirroring
|
|
756
|
+
* the fallback compaction's encrypted-ledger deferral. Non-fatal; a fast
|
|
757
|
+
* no-op when nothing is pending. The shared spill lister enforces the symlink/
|
|
758
|
+
* containment guard on every spill file it reads or deletes.
|
|
759
|
+
*/
|
|
760
|
+
private async drainPendingLifecycleAppendsForPath(memoryDir: string): Promise<void> {
|
|
761
|
+
const ledgerPath = path.join(memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
762
|
+
const spillDir = pendingLifecycleLedgerDir(ledgerPath);
|
|
763
|
+
// Enumerate spills through the SAME guarded lister the actual drain uses
|
|
764
|
+
// (listContainedSpillFiles): it rejects a symlinked/non-directory spill dir
|
|
765
|
+
// and skips any symlink/FIFO/device/escaping entry, returning only regular
|
|
766
|
+
// files contained in the dir. Never raw-readdir + open() an untrusted name:
|
|
767
|
+
// opening a FIFO would block until a writer appears and a symlink would
|
|
768
|
+
// redirect the probe outside the dir (#2033). Enumerate BOTH live `*.jsonl`
|
|
769
|
+
// spills and crash-orphaned `*.jsonl.claimed` files: a drain that died
|
|
770
|
+
// between claiming a spill (rename to `.claimed`) and committing it leaves
|
|
771
|
+
// the ONLY copy of those rows as a claimed orphan. Gating solely on live
|
|
772
|
+
// spills would early-return here whenever the pending dir holds nothing but
|
|
773
|
+
// orphans, stranding those rows forever; proceeding lets
|
|
774
|
+
// drainPendingLifecycleLedgerIfAny -> recoverOrphanedClaims restore and
|
|
775
|
+
// re-commit them under the ledger lock (#2033).
|
|
776
|
+
let spillFiles: string[];
|
|
777
|
+
let claimedOrphans: string[];
|
|
778
|
+
try {
|
|
779
|
+
spillFiles = await listContainedSpillFiles(spillDir);
|
|
780
|
+
claimedOrphans = await listContainedSpillFiles(spillDir, ".jsonl.claimed");
|
|
781
|
+
} catch (err) {
|
|
782
|
+
log.debug(`fallback lifecycle pending scan failed (non-fatal) for ${memoryDir}: ${err}`);
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
if (spillFiles.length === 0 && claimedOrphans.length === 0) return;
|
|
786
|
+
// The pending encryption state is authoritative only UNDER the ledger lock:
|
|
787
|
+
// drainPendingLifecycleLedgerIfAny waits for the lock and re-enumerates the
|
|
788
|
+
// pending dir, so a secure-store writer that spills an encrypted file — or a
|
|
789
|
+
// keyed compaction that rewrites the ledger encrypted — while this fallback
|
|
790
|
+
// waits would defeat any pre-lock probe (#2033). Probe each file at the
|
|
791
|
+
// moment of use inside the held lock instead: readSecure refuses an
|
|
792
|
+
// encrypted spill (the fold reads each spill lazily and propagates the throw
|
|
793
|
+
// BEFORE claiming that spill, leaving it intact) and the append refuses a
|
|
794
|
+
// ledger that became encrypted (the fold rolls the claims back). Either way
|
|
795
|
+
// the plaintext IO
|
|
796
|
+
// never reads or writes ciphertext; the keyed catalog-path drain handles the
|
|
797
|
+
// deferred rows.
|
|
798
|
+
const io: LifecyclePendingIo = {
|
|
799
|
+
writeSecure: async (filePath, payload) => {
|
|
800
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
801
|
+
await writeFile(filePath, payload, "utf-8");
|
|
802
|
+
},
|
|
803
|
+
readSecure: async (filePath) => {
|
|
804
|
+
if (await probeEncryptedRegularFileHeader(filePath)) {
|
|
805
|
+
throw new Error(`fallback lifecycle drain deferred: encrypted spill at ${filePath}`);
|
|
806
|
+
}
|
|
807
|
+
return readFile(filePath, "utf-8");
|
|
808
|
+
},
|
|
809
|
+
};
|
|
810
|
+
try {
|
|
811
|
+
await drainPendingLifecycleLedgerIfAny(
|
|
812
|
+
ledgerPath,
|
|
813
|
+
io,
|
|
814
|
+
async (payload) => {
|
|
815
|
+
if (await probeEncryptedRegularFileHeader(ledgerPath)) {
|
|
816
|
+
throw new Error(`fallback lifecycle drain deferred: ledger became encrypted at ${ledgerPath}`);
|
|
817
|
+
}
|
|
818
|
+
await appendFile(ledgerPath, payload, "utf-8");
|
|
819
|
+
},
|
|
820
|
+
async () => {
|
|
821
|
+
await mkdir(path.dirname(ledgerPath), { recursive: true });
|
|
822
|
+
},
|
|
823
|
+
);
|
|
824
|
+
} catch (err) {
|
|
825
|
+
log.debug(`fallback lifecycle pending drain failed (non-fatal) for ${memoryDir}: ${err}`);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/**
|
|
830
|
+
* Enumerate the lifecycle ledgers to consider for compaction: the root
|
|
831
|
+
* (through the secure-configured root storage when available) plus every
|
|
832
|
+
* cataloged namespace ledger when namespaces are enabled. Deduplicated by
|
|
833
|
+
* resolved storage dir so a namespace that collapses onto the root is not
|
|
834
|
+
* compacted twice. Namespace resolution failures are non-fatal.
|
|
835
|
+
*/
|
|
836
|
+
private async resolveLifecycleCompactionTargets(): Promise<
|
|
837
|
+
Array<{ memoryDir: string; storage?: StorageManager }>
|
|
838
|
+
> {
|
|
839
|
+
const targets: Array<{ memoryDir: string; storage?: StorageManager }> = [];
|
|
840
|
+
const seen = new Set<string>();
|
|
841
|
+
const addTarget = (memoryDir: string, storage?: StorageManager): void => {
|
|
842
|
+
const key = path.resolve(memoryDir);
|
|
843
|
+
if (seen.has(key)) return;
|
|
844
|
+
seen.add(key);
|
|
845
|
+
targets.push({ memoryDir, storage });
|
|
846
|
+
};
|
|
847
|
+
|
|
848
|
+
const rootStorage = this.deps.getStorage?.();
|
|
849
|
+
addTarget(rootStorage ? rootStorage.dir : this.deps.config.memoryDir, rootStorage);
|
|
850
|
+
|
|
851
|
+
const resolveNamespaceStorage = this.deps.storageForNamespace;
|
|
852
|
+
if (resolveNamespaceStorage && this.deps.namespaceCatalog?.enabled) {
|
|
853
|
+
let records: NamespaceRecord[] = [];
|
|
854
|
+
try {
|
|
855
|
+
records = await this.deps.namespaceCatalog.listNamespaces();
|
|
856
|
+
} catch (err) {
|
|
857
|
+
log.debug(`lifecycle compaction: namespace enumeration failed (non-fatal): ${err}`);
|
|
858
|
+
}
|
|
859
|
+
for (const record of records) {
|
|
860
|
+
const namespace = record.namespace.trim();
|
|
861
|
+
if (!namespace) continue;
|
|
862
|
+
try {
|
|
863
|
+
const storage = await resolveNamespaceStorage(namespace);
|
|
864
|
+
addTarget(storage.dir, storage);
|
|
865
|
+
} catch (err) {
|
|
866
|
+
log.debug(
|
|
867
|
+
`lifecycle compaction: storage resolve failed for namespace ${namespace} (non-fatal): ${err}`,
|
|
868
|
+
);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// Filesystem fallback (codex P2): when namespaces are enabled but the
|
|
874
|
+
// catalog is disabled (namespaceCatalogEnabled=false) — or a namespace is
|
|
875
|
+
// not yet cataloged — the catalog walk above finds nothing, yet per-namespace
|
|
876
|
+
// ledgers still grow under <memoryDir>/namespaces/<token>/state/. Scan that
|
|
877
|
+
// base directly so those ledgers are still bounded. Deduped by resolved dir,
|
|
878
|
+
// so a namespace already added via the catalog is not compacted twice.
|
|
879
|
+
if (resolveNamespaceCapabilities(this.deps.config).namespaces) {
|
|
880
|
+
const namespacesBase = path.join(this.deps.config.memoryDir, "namespaces");
|
|
881
|
+
// Symlink/traversal containment (issue #2033 codex P2): a symlinked
|
|
882
|
+
// <memoryDir>/namespaces (or a symlinked child) must not redirect the scan
|
|
883
|
+
// — and later backup/ledger rewrites — outside memoryDir. Resolve the
|
|
884
|
+
// memory root and the scan base through realpath, reject a symlinked or
|
|
885
|
+
// escaping base, and skip any symlinked/escaping child, mirroring the
|
|
886
|
+
// memory-store walkers' hardening (utils/path-containment).
|
|
887
|
+
let memoryDirReal: string;
|
|
888
|
+
try {
|
|
889
|
+
memoryDirReal = await realpath(this.deps.config.memoryDir);
|
|
890
|
+
const baseStat = await lstat(namespacesBase);
|
|
891
|
+
if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {
|
|
892
|
+
throw new Error("namespaces base is a symlink or not a directory");
|
|
893
|
+
}
|
|
894
|
+
assertPathInsideRoot(memoryDirReal, await realpath(namespacesBase), namespacesBase);
|
|
895
|
+
} catch (err) {
|
|
896
|
+
if (!isErrnoCode(err, "ENOENT")) {
|
|
897
|
+
log.debug(`lifecycle compaction: namespaces base rejected (non-fatal): ${err}`);
|
|
898
|
+
}
|
|
899
|
+
return targets;
|
|
900
|
+
}
|
|
901
|
+
let entries: Dirent[] = [];
|
|
902
|
+
try {
|
|
903
|
+
entries = await readdir(namespacesBase, { withFileTypes: true });
|
|
904
|
+
} catch (err) {
|
|
905
|
+
if (!isErrnoCode(err, "ENOENT")) {
|
|
906
|
+
log.debug(`lifecycle compaction: namespaces dir scan failed (non-fatal): ${err}`);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
910
|
+
if (!entry.isDirectory() || entry.isSymbolicLink()) continue;
|
|
911
|
+
const childPath = path.join(namespacesBase, entry.name);
|
|
912
|
+
try {
|
|
913
|
+
assertPathInsideRoot(memoryDirReal, await realpath(childPath), childPath);
|
|
914
|
+
} catch (err) {
|
|
915
|
+
log.debug(`lifecycle compaction: skipping out-of-root namespace dir ${childPath}: ${err}`);
|
|
916
|
+
continue;
|
|
917
|
+
}
|
|
918
|
+
// Resolve the namespace's secure-store-aware storage so an encrypted
|
|
919
|
+
// fallback ledger compacts through the correct root key/context instead
|
|
920
|
+
// of deferring forever behind a keyless plaintext StorageManager (#2033
|
|
921
|
+
// thread PRRT_kwDORJXyws6SE5fv). The on-disk dir name is EITHER a
|
|
922
|
+
// namespace identity TOKEN (ns-<hex>) OR a legacy raw namespace dir name
|
|
923
|
+
// written before tokenization (namespaces/<name>/). Decode a token back
|
|
924
|
+
// to its canonical namespace; treat a non-token dir as a raw namespace
|
|
925
|
+
// only when it is a safe route namespace (isSafeRouteNamespace), so a
|
|
926
|
+
// garbage/traversal dir name is never handed to the resolver. Passing the
|
|
927
|
+
// raw token to the resolver would re-tokenize an already-tokenized value
|
|
928
|
+
// and (for namespaces longer than 30 bytes) exceed the router's 64-char
|
|
929
|
+
// safe-route limit, so the resolver throws and the encrypted over-cap
|
|
930
|
+
// ledger defers forever — hence decode first. Resolve the route namespace
|
|
931
|
+
// and accept the keyed storage only when it roots at THIS dir: the secure
|
|
932
|
+
// store keys one master key per memory ROOT (not per namespace), the
|
|
933
|
+
// router routes a token to namespaces/<token>/ and an existing legacy raw
|
|
934
|
+
// name to its namespaces/<name>/ root, so a correct resolve returns THIS
|
|
935
|
+
// childPath; anything else is an unexpected re-route we refuse (keeping
|
|
936
|
+
// namespace isolation and never compacting the wrong ledger). A dir that
|
|
937
|
+
// neither decodes nor is a safe raw namespace, or no resolver wired
|
|
938
|
+
// (focused tests / plaintext deployments), leaves the keyless target
|
|
939
|
+
// standing: the rebuild chokepoint still refuses to downgrade an
|
|
940
|
+
// encrypted ledger, so plaintext behavior holds.
|
|
941
|
+
const decodedNamespace = namespaceIdentityFromToken(entry.name);
|
|
942
|
+
const routeNamespace =
|
|
943
|
+
decodedNamespace !== null
|
|
944
|
+
? decodedNamespace
|
|
945
|
+
: isSafeRouteNamespace(entry.name)
|
|
946
|
+
? entry.name
|
|
947
|
+
: null;
|
|
948
|
+
if (resolveNamespaceStorage && routeNamespace !== null) {
|
|
949
|
+
try {
|
|
950
|
+
const storage = await resolveNamespaceStorage(routeNamespace);
|
|
951
|
+
if (path.resolve(storage.dir) === path.resolve(childPath)) {
|
|
952
|
+
addTarget(storage.dir, storage);
|
|
953
|
+
continue;
|
|
954
|
+
}
|
|
955
|
+
log.debug(
|
|
956
|
+
`lifecycle compaction: fallback resolver routed ${childPath} to ${storage.dir}; `
|
|
957
|
+
+ "using keyless target",
|
|
958
|
+
);
|
|
959
|
+
} catch (err) {
|
|
960
|
+
log.debug(
|
|
961
|
+
`lifecycle compaction: fallback storage resolve failed for ${childPath} (non-fatal): ${err}`,
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
addTarget(childPath);
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
return targets;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
/**
|
|
972
|
+
* Compact one lifecycle ledger when it is at/over `threshold`. Returns
|
|
973
|
+
* `"skipped"` (absent or below threshold — nothing to do), `"compacted"`
|
|
974
|
+
* (rewritten and verified under the read/decrypt cap), `"failed"`
|
|
975
|
+
* (rebuild/probe threw, or the rewritten ledger is STILL over the cap — an
|
|
976
|
+
* ineffective compaction — non-fatal, retried next pass), or `"deferred"`
|
|
977
|
+
* (oversized but its encrypted ledger cannot be rewritten because no unlocked
|
|
978
|
+
* secure store is available — real work still pending, so the caller must NOT
|
|
979
|
+
* arm the throttle). #2033: a deferred/failed target is distinct from a genuine
|
|
980
|
+
* no-op so one namespace compacting cannot suppress retries for another, and
|
|
981
|
+
* an over-cap rewrite never arms the throttle.
|
|
982
|
+
*/
|
|
983
|
+
private async compactLifecycleLedgerTarget(
|
|
984
|
+
target: { memoryDir: string; storage?: StorageManager },
|
|
985
|
+
threshold: number,
|
|
986
|
+
): Promise<"skipped" | "compacted" | "failed" | "deferred"> {
|
|
987
|
+
const ledgerPath = path.join(target.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
|
|
988
|
+
let size = 0;
|
|
989
|
+
try {
|
|
990
|
+
size = (await stat(ledgerPath)).size;
|
|
991
|
+
} catch (err) {
|
|
992
|
+
if (isErrnoCode(err, "ENOENT")) return "skipped"; // absent — nothing to compact yet.
|
|
993
|
+
log.warn(
|
|
994
|
+
`lifecycle ledger size check failed (non-fatal) for ${target.memoryDir}: ${err}`,
|
|
995
|
+
);
|
|
996
|
+
return "failed";
|
|
997
|
+
}
|
|
998
|
+
// #2033 finding (1): an encrypted ledger becomes unreadable once its on-disk
|
|
999
|
+
// size reaches the whole-file decrypt cap (the reader refuses at/over it), so
|
|
1000
|
+
// the effective compaction trigger for an encrypted target is clamped to that
|
|
1001
|
+
// cap even when the configured threshold is LARGER — otherwise a ledger that
|
|
1002
|
+
// grows past the cap but stays below a bigger threshold would never compact
|
|
1003
|
+
// and stay permanently unreadable. Plaintext streaming is unaffected at any
|
|
1004
|
+
// size, so a plaintext target keeps the configured threshold. The cheap
|
|
1005
|
+
// pre-check skips anything below the smaller of the two before paying for the
|
|
1006
|
+
// extra lstat/open the encryption probe costs.
|
|
1007
|
+
if (size < Math.min(threshold, this.lifecycleLedgerMaxBytes)) return "skipped";
|
|
1008
|
+
let encrypted: boolean;
|
|
1009
|
+
try {
|
|
1010
|
+
encrypted = await probeEncryptedRegularFileHeader(ledgerPath);
|
|
1011
|
+
} catch (err) {
|
|
1012
|
+
log.warn(`lifecycle ledger encryption probe failed (non-fatal) for ${ledgerPath}: ${err}`);
|
|
1013
|
+
return "failed";
|
|
1014
|
+
}
|
|
1015
|
+
const effectiveThreshold = encrypted
|
|
1016
|
+
? Math.min(threshold, this.lifecycleLedgerMaxBytes)
|
|
1017
|
+
: threshold;
|
|
1018
|
+
if (size < effectiveThreshold) return "skipped";
|
|
1019
|
+
// No plaintext rewrite of an encrypted-at-rest ledger (#2033): rebuilding an
|
|
1020
|
+
// encrypted ledger without an unlocked secure StorageManager would either
|
|
1021
|
+
// fail the preserve-read (locked store) or downgrade the ledger to plaintext.
|
|
1022
|
+
// Report "deferred" (NOT "skipped"): the ledger is over threshold and still
|
|
1023
|
+
// needs compaction, so the throttle must stay un-armed and retry once a key
|
|
1024
|
+
// is available — a "skipped" here would let another target's success arm the
|
|
1025
|
+
// throttle and suppress this pending work for the whole interval (#2033).
|
|
1026
|
+
if (encrypted && !(target.storage?.isSecureStoreUnlocked() ?? false)) {
|
|
1027
|
+
log.warn(
|
|
1028
|
+
`lifecycle ledger at ${ledgerPath} is encrypted at rest but no unlocked secure `
|
|
1029
|
+
+ `storage is available; deferring auto-compaction to avoid a plaintext rewrite. `
|
|
1030
|
+
+ `Run 'remnic rebuild-memory-lifecycle-ledger --write' after unlocking.`,
|
|
1031
|
+
);
|
|
1032
|
+
return "deferred";
|
|
1033
|
+
}
|
|
1034
|
+
// #2033 findings (2)+(4): the rewrite budget bounds the PLAINTEXT payload, but
|
|
1035
|
+
// an encrypted-at-rest target adds a fixed secure-store envelope on disk.
|
|
1036
|
+
// Reserve that envelope (plus one byte) from the plaintext budget so the
|
|
1037
|
+
// encrypted file lands STRICTLY below the reader's refusal cap and the
|
|
1038
|
+
// post-write check — which stats the on-disk (encrypted) size against the cap
|
|
1039
|
+
// — cannot fail forever on a plaintext budget that equals the cap (the
|
|
1040
|
+
// endless-retry bug). Base this on whether the REPLACEMENT will be encrypted
|
|
1041
|
+
// (the storage write mode), NOT only on the current file header: a
|
|
1042
|
+
// plaintext ledger rewritten under `secureStoreEncryptOnWrite` with the key
|
|
1043
|
+
// set becomes encrypted, so it needs the reserve even though its current
|
|
1044
|
+
// header is plaintext (#2033 write-mode finding).
|
|
1045
|
+
const replacementEncrypted =
|
|
1046
|
+
encrypted || (target.storage?.willEncryptStateWrites() ?? false);
|
|
1047
|
+
const plaintextBudget = replacementEncrypted
|
|
1048
|
+
? this.lifecycleLedgerMaxBytes - SECURE_STORE_ENVELOPE_OVERHEAD_BYTES - 1
|
|
1049
|
+
: this.lifecycleLedgerMaxBytes - 1;
|
|
1050
|
+
try {
|
|
1051
|
+
const result = await rebuildMemoryLifecycleLedger({
|
|
1052
|
+
memoryDir: target.memoryDir,
|
|
1053
|
+
dryRun: false,
|
|
1054
|
+
storage: target.storage,
|
|
1055
|
+
// Background compaction must not lose append-only history that
|
|
1056
|
+
// frontmatter cannot reconstruct (issue #1910); the manual CLI repair
|
|
1057
|
+
// rebuild now preserves and bounds identically (#2033).
|
|
1058
|
+
preserveExistingEvents: true,
|
|
1059
|
+
// Bound the PLAINTEXT rewrite to a budget that reserves the secure-store
|
|
1060
|
+
// envelope, so the on-disk ledger (plaintext, or plaintext+envelope when
|
|
1061
|
+
// encrypted) is strictly below the read/decrypt cap; overflow lands in
|
|
1062
|
+
// the verbatim backup (#2033 findings 2+4).
|
|
1063
|
+
maxLedgerBytes: plaintextBudget,
|
|
1064
|
+
});
|
|
1065
|
+
// Verify the rewritten ledger is actually bounded. A compaction that left
|
|
1066
|
+
// the ledger at/over the read/decrypt cap is ineffective (the ledger would
|
|
1067
|
+
// be unreadable) — report "failed" so the throttle stays un-armed and the
|
|
1068
|
+
// next pass retries rather than declaring success (#2033).
|
|
1069
|
+
let rewrittenSize = 0;
|
|
1070
|
+
try {
|
|
1071
|
+
rewrittenSize = (await stat(ledgerPath)).size;
|
|
1072
|
+
} catch (err) {
|
|
1073
|
+
log.warn(`lifecycle ledger post-compaction size check failed (non-fatal) for ${target.memoryDir}: ${err}`);
|
|
1074
|
+
return "failed";
|
|
1075
|
+
}
|
|
1076
|
+
if (rewrittenSize >= this.lifecycleLedgerMaxBytes) {
|
|
1077
|
+
log.warn(
|
|
1078
|
+
`lifecycle ledger auto-compaction ineffective for ${target.memoryDir}: rewritten `
|
|
1079
|
+
+ `ledger is ${rewrittenSize}B, still at/over the ${this.lifecycleLedgerMaxBytes}-byte `
|
|
1080
|
+
+ `read/decrypt cap; leaving the throttle un-armed to retry.`,
|
|
1081
|
+
);
|
|
1082
|
+
return "failed";
|
|
1083
|
+
}
|
|
1084
|
+
if (result.rewritten === false) {
|
|
1085
|
+
// No-op pass (#2033 thread PRRT_kwDORJXyws6SExst): a preserving rebuild
|
|
1086
|
+
// would reproduce the current ledger byte-for-byte, so it skipped the
|
|
1087
|
+
// backup+rewrite. The ledger stays over the trigger but under the cap;
|
|
1088
|
+
// report "compacted" so the throttle still arms (nothing more can be
|
|
1089
|
+
// done until the ledger grows), which stops the periodic re-archive/
|
|
1090
|
+
// rewrite churn the review flagged — the archive no longer grows.
|
|
1091
|
+
log.debug(
|
|
1092
|
+
`lifecycle ledger already compact for ${target.memoryDir}: ${rewrittenSize}B, `
|
|
1093
|
+
+ `no rewrite needed (throttle armed to avoid re-archiving an unchanged ledger).`,
|
|
1094
|
+
);
|
|
1095
|
+
} else {
|
|
1096
|
+
log.info(
|
|
1097
|
+
`lifecycle ledger auto-compacted (${target.memoryDir}): ${size}B -> `
|
|
1098
|
+
+ `${rewrittenSize}B, ${result.rebuiltRows} rows `
|
|
1099
|
+
+ `(${result.preservedAppendOnlyRows ?? 0} append-only preserved, `
|
|
1100
|
+
+ `${result.archivedOverflowRows ?? 0} overflow archived), `
|
|
1101
|
+
+ `backup=${result.backupPath ?? "none"}`,
|
|
1102
|
+
);
|
|
1103
|
+
}
|
|
1104
|
+
return "compacted";
|
|
1105
|
+
} catch (err) {
|
|
1106
|
+
log.warn(
|
|
1107
|
+
`lifecycle ledger auto-compaction failed (non-fatal) for ${target.memoryDir}: ${err}`,
|
|
1108
|
+
);
|
|
1109
|
+
return "failed";
|
|
531
1110
|
}
|
|
532
1111
|
}
|
|
533
1112
|
|