@remnic/core 9.7.15 → 9.9.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-DbZ1G3zV.d.ts} +29 -36
- 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-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-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-QKQYXZVS.js → chunk-BI2OJF6J.js} +1819 -1481
- package/dist/chunk-BI2OJF6J.js.map +1 -0
- 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-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-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-OAZVR2BV.js → chunk-OGCAYLNA.js} +8 -6
- package/dist/{chunk-OAZVR2BV.js.map → chunk-OGCAYLNA.js.map} +1 -1
- 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-PJSK6OJM.js +201 -0
- package/dist/chunk-PJSK6OJM.js.map +1 -0
- package/dist/{chunk-OVJ2HIPE.js → chunk-PMUD7ERF.js} +158 -125
- package/dist/chunk-PMUD7ERF.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-SK7AMF2J.js +168 -0
- package/dist/chunk-SK7AMF2J.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-LZOV7MX7.js → chunk-XQDRKZ7V.js} +6476 -5747
- package/dist/chunk-XQDRKZ7V.js.map +1 -0
- 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/{chunk-DCFV7A7H.js → chunk-ZVAYK7GU.js} +101 -91
- package/dist/chunk-ZVAYK7GU.js.map +1 -0
- package/dist/{cli-Cd5fMmhq.d.ts → cli-5tNLVTvJ.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 +94 -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 +172 -0
- package/src/access-observe-write-surface.ts +137 -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 +186 -179
- 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 +245 -0
- package/src/write-quarantine.ts +290 -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
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { mkdir, mkdtemp, readFile, rm, symlink, utimes, writeFile } from "node:fs/promises";
|
|
3
|
+
import { mkdir, mkdtemp, readdir, readFile, rm, symlink, utimes, writeFile } from "node:fs/promises";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import test from "node:test";
|
|
7
7
|
|
|
8
8
|
import { EngramAccessInputError, EngramAccessService } from "./access-service.js";
|
|
9
|
+
import { type LoggerBackend, initLogger } from "./logger.js";
|
|
9
10
|
import { namespaceIdentityToken } from "./namespaces/identity.js";
|
|
10
11
|
import { namespaceCollectionName } from "./namespaces/search.js";
|
|
11
12
|
import { SecureStoreLockedError } from "./secure-store/index.js";
|
|
12
|
-
import
|
|
13
|
-
import
|
|
13
|
+
import { StorageManager } from "./storage.js";
|
|
14
|
+
import { serializeLifecycleAppendPayload } from "./storage/memory-lifecycle-ledger-access.js";
|
|
15
|
+
import type { MemoryLifecycleEvent, PluginConfig } from "./types.js";
|
|
16
|
+
import { LastRecallStore } from "./recall-state.js";
|
|
17
|
+
import type { DrainPendingImpressionsResult } from "./recall-state.js";
|
|
14
18
|
|
|
15
19
|
function makeConfig(): PluginConfig {
|
|
16
20
|
return {
|
|
@@ -60,6 +64,7 @@ function makeService(): {
|
|
|
60
64
|
searchGlobal(query: string, maxResults?: number): Promise<unknown[]>;
|
|
61
65
|
};
|
|
62
66
|
getStorage(namespace: string): Promise<StorageManager>;
|
|
67
|
+
drainPendingRecallImpressions(): Promise<DrainPendingImpressionsResult>;
|
|
63
68
|
searchAcrossNamespaces(params: {
|
|
64
69
|
query: string;
|
|
65
70
|
namespaces?: string[];
|
|
@@ -81,6 +86,9 @@ function makeService(): {
|
|
|
81
86
|
getStorageCalls.push(namespace);
|
|
82
87
|
return storage;
|
|
83
88
|
},
|
|
89
|
+
async drainPendingRecallImpressions(): Promise<DrainPendingImpressionsResult> {
|
|
90
|
+
return { folded: false, pendingDeferred: false };
|
|
91
|
+
},
|
|
84
92
|
async searchAcrossNamespaces() {
|
|
85
93
|
return [];
|
|
86
94
|
},
|
|
@@ -89,6 +97,19 @@ function makeService(): {
|
|
|
89
97
|
return { service, storage, getStorageCalls };
|
|
90
98
|
}
|
|
91
99
|
|
|
100
|
+
// memory_search now threads an `execution.onDegradation` observer into
|
|
101
|
+
// searchAcrossNamespaces (issue #2018 observability). Tests that assert the
|
|
102
|
+
// fanout shape compare only the fields they care about, not the whole object.
|
|
103
|
+
function searchParamsSubset(params: unknown): {
|
|
104
|
+
query: unknown;
|
|
105
|
+
namespaces: unknown;
|
|
106
|
+
maxResults: unknown;
|
|
107
|
+
mode: unknown;
|
|
108
|
+
} {
|
|
109
|
+
const p = params as { query?: unknown; namespaces?: unknown; maxResults?: unknown; mode?: unknown };
|
|
110
|
+
return { query: p.query, namespaces: p.namespaces, maxResults: p.maxResults, mode: p.mode };
|
|
111
|
+
}
|
|
112
|
+
|
|
92
113
|
test("getWritableStorageForNamespace denies read-only principals before storage lookup", async () => {
|
|
93
114
|
const { service, getStorageCalls } = makeService();
|
|
94
115
|
|
|
@@ -908,7 +929,7 @@ test("memorySearch without an explicit namespace uses readable recall namespaces
|
|
|
908
929
|
principal: "reader",
|
|
909
930
|
});
|
|
910
931
|
|
|
911
|
-
assert.deepEqual(searchParams, {
|
|
932
|
+
assert.deepEqual(searchParamsSubset(searchParams), {
|
|
912
933
|
query: "deployment notes",
|
|
913
934
|
namespaces: ["default", "shared"],
|
|
914
935
|
maxResults: 3,
|
|
@@ -936,7 +957,7 @@ test("memorySearch with an explicit namespace searches only that readable namesp
|
|
|
936
957
|
principal: "reader",
|
|
937
958
|
});
|
|
938
959
|
|
|
939
|
-
assert.deepEqual(searchParams, {
|
|
960
|
+
assert.deepEqual(searchParamsSubset(searchParams), {
|
|
940
961
|
query: "release note",
|
|
941
962
|
namespaces: ["team"],
|
|
942
963
|
maxResults: 2,
|
|
@@ -1027,7 +1048,7 @@ test("memorySearch treats global collection as ACL-scoped when namespaces are en
|
|
|
1027
1048
|
});
|
|
1028
1049
|
|
|
1029
1050
|
assert.equal(globalSearchCalls, 0);
|
|
1030
|
-
assert.deepEqual(searchParams, {
|
|
1051
|
+
assert.deepEqual(searchParamsSubset(searchParams), {
|
|
1031
1052
|
query: "runbook",
|
|
1032
1053
|
namespaces: ["default", "shared"],
|
|
1033
1054
|
maxResults: undefined,
|
|
@@ -1057,7 +1078,7 @@ test("memorySearch accepts a namespace-scoped collection for the requested names
|
|
|
1057
1078
|
principal: "reader",
|
|
1058
1079
|
});
|
|
1059
1080
|
|
|
1060
|
-
assert.deepEqual(searchParams, {
|
|
1081
|
+
assert.deepEqual(searchParamsSubset(searchParams), {
|
|
1061
1082
|
query: "release note",
|
|
1062
1083
|
namespaces: ["team"],
|
|
1063
1084
|
maxResults: undefined,
|
|
@@ -1086,7 +1107,7 @@ test("memorySearch accepts a readable namespace-scoped collection without duplic
|
|
|
1086
1107
|
principal: "reader",
|
|
1087
1108
|
});
|
|
1088
1109
|
|
|
1089
|
-
assert.deepEqual(searchParams, {
|
|
1110
|
+
assert.deepEqual(searchParamsSubset(searchParams), {
|
|
1090
1111
|
query: "release note",
|
|
1091
1112
|
namespaces: ["team"],
|
|
1092
1113
|
maxResults: undefined,
|
|
@@ -1187,6 +1208,9 @@ test("offlineSyncFiles reports invalid requested paths as input errors", async (
|
|
|
1187
1208
|
};
|
|
1188
1209
|
}).orchestrator.getStorage = async () => ({
|
|
1189
1210
|
dir: os.tmpdir(),
|
|
1211
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1212
|
+
return { folded: false, pendingDeferred: false };
|
|
1213
|
+
},
|
|
1190
1214
|
async readOfflineSyncFile() {
|
|
1191
1215
|
throw new Error("should not read invalid paths");
|
|
1192
1216
|
},
|
|
@@ -1217,6 +1241,9 @@ test("offlineSyncFiles reports symlink requested paths as input errors", async (
|
|
|
1217
1241
|
};
|
|
1218
1242
|
}).orchestrator.getStorage = async () => ({
|
|
1219
1243
|
dir: root,
|
|
1244
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1245
|
+
return { folded: false, pendingDeferred: false };
|
|
1246
|
+
},
|
|
1220
1247
|
async readOfflineSyncFile() {
|
|
1221
1248
|
throw new Error("should not read symlink paths");
|
|
1222
1249
|
},
|
|
@@ -1264,6 +1291,9 @@ test("offlineSyncSnapshot does not trust client base capture time for server fas
|
|
|
1264
1291
|
};
|
|
1265
1292
|
}).orchestrator.getStorage = async () => ({
|
|
1266
1293
|
dir: root,
|
|
1294
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1295
|
+
return { folded: false, pendingDeferred: false };
|
|
1296
|
+
},
|
|
1267
1297
|
async readOfflineSyncFile(targetPath: string) {
|
|
1268
1298
|
return readFile(targetPath);
|
|
1269
1299
|
},
|
|
@@ -1291,3 +1321,451 @@ test("offlineSyncSnapshot does not trust client base capture time for server fas
|
|
|
1291
1321
|
await rm(root, { recursive: true, force: true });
|
|
1292
1322
|
}
|
|
1293
1323
|
});
|
|
1324
|
+
|
|
1325
|
+
test("offlineSyncSnapshot drains pending recall-impression spills so a recorded impression reaches the snapshot (#2033)", async () => {
|
|
1326
|
+
// A record() that timed out on the rotation lock spills to the offline-sync
|
|
1327
|
+
// EXCLUDED recall_impressions.jsonl.pending.d/. Without a pre-snapshot drain
|
|
1328
|
+
// the impression is absent from the pushed snapshot and lost if this node is
|
|
1329
|
+
// discarded. offlineSyncSnapshot() must fold the spill into the synced active
|
|
1330
|
+
// recall_impressions.jsonl before building.
|
|
1331
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-offline-impression-drain-"));
|
|
1332
|
+
try {
|
|
1333
|
+
const impressionsPath = path.join(root, "state", "recall_impressions.jsonl");
|
|
1334
|
+
const pendingDir = `${impressionsPath}.pending.d`;
|
|
1335
|
+
await mkdir(pendingDir, { recursive: true });
|
|
1336
|
+
const row = `${JSON.stringify({ sessionKey: "s1", writeNonce: "n-1", memoryIds: ["m-1"] })}\n`;
|
|
1337
|
+
await writeFile(path.join(pendingDir, "spill-1.jsonl"), row, "utf-8");
|
|
1338
|
+
|
|
1339
|
+
const { service } = makeService();
|
|
1340
|
+
const orchestrator = (service as unknown as {
|
|
1341
|
+
orchestrator: {
|
|
1342
|
+
config: PluginConfig;
|
|
1343
|
+
getStorage(namespace: string): Promise<StorageManager>;
|
|
1344
|
+
drainPendingRecallImpressions(): Promise<DrainPendingImpressionsResult>;
|
|
1345
|
+
};
|
|
1346
|
+
}).orchestrator;
|
|
1347
|
+
// The writer store roots at config.memoryDir — the SAME instance the drain
|
|
1348
|
+
// must fold from. Here memoryDir === storage.dir (the offline-synced root),
|
|
1349
|
+
// so the folded active file lands in the snapshot.
|
|
1350
|
+
orchestrator.config.memoryDir = root;
|
|
1351
|
+
const writerStore = new LastRecallStore(root, {
|
|
1352
|
+
impressionsRotateBytes: 0,
|
|
1353
|
+
impressionsRotateKeep: 5,
|
|
1354
|
+
});
|
|
1355
|
+
orchestrator.drainPendingRecallImpressions = () => writerStore.drainPendingImpressions();
|
|
1356
|
+
orchestrator.getStorage = async () => ({
|
|
1357
|
+
dir: root,
|
|
1358
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1359
|
+
return { folded: false, pendingDeferred: false };
|
|
1360
|
+
},
|
|
1361
|
+
async readOfflineSyncFile(targetPath: string) {
|
|
1362
|
+
return readFile(targetPath);
|
|
1363
|
+
},
|
|
1364
|
+
async digestOfflineSyncFile(targetPath: string) {
|
|
1365
|
+
const content = await readFile(targetPath);
|
|
1366
|
+
return {
|
|
1367
|
+
sha256: createHash("sha256").update(content).digest("hex"),
|
|
1368
|
+
bytes: content.byteLength,
|
|
1369
|
+
};
|
|
1370
|
+
},
|
|
1371
|
+
} as unknown as StorageManager);
|
|
1372
|
+
|
|
1373
|
+
const snapshot = await service.offlineSyncSnapshot({
|
|
1374
|
+
namespace: "team",
|
|
1375
|
+
principal: "reader",
|
|
1376
|
+
includeContent: true,
|
|
1377
|
+
});
|
|
1378
|
+
|
|
1379
|
+
const active = snapshot.files.find((f) => f.path === "state/recall_impressions.jsonl");
|
|
1380
|
+
assert.ok(active, "drained active impressions file is present in the snapshot");
|
|
1381
|
+
assert.equal(
|
|
1382
|
+
Buffer.from(active!.contentBase64!, "base64").toString("utf-8"),
|
|
1383
|
+
row,
|
|
1384
|
+
"the recorded impression was folded into the synced active file",
|
|
1385
|
+
);
|
|
1386
|
+
// The node-local pending spill dir stays excluded from the snapshot...
|
|
1387
|
+
assert.ok(
|
|
1388
|
+
!snapshot.files.some((f) => f.path.startsWith("state/recall_impressions.jsonl.pending.d")),
|
|
1389
|
+
"pending spill dir remains offline-sync excluded",
|
|
1390
|
+
);
|
|
1391
|
+
// ...because the drain already emptied it.
|
|
1392
|
+
assert.deepEqual(await readdir(pendingDir), [], "pending spill drained before the snapshot");
|
|
1393
|
+
} finally {
|
|
1394
|
+
await rm(root, { recursive: true, force: true });
|
|
1395
|
+
}
|
|
1396
|
+
});
|
|
1397
|
+
|
|
1398
|
+
test("offlineSyncSnapshot does NOT drain the global impression queue during a namespace snapshot (#2033)", async () => {
|
|
1399
|
+
// Recall impressions are global: the orchestrator's single LastRecallStore roots
|
|
1400
|
+
// at config.memoryDir, so the active recall_impressions.jsonl lives at
|
|
1401
|
+
// <memoryDir>/state/ and a namespace-rooted snapshot (storage.dir under
|
|
1402
|
+
// namespaces/<token>/) can never carry it. Draining the global pending queue
|
|
1403
|
+
// during such a snapshot would empty the durable queue into a file this
|
|
1404
|
+
// snapshot omits - stranding the row until a root sync - so the drain is scoped
|
|
1405
|
+
// to the snapshot whose root actually contains the file. Here it must be a
|
|
1406
|
+
// no-op, leaving the writer-root spill pending for the root sync, while the
|
|
1407
|
+
// per-namespace lifecycle drain still runs.
|
|
1408
|
+
const writerRoot = await mkdtemp(path.join(os.tmpdir(), "remnic-impression-drain-writer-"));
|
|
1409
|
+
const nsDir = await mkdtemp(path.join(os.tmpdir(), "remnic-impression-drain-ns-"));
|
|
1410
|
+
try {
|
|
1411
|
+
const impressionsPath = path.join(writerRoot, "state", "recall_impressions.jsonl");
|
|
1412
|
+
const pendingDir = `${impressionsPath}.pending.d`;
|
|
1413
|
+
await mkdir(pendingDir, { recursive: true });
|
|
1414
|
+
const row = `${JSON.stringify({ sessionKey: "s1", writeNonce: "n-1", memoryIds: ["m-1"] })}\n`;
|
|
1415
|
+
await writeFile(path.join(pendingDir, "spill-1.jsonl"), row, "utf-8");
|
|
1416
|
+
|
|
1417
|
+
const { service } = makeService();
|
|
1418
|
+
const orchestrator = (service as unknown as {
|
|
1419
|
+
orchestrator: {
|
|
1420
|
+
config: PluginConfig;
|
|
1421
|
+
getStorage(namespace: string): Promise<StorageManager>;
|
|
1422
|
+
drainPendingRecallImpressions(): Promise<DrainPendingImpressionsResult>;
|
|
1423
|
+
};
|
|
1424
|
+
}).orchestrator;
|
|
1425
|
+
// Writer root (config.memoryDir) is deliberately DISTINCT from the resolved
|
|
1426
|
+
// namespace's storage.dir.
|
|
1427
|
+
orchestrator.config.memoryDir = writerRoot;
|
|
1428
|
+
const writerStore = new LastRecallStore(writerRoot, {
|
|
1429
|
+
impressionsRotateBytes: 0,
|
|
1430
|
+
impressionsRotateKeep: 5,
|
|
1431
|
+
});
|
|
1432
|
+
let impressionDrainCalls = 0;
|
|
1433
|
+
orchestrator.drainPendingRecallImpressions = () => {
|
|
1434
|
+
impressionDrainCalls += 1;
|
|
1435
|
+
return writerStore.drainPendingImpressions();
|
|
1436
|
+
};
|
|
1437
|
+
let lifecycleDrainCalls = 0;
|
|
1438
|
+
orchestrator.getStorage = async () => ({
|
|
1439
|
+
dir: nsDir,
|
|
1440
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1441
|
+
lifecycleDrainCalls += 1;
|
|
1442
|
+
return { folded: false, pendingDeferred: false };
|
|
1443
|
+
},
|
|
1444
|
+
async readOfflineSyncFile(targetPath: string) {
|
|
1445
|
+
return readFile(targetPath);
|
|
1446
|
+
},
|
|
1447
|
+
async digestOfflineSyncFile(targetPath: string) {
|
|
1448
|
+
const content = await readFile(targetPath);
|
|
1449
|
+
return {
|
|
1450
|
+
sha256: createHash("sha256").update(content).digest("hex"),
|
|
1451
|
+
bytes: content.byteLength,
|
|
1452
|
+
};
|
|
1453
|
+
},
|
|
1454
|
+
} as unknown as StorageManager);
|
|
1455
|
+
|
|
1456
|
+
const snapshot = await service.offlineSyncSnapshot({
|
|
1457
|
+
namespace: "team",
|
|
1458
|
+
principal: "reader",
|
|
1459
|
+
includeContent: true,
|
|
1460
|
+
});
|
|
1461
|
+
|
|
1462
|
+
// The global impression drain is scoped OUT of a namespace snapshot: it is
|
|
1463
|
+
// never invoked, so the writer-root pending spill is retained for the root
|
|
1464
|
+
// sync and no writer-root active file is created.
|
|
1465
|
+
assert.equal(impressionDrainCalls, 0, "global impression drain must be skipped for a namespace snapshot");
|
|
1466
|
+
assert.deepEqual(
|
|
1467
|
+
await readdir(pendingDir),
|
|
1468
|
+
["spill-1.jsonl"],
|
|
1469
|
+
"writer-root pending spill retained for the eventual root sync",
|
|
1470
|
+
);
|
|
1471
|
+
await assert.rejects(
|
|
1472
|
+
() => readFile(impressionsPath, "utf-8"),
|
|
1473
|
+
/ENOENT/,
|
|
1474
|
+
"no writer-root active impressions file is written during a namespace snapshot",
|
|
1475
|
+
);
|
|
1476
|
+
// The per-namespace lifecycle drain still runs.
|
|
1477
|
+
assert.equal(lifecycleDrainCalls, 1, "per-namespace lifecycle drain still runs");
|
|
1478
|
+
// The namespace-rooted snapshot never carries the writer-root impressions file.
|
|
1479
|
+
assert.ok(
|
|
1480
|
+
!snapshot.files.some((f) => f.path === "state/recall_impressions.jsonl"),
|
|
1481
|
+
"namespace-rooted snapshot does not carry the writer-root active file",
|
|
1482
|
+
);
|
|
1483
|
+
} finally {
|
|
1484
|
+
await rm(writerRoot, { recursive: true, force: true });
|
|
1485
|
+
await rm(nsDir, { recursive: true, force: true });
|
|
1486
|
+
}
|
|
1487
|
+
});
|
|
1488
|
+
|
|
1489
|
+
test("offlineSyncSnapshot drains a pending memory-lifecycle spill so the append-only row reaches the snapshot (#2033)", async () => {
|
|
1490
|
+
// An appendMemoryLifecycleEvents() that timed out on the ledger lock spills the
|
|
1491
|
+
// durable row into the offline-sync-EXCLUDED memory-lifecycle-ledger.jsonl.pending.d/.
|
|
1492
|
+
// Without a pre-snapshot drain the promotion/import/explicit-capture row is
|
|
1493
|
+
// absent from the pushed snapshot and lost if this node is discarded before a
|
|
1494
|
+
// later append or maintenance pass folds it. Unlike recall impressions (writer
|
|
1495
|
+
// root), the lifecycle ledger is per-namespace, so the drain runs on the
|
|
1496
|
+
// RESOLVED-namespace storage and the folded ledger lands in the snapshot.
|
|
1497
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-offline-lifecycle-drain-"));
|
|
1498
|
+
try {
|
|
1499
|
+
const storage = new StorageManager(root);
|
|
1500
|
+
const ledgerPath = path.join(root, "state", "memory-lifecycle-ledger.jsonl");
|
|
1501
|
+
const pendingDir = `${ledgerPath}.pending.d`;
|
|
1502
|
+
await mkdir(pendingDir, { recursive: true });
|
|
1503
|
+
const event: MemoryLifecycleEvent = {
|
|
1504
|
+
eventId: "evt-spilled-1",
|
|
1505
|
+
memoryId: "memory-a",
|
|
1506
|
+
eventType: "promoted",
|
|
1507
|
+
timestamp: "2026-03-08T00:00:00.000Z",
|
|
1508
|
+
actor: "system",
|
|
1509
|
+
ruleVersion: "v1",
|
|
1510
|
+
};
|
|
1511
|
+
// Spill file written exactly as a lock-timed-out append leaves it (plaintext
|
|
1512
|
+
// here: no secure key is configured on this store).
|
|
1513
|
+
const spillPayload = serializeLifecycleAppendPayload([event]);
|
|
1514
|
+
await writeFile(path.join(pendingDir, "spill-1.jsonl"), spillPayload, "utf-8");
|
|
1515
|
+
|
|
1516
|
+
const { service } = makeService();
|
|
1517
|
+
const orchestrator = (service as unknown as {
|
|
1518
|
+
orchestrator: { config: PluginConfig; getStorage(namespace: string): Promise<StorageManager> };
|
|
1519
|
+
}).orchestrator;
|
|
1520
|
+
orchestrator.getStorage = async () => storage;
|
|
1521
|
+
|
|
1522
|
+
const snapshot = await service.offlineSyncSnapshot({
|
|
1523
|
+
namespace: "team",
|
|
1524
|
+
principal: "reader",
|
|
1525
|
+
includeContent: true,
|
|
1526
|
+
});
|
|
1527
|
+
|
|
1528
|
+
const active = snapshot.files.find((f) => f.path === "state/memory-lifecycle-ledger.jsonl");
|
|
1529
|
+
assert.ok(active, "drained active lifecycle ledger is present in the snapshot");
|
|
1530
|
+
assert.equal(
|
|
1531
|
+
Buffer.from(active!.contentBase64!, "base64").toString("utf-8"),
|
|
1532
|
+
spillPayload,
|
|
1533
|
+
"the spilled lifecycle event was folded into the synced active ledger",
|
|
1534
|
+
);
|
|
1535
|
+
// The node-local pending spill dir stays excluded from the snapshot...
|
|
1536
|
+
assert.ok(
|
|
1537
|
+
!snapshot.files.some((f) => f.path.startsWith("state/memory-lifecycle-ledger.jsonl.pending.d")),
|
|
1538
|
+
"pending spill dir remains offline-sync excluded",
|
|
1539
|
+
);
|
|
1540
|
+
// ...because the drain already folded and emptied it.
|
|
1541
|
+
assert.deepEqual(await readdir(pendingDir), [], "pending spill drained before the snapshot");
|
|
1542
|
+
} finally {
|
|
1543
|
+
await rm(root, { recursive: true, force: true });
|
|
1544
|
+
}
|
|
1545
|
+
});
|
|
1546
|
+
|
|
1547
|
+
test("offlineSyncSnapshot aborts when pending lifecycle rows cannot be drained (#2033)", async () => {
|
|
1548
|
+
// When the ledger lock is held by a peer the drain leaves durable rows in the
|
|
1549
|
+
// EXCLUDED pending queue and reports pendingDeferred. A snapshot built then
|
|
1550
|
+
// would silently omit those append-only rows, so the buffered snapshot, the
|
|
1551
|
+
// streaming snapshot, AND the path-enumeration (offlineSyncFiles) entrypoints
|
|
1552
|
+
// MUST abort rather than report success.
|
|
1553
|
+
const { service } = makeService();
|
|
1554
|
+
const orchestrator = (service as unknown as {
|
|
1555
|
+
orchestrator: { getStorage(namespace: string): Promise<StorageManager> };
|
|
1556
|
+
}).orchestrator;
|
|
1557
|
+
let drainAttempts = 0;
|
|
1558
|
+
orchestrator.getStorage = async () =>
|
|
1559
|
+
({
|
|
1560
|
+
dir: "/unused",
|
|
1561
|
+
async drainPendingMemoryLifecycleEventsForSync() {
|
|
1562
|
+
drainAttempts++;
|
|
1563
|
+
return { folded: false, pendingDeferred: true };
|
|
1564
|
+
},
|
|
1565
|
+
}) as unknown as StorageManager;
|
|
1566
|
+
|
|
1567
|
+
await assert.rejects(
|
|
1568
|
+
() => service.offlineSyncSnapshot({ namespace: "team", principal: "reader" }),
|
|
1569
|
+
/lifecycle drain could not fold pending memory-lifecycle events.*aborting snapshot/s,
|
|
1570
|
+
"buffered snapshot aborts on a persistent lifecycle deferral",
|
|
1571
|
+
);
|
|
1572
|
+
await assert.rejects(
|
|
1573
|
+
() => service.offlineSyncSnapshotStream({ namespace: "team", principal: "reader" }),
|
|
1574
|
+
/lifecycle drain could not fold pending memory-lifecycle events.*aborting snapshot/s,
|
|
1575
|
+
"streaming snapshot aborts on a persistent lifecycle deferral",
|
|
1576
|
+
);
|
|
1577
|
+
await assert.rejects(
|
|
1578
|
+
() =>
|
|
1579
|
+
service.offlineSyncFiles({
|
|
1580
|
+
namespace: "team",
|
|
1581
|
+
principal: "reader",
|
|
1582
|
+
paths: ["state/memory-lifecycle-ledger.jsonl"],
|
|
1583
|
+
}),
|
|
1584
|
+
/lifecycle drain could not fold pending memory-lifecycle events.*aborting snapshot/s,
|
|
1585
|
+
"path enumeration aborts on a persistent lifecycle deferral",
|
|
1586
|
+
);
|
|
1587
|
+
assert.ok(drainAttempts >= 9, "each aborted entrypoint retried the drain before giving up");
|
|
1588
|
+
});
|
|
1589
|
+
// ─── Issue #2018: memory_search must reach the base collection ───────────────
|
|
1590
|
+
//
|
|
1591
|
+
// On a namespaces-enabled deployment with a flat-root default namespace, the
|
|
1592
|
+
// bulk corpus lives under the DEFAULT namespace's base QMD collection. recall
|
|
1593
|
+
// reaches it via the coding-overlay fallbacks, but memory_search has no
|
|
1594
|
+
// sessionKey (so no coding context). With scope profiles active and a
|
|
1595
|
+
// non-default principal, the profile read set collapsed to the derived
|
|
1596
|
+
// principal-self + shared namespaces and EXCLUDED the default namespace —
|
|
1597
|
+
// every query silently returned 0.
|
|
1598
|
+
|
|
1599
|
+
function makeConfigWithScopeProfile(): PluginConfig {
|
|
1600
|
+
const base = makeConfig();
|
|
1601
|
+
return {
|
|
1602
|
+
...base,
|
|
1603
|
+
defaultScopeProfile: "standard",
|
|
1604
|
+
scopeProfiles: {
|
|
1605
|
+
standard: {
|
|
1606
|
+
readOrder: ["userProject", "userGlobal", "serverShared"],
|
|
1607
|
+
writeDefault: "userProject",
|
|
1608
|
+
promotionTargets: ["userGlobal", "serverShared"],
|
|
1609
|
+
autoPromote: {
|
|
1610
|
+
enabled: false,
|
|
1611
|
+
targets: ["userGlobal"],
|
|
1612
|
+
categories: ["fact"],
|
|
1613
|
+
minConfidenceTier: "inferred",
|
|
1614
|
+
},
|
|
1615
|
+
},
|
|
1616
|
+
},
|
|
1617
|
+
} as unknown as PluginConfig;
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
function makeServiceWithConfig(config: PluginConfig): {
|
|
1621
|
+
service: EngramAccessService;
|
|
1622
|
+
captured: { namespaces?: string[]; execution?: unknown; getStorageCalls: string[] };
|
|
1623
|
+
} {
|
|
1624
|
+
const service = Object.create(EngramAccessService.prototype) as EngramAccessService;
|
|
1625
|
+
const captured: { namespaces?: string[]; execution?: unknown; getStorageCalls: string[] } = { getStorageCalls: [] };
|
|
1626
|
+
type OrchLike = {
|
|
1627
|
+
config: PluginConfig;
|
|
1628
|
+
qmd: { search(): Promise<unknown[]>; searchGlobal(): Promise<unknown[]> };
|
|
1629
|
+
getStorage(namespace: string): Promise<StorageManager>;
|
|
1630
|
+
searchAcrossNamespaces(params: {
|
|
1631
|
+
namespaces?: string[];
|
|
1632
|
+
maxResults?: number;
|
|
1633
|
+
mode?: string;
|
|
1634
|
+
execution?: unknown;
|
|
1635
|
+
}): Promise<unknown[]>;
|
|
1636
|
+
};
|
|
1637
|
+
const orchestrator: OrchLike = {
|
|
1638
|
+
config,
|
|
1639
|
+
qmd: {
|
|
1640
|
+
async search() { throw new Error("qmd.search should not run in namespace mode"); },
|
|
1641
|
+
async searchGlobal() { throw new Error("qmd.searchGlobal should not run in namespace mode"); },
|
|
1642
|
+
},
|
|
1643
|
+
async getStorage(namespace: string) { captured.getStorageCalls.push(namespace); return { dir: config.memoryDir } as StorageManager; },
|
|
1644
|
+
async searchAcrossNamespaces(params) {
|
|
1645
|
+
captured.namespaces = params.namespaces;
|
|
1646
|
+
captured.execution = params.execution;
|
|
1647
|
+
return [];
|
|
1648
|
+
},
|
|
1649
|
+
};
|
|
1650
|
+
(service as unknown as { orchestrator: OrchLike }).orchestrator = orchestrator;
|
|
1651
|
+
return { service, captured };
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
function captureLogs(): { backend: LoggerBackend; warn: string[]; reset: () => void } {
|
|
1655
|
+
const warn: string[] = [];
|
|
1656
|
+
const backend: LoggerBackend = {
|
|
1657
|
+
info() {},
|
|
1658
|
+
warn(msg) { warn.push(msg); },
|
|
1659
|
+
error() {},
|
|
1660
|
+
debug() {},
|
|
1661
|
+
};
|
|
1662
|
+
initLogger(backend, false, { timestamps: false });
|
|
1663
|
+
return { backend, warn, reset: () => initLogger({ info() {}, warn() {}, error() {}, debug() {} }, false) };
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
test("memorySearch includes the default namespace for a scope-profile principal without coding context (#2018)", async () => {
|
|
1667
|
+
// Before the fix the fanout resolved to ["operator-x", "shared"] and the
|
|
1668
|
+
// base collection (default namespace) was never queried — every search
|
|
1669
|
+
// returned 0 on a flat-root deployment.
|
|
1670
|
+
const { service, captured } = makeServiceWithConfig(makeConfigWithScopeProfile());
|
|
1671
|
+
await service.memorySearch({ query: "exact phrase", principal: "operator-x" });
|
|
1672
|
+
assert.ok(
|
|
1673
|
+
captured.namespaces?.includes("default"),
|
|
1674
|
+
`default namespace must be in fanout, got ${JSON.stringify(captured.namespaces)}`,
|
|
1675
|
+
);
|
|
1676
|
+
});
|
|
1677
|
+
|
|
1678
|
+
test("memorySearch preserves scope-profile project/global layers alongside the default namespace (#2018)", async () => {
|
|
1679
|
+
const { service, captured } = makeServiceWithConfig(makeConfigWithScopeProfile());
|
|
1680
|
+
await service.memorySearch({ query: "exact phrase", principal: "operator-x" });
|
|
1681
|
+
// The derived self namespace ("operator-x") and shared must still be present;
|
|
1682
|
+
// the fix ADDS the default, it does not replace the profile stack.
|
|
1683
|
+
assert.ok(captured.namespaces?.includes("operator-x"));
|
|
1684
|
+
assert.ok(captured.namespaces?.includes("shared"));
|
|
1685
|
+
assert.ok(captured.namespaces?.includes("default"));
|
|
1686
|
+
});
|
|
1687
|
+
|
|
1688
|
+
test("memorySearch ACL-gates the default namespace fallback (#2018)", async () => {
|
|
1689
|
+
// If the principal cannot read the default namespace, the fallback must NOT
|
|
1690
|
+
// add it. Configure a protected default via a namespace policy that excludes
|
|
1691
|
+
// the principal, and confirm "default" is absent while the policy name is
|
|
1692
|
+
// still reachable through the profile stack only when readable.
|
|
1693
|
+
const config = makeConfigWithScopeProfile();
|
|
1694
|
+
(config as unknown as { defaultNamespace: string }).defaultNamespace = "root";
|
|
1695
|
+
(config as unknown as { namespacePolicies: Array<{ name: string; readPrincipals: string[]; writePrincipals: string[] }> }).namespacePolicies = [
|
|
1696
|
+
{ name: "root", readPrincipals: ["owner"], writePrincipals: ["owner"] },
|
|
1697
|
+
];
|
|
1698
|
+
const { service, captured } = makeServiceWithConfig(config);
|
|
1699
|
+
await service.memorySearch({ query: "exact phrase", principal: "operator-x" });
|
|
1700
|
+
assert.ok(
|
|
1701
|
+
!captured.namespaces?.includes("root"),
|
|
1702
|
+
"default namespace must NOT be added when the principal lacks read access",
|
|
1703
|
+
);
|
|
1704
|
+
});
|
|
1705
|
+
|
|
1706
|
+
test("memorySearch surfaces an empty namespace resolution as a warning, never silently empty (#2018)", async () => {
|
|
1707
|
+
const { reset, warn } = captureLogs();
|
|
1708
|
+
try {
|
|
1709
|
+
// defaultRecallNamespaces: [] + no scope profile + no policies ⇒ the
|
|
1710
|
+
// readable recall set is empty, exercising the silent-empty branch.
|
|
1711
|
+
const config = {
|
|
1712
|
+
...makeConfig(),
|
|
1713
|
+
defaultRecallNamespaces: [],
|
|
1714
|
+
} as unknown as PluginConfig;
|
|
1715
|
+
const { service } = makeServiceWithConfig(config);
|
|
1716
|
+
const result = await service.memorySearch({ query: "anything", principal: "operator-x" });
|
|
1717
|
+
assert.equal(result.count, 0);
|
|
1718
|
+
assert.ok(
|
|
1719
|
+
warn.some((line) => line.includes("memory_search resolved zero readable namespaces")),
|
|
1720
|
+
"expected a zero-namespace warning",
|
|
1721
|
+
);
|
|
1722
|
+
} finally {
|
|
1723
|
+
reset();
|
|
1724
|
+
}
|
|
1725
|
+
});
|
|
1726
|
+
|
|
1727
|
+
test("memorySearch threads backend degradations to a warning (#2018)", async () => {
|
|
1728
|
+
const { reset, warn } = captureLogs();
|
|
1729
|
+
try {
|
|
1730
|
+
const config = makeConfigWithScopeProfile();
|
|
1731
|
+
const { service } = makeServiceWithConfig(config);
|
|
1732
|
+
(service as unknown as {
|
|
1733
|
+
orchestrator: {
|
|
1734
|
+
searchAcrossNamespaces(params: {
|
|
1735
|
+
execution?: { onDegradation?: (d: unknown) => void };
|
|
1736
|
+
}): Promise<unknown[]>;
|
|
1737
|
+
};
|
|
1738
|
+
}).orchestrator.searchAcrossNamespaces = async (params) => {
|
|
1739
|
+
params.execution?.onDegradation?.({
|
|
1740
|
+
backend: "qmd",
|
|
1741
|
+
code: "backend_unavailable",
|
|
1742
|
+
detail: "namespace collection missing: operator-x",
|
|
1743
|
+
});
|
|
1744
|
+
return [];
|
|
1745
|
+
};
|
|
1746
|
+
await service.memorySearch({ query: "anything", principal: "operator-x" });
|
|
1747
|
+
assert.ok(
|
|
1748
|
+
warn.some((line) => line.includes("memory_search backend degradation")),
|
|
1749
|
+
"expected a backend-degradation warning",
|
|
1750
|
+
);
|
|
1751
|
+
} finally {
|
|
1752
|
+
reset();
|
|
1753
|
+
}
|
|
1754
|
+
});
|
|
1755
|
+
|
|
1756
|
+
test("memorySearch does not probe default storage for an explicit namespace or before auth (#2056 r5)", async () => {
|
|
1757
|
+
const config = makeConfigWithScopeProfile();
|
|
1758
|
+
const { service, captured } = makeServiceWithConfig(config);
|
|
1759
|
+
// Explicit-namespace queries ignore the default-namespace fallback, so the
|
|
1760
|
+
// flat-root storage probe must not run (and must not run before the auth
|
|
1761
|
+
// check rejects an unauthorized principal).
|
|
1762
|
+
await assert.rejects(
|
|
1763
|
+
() => service.memorySearch({ query: "x", namespace: "team", principal: "stranger" }),
|
|
1764
|
+
/namespace is not readable: team/,
|
|
1765
|
+
);
|
|
1766
|
+
assert.deepEqual(
|
|
1767
|
+
captured.getStorageCalls,
|
|
1768
|
+
[],
|
|
1769
|
+
"default-namespace storage must not be probed for an explicit-namespace query",
|
|
1770
|
+
);
|
|
1771
|
+
});
|
|
@@ -34,6 +34,7 @@ import test from "node:test";
|
|
|
34
34
|
|
|
35
35
|
import { EngramAccessService } from "./access-service.js";
|
|
36
36
|
import { Orchestrator } from "./orchestrator.js";
|
|
37
|
+
import type { StorageManager } from "./storage.js";
|
|
37
38
|
import type { EngramAccessObserveRequest } from "./access-service.js";
|
|
38
39
|
import {
|
|
39
40
|
combineNamespaces,
|
|
@@ -810,6 +811,7 @@ test("#1501 implicit memorySearch honors active scope profile readOrder", async
|
|
|
810
811
|
const orch = {
|
|
811
812
|
config,
|
|
812
813
|
qmd: { isAvailable: () => true },
|
|
814
|
+
getStorage: async () => ({ dir: config.memoryDir } as StorageManager),
|
|
813
815
|
searchAcrossNamespaces: async (options: { namespaces: string[] }) => {
|
|
814
816
|
searchedNamespaces = options.namespaces;
|
|
815
817
|
return [];
|
|
@@ -862,11 +864,13 @@ test("#1501 memorySearch collection names stay constrained to active scope profi
|
|
|
862
864
|
const orch = {
|
|
863
865
|
config,
|
|
864
866
|
qmd: { isAvailable: () => true },
|
|
867
|
+
getStorage: async () => ({ dir: config.memoryDir } as StorageManager),
|
|
865
868
|
searchAcrossNamespaces: async (options: { namespaces: string[] }) => {
|
|
866
869
|
searchedNamespaces = options.namespaces;
|
|
867
870
|
return [];
|
|
868
871
|
},
|
|
869
872
|
} as unknown as Orchestrator;
|
|
873
|
+
|
|
870
874
|
const service = new EngramAccessService(orch);
|
|
871
875
|
const sharedCollection = namespaceCollectionName(config.qmdCollection, "shared", {
|
|
872
876
|
defaultNamespace: config.defaultNamespace,
|