@remnic/core 9.7.15 → 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 +85 -71
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +35 -17
- package/dist/access-boundary.js +86 -74
- package/dist/access-citation.d.ts +28 -0
- package/dist/access-citation.js +9 -0
- package/dist/access-cli.js +194 -178
- 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 +100 -87
- package/dist/access-identity-continuity-surface.d.ts +13 -8
- package/dist/access-identity-continuity-surface.js +85 -71
- package/dist/access-lcm-surface.d.ts +16 -9
- package/dist/access-lcm-surface.js +85 -71
- package/dist/access-mcp.d.ts +23 -16
- package/dist/access-mcp.js +96 -84
- 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 +85 -71
- package/dist/access-operations-batch.js +92 -80
- package/dist/access-operations.d.ts +29 -22
- package/dist/access-operations.js +94 -82
- 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 +85 -71
- package/dist/access-schema.d.ts +98 -98
- package/dist/access-schema.js +8 -6
- package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DEL4qCrc.d.ts} +25 -32
- package/dist/access-service.d.ts +13 -6
- package/dist/access-service.js +89 -72
- 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 +34 -24
- 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/{catalog-C9444P10.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 +43 -34
- 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-QKQYXZVS.js → chunk-2EJOEICD.js} +1819 -1481
- package/dist/chunk-2EJOEICD.js.map +1 -0
- package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
- package/dist/{chunk-VJVNLNDQ.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-HDTQVNWD.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-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
- package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
- package/dist/chunk-44XZ75OQ.js.map +1 -0
- package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
- package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
- package/dist/chunk-4BJQODZF.js.map +1 -0
- package/dist/{chunk-JREB6UFH.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-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
- package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
- package/dist/chunk-5SB7SC2G.js.map +1 -0
- 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-FDCTQWLW.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-OVJ2HIPE.js → chunk-76GLCM57.js} +158 -125
- 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-ZHIVCODT.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-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
- 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-74F5STS4.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-T7Y5KPLN.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-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
- package/dist/{chunk-PBNZVPFS.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-INELTPRG.js → chunk-EEC7UJPX.js} +103 -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-DZKHSDOM.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-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
- package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
- 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-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
- package/dist/chunk-GCASGYIO.js +71 -0
- package/dist/chunk-GCASGYIO.js.map +1 -0
- package/dist/{chunk-HF77M34J.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-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
- package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
- package/dist/{chunk-OAZVR2BV.js → chunk-IDZFBSHN.js} +8 -6
- package/dist/{chunk-OAZVR2BV.js.map → chunk-IDZFBSHN.js.map} +1 -1
- package/dist/{chunk-PLQE6MJA.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-DCFV7A7H.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-E6CBU7XP.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-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
- package/dist/{chunk-BS4SGLWV.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-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
- 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-QQGPUKMT.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-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
- 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-VDW4VU7B.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-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
- package/dist/chunk-QJAQNXWI.js.map +1 -0
- package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
- package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
- package/dist/{chunk-FIJUY7GG.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-FNZQGN76.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-LZOV7MX7.js → chunk-TDTXKOAJ.js} +6474 -5747
- 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-DPAENM7O.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-AJLLIIML.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-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
- package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
- package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
- package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
- package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
- package/dist/chunk-YV32N67O.js.map +1 -0
- package/dist/{chunk-PBSAPHHA.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-Cd5fMmhq.d.ts → cli-C_pqqTCw.d.ts} +28 -12
- package/dist/cli.d.ts +16 -9
- package/dist/cli.js +142 -127
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +36 -26
- 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 +36 -26
- 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 +41 -32
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-undo.d.ts +5 -2
- 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 +35 -26
- 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-IOGBBAGC.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 +3 -1
- 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 +473 -464
- package/dist/index.js +287 -239
- 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 +35 -25
- 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 +37 -25
- package/dist/maintenance/rebuild-memory-projection.js +38 -28
- 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 +3 -1
- 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 +51 -42
- 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 +24 -20
- package/dist/namespaces/storage.d.ts +24 -3
- package/dist/namespaces/storage.js +35 -27
- 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 +69 -54
- 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 +44 -31
- package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
- package/dist/orchestrator.d.ts +13 -8
- package/dist/orchestrator.js +194 -177
- package/dist/patterns-cli.d.ts +3 -1
- package/dist/{pipeline-BAj5bx7g.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-_MDSlj1m.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 +7 -3
- 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 +98 -98
- 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 +18 -16
- package/dist/search/index.d.ts +3 -1
- package/dist/search/index.js +22 -20
- 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 +16 -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-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +4 -2
- package/dist/semantic-consolidation.js +38 -29
- package/dist/semantic-rule-promotion.js +34 -24
- package/dist/semantic-rule-verifier.d.ts +3 -1
- package/dist/semantic-rule-verifier.js +35 -25
- 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 +11 -9
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +3 -1
- package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
- package/dist/storage-guards.js +2 -2
- package/dist/storage.d.ts +6 -3
- package/dist/storage.js +38 -26
- 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 +3 -3
- package/dist/transfer/types.d.ts +90 -90
- 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-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -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 +36 -26
- 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 +113 -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/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-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 +43 -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 +574 -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 +168 -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 +160 -149
- 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.ts +47 -47
- 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 +13 -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 +882 -890
- 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 +51 -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-3IY64MV6.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-BS4SGLWV.js.map +0 -1
- package/dist/chunk-DCFV7A7H.js.map +0 -1
- package/dist/chunk-DYP3YYJJ.js.map +0 -1
- package/dist/chunk-E5BK6CGV.js +0 -335
- package/dist/chunk-E5BK6CGV.js.map +0 -1
- package/dist/chunk-FTYDWKO6.js.map +0 -1
- package/dist/chunk-GWTFLF2P.js.map +0 -1
- package/dist/chunk-IKQTFQMI.js.map +0 -1
- package/dist/chunk-INELTPRG.js.map +0 -1
- package/dist/chunk-J2HSAU72.js.map +0 -1
- package/dist/chunk-JREB6UFH.js.map +0 -1
- package/dist/chunk-K7LOWSLU.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-LZOV7MX7.js.map +0 -1
- package/dist/chunk-NWTGD4AN.js.map +0 -1
- package/dist/chunk-ODPLEWB6.js.map +0 -1
- package/dist/chunk-OVJ2HIPE.js.map +0 -1
- package/dist/chunk-PBSAPHHA.js.map +0 -1
- package/dist/chunk-PHK3HARR.js +0 -32
- package/dist/chunk-PHK3HARR.js.map +0 -1
- package/dist/chunk-PLQE6MJA.js.map +0 -1
- package/dist/chunk-QKQYXZVS.js.map +0 -1
- package/dist/chunk-QQGPUKMT.js.map +0 -1
- package/dist/chunk-RANHFI3P.js +0 -8
- package/dist/chunk-RANHFI3P.js.map +0 -1
- package/dist/chunk-RAR2BSEM.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-T7Y5KPLN.js.map +0 -1
- package/dist/chunk-TXLGHDHS.js.map +0 -1
- package/dist/chunk-VDW4VU7B.js.map +0 -1
- package/dist/chunk-VSMRDBFT.js +0 -17
- package/dist/chunk-VSMRDBFT.js.map +0 -1
- package/dist/chunk-X64YLC24.js.map +0 -1
- package/dist/chunk-XDSXEKYK.js +0 -118
- package/dist/chunk-XDSXEKYK.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-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
- /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.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-VJVNLNDQ.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-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
- /package/dist/{chunk-LRNMRXJO.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-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
- /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
- /package/dist/{chunk-FDCTQWLW.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-ZHIVCODT.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-A5UXZRRM.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-74F5STS4.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-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
- /package/dist/{chunk-PBNZVPFS.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-DZKHSDOM.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-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
- /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
- /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
- /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
- /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
- /package/dist/{chunk-UDQUSU27.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-E6CBU7XP.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-KDXVOFYY.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-2S6QHZGJ.js.map → chunk-L2DPF4DF.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-Q5WG43OP.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-FNZQGN76.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-DPAENM7O.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-AJLLIIML.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-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
- /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
- /package/dist/{chunk-RVZRYUQH.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
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* suffix-anchored patterns over library-supplied content.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { sanitizeMemoryContent } from "./sanitize.js";
|
|
18
|
+
|
|
17
19
|
/**
|
|
18
20
|
* Remove the `[Attributes: …]` suffix `writeMemory` appends to the stored
|
|
19
21
|
* body when structuredAttributes are present, yielding the raw fact/card text
|
|
@@ -37,3 +39,53 @@ export function stripAttributesSuffix(content: string): string {
|
|
|
37
39
|
if (inner.includes("]") || inner.includes("\n")) return content.trim();
|
|
38
40
|
return trimmed.slice(0, markerIndex).trim();
|
|
39
41
|
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Persisted-body assembly (issue #1989 PR2)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
//
|
|
46
|
+
// `writeMemory` historically enriched content with the attribute suffix and
|
|
47
|
+
// then sanitized the COMBINED body inline. That assembly is the persisted
|
|
48
|
+
// form both the file body and write-idempotency fingerprints must agree on
|
|
49
|
+
// (AGENTS.md §13), so it lives here — shared by `StorageManager.writeMemory`
|
|
50
|
+
// and `composeMemoryEnvelope` — instead of existing twice.
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Canonical `key: value; …` rendering of structured attributes. Keys are
|
|
54
|
+
* trimmed + lowercased, values trimmed, pairs sorted by normalized key.
|
|
55
|
+
* Moved verbatim from `storage.ts` (which re-exports it for API stability);
|
|
56
|
+
* used at the write path, the dedup-lookup path, and envelope assembly.
|
|
57
|
+
*/
|
|
58
|
+
export function normalizeAttributePairs(pairs: Record<string, string>): string {
|
|
59
|
+
return Object.entries(pairs)
|
|
60
|
+
.map(([k, v]) => [k.trim().toLowerCase(), v.trim()] as [string, string])
|
|
61
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
62
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
63
|
+
.join("; ");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface AssembledPersistBody {
|
|
67
|
+
/** The exact body persistence writes: enriched then sanitized. */
|
|
68
|
+
text: string;
|
|
69
|
+
/** False when sanitization redacted injection-bearing text. */
|
|
70
|
+
clean: boolean;
|
|
71
|
+
/** Matched injection pattern sources (for the storage warn log). */
|
|
72
|
+
violations: string[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Assemble the persisted body exactly as `writeMemory` does: append the
|
|
77
|
+
* normalized attribute suffix when attributes are present, then sanitize the
|
|
78
|
+
* combined result. ONE definition — byte-identity between the legacy write
|
|
79
|
+
* path and the sealed-envelope path is structural, not tested-by-hope.
|
|
80
|
+
*/
|
|
81
|
+
export function assemblePersistedBody(
|
|
82
|
+
content: string,
|
|
83
|
+
structuredAttributes?: Record<string, string>,
|
|
84
|
+
): AssembledPersistBody {
|
|
85
|
+
let enriched = content;
|
|
86
|
+
if (structuredAttributes && Object.keys(structuredAttributes).length > 0) {
|
|
87
|
+
enriched = `${content}\n[Attributes: ${normalizeAttributePairs(structuredAttributes)}]`;
|
|
88
|
+
}
|
|
89
|
+
const sanitized = sanitizeMemoryContent(enriched);
|
|
90
|
+
return { text: sanitized.text, clean: sanitized.clean, violations: sanitized.violations };
|
|
91
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch temporal/tag index mutations.
|
|
3
|
+
*
|
|
4
|
+
* Split from temporal-index.ts (issue #1911B / #1995): maintenance loops that
|
|
5
|
+
* add or invalidate N memories at once collect their entries and call these once
|
|
6
|
+
* instead of paying the per-memory read-parse-stringify-write amplification.
|
|
7
|
+
* Both operations reuse the low-level primitives exported from temporal-index.ts;
|
|
8
|
+
* per-entry semantics are byte-identical to indexMemoryAsync / deindexMemoryAsync.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
INDEX_VERSION,
|
|
13
|
+
addPathToSet,
|
|
14
|
+
addTagGraphEntry,
|
|
15
|
+
ensureStateDir,
|
|
16
|
+
isoDateFromTimestamp,
|
|
17
|
+
removePathFromAllSets,
|
|
18
|
+
removePathFromAllTagEntries,
|
|
19
|
+
removePathFromSet,
|
|
20
|
+
removeTagGraphEntry,
|
|
21
|
+
temporalEventFromEntry,
|
|
22
|
+
updateTagIndex,
|
|
23
|
+
updateTemporalIndex,
|
|
24
|
+
withMemoryDirMutex,
|
|
25
|
+
type TemporalIndexEntry,
|
|
26
|
+
} from "./temporal-index.js";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Batch-add multiple memories to both indexes in a single read-modify-write cycle.
|
|
30
|
+
* More efficient than calling indexMemoryAsync() per file when adding many at once.
|
|
31
|
+
*/
|
|
32
|
+
export async function indexMemoriesBatchAsync(
|
|
33
|
+
memoryDir: string,
|
|
34
|
+
entries: TemporalIndexEntry[]
|
|
35
|
+
): Promise<void> {
|
|
36
|
+
if (entries.length === 0) return;
|
|
37
|
+
try {
|
|
38
|
+
await ensureStateDir(memoryDir);
|
|
39
|
+
|
|
40
|
+
await withMemoryDirMutex(memoryDir, async () => {
|
|
41
|
+
const temporalOk = await updateTemporalIndex(memoryDir, (index) => {
|
|
42
|
+
index.version = INDEX_VERSION;
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
const dateKey = isoDateFromTimestamp(entry.createdAt);
|
|
45
|
+
removePathFromAllSets(index.dates, entry.path);
|
|
46
|
+
addPathToSet(index.dates, dateKey, entry.path);
|
|
47
|
+
index.events[entry.path] = temporalEventFromEntry(entry);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (temporalOk) {
|
|
51
|
+
await updateTagIndex(memoryDir, (index) => {
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
removePathFromAllTagEntries(index, entry.path);
|
|
54
|
+
for (const tag of entry.tags) {
|
|
55
|
+
if (tag && typeof tag === "string") {
|
|
56
|
+
addTagGraphEntry(index, tag, entry.path);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
} catch {
|
|
64
|
+
// Fail silently
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Batch-remove multiple memories from both indexes in a single read-modify-write
|
|
70
|
+
* cycle per index. Mirrors {@link indexMemoriesBatchAsync}: maintenance loops that
|
|
71
|
+
* invalidate/archive N memories collect their entries and call this once, replacing
|
|
72
|
+
* the O(N) full read-parse-stringify-write amplification of per-memory
|
|
73
|
+
* deindexMemoryAsync with O(1) temporal + O(1) tag write cycles.
|
|
74
|
+
*
|
|
75
|
+
* Per-entry semantics are byte-identical to deindexMemoryAsync: the date
|
|
76
|
+
* set for each entry's `createdAt` drops the path, the temporal event is deleted,
|
|
77
|
+
* and each tag graph entry is removed. The temporal half commits first; the tag
|
|
78
|
+
* half only runs if it succeeds, so a partial failure never leaves tags orphaned
|
|
79
|
+
* from a temporal entry that still exists.
|
|
80
|
+
*/
|
|
81
|
+
export async function deindexMemoriesBatchAsync(
|
|
82
|
+
memoryDir: string,
|
|
83
|
+
entries: ReadonlyArray<Pick<TemporalIndexEntry, "path" | "createdAt" | "tags">>,
|
|
84
|
+
): Promise<void> {
|
|
85
|
+
if (entries.length === 0) return;
|
|
86
|
+
try {
|
|
87
|
+
await ensureStateDir(memoryDir);
|
|
88
|
+
|
|
89
|
+
await withMemoryDirMutex(memoryDir, async () => {
|
|
90
|
+
const temporalOk = await updateTemporalIndex(memoryDir, (index) => {
|
|
91
|
+
for (const entry of entries) {
|
|
92
|
+
const dateKey = isoDateFromTimestamp(entry.createdAt);
|
|
93
|
+
removePathFromSet(index.dates, dateKey, entry.path);
|
|
94
|
+
delete index.events[entry.path];
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (temporalOk) {
|
|
98
|
+
await updateTagIndex(memoryDir, (index) => {
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
for (const tag of entry.tags) {
|
|
101
|
+
if (tag && typeof tag === "string") {
|
|
102
|
+
removeTagGraphEntry(index, tag, entry.path);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
} catch {
|
|
110
|
+
// Fail silently — indexes are advisory only
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -21,7 +21,10 @@ import {
|
|
|
21
21
|
queryTemporalTimelineAsync,
|
|
22
22
|
resolvePromptTagPrefilterAsync,
|
|
23
23
|
setIndexReadObserverForTest,
|
|
24
|
+
setIndexWriteFailureForTest,
|
|
25
|
+
setIndexWriteObserverForTest,
|
|
24
26
|
} from "./temporal-index.js";
|
|
27
|
+
import { deindexMemoriesBatchAsync } from "./temporal-index-batch.js";
|
|
25
28
|
|
|
26
29
|
test("legacy temporal-index exports preserve synchronous return timing and booleans", async () => {
|
|
27
30
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-sync-compat-"));
|
|
@@ -644,3 +647,193 @@ test("temporal timeline generic edge selection honors small and zero limits", as
|
|
|
644
647
|
4,
|
|
645
648
|
);
|
|
646
649
|
});
|
|
650
|
+
|
|
651
|
+
// ─── #1911B: batch de-index ─────────────────────────────────────────────────
|
|
652
|
+
|
|
653
|
+
interface DeindexEntry {
|
|
654
|
+
path: string;
|
|
655
|
+
createdAt: string;
|
|
656
|
+
tags: string[];
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// A spread of memories across distinct dates with hierarchical (alias-producing)
|
|
660
|
+
// and flat tags, so equivalence covers date sets, event map, tag graph, and aliases.
|
|
661
|
+
function sampleMemories(prefix: string, count: number): DeindexEntry[] {
|
|
662
|
+
const entries: DeindexEntry[] = [];
|
|
663
|
+
for (let i = 0; i < count; i += 1) {
|
|
664
|
+
const day = String((i % 28) + 1).padStart(2, "0");
|
|
665
|
+
entries.push({
|
|
666
|
+
path: `/tmp/${prefix}-memory-${i}.md`,
|
|
667
|
+
createdAt: `2026-05-${day}T09:00:00.000Z`,
|
|
668
|
+
tags: ["project/remnic", `worker/${i % 3}`, "shared", `flat-${i}`],
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
return entries;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
async function seedIndex(memoryDir: string, entries: DeindexEntry[]): Promise<void> {
|
|
675
|
+
for (const e of entries) {
|
|
676
|
+
await indexMemory(memoryDir, e.path, e.createdAt, e.tags);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
async function readRawIndexes(memoryDir: string): Promise<{ temporal: unknown; tags: unknown }> {
|
|
681
|
+
const temporal = JSON.parse(
|
|
682
|
+
await readFile(join(memoryDir, "state", "index_time.json"), "utf8"),
|
|
683
|
+
);
|
|
684
|
+
const tags = JSON.parse(
|
|
685
|
+
await readFile(join(memoryDir, "state", "index_tags.json"), "utf8"),
|
|
686
|
+
);
|
|
687
|
+
return { temporal, tags };
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
test("#1911B batch de-index yields the same final index as per-memory de-index", async () => {
|
|
691
|
+
const sequentialDir = await mkdtemp(join(tmpdir(), "remnic-deindex-seq-"));
|
|
692
|
+
const batchDir = await mkdtemp(join(tmpdir(), "remnic-deindex-batch-"));
|
|
693
|
+
const all = sampleMemories("equiv", 12);
|
|
694
|
+
await seedIndex(sequentialDir, all);
|
|
695
|
+
await seedIndex(batchDir, all);
|
|
696
|
+
|
|
697
|
+
// Remove a non-contiguous subset in a scrambled order; batching must not depend
|
|
698
|
+
// on removal order to reach the same final index.
|
|
699
|
+
const removed = [all[10], all[1], all[7], all[4], all[0]];
|
|
700
|
+
|
|
701
|
+
for (const e of removed) {
|
|
702
|
+
await deindexMemory(sequentialDir, e.path, e.createdAt, e.tags);
|
|
703
|
+
}
|
|
704
|
+
await deindexMemoriesBatchAsync(batchDir, removed);
|
|
705
|
+
|
|
706
|
+
const seq = await readRawIndexes(sequentialDir);
|
|
707
|
+
const batch = await readRawIndexes(batchDir);
|
|
708
|
+
assert.deepEqual(batch.temporal, seq.temporal);
|
|
709
|
+
assert.deepEqual(batch.tags, seq.tags);
|
|
710
|
+
|
|
711
|
+
// Survivors remain, removed paths are gone from both indexes.
|
|
712
|
+
const survivorPaths = all.filter((e) => !removed.includes(e)).map((e) => e.path);
|
|
713
|
+
const stillIndexed = await queryByTagsAsync(batchDir, ["shared"]);
|
|
714
|
+
assert.deepEqual(stillIndexed, new Set(survivorPaths));
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
test("#1911B de-indexing N memories performs exactly one temporal + one tag write", async () => {
|
|
718
|
+
const batchDir = await mkdtemp(join(tmpdir(), "remnic-deindex-writes-batch-"));
|
|
719
|
+
const seqDir = await mkdtemp(join(tmpdir(), "remnic-deindex-writes-seq-"));
|
|
720
|
+
const entries = sampleMemories("writes", 8);
|
|
721
|
+
await seedIndex(batchDir, entries);
|
|
722
|
+
await seedIndex(seqDir, entries);
|
|
723
|
+
|
|
724
|
+
const countWrites = (dir: string) => {
|
|
725
|
+
let temporal = 0;
|
|
726
|
+
let tags = 0;
|
|
727
|
+
setIndexWriteObserverForTest((filePath) => {
|
|
728
|
+
// Scope to this directory so unrelated index writes never skew the count.
|
|
729
|
+
if (!filePath.startsWith(dir)) return;
|
|
730
|
+
if (filePath.endsWith("index_time.json")) temporal += 1;
|
|
731
|
+
else if (filePath.endsWith("index_tags.json")) tags += 1;
|
|
732
|
+
});
|
|
733
|
+
return () => {
|
|
734
|
+
setIndexWriteObserverForTest(undefined);
|
|
735
|
+
return { temporal, tags };
|
|
736
|
+
};
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
// try/finally guarantees the global observer is cleared even if an awaited
|
|
740
|
+
// op throws, so it can never leak into a later test.
|
|
741
|
+
let batchWrites = { temporal: 0, tags: 0 };
|
|
742
|
+
const stopBatch = countWrites(batchDir);
|
|
743
|
+
try {
|
|
744
|
+
await deindexMemoriesBatchAsync(batchDir, entries);
|
|
745
|
+
} finally {
|
|
746
|
+
batchWrites = stopBatch();
|
|
747
|
+
}
|
|
748
|
+
assert.deepEqual(batchWrites, { temporal: 1, tags: 1 });
|
|
749
|
+
|
|
750
|
+
let seqWrites = { temporal: 0, tags: 0 };
|
|
751
|
+
const stopSeq = countWrites(seqDir);
|
|
752
|
+
try {
|
|
753
|
+
for (const e of entries) {
|
|
754
|
+
await deindexMemory(seqDir, e.path, e.createdAt, e.tags);
|
|
755
|
+
}
|
|
756
|
+
} finally {
|
|
757
|
+
seqWrites = stopSeq();
|
|
758
|
+
}
|
|
759
|
+
// The per-memory path is the O(N) amplification this batch API replaces.
|
|
760
|
+
assert.deepEqual(seqWrites, { temporal: entries.length, tags: entries.length });
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
test("#1911B empty batch is a no-op that performs no writes", async () => {
|
|
764
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-deindex-empty-"));
|
|
765
|
+
await seedIndex(memoryDir, sampleMemories("empty", 2));
|
|
766
|
+
let writes = 0;
|
|
767
|
+
setIndexWriteObserverForTest(() => {
|
|
768
|
+
writes += 1;
|
|
769
|
+
});
|
|
770
|
+
try {
|
|
771
|
+
await deindexMemoriesBatchAsync(memoryDir, []);
|
|
772
|
+
} finally {
|
|
773
|
+
setIndexWriteObserverForTest(undefined);
|
|
774
|
+
}
|
|
775
|
+
assert.equal(writes, 0);
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
test("#1911B batch de-index keeps tag index consistent when the temporal write fails", async () => {
|
|
779
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-deindex-partialfail-"));
|
|
780
|
+
const entries = sampleMemories("partial", 4);
|
|
781
|
+
await seedIndex(memoryDir, entries);
|
|
782
|
+
const before = await readRawIndexes(memoryDir);
|
|
783
|
+
|
|
784
|
+
// Deterministically fail the temporal write via the test-only hook. chmod is a
|
|
785
|
+
// no-op for privileged users (common in CI) and differs on Windows; the hook
|
|
786
|
+
// fails the same branch in every environment. Temporal fails first, so the tag
|
|
787
|
+
// half is skipped, leaving BOTH indexes at their pre-batch contents.
|
|
788
|
+
setIndexWriteFailureForTest((filePath) => filePath.endsWith("index_time.json"));
|
|
789
|
+
try {
|
|
790
|
+
await deindexMemoriesBatchAsync(memoryDir, entries);
|
|
791
|
+
} finally {
|
|
792
|
+
setIndexWriteFailureForTest(undefined);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const after = await readRawIndexes(memoryDir);
|
|
796
|
+
assert.deepEqual(after.temporal, before.temporal);
|
|
797
|
+
assert.deepEqual(after.tags, before.tags);
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
test("#1911B a throwing write observer cannot fail a committed index write", async () => {
|
|
801
|
+
const throwDir = await mkdtemp(join(tmpdir(), "remnic-deindex-observer-throw-"));
|
|
802
|
+
const controlDir = await mkdtemp(join(tmpdir(), "remnic-deindex-observer-control-"));
|
|
803
|
+
const entries = sampleMemories("obsthrow", 3);
|
|
804
|
+
await seedIndex(throwDir, entries);
|
|
805
|
+
await seedIndex(controlDir, entries);
|
|
806
|
+
|
|
807
|
+
// Control: a clean batch de-index with no observer installed.
|
|
808
|
+
await deindexMemoriesBatchAsync(controlDir, entries);
|
|
809
|
+
|
|
810
|
+
// Same batch, but the committed-write observer throws. The exception fires
|
|
811
|
+
// only after the temporal rename has committed; if it escaped, the write would
|
|
812
|
+
// retry and ultimately report failure, skipping the paired tag phase and
|
|
813
|
+
// leaving a half-applied index. Isolation must keep the outcome identical to
|
|
814
|
+
// the control on BOTH indexes.
|
|
815
|
+
const observedWrites: string[] = [];
|
|
816
|
+
setIndexWriteObserverForTest((filePath) => {
|
|
817
|
+
// Scope to this directory so a concurrent test's index write never counts.
|
|
818
|
+
if (filePath.startsWith(throwDir)) observedWrites.push(filePath);
|
|
819
|
+
throw new Error("observer boom");
|
|
820
|
+
});
|
|
821
|
+
try {
|
|
822
|
+
await deindexMemoriesBatchAsync(throwDir, entries);
|
|
823
|
+
} finally {
|
|
824
|
+
setIndexWriteObserverForTest(undefined);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
// The observer must have fired once per committed index write, in order:
|
|
828
|
+
// temporal commits first, then tags. This guards against a silent regression
|
|
829
|
+
// where observer dispatch is dropped and the isolation assertions below pass
|
|
830
|
+
// vacuously because nothing ever threw.
|
|
831
|
+
assert.equal(observedWrites.length, 2);
|
|
832
|
+
assert.ok(observedWrites[0]?.endsWith("index_time.json"));
|
|
833
|
+
assert.ok(observedWrites[1]?.endsWith("index_tags.json"));
|
|
834
|
+
|
|
835
|
+
const control = await readRawIndexes(controlDir);
|
|
836
|
+
const thrown = await readRawIndexes(throwDir);
|
|
837
|
+
assert.deepEqual(thrown.temporal, control.temporal);
|
|
838
|
+
assert.deepEqual(thrown.tags, control.tags);
|
|
839
|
+
});
|
package/src/temporal-index.ts
CHANGED
|
@@ -32,6 +32,11 @@ export {
|
|
|
32
32
|
indexesExist,
|
|
33
33
|
} from "./temporal-index-compat.js";
|
|
34
34
|
|
|
35
|
+
export {
|
|
36
|
+
deindexMemoriesBatchAsync,
|
|
37
|
+
indexMemoriesBatchAsync,
|
|
38
|
+
} from "./temporal-index-batch.js";
|
|
39
|
+
|
|
35
40
|
export interface TemporalIndex {
|
|
36
41
|
/** version bumped when schema changes */
|
|
37
42
|
version: number;
|
|
@@ -87,7 +92,7 @@ export interface TagNode {
|
|
|
87
92
|
parents?: string[];
|
|
88
93
|
}
|
|
89
94
|
|
|
90
|
-
const INDEX_VERSION = 2;
|
|
95
|
+
export const INDEX_VERSION = 2;
|
|
91
96
|
const TEMPORAL_INDEX_FILE = "index_time.json";
|
|
92
97
|
const TAG_INDEX_FILE = "index_tags.json";
|
|
93
98
|
const TAG_INDEX_VERSION = 2;
|
|
@@ -130,6 +135,25 @@ export function setIndexReadObserverForTest(observer?: () => void): void {
|
|
|
130
135
|
indexReadObserverForTest = observer;
|
|
131
136
|
}
|
|
132
137
|
|
|
138
|
+
let indexWriteObserverForTest: ((filePath: string) => void) | undefined;
|
|
139
|
+
|
|
140
|
+
/** Test-only observer fired once per committed atomic index write. */
|
|
141
|
+
export function setIndexWriteObserverForTest(observer?: (filePath: string) => void): void {
|
|
142
|
+
indexWriteObserverForTest = observer;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
let indexWriteFailureForTest: ((filePath: string) => boolean) | undefined;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Test-only hook to deterministically fail an atomic index write for matching
|
|
149
|
+
* paths. Return true to fail the write for a given path. Lets partial-failure
|
|
150
|
+
* branches be exercised without relying on filesystem permissions, which no-op
|
|
151
|
+
* for privileged users (common in containerized CI) and differ on Windows.
|
|
152
|
+
*/
|
|
153
|
+
export function setIndexWriteFailureForTest(shouldFail?: (filePath: string) => boolean): void {
|
|
154
|
+
indexWriteFailureForTest = shouldFail;
|
|
155
|
+
}
|
|
156
|
+
|
|
133
157
|
interface IndexLockOwner {
|
|
134
158
|
pid: number;
|
|
135
159
|
createdAt?: string;
|
|
@@ -150,7 +174,7 @@ function tagIndexPath(memoryDir: string): string {
|
|
|
150
174
|
return path.join(stateDir(memoryDir), TAG_INDEX_FILE);
|
|
151
175
|
}
|
|
152
176
|
|
|
153
|
-
async function ensureStateDir(memoryDir: string): Promise<void> {
|
|
177
|
+
export async function ensureStateDir(memoryDir: string): Promise<void> {
|
|
154
178
|
await fs.promises.mkdir(stateDir(memoryDir), { recursive: true });
|
|
155
179
|
}
|
|
156
180
|
|
|
@@ -222,7 +246,7 @@ function withPathMutex<T>(filePath: string, update: () => Promise<T>): Promise<T
|
|
|
222
246
|
* per-file writes and commit mismatched halves. The inner per-file writeChains
|
|
223
247
|
* still protect each file; this outer chain just orders complete operations.
|
|
224
248
|
*/
|
|
225
|
-
function withMemoryDirMutex<T>(memoryDir: string, op: () => Promise<T>): Promise<T> {
|
|
249
|
+
export function withMemoryDirMutex<T>(memoryDir: string, op: () => Promise<T>): Promise<T> {
|
|
226
250
|
const previous = opChains.get(memoryDir) ?? Promise.resolve();
|
|
227
251
|
const run = previous.then(op, op);
|
|
228
252
|
const tail = run.then(() => undefined, () => undefined);
|
|
@@ -413,8 +437,20 @@ async function writeJsonAtomic(filePath: string, data: unknown): Promise<boolean
|
|
|
413
437
|
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
414
438
|
const tmp = uniqueTempPath(filePath);
|
|
415
439
|
try {
|
|
440
|
+
if (indexWriteFailureForTest?.(filePath)) {
|
|
441
|
+
throw new Error("injected atomic-write failure (test)");
|
|
442
|
+
}
|
|
416
443
|
await fs.promises.writeFile(tmp, payload, "utf8");
|
|
417
444
|
await fs.promises.rename(tmp, filePath);
|
|
445
|
+
// The observer fires only after the committed rename. Isolate its
|
|
446
|
+
// exceptions so a test hook can never turn a successful write into a
|
|
447
|
+
// retry or a false (failed) result, which would clear the cache and
|
|
448
|
+
// skip the paired tag-index phase.
|
|
449
|
+
try {
|
|
450
|
+
indexWriteObserverForTest?.(filePath);
|
|
451
|
+
} catch {
|
|
452
|
+
// Test hooks must not alter committed index-write results.
|
|
453
|
+
}
|
|
418
454
|
return true;
|
|
419
455
|
} catch {
|
|
420
456
|
try {
|
|
@@ -453,7 +489,7 @@ function hasCurrentTemporalIndexSchema(raw: unknown): boolean {
|
|
|
453
489
|
isRecord(raw.events);
|
|
454
490
|
}
|
|
455
491
|
|
|
456
|
-
async function updateTemporalIndex(memoryDir: string, update: (index: TemporalIndex) => void): Promise<boolean> {
|
|
492
|
+
export async function updateTemporalIndex(memoryDir: string, update: (index: TemporalIndex) => void): Promise<boolean> {
|
|
457
493
|
const indexPath = temporalIndexPath(memoryDir);
|
|
458
494
|
return withPathMutex(indexPath, async () => {
|
|
459
495
|
const ok = await withIndexFileLock(indexPath, async () => {
|
|
@@ -475,7 +511,7 @@ async function updateTemporalIndex(memoryDir: string, update: (index: TemporalIn
|
|
|
475
511
|
});
|
|
476
512
|
}
|
|
477
513
|
|
|
478
|
-
async function updateTagIndex(memoryDir: string, update: (index: TagIndex) => void): Promise<void> {
|
|
514
|
+
export async function updateTagIndex(memoryDir: string, update: (index: TagIndex) => void): Promise<void> {
|
|
479
515
|
const indexPath = tagIndexPath(memoryDir);
|
|
480
516
|
await withPathMutex(indexPath, async () => {
|
|
481
517
|
await withIndexFileLock(indexPath, async () => {
|
|
@@ -499,7 +535,7 @@ async function updateTagIndex(memoryDir: string, update: (index: TagIndex) => vo
|
|
|
499
535
|
});
|
|
500
536
|
}
|
|
501
537
|
|
|
502
|
-
function isoDateFromTimestamp(isoString: string): string {
|
|
538
|
+
export function isoDateFromTimestamp(isoString: string): string {
|
|
503
539
|
if (typeof isoString !== "string" || isoString.length < 10) {
|
|
504
540
|
// Malformed frontmatter — fall back to today so the memory is still indexed.
|
|
505
541
|
// Log a warning to surface data-quality issues without aborting the write.
|
|
@@ -520,7 +556,7 @@ function normalizedIsoTimestamp(value: string | undefined): string | undefined {
|
|
|
520
556
|
}
|
|
521
557
|
}
|
|
522
558
|
|
|
523
|
-
function temporalEventFromEntry(entry: TemporalIndexEntry): TemporalIndexEvent {
|
|
559
|
+
export function temporalEventFromEntry(entry: TemporalIndexEntry): TemporalIndexEvent {
|
|
524
560
|
const createdAt = normalizedIsoTimestamp(entry.createdAt) ?? new Date(0).toISOString();
|
|
525
561
|
const eventAt = normalizedIsoTimestamp(entry.validAt) ?? createdAt;
|
|
526
562
|
const observedAt = normalizedIsoTimestamp(entry.observedAt);
|
|
@@ -565,7 +601,7 @@ function compareTemporalIndexEvents(
|
|
|
565
601
|
return left.path.localeCompare(right.path);
|
|
566
602
|
}
|
|
567
603
|
|
|
568
|
-
function addPathToSet(record: Record<string, string[]>, key: string, p: string): void {
|
|
604
|
+
export function addPathToSet(record: Record<string, string[]>, key: string, p: string): void {
|
|
569
605
|
if (!record[key]) {
|
|
570
606
|
record[key] = [];
|
|
571
607
|
}
|
|
@@ -574,7 +610,7 @@ function addPathToSet(record: Record<string, string[]>, key: string, p: string):
|
|
|
574
610
|
}
|
|
575
611
|
}
|
|
576
612
|
|
|
577
|
-
function removePathFromSet(record: Record<string, string[]>, key: string, p: string): void {
|
|
613
|
+
export function removePathFromSet(record: Record<string, string[]>, key: string, p: string): void {
|
|
578
614
|
if (!record[key]) return;
|
|
579
615
|
record[key] = record[key].filter((x) => x !== p);
|
|
580
616
|
if (record[key].length === 0) {
|
|
@@ -582,7 +618,7 @@ function removePathFromSet(record: Record<string, string[]>, key: string, p: str
|
|
|
582
618
|
}
|
|
583
619
|
}
|
|
584
620
|
|
|
585
|
-
function removePathFromAllSets(record: Record<string, string[]>, p: string): void {
|
|
621
|
+
export function removePathFromAllSets(record: Record<string, string[]>, p: string): void {
|
|
586
622
|
for (const key of Object.keys(record)) {
|
|
587
623
|
removePathFromSet(record, key, p);
|
|
588
624
|
}
|
|
@@ -736,7 +772,7 @@ function ensureTagNode(index: TagIndex, canonical: string): TagNode {
|
|
|
736
772
|
return created;
|
|
737
773
|
}
|
|
738
774
|
|
|
739
|
-
function addTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {
|
|
775
|
+
export function addTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {
|
|
740
776
|
const canonical = normalizeCanonicalTag(rawTag);
|
|
741
777
|
if (!canonical) return;
|
|
742
778
|
const node = ensureTagNode(index, canonical);
|
|
@@ -757,7 +793,7 @@ function addTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string):
|
|
|
757
793
|
}
|
|
758
794
|
}
|
|
759
795
|
|
|
760
|
-
function removeTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {
|
|
796
|
+
export function removeTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {
|
|
761
797
|
const canonical = normalizeCanonicalTag(rawTag);
|
|
762
798
|
if (!canonical) return;
|
|
763
799
|
const node = index.tags[canonical];
|
|
@@ -769,7 +805,7 @@ function removeTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string
|
|
|
769
805
|
}
|
|
770
806
|
}
|
|
771
807
|
|
|
772
|
-
function removePathFromAllTagEntries(index: TagIndex, memoryPath: string): void {
|
|
808
|
+
export function removePathFromAllTagEntries(index: TagIndex, memoryPath: string): void {
|
|
773
809
|
for (const [canonical, nodeOrPaths] of Object.entries(index.tags)) {
|
|
774
810
|
if (Array.isArray(nodeOrPaths)) {
|
|
775
811
|
const paths = nodeOrPaths.filter((value) => value !== memoryPath);
|
|
@@ -1023,46 +1059,6 @@ export async function indexesExistAsync(memoryDir: string): Promise<boolean> {
|
|
|
1023
1059
|
}
|
|
1024
1060
|
}
|
|
1025
1061
|
|
|
1026
|
-
/**
|
|
1027
|
-
* Batch-add multiple memories to both indexes in a single read-modify-write cycle.
|
|
1028
|
-
* More efficient than calling indexMemoryAsync() per file when adding many at once.
|
|
1029
|
-
*/
|
|
1030
|
-
export async function indexMemoriesBatchAsync(
|
|
1031
|
-
memoryDir: string,
|
|
1032
|
-
entries: TemporalIndexEntry[]
|
|
1033
|
-
): Promise<void> {
|
|
1034
|
-
if (entries.length === 0) return;
|
|
1035
|
-
try {
|
|
1036
|
-
await ensureStateDir(memoryDir);
|
|
1037
|
-
|
|
1038
|
-
await withMemoryDirMutex(memoryDir, async () => {
|
|
1039
|
-
const temporalOk = await updateTemporalIndex(memoryDir, (index) => {
|
|
1040
|
-
index.version = INDEX_VERSION;
|
|
1041
|
-
for (const entry of entries) {
|
|
1042
|
-
const dateKey = isoDateFromTimestamp(entry.createdAt);
|
|
1043
|
-
removePathFromAllSets(index.dates, entry.path);
|
|
1044
|
-
addPathToSet(index.dates, dateKey, entry.path);
|
|
1045
|
-
index.events[entry.path] = temporalEventFromEntry(entry);
|
|
1046
|
-
}
|
|
1047
|
-
});
|
|
1048
|
-
if (temporalOk) {
|
|
1049
|
-
await updateTagIndex(memoryDir, (index) => {
|
|
1050
|
-
for (const entry of entries) {
|
|
1051
|
-
removePathFromAllTagEntries(index, entry.path);
|
|
1052
|
-
for (const tag of entry.tags) {
|
|
1053
|
-
if (tag && typeof tag === "string") {
|
|
1054
|
-
addTagGraphEntry(index, tag, entry.path);
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
});
|
|
1059
|
-
}
|
|
1060
|
-
});
|
|
1061
|
-
} catch {
|
|
1062
|
-
// Fail silently
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
|
|
1066
1062
|
/**
|
|
1067
1063
|
* Return the set of memory paths whose index date falls in [fromDate, toDate).
|
|
1068
1064
|
*
|