@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
|
@@ -17,7 +17,7 @@ import { AccessAuditAdapter, type AccessAuditResult } from "./access-audit.js";
|
|
|
17
17
|
import { throwIfAborted } from "./abort-error.js";
|
|
18
18
|
import { resolveNamespaceCapabilities } from "./capabilities.js";
|
|
19
19
|
import { resolveCodingNamespaceOverlay } from "./coding/coding-namespace.js";
|
|
20
|
-
import { type BudgetDecision, CrossNamespaceBudget } from "./cross-namespace-budget.js";
|
|
20
|
+
import { type BudgetDecision, type BudgetReservation, CrossNamespaceBudget, toBudgetWarning } from "./cross-namespace-budget.js";
|
|
21
21
|
import { lcmEvidenceIdentity } from "./lcm/evidence-identity.js";
|
|
22
22
|
import { normalizeProjectionTags } from "./memory-projection-format.js";
|
|
23
23
|
import { namespaceIdentityFromToken } from "./namespaces/identity.js";
|
|
@@ -25,6 +25,7 @@ import { canReadNamespace, defaultNamespaceForPrincipal, recallNamespacesForPrin
|
|
|
25
25
|
import { expandScopeProfileReadNamespaces, resolveScopeProfilePlan } from "./namespaces/scope-profiles.js";
|
|
26
26
|
import type { Orchestrator, RecallInvocationOptions } from "./orchestrator.js";
|
|
27
27
|
import { decideDisclosureEscalation } from "./recall-disclosure-escalation.js";
|
|
28
|
+
import { assembleRecallResponse } from "./access-recall-response.js";
|
|
28
29
|
import type { LastRecallSnapshot } from "./recall-state.js";
|
|
29
30
|
import { type TagMatchMode, applyTagFilter, normalizeTags, parseTagMatch } from "./recall-tag-filter.js";
|
|
30
31
|
import { type RecallXraySnapshot, estimateRecallTokens } from "./recall-xray.js";
|
|
@@ -365,10 +366,35 @@ export class AccessRecallSurface {
|
|
|
365
366
|
};
|
|
366
367
|
const readResultPath = async (
|
|
367
368
|
memoryPath: string,
|
|
369
|
+
preferredNamespace?: string,
|
|
368
370
|
): Promise<{ memory: MemoryFile; baseDir: string } | null> => {
|
|
369
371
|
const parts = qmdCollectionPathParts(memoryPath);
|
|
370
372
|
const coldCollection =
|
|
371
373
|
this.deps.orchestrator.config.qmdColdCollection ?? "openclaw-engram-cold";
|
|
374
|
+
const collectionNamespace = parts
|
|
375
|
+
? collectionNamespaceFromPrefix(parts.collection)
|
|
376
|
+
: null;
|
|
377
|
+
const preferredAttempted = Boolean(
|
|
378
|
+
preferredNamespace &&
|
|
379
|
+
(!parts ||
|
|
380
|
+
(collectionNamespace === null && parts.collection !== coldCollection)),
|
|
381
|
+
);
|
|
382
|
+
if (preferredAttempted) {
|
|
383
|
+
try {
|
|
384
|
+
const preferredStorage = await this.deps.orchestrator.getStorage(
|
|
385
|
+
this.deps.resolveNamespace(preferredNamespace),
|
|
386
|
+
);
|
|
387
|
+
for (const candidate of qmdResultPathCandidates(
|
|
388
|
+
preferredStorage.dir,
|
|
389
|
+
memoryPath,
|
|
390
|
+
)) {
|
|
391
|
+
const memory = await preferredStorage.readMemoryByPath(candidate);
|
|
392
|
+
if (memory) return { memory, baseDir: preferredStorage.dir };
|
|
393
|
+
}
|
|
394
|
+
} catch (err) {
|
|
395
|
+
if (err instanceof SecureStoreLockedError) throw err;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
372
398
|
if (parts && parts.collection === coldCollection) {
|
|
373
399
|
const storages: Array<{ storage: StorageManager; dir: string }> = [];
|
|
374
400
|
const seenStorageDirs = new Set<string>();
|
|
@@ -405,9 +431,6 @@ export class AccessRecallSurface {
|
|
|
405
431
|
return null;
|
|
406
432
|
}
|
|
407
433
|
|
|
408
|
-
const collectionNamespace = parts
|
|
409
|
-
? collectionNamespaceFromPrefix(parts.collection)
|
|
410
|
-
: null;
|
|
411
434
|
|
|
412
435
|
if (parts && collectionNamespace) {
|
|
413
436
|
try {
|
|
@@ -444,6 +467,12 @@ export class AccessRecallSurface {
|
|
|
444
467
|
return null;
|
|
445
468
|
}
|
|
446
469
|
|
|
470
|
+
// A preferred namespace was supplied but its file is missing/stale. For a
|
|
471
|
+
// relative path the preferred store was the only correct lead, so do not
|
|
472
|
+
// fall through to the default store and surface a same-relative-path file
|
|
473
|
+
// from the wrong namespace (#2020). Absolute paths self-identify above.
|
|
474
|
+
if (preferredAttempted && !nodePath.isAbsolute(memoryPath)) return null;
|
|
475
|
+
|
|
447
476
|
for (const candidate of qmdResultPathCandidates(storageDir, memoryPath)) {
|
|
448
477
|
const memory = await storage.readMemoryByPath(candidate);
|
|
449
478
|
if (memory) return { memory, baseDir: storageDir };
|
|
@@ -486,12 +515,17 @@ export class AccessRecallSurface {
|
|
|
486
515
|
);
|
|
487
516
|
const rawExcerpts = rawExcerptsResult ?? undefined;
|
|
488
517
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
const
|
|
518
|
+
const resultNamespaces = snapshot.resultNamespaces ?? [];
|
|
519
|
+
for (let index = 0; index < (snapshot.resultPaths ?? []).length; index += 1) {
|
|
520
|
+
const memoryPath = snapshot.resultPaths?.[index];
|
|
521
|
+
const memoryNamespace = resultNamespaces[index];
|
|
522
|
+
if (!memoryPath) continue;
|
|
523
|
+
const seenKey = `${memoryNamespace ?? ""}\0${memoryPath}`;
|
|
524
|
+
if (seen.has(seenKey)) continue;
|
|
525
|
+
const resolved = await readResultPath(memoryPath, memoryNamespace);
|
|
492
526
|
if (!resolved) continue;
|
|
493
527
|
const { memory, baseDir } = resolved;
|
|
494
|
-
seen.add(
|
|
528
|
+
seen.add(seenKey);
|
|
495
529
|
results.push(
|
|
496
530
|
this.deps.serializeMemorySummary(
|
|
497
531
|
memory,
|
|
@@ -619,6 +653,7 @@ export class AccessRecallSurface {
|
|
|
619
653
|
): Promise<{
|
|
620
654
|
response: EngramAccessRecallResponse;
|
|
621
655
|
budgetRecordPrincipal: string | null;
|
|
656
|
+
reservation?: BudgetReservation;
|
|
622
657
|
}> {
|
|
623
658
|
const query = request.query;
|
|
624
659
|
// Disclosure depth (issue #677). Default to `"chunk"` when omitted so
|
|
@@ -721,7 +756,7 @@ export class AccessRecallSurface {
|
|
|
721
756
|
: legacyRecallNamespaces;
|
|
722
757
|
const budgetPrincipalNamespace = profilePlan?.baseNamespace ?? principalNamespace;
|
|
723
758
|
let budgetDecision: BudgetDecision;
|
|
724
|
-
let
|
|
759
|
+
let willReserveBudget = false;
|
|
725
760
|
if (modeSkipsBudget) {
|
|
726
761
|
budgetDecision = {
|
|
727
762
|
allowed: true as const,
|
|
@@ -736,11 +771,11 @@ export class AccessRecallSurface {
|
|
|
736
771
|
} else {
|
|
737
772
|
// Peek at every effective namespace to determine whether ANY would be
|
|
738
773
|
// cross-namespace WITHOUT recording side effects (Cursor review:
|
|
739
|
-
// multi-count bug).
|
|
740
|
-
//
|
|
741
|
-
//
|
|
742
|
-
//
|
|
743
|
-
//
|
|
774
|
+
// multi-count bug). When cross-namespace, the actual reserve
|
|
775
|
+
// (budget.record) happens ATOMICALLY at admission just before the
|
|
776
|
+
// pipeline runs (issue #1906) — see the reserve+rollback block below —
|
|
777
|
+
// so concurrent recalls for one principal cannot each pass a stale peek
|
|
778
|
+
// and collectively overrun the hard limit.
|
|
744
779
|
let anyCrossNamespace = false;
|
|
745
780
|
let denied: BudgetDecision | null = null;
|
|
746
781
|
let crossNamespaceDecision: BudgetDecision | null = null;
|
|
@@ -774,7 +809,7 @@ export class AccessRecallSurface {
|
|
|
774
809
|
windowMs: this.deps.orchestrator.config.recallCrossNamespaceBudgetWindowMs ?? 60_000,
|
|
775
810
|
},
|
|
776
811
|
};
|
|
777
|
-
|
|
812
|
+
willReserveBudget = true;
|
|
778
813
|
} else {
|
|
779
814
|
budgetDecision = {
|
|
780
815
|
allowed: true as const,
|
|
@@ -825,249 +860,62 @@ export class AccessRecallSurface {
|
|
|
825
860
|
...(asOf !== undefined ? { asOf } : {}),
|
|
826
861
|
...(request.includeLowConfidence === true ? { includeLowConfidence: true } : {}),
|
|
827
862
|
...(request.abortSignal ? { abortSignal: request.abortSignal } : {}),
|
|
863
|
+
// Only surface a real wait: an uncontended recall (queueWaitMs 0) omits
|
|
864
|
+
// the field so recall-timings stays additive and byte-identical to the
|
|
865
|
+
// pre-#1906 uncontended path (acceptance: "record queueWaitMs ~0 or omit").
|
|
866
|
+
...(typeof request.queueWaitMs === "number" && request.queueWaitMs > 0
|
|
867
|
+
? { queueWaitMs: request.queueWaitMs }
|
|
868
|
+
: {}),
|
|
828
869
|
};
|
|
829
870
|
const startedAt = Date.now();
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
// disclosure both bypass the policy. Documented in
|
|
845
|
-
// `recall-disclosure-escalation.ts` and unit-tested there.
|
|
846
|
-
// Confidence-proxy denominator: priority order is
|
|
847
|
-
// 1. `snapshot.budgetsApplied.appliedTopK` (ALWAYS wins) — this is
|
|
848
|
-
// the limit the orchestrator actually applied after planner /
|
|
849
|
-
// minimal-mode / section-cap narrowing. Codex P1 rounds 2+3
|
|
850
|
-
// on #705 emphasize that even a caller's explicit `request.topK`
|
|
851
|
-
// is wrong when the orchestrator caps below it (e.g. topK=50
|
|
852
|
-
// but appliedTopK=3 makes a 2-hit recall actually 0.67, not
|
|
853
|
-
// 0.04).
|
|
854
|
-
// 2. The caller's explicit `topK` when the snapshot lacks
|
|
855
|
-
// `budgetsApplied` (early-return paths, error cases).
|
|
856
|
-
// 3. Config `qmdMaxResults` as a last-resort fallback.
|
|
857
|
-
// Floor at observed-results so the ratio stays in [0, 1] even if
|
|
858
|
-
// any of the signals drifts below the actual hit count.
|
|
859
|
-
const resultsReturned = snapshot?.memoryIds?.length ?? 0;
|
|
860
|
-
const appliedTopK = snapshot?.budgetsApplied?.appliedTopK;
|
|
861
|
-
const configMaxResults =
|
|
862
|
-
typeof this.deps.orchestrator.config.qmdMaxResults === "number" &&
|
|
863
|
-
Number.isFinite(this.deps.orchestrator.config.qmdMaxResults) &&
|
|
864
|
-
this.deps.orchestrator.config.qmdMaxResults > 0
|
|
865
|
-
? this.deps.orchestrator.config.qmdMaxResults
|
|
866
|
-
: 0;
|
|
867
|
-
const topKDenominator =
|
|
868
|
-
typeof appliedTopK === "number" &&
|
|
869
|
-
Number.isFinite(appliedTopK) &&
|
|
870
|
-
appliedTopK > 0
|
|
871
|
-
? Math.max(appliedTopK, resultsReturned)
|
|
872
|
-
: typeof topK === "number" && topK > 0
|
|
873
|
-
? Math.max(topK, resultsReturned)
|
|
874
|
-
: Math.max(configMaxResults, resultsReturned, 1);
|
|
875
|
-
// When the recall produced no snapshot (sessionless / namespace
|
|
876
|
-
// mismatch / early-return path), there is no confidence signal to
|
|
877
|
-
// base escalation on. Pass `undefined` so the helper takes its
|
|
878
|
-
// `no-top-k-confidence` branch instead of computing 0/N=0 and
|
|
879
|
-
// forcing auto-escalation on every sessionless caller (Codex P2
|
|
880
|
-
// review on PR #705).
|
|
881
|
-
const topKConfidence =
|
|
882
|
-
snapshot && topKDenominator > 0
|
|
883
|
-
? Math.min(1, resultsReturned / topKDenominator)
|
|
884
|
-
: undefined;
|
|
885
|
-
const escalationDecision = decideDisclosureEscalation({
|
|
886
|
-
mode: this.deps.orchestrator.config.recallDisclosureEscalation,
|
|
887
|
-
threshold: this.deps.orchestrator.config.recallDisclosureEscalationThreshold,
|
|
888
|
-
originalDisclosure: requestedDisclosure,
|
|
889
|
-
callerProvidedDisclosure,
|
|
890
|
-
topKConfidence,
|
|
891
|
-
});
|
|
892
|
-
const disclosure = escalationDecision.effective;
|
|
893
|
-
// Gate the raw-excerpt LCM read with the SAME read-authorization namespace
|
|
894
|
-
// `lcmSearch` + the in-prompt LCM sections use (#1505 thread 2f7), so
|
|
895
|
-
// `disclosure: "raw"` never attaches `<principal>-project-*` overlay rows
|
|
896
|
-
// when the principal can WRITE but not READ its self base (or
|
|
897
|
-
// `defaultRecallNamespaces` omits `self`). Computed ONLY for raw disclosure:
|
|
898
|
-
// it is the sole consumer, and resolving the overlay on every chunk/section
|
|
899
|
-
// recall would be wasted work — keeping non-raw recall byte-for-byte
|
|
900
|
-
// unchanged.
|
|
901
|
-
// Trim the sessionKey to match what `orchestrator.recall(...)` already does
|
|
902
|
-
// (`request.sessionKey?.trim() || undefined`) and what the x-ray raw-excerpt
|
|
903
|
-
// path uses (cursor "Raw excerpt key not trimmed"). A whitespace-padded key
|
|
904
|
-
// otherwise drives recall under one identity but resolves the raw-excerpt
|
|
905
|
-
// overlay namespace + LCM `session_id` under a DIFFERENT (untrimmed) prefix,
|
|
906
|
-
// so excerpts are gated/queried inconsistently with recall and the x-ray path.
|
|
907
|
-
const trimmedSessionKey = request.sessionKey?.trim() || undefined;
|
|
908
|
-
const rawExcerptNamespace =
|
|
909
|
-
disclosure === "raw"
|
|
910
|
-
? this.deps.resolveRawExcerptReadNamespace(
|
|
911
|
-
request.namespace,
|
|
912
|
-
trimmedSessionKey,
|
|
913
|
-
authenticatedPrincipal,
|
|
914
|
-
)
|
|
915
|
-
: undefined;
|
|
916
|
-
// `undefined` for an IMPLICIT raw recall means NO readable LCM namespace
|
|
917
|
-
// exists (restrictive `default` READ policy, no readable overlay/self) —
|
|
918
|
-
// suppress excerpts rather than fall back to the write/overlay namespace the
|
|
919
|
-
// read gate excludes (#1505 thread NBHWz). An EXPLICIT namespace always
|
|
920
|
-
// resolves (or throws) above, so suppression only applies to the implicit
|
|
921
|
-
// path.
|
|
922
|
-
const hasExplicitNamespace =
|
|
923
|
-
typeof request.namespace === "string" &&
|
|
924
|
-
request.namespace.trim().length > 0;
|
|
925
|
-
const rawExcerptsSuppressed =
|
|
926
|
-
disclosure === "raw" &&
|
|
927
|
-
!hasExplicitNamespace &&
|
|
928
|
-
rawExcerptNamespace === undefined;
|
|
929
|
-
// Ordered, read-authorized LCM read key SET (#1505 fallback unification) so
|
|
930
|
-
// raw disclosure finds excerpts a branch-scoped session archived at
|
|
931
|
-
// project/root scope — exactly as recall + `lcmSearch` do. Only with a
|
|
932
|
-
// concrete sessionKey; already read-gated.
|
|
933
|
-
const rawExcerptSessionIds =
|
|
934
|
-
disclosure === "raw" && rawExcerptNamespace && trimmedSessionKey
|
|
935
|
-
? this.deps.resolveLcmReadSessionIds(
|
|
936
|
-
request.namespace,
|
|
937
|
-
rawExcerptNamespace,
|
|
938
|
-
trimmedSessionKey,
|
|
939
|
-
authenticatedPrincipal,
|
|
940
|
-
)
|
|
941
|
-
: undefined;
|
|
942
|
-
let results = await this.deps.serializeRecallResults(snapshot, disclosure, {
|
|
943
|
-
query,
|
|
944
|
-
sessionKey: trimmedSessionKey,
|
|
945
|
-
...(rawExcerptNamespace ? { rawExcerptNamespace } : {}),
|
|
946
|
-
...(rawExcerptSessionIds !== undefined ? { rawExcerptSessionIds } : {}),
|
|
947
|
-
...(rawExcerptsSuppressed ? { rawExcerptsSuppressed } : {}),
|
|
948
|
-
});
|
|
949
|
-
|
|
950
|
-
// Tag filter (issue #689). Applied post-recall, post-serialization so
|
|
951
|
-
// the actual frontmatter tags are already loaded onto each result. When
|
|
952
|
-
// `tags` is absent or empty the filter is a no-op; an invalid `tagMatch`
|
|
953
|
-
// throws via `parseTagMatch` (CLAUDE.md rule 51).
|
|
954
|
-
const filterTags = normalizeTags(request.tags);
|
|
955
|
-
let tagMatchMode: TagMatchMode | undefined;
|
|
956
|
-
try {
|
|
957
|
-
tagMatchMode = parseTagMatch(request.tagMatch);
|
|
958
|
-
} catch (err) {
|
|
959
|
-
throw new EngramAccessInputError(
|
|
960
|
-
err instanceof Error ? err.message : String(err),
|
|
961
|
-
);
|
|
962
|
-
}
|
|
963
|
-
let effectiveContext = context;
|
|
964
|
-
if (filterTags && filterTags.length > 0) {
|
|
965
|
-
const beforeIds = results.map((r) => r.id);
|
|
966
|
-
const { results: admitted } = applyTagFilter(results, {
|
|
967
|
-
tags: filterTags,
|
|
968
|
-
tagMatch: tagMatchMode,
|
|
969
|
-
});
|
|
970
|
-
results = admitted;
|
|
971
|
-
// Codex P1: `context` was generated by orchestrator.recall(...)
|
|
972
|
-
// BEFORE the tag filter ran, so it can contain memories that don't
|
|
973
|
-
// match the requested tags. Surfaces consuming `context` (the
|
|
974
|
-
// prompt-injection string) would leak excluded content into the
|
|
975
|
-
// LLM. When the filter actually drops any result, rebuild context
|
|
976
|
-
// from the admitted set so excluded content is unreachable through
|
|
977
|
-
// any field of the response. The rebuilt context concatenates each
|
|
978
|
-
// admitted result's available text (full content at section/raw
|
|
979
|
-
// disclosure, otherwise the preview) — a different wire format
|
|
980
|
-
// than the orchestrator's native context, but a strict subset
|
|
981
|
-
// safe to inject.
|
|
982
|
-
const admittedIds = new Set(results.map((r) => r.id));
|
|
983
|
-
const droppedAny = beforeIds.some((id) => !admittedIds.has(id));
|
|
984
|
-
if (droppedAny) {
|
|
985
|
-
effectiveContext = results
|
|
986
|
-
.map((r) => {
|
|
987
|
-
const content =
|
|
988
|
-
typeof (r as { content?: unknown }).content === "string"
|
|
989
|
-
? ((r as { content?: string }).content ?? "")
|
|
990
|
-
: "";
|
|
991
|
-
const preview =
|
|
992
|
-
typeof (r as { preview?: unknown }).preview === "string"
|
|
993
|
-
? ((r as { preview?: string }).preview ?? "")
|
|
994
|
-
: "";
|
|
995
|
-
return content || preview;
|
|
996
|
-
})
|
|
997
|
-
.filter((s) => s.length > 0)
|
|
998
|
-
.join("\n\n");
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
const filteredMemoryIds = filterTags && filterTags.length > 0
|
|
1002
|
-
? results.map((r) => r.id)
|
|
1003
|
-
: (snapshot?.memoryIds ?? []);
|
|
1004
|
-
const debug = await this.deps.buildRecallDebug(
|
|
1005
|
-
snapshot,
|
|
1006
|
-
effectiveNamespace,
|
|
1007
|
-
request.includeDebug === true,
|
|
1008
|
-
request.sessionKey,
|
|
1009
|
-
);
|
|
1010
|
-
|
|
1011
|
-
// Fire-and-forget audit recording. Must never block or crash recall.
|
|
1012
|
-
let auditAnomalies: AccessAuditResult["anomalies"] | undefined;
|
|
1013
|
-
if (this.deps.auditAdapter) {
|
|
1014
|
-
try {
|
|
1015
|
-
const resolvedAgentId = principal ?? "__anonymous__";
|
|
1016
|
-
const auditEntry = {
|
|
1017
|
-
ts: new Date().toISOString(),
|
|
1018
|
-
sessionKey: request.sessionKey ?? "",
|
|
1019
|
-
agentId: resolvedAgentId,
|
|
1020
|
-
trigger: "access-surface",
|
|
1021
|
-
queryText: query,
|
|
1022
|
-
candidateMemoryIds: snapshot?.memoryIds ?? [],
|
|
1023
|
-
// Audit must reflect what was actually injected, not what
|
|
1024
|
-
// recall produced before the tag filter. Using `context`
|
|
1025
|
-
// (pre-filter) overstates injectedChars and can leak content
|
|
1026
|
-
// from excluded memories into the audit summary (cursor
|
|
1027
|
-
// Medium on PR #712).
|
|
1028
|
-
summary: effectiveContext.slice(0, 200) || null,
|
|
1029
|
-
injectedChars: effectiveContext.length,
|
|
1030
|
-
toggleState: "enabled" as const,
|
|
1031
|
-
latencyMs: Date.now() - startedAt,
|
|
1032
|
-
plannerMode: snapshot?.plannerMode ?? mode,
|
|
1033
|
-
requestedMode: mode,
|
|
1034
|
-
fallbackUsed: snapshot?.fallbackUsed ?? false,
|
|
1035
|
-
};
|
|
1036
|
-
const auditResult = await this.deps.auditAdapter.record(
|
|
1037
|
-
resolvedAgentId || "__anonymous__",
|
|
1038
|
-
auditEntry,
|
|
871
|
+
// #1906 atomic budget admission: the peek loop above and this record are
|
|
872
|
+
// one synchronous JS turn (no await between them), so record()'s own
|
|
873
|
+
// atomic project-and-push denies the Nth concurrent cross-namespace recall
|
|
874
|
+
// for a principal BEFORE its pipeline runs — no over-admission. On a
|
|
875
|
+
// pipeline failure/abort the reservation is rolled back (budget.release)
|
|
876
|
+
// so an errored recall does not consume budget permanently.
|
|
877
|
+
let reservedBudgetPrincipal: string | null = null;
|
|
878
|
+
let reservedBudget: BudgetReservation | undefined;
|
|
879
|
+
if (willReserveBudget) {
|
|
880
|
+
const reserveDecision = this.deps.budget.record(principal);
|
|
881
|
+
budgetDecision = reserveDecision;
|
|
882
|
+
if (!reserveDecision.allowed) {
|
|
883
|
+
throw new EngramAccessInputError(
|
|
884
|
+
`recall denied: cross-namespace budget exceeded (${reserveDecision.count}/${reserveDecision.limit.hardLimit} in ${reserveDecision.limit.windowMs}ms window)`,
|
|
1039
885
|
);
|
|
1040
|
-
auditAnomalies = auditResult.anomalies;
|
|
1041
|
-
} catch {
|
|
1042
|
-
// Audit failures must never crash the recall path.
|
|
1043
886
|
}
|
|
887
|
+
reservedBudgetPrincipal = principal;
|
|
888
|
+
reservedBudget = reserveDecision.reservation;
|
|
1044
889
|
}
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
890
|
+
// #1906 review #5: the rollback covers the ENTIRE post-reservation
|
|
891
|
+
// operation — orchestrator.recall AND serialization / debug / response
|
|
892
|
+
// construction — so ANY failure after the reserve releases the exact
|
|
893
|
+
// budget entry (by token, review #4) instead of leaking it.
|
|
894
|
+
try {
|
|
895
|
+
const context = await this.deps.orchestrator.recall(query, request.sessionKey, recallOptions);
|
|
896
|
+
const assembled = await assembleRecallResponse(this.deps, {
|
|
897
|
+
request,
|
|
898
|
+
context,
|
|
1048
899
|
query,
|
|
1049
|
-
|
|
1050
|
-
namespace
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
},
|
|
1069
|
-
budgetRecordPrincipal: recordBudgetAfterSuccess ? principal : null,
|
|
1070
|
-
};
|
|
900
|
+
mode,
|
|
901
|
+
namespace,
|
|
902
|
+
requestedDisclosure,
|
|
903
|
+
callerProvidedDisclosure,
|
|
904
|
+
topK,
|
|
905
|
+
principal,
|
|
906
|
+
authenticatedPrincipal,
|
|
907
|
+
startedAt,
|
|
908
|
+
budgetDecision,
|
|
909
|
+
budgetRecordPrincipal: reservedBudgetPrincipal,
|
|
910
|
+
});
|
|
911
|
+
// Expose the reservation token so a consumer that fails AFTER this
|
|
912
|
+
// returns (response clone, idempotency put) can release the exact entry
|
|
913
|
+
// (#1906 review round 3, findings #1/#3).
|
|
914
|
+
return { ...assembled, reservation: reservedBudget };
|
|
915
|
+
} catch (err) {
|
|
916
|
+
if (reservedBudget) this.deps.budget.release(reservedBudget);
|
|
917
|
+
throw err;
|
|
918
|
+
}
|
|
1071
919
|
}
|
|
1072
920
|
|
|
1073
921
|
/**
|
|
@@ -31,6 +31,24 @@ import {
|
|
|
31
31
|
projectTagProjectId,
|
|
32
32
|
} from "./coding/coding-namespace.js";
|
|
33
33
|
import type { CodingContext, PluginConfig } from "./types.js";
|
|
34
|
+
import { sealedWriteToLegacyArgs, type SealedMemoryEnvelope } from "./write-envelope.js";
|
|
35
|
+
|
|
36
|
+
// Sealed-write stub fidelity (issue #1989 PR2; AGENTS.md §21): production
|
|
37
|
+
// callers now write via `writeSealedMemory`. Test doubles keep stubbing
|
|
38
|
+
// `writeMemory`; this decorator adds a sealed entry that delegates through
|
|
39
|
+
// the PRODUCTION mapping (`sealedWriteToLegacyArgs`), so mock behavior
|
|
40
|
+
// cannot drift from the real envelope→options translation.
|
|
41
|
+
function withSealedWrite<T extends { writeMemory: (...args: never[]) => unknown }>(stub: T): T {
|
|
42
|
+
const decorated = stub as T & {
|
|
43
|
+
writeSealedMemory?: (envelope: SealedMemoryEnvelope, extras?: Record<string, unknown>) => unknown;
|
|
44
|
+
};
|
|
45
|
+
decorated.writeSealedMemory = (envelope, extras = {}) => {
|
|
46
|
+
const { category, content, options } = sealedWriteToLegacyArgs(envelope, extras);
|
|
47
|
+
return (stub.writeMemory as (c: unknown, b: unknown, o: unknown) => unknown)(category, content, options);
|
|
48
|
+
};
|
|
49
|
+
return decorated;
|
|
50
|
+
}
|
|
51
|
+
|
|
34
52
|
|
|
35
53
|
function makeOrchestratorStub(overrides: Partial<PluginConfig> = {}): Orchestrator {
|
|
36
54
|
const orch = Object.create(Orchestrator.prototype) as Orchestrator;
|
|
@@ -336,11 +354,11 @@ function makeAttachOrchestrator() {
|
|
|
336
354
|
},
|
|
337
355
|
getStorage: async (ns?: string) => {
|
|
338
356
|
getStorageCalls.push(ns);
|
|
339
|
-
return {
|
|
357
|
+
return withSealedWrite({
|
|
340
358
|
readAllMemories: async () => [],
|
|
341
359
|
writeMemory: async () => ({ id: "mem-1", tombstoneBlocked: false }),
|
|
342
360
|
appendMemoryLifecycleEvents: async () => {},
|
|
343
|
-
};
|
|
361
|
+
});
|
|
344
362
|
},
|
|
345
363
|
} as unknown as Orchestrator;
|
|
346
364
|
return { orch, contexts, getStorageCalls };
|
|
@@ -431,11 +449,11 @@ function makePersistOrchestrator() {
|
|
|
431
449
|
},
|
|
432
450
|
getStorage: async (ns?: string) => {
|
|
433
451
|
getStorageCalls.push(ns);
|
|
434
|
-
return {
|
|
452
|
+
return withSealedWrite({
|
|
435
453
|
readAllMemories: async () => [],
|
|
436
454
|
writeMemory: async () => ({ id: "mem-1", tombstoneBlocked: false }),
|
|
437
455
|
appendMemoryLifecycleEvents: async () => {},
|
|
438
|
-
};
|
|
456
|
+
});
|
|
439
457
|
},
|
|
440
458
|
} as unknown as Orchestrator;
|
|
441
459
|
return { orch, getStorageCalls };
|
|
@@ -99,12 +99,61 @@ test("health reports active QMD version and collection state", async () => {
|
|
|
99
99
|
upgradeAvailable: false,
|
|
100
100
|
doctorAvailable: true,
|
|
101
101
|
debugStatus: "cli=true daemon=false cliPath=qmd cliVersion=qmd 2.5.3",
|
|
102
|
+
pendingEmbeddings: null,
|
|
103
|
+
oldestPendingAgeMs: null,
|
|
104
|
+
embeddingBacklogThreshold: 1000,
|
|
102
105
|
});
|
|
103
106
|
} finally {
|
|
104
107
|
await rm(memoryDir, { recursive: true, force: true });
|
|
105
108
|
}
|
|
106
109
|
});
|
|
107
110
|
|
|
111
|
+
test("health treats qmdEmbeddingBacklogThreshold 0 as backlog degradation disabled", async () => {
|
|
112
|
+
const config = parseConfig({ qmdEnabled: true, qmdEmbeddingBacklogThreshold: 0 });
|
|
113
|
+
const qmd = makeQmd({
|
|
114
|
+
probe: async () => true,
|
|
115
|
+
isAvailable: () => true,
|
|
116
|
+
checkCollection: async () => "present",
|
|
117
|
+
status: async () => ({ pendingEmbeddings: 42, oldestPendingAgeMs: 90_000, totalFiles: 100, embeddedFiles: 58 }),
|
|
118
|
+
});
|
|
119
|
+
const service = new EngramAccessService({
|
|
120
|
+
config,
|
|
121
|
+
qmd,
|
|
122
|
+
async getStorage() {
|
|
123
|
+
return { dir: path.join(os.tmpdir(), "remnic-health-mock") };
|
|
124
|
+
},
|
|
125
|
+
} as unknown as Orchestrator);
|
|
126
|
+
|
|
127
|
+
const health = await service.health();
|
|
128
|
+
assert.equal(health.qmd?.degraded, false);
|
|
129
|
+
assert.equal(health.qmd?.degradedReason, undefined);
|
|
130
|
+
assert.equal(health.qmd?.pendingEmbeddings, 42);
|
|
131
|
+
assert.equal(health.qmd?.embeddingBacklogThreshold, 0);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("health marks QMD degraded when pending embeddings exceed a positive threshold", async () => {
|
|
135
|
+
const config = parseConfig({ qmdEnabled: true, qmdEmbeddingBacklogThreshold: 10 });
|
|
136
|
+
const qmd = makeQmd({
|
|
137
|
+
probe: async () => true,
|
|
138
|
+
isAvailable: () => true,
|
|
139
|
+
checkCollection: async () => "present",
|
|
140
|
+
status: async () => ({ pendingEmbeddings: 42, oldestPendingAgeMs: 90_000, totalFiles: 100, embeddedFiles: 58 }),
|
|
141
|
+
});
|
|
142
|
+
const service = new EngramAccessService({
|
|
143
|
+
config,
|
|
144
|
+
qmd,
|
|
145
|
+
async getStorage() {
|
|
146
|
+
return { dir: path.join(os.tmpdir(), "remnic-health-mock") };
|
|
147
|
+
},
|
|
148
|
+
} as unknown as Orchestrator);
|
|
149
|
+
|
|
150
|
+
const health = await service.health();
|
|
151
|
+
assert.equal(health.qmd?.degraded, true);
|
|
152
|
+
assert.match(health.qmd?.degradedReason ?? "", /embedding-backlog/);
|
|
153
|
+
assert.equal(health.qmd?.pendingEmbeddings, 42);
|
|
154
|
+
assert.equal(health.qmd?.embeddingBacklogThreshold, 10);
|
|
155
|
+
});
|
|
156
|
+
|
|
108
157
|
test("health marks QMD as degraded when configured search falls back to noop", async () => {
|
|
109
158
|
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-health-qmd-degraded-"));
|
|
110
159
|
try {
|