@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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD status parsing and backlog reporting helpers.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from qmd.ts to keep that module under its structural ceiling.
|
|
5
|
+
* Issue #2019: expose embedding backlog metrics in health and CLI surfaces.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface QmdStatusReport {
|
|
9
|
+
totalFiles: number | null;
|
|
10
|
+
embeddedFiles: number | null;
|
|
11
|
+
pendingEmbeddings: number | null;
|
|
12
|
+
/** Age in ms of the oldest file still pending embedding, or null if unavailable. */
|
|
13
|
+
oldestPendingAgeMs: number | null;
|
|
14
|
+
/** Raw text output from `qmd status` for debugging. */
|
|
15
|
+
raw: string;
|
|
16
|
+
/** Error message when the status command fails, if any. */
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Minimal interface for backends that expose QMD status. */
|
|
21
|
+
export interface QmdStatusCapable {
|
|
22
|
+
status(): Promise<QmdStatusReport>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Parse `qmd status -c <collection>` text output into structured metrics.
|
|
27
|
+
* Handles formats like:
|
|
28
|
+
* Total files: 200129
|
|
29
|
+
* Embedded: 189091 (94.5%)
|
|
30
|
+
* Pending embedding: 108186
|
|
31
|
+
* Returns null fields for unparseable or missing lines.
|
|
32
|
+
*/
|
|
33
|
+
function parseLeadingInt(s: string): number | null {
|
|
34
|
+
let digits = "";
|
|
35
|
+
for (const ch of s) {
|
|
36
|
+
if (ch >= "0" && ch <= "9") digits += ch;
|
|
37
|
+
else if (ch === "," && digits.length > 0) continue;
|
|
38
|
+
else break;
|
|
39
|
+
}
|
|
40
|
+
return digits.length > 0 ? Number.parseInt(digits, 10) : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function parseLeadingDurationMs(s: string): number | null {
|
|
44
|
+
let digits = "";
|
|
45
|
+
let i = 0;
|
|
46
|
+
for (; i < s.length; i++) {
|
|
47
|
+
if (s[i] >= "0" && s[i] <= "9") digits += s[i];
|
|
48
|
+
else break;
|
|
49
|
+
}
|
|
50
|
+
if (digits.length === 0) return null;
|
|
51
|
+
const val = Number.parseInt(digits, 10);
|
|
52
|
+
const unit = s.slice(i).trim();
|
|
53
|
+
if (unit === "ms") return val;
|
|
54
|
+
if (unit === "s") return val * 1000;
|
|
55
|
+
if (unit === "m") return val * 60_000;
|
|
56
|
+
if (unit === "h") return val * 3_600_000;
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function parseQmdStatusOutput(stdout: string): QmdStatusReport {
|
|
61
|
+
const raw = stdout;
|
|
62
|
+
let totalFiles: number | null = null;
|
|
63
|
+
let embeddedFiles: number | null = null;
|
|
64
|
+
let pendingEmbeddings: number | null = null;
|
|
65
|
+
let oldestPendingAgeMs: number | null = null;
|
|
66
|
+
|
|
67
|
+
for (const rawLine of stdout.split("\n")) {
|
|
68
|
+
const line = rawLine.trim().toLowerCase();
|
|
69
|
+
const colonIdx = line.indexOf(":");
|
|
70
|
+
if (colonIdx === -1) continue;
|
|
71
|
+
const key = line.slice(0, colonIdx).trim();
|
|
72
|
+
const value = line.slice(colonIdx + 1).trim();
|
|
73
|
+
|
|
74
|
+
if (key === "total" || key === "total files" || key === "total file") {
|
|
75
|
+
totalFiles = parseLeadingInt(value);
|
|
76
|
+
} else if (key === "vectors" || key === "embedded") {
|
|
77
|
+
embeddedFiles = parseLeadingInt(value);
|
|
78
|
+
} else if (key === "oldest pending") {
|
|
79
|
+
oldestPendingAgeMs = parseLeadingDurationMs(value);
|
|
80
|
+
} else if (key.startsWith("pending")) {
|
|
81
|
+
pendingEmbeddings = parseLeadingInt(value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return { totalFiles, embeddedFiles, pendingEmbeddings, oldestPendingAgeMs, raw };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Empty status report returned when QMD is unavailable or the command fails. */
|
|
89
|
+
export const EMPTY_QMD_STATUS: QmdStatusReport = {
|
|
90
|
+
totalFiles: null,
|
|
91
|
+
embeddedFiles: null,
|
|
92
|
+
pendingEmbeddings: null,
|
|
93
|
+
oldestPendingAgeMs: null,
|
|
94
|
+
raw: "",
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Format backlog lines from a pre-resolved status report.
|
|
99
|
+
* Returns display strings for CLI output; empty array when unavailable.
|
|
100
|
+
*/
|
|
101
|
+
export function formatBacklogLinesFromReport(
|
|
102
|
+
report: QmdStatusReport | null | undefined,
|
|
103
|
+
threshold: number,
|
|
104
|
+
): string[] {
|
|
105
|
+
if (!report) return [];
|
|
106
|
+
const lines: string[] = [];
|
|
107
|
+
|
|
108
|
+
if (report.pendingEmbeddings != null) {
|
|
109
|
+
lines.push(` Pending embeddings: ${report.pendingEmbeddings}`);
|
|
110
|
+
if (threshold > 0 && report.pendingEmbeddings > threshold) {
|
|
111
|
+
lines.push(` ⚠ Embedding backlog exceeds threshold (${threshold}) — degraded`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (report.oldestPendingAgeMs != null) {
|
|
116
|
+
const ageMin = Math.round(report.oldestPendingAgeMs / 60_000);
|
|
117
|
+
lines.push(` Oldest pending: ${ageMin}m`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return lines;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Fetch QMD status and format backlog lines for CLI output.
|
|
125
|
+
* Returns empty array when the backend lacks status() or the call fails.
|
|
126
|
+
*/
|
|
127
|
+
export async function renderQmdBacklogStatus(
|
|
128
|
+
qmd: unknown,
|
|
129
|
+
threshold: number,
|
|
130
|
+
): Promise<string[]> {
|
|
131
|
+
const backend = qmd as Partial<QmdStatusCapable> | null;
|
|
132
|
+
if (!backend || typeof backend.status !== "function") return [];
|
|
133
|
+
try {
|
|
134
|
+
const report = await Promise.race([
|
|
135
|
+
backend.status(),
|
|
136
|
+
new Promise<null>((resolve) => setTimeout(() => resolve(null), 5_000).unref?.()),
|
|
137
|
+
]);
|
|
138
|
+
if (!report) return [];
|
|
139
|
+
return formatBacklogLinesFromReport(report, threshold);
|
|
140
|
+
} catch {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export type QmdCommandRunner = (args: string[], timeoutMs: number) => Promise<{ stdout: string; stderr: string }>;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Fetch QMD collection status via the `qmd status` command. Returns an
|
|
149
|
+
* unavailable report (with `error` set) when the command fails.
|
|
150
|
+
*/
|
|
151
|
+
export async function fetchQmdStatus(
|
|
152
|
+
runQmdCommand: QmdCommandRunner,
|
|
153
|
+
collection: string,
|
|
154
|
+
timeoutMs: number,
|
|
155
|
+
): Promise<QmdStatusReport> {
|
|
156
|
+
try {
|
|
157
|
+
const { stdout } = await runQmdCommand(["status", "-c", collection], timeoutMs);
|
|
158
|
+
return parseQmdStatusOutput(stdout);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
return { ...EMPTY_QMD_STATUS, error: error instanceof Error ? error.message : String(error) };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Trigger a collection-level embed run via `qmd embed -c <collection>`.
|
|
166
|
+
* The QMD CLI does not support per-file embed targeting; this triggers
|
|
167
|
+
* embedding for all pending files in the collection. The prioritized-embed
|
|
168
|
+
* module debounces and batches these triggers so fresh writes become
|
|
169
|
+
* searchable within minutes without hammering the CLI on every write.
|
|
170
|
+
* Returns `{ ok: false }` on failure so callers can reschedule without crashing.
|
|
171
|
+
*/
|
|
172
|
+
export async function embedQmdFiles(
|
|
173
|
+
runQmdCommand: QmdCommandRunner,
|
|
174
|
+
collection: string,
|
|
175
|
+
_filePaths: string[],
|
|
176
|
+
timeoutMs: number,
|
|
177
|
+
embedArgs?: string[],
|
|
178
|
+
): Promise<{ ok: boolean; error?: string }> {
|
|
179
|
+
try {
|
|
180
|
+
await runQmdCommand(["update", "-c", collection], timeoutMs);
|
|
181
|
+
await runQmdCommand(embedArgs ?? ["embed", "-c", collection], timeoutMs);
|
|
182
|
+
return { ok: true };
|
|
183
|
+
} catch (error) {
|
|
184
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
185
|
+
}
|
|
186
|
+
}
|
package/src/qmd.ts
CHANGED
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
versionAtLeast,
|
|
34
34
|
type QmdProbeFailureKind,
|
|
35
35
|
} from "./qmd-preflight.js";
|
|
36
|
+
import { fetchQmdStatus, embedQmdFiles, EMPTY_QMD_STATUS, type QmdStatusReport } from "./qmd-status.js";
|
|
36
37
|
// Re-export version-check / probe-preflight helpers (moved to qmd-preflight.ts,
|
|
37
38
|
// issue #1841) so existing imports from "./qmd.js" keep resolving.
|
|
38
39
|
export {
|
|
@@ -149,16 +150,13 @@ export interface QmdDoctorReport {
|
|
|
149
150
|
error?: string;
|
|
150
151
|
}
|
|
151
152
|
|
|
153
|
+
export { parseQmdStatusOutput } from "./qmd-status.js";
|
|
154
|
+
export type { QmdStatusReport } from "./qmd-status.js";
|
|
155
|
+
|
|
152
156
|
const QMD_TIMEOUT_MS = 30_000;
|
|
153
|
-
// Daemon timeout for
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
// During the loading window, searches will timeout/return [] quickly — this is preferable to
|
|
157
|
-
// blocking the full 75s on every recall request.
|
|
158
|
-
// Note: keep this ≥ 5s to allow normal searches (post-load) to complete reliably.
|
|
159
|
-
// This is the DEFAULT only — operators can override per-client via the
|
|
160
|
-
// `qmdDaemonTimeoutMs` config knob (issue #1335), e.g. to give CPU-only HyDE
|
|
161
|
-
// queries more headroom. The effective value lives in `this.daemonTimeoutMs`.
|
|
157
|
+
// Daemon timeout for search calls. Keep under RECALL_TIMEOUT_MS (75s) so a slow
|
|
158
|
+
// daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335).
|
|
159
|
+
// Keep ≥ 5s for normal post-load searches to complete reliably.
|
|
162
160
|
const QMD_DAEMON_TIMEOUT_MS = 8_000;
|
|
163
161
|
const QMD_UPDATE_BACKOFF_MS = 15 * 60 * 1000; // 15m
|
|
164
162
|
const QMD_EMBED_BACKOFF_MS = 60 * 60 * 1000; // 60m
|
|
@@ -687,10 +685,7 @@ class QmdDaemonSession {
|
|
|
687
685
|
return this.startPromise;
|
|
688
686
|
}
|
|
689
687
|
this.startPromise = (async () => {
|
|
690
|
-
//
|
|
691
|
-
// loading its index after a previous handshake timeout), reuse it instead of
|
|
692
|
-
// killing and re-spawning. This prevents accumulating zombie qmd-mcp processes
|
|
693
|
-
// when the daemon takes >15s to load a large collection.
|
|
688
|
+
// Reuse already-running uninitialized process to avoid zombie accumulation.
|
|
694
689
|
const processAlreadyRunning = this.child != null && !this.child.killed;
|
|
695
690
|
if (!processAlreadyRunning) {
|
|
696
691
|
if (this.child) {
|
|
@@ -715,10 +710,7 @@ class QmdDaemonSession {
|
|
|
715
710
|
if (msg) log.debug(`QMD mcp stderr: ${stripControlChars(msg)}`);
|
|
716
711
|
});
|
|
717
712
|
child.stdin?.on("error", (err) => {
|
|
718
|
-
// Swallow EPIPE/ERR_STREAM_DESTROYED
|
|
719
|
-
// process is killed (e.g. due to recall timeout) and a write arrives
|
|
720
|
-
// after the pipe is broken. Without this handler Node.js would throw
|
|
721
|
-
// an uncaught exception and crash the process.
|
|
713
|
+
// Swallow EPIPE/ERR_STREAM_DESTROYED from killed child processes.
|
|
722
714
|
log.debug(`QMD mcp stdin error (suppressed): ${err.message}`);
|
|
723
715
|
});
|
|
724
716
|
child.on("error", (err) => {
|
|
@@ -1328,12 +1320,8 @@ export class QmdClient implements SearchBackend {
|
|
|
1328
1320
|
this.daemonSessionPath = daemonSessionPath;
|
|
1329
1321
|
}
|
|
1330
1322
|
try {
|
|
1331
|
-
// Race start() against a short window:
|
|
1332
|
-
//
|
|
1333
|
-
// fast and let the caller fall back gracefully. The underlying start() promise
|
|
1334
|
-
// continues running in the background so the process is NOT killed. On the
|
|
1335
|
-
// next recheck cycle (daemonRecheckIntervalMs=15s) start() returns true
|
|
1336
|
-
// immediately once the handshake has completed.
|
|
1323
|
+
// Race start() against a short window: fail fast if still loading; the
|
|
1324
|
+
// underlying promise continues so the process is NOT killed.
|
|
1337
1325
|
const PROBE_QUICK_TIMEOUT_MS = 3_000;
|
|
1338
1326
|
const ok = await Promise.race([
|
|
1339
1327
|
this.daemonSession.start(),
|
|
@@ -1422,10 +1410,7 @@ export class QmdClient implements SearchBackend {
|
|
|
1422
1410
|
|
|
1423
1411
|
if (this.configuredQmdPath) {
|
|
1424
1412
|
const configuredPath = this.configuredQmdPath;
|
|
1425
|
-
// Retry only
|
|
1426
|
-
// binary that resolved and ran before is more likely slow under load than
|
|
1427
|
-
// gone. ENOENT/EACCES is a hard misconfiguration and must fail fast.
|
|
1428
|
-
// Issue #1841.
|
|
1413
|
+
// Retry only transient probes; ENOENT/EACCES is a hard misconfiguration (#1841).
|
|
1429
1414
|
let failureKind: QmdProbeFailureKind = "other";
|
|
1430
1415
|
let retries = 0;
|
|
1431
1416
|
let callerCancelled = false;
|
|
@@ -1437,10 +1422,7 @@ export class QmdClient implements SearchBackend {
|
|
|
1437
1422
|
} catch (err) {
|
|
1438
1423
|
markProbeFailure(err);
|
|
1439
1424
|
configuredProbeFailure = this.lastCliProbeError;
|
|
1440
|
-
// Detect
|
|
1441
|
-
// non-actionable noise — the caller chose to stop. Other QMD paths
|
|
1442
|
-
// treat it via `isCallerCancellation`; do the same here so a cancelled
|
|
1443
|
-
// probe never reads as a transient host-load failure. Issue #1841.
|
|
1425
|
+
// Detect caller cancellation first — non-actionable noise (#1841).
|
|
1444
1426
|
if (isCallerCancellation(err, options.signal)) {
|
|
1445
1427
|
callerCancelled = true;
|
|
1446
1428
|
break;
|
|
@@ -1468,11 +1450,7 @@ export class QmdClient implements SearchBackend {
|
|
|
1468
1450
|
break;
|
|
1469
1451
|
}
|
|
1470
1452
|
}
|
|
1471
|
-
// Distinct
|
|
1472
|
-
// a misconfiguration (and vice versa). Do not hard-fail here: fall through
|
|
1473
|
-
// to PATH/fallback probing so recall stays healthy when config is stale.
|
|
1474
|
-
// Caller cancellation is silent noise (issue #1841): suppress all warnings
|
|
1475
|
-
// for it exactly as the other QMD paths do.
|
|
1453
|
+
// Distinct warnings for slow binary vs misconfiguration; suppress on caller cancellation (#1841).
|
|
1476
1454
|
if (!callerCancelled) {
|
|
1477
1455
|
if (failureKind === "transient") {
|
|
1478
1456
|
this.logCliProbeWarning(
|
|
@@ -1736,6 +1714,21 @@ export class QmdClient implements SearchBackend {
|
|
|
1736
1714
|
}
|
|
1737
1715
|
}
|
|
1738
1716
|
|
|
1717
|
+
/**
|
|
1718
|
+
* Query QMD collection status for embedding backlog metrics.
|
|
1719
|
+
* Runs `qmd status -c <collection>` and parses the text output.
|
|
1720
|
+
* Returns null fields when the command fails or output is unparseable.
|
|
1721
|
+
*/
|
|
1722
|
+
async status(): Promise<QmdStatusReport> {
|
|
1723
|
+
if (!this.isAvailable()) {
|
|
1724
|
+
return EMPTY_QMD_STATUS;
|
|
1725
|
+
}
|
|
1726
|
+
if (!this.qmdCapabilities.safeStatusDeviceProbe) {
|
|
1727
|
+
return EMPTY_QMD_STATUS;
|
|
1728
|
+
}
|
|
1729
|
+
return fetchQmdStatus((args, timeoutMs) => this.runQmdCommand(args, timeoutMs), this.collection, QMD_TIMEOUT_MS);
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1739
1732
|
isDaemonMode(): boolean {
|
|
1740
1733
|
return this.daemonAvailable;
|
|
1741
1734
|
}
|
|
@@ -1947,23 +1940,14 @@ export class QmdClient implements SearchBackend {
|
|
|
1947
1940
|
// repeated queries within the same recall cycle (e.g., primary + hybrid
|
|
1948
1941
|
// top-up, or conversation recall using the same collection).
|
|
1949
1942
|
const optionsFingerprint = searchOptions ? JSON.stringify(searchOptions) : "";
|
|
1950
|
-
//
|
|
1951
|
-
// key must capture every input that changes the result — including the daemon
|
|
1952
|
-
// and subprocess strategies. Otherwise two QmdClient instances (or a reloaded
|
|
1953
|
-
// config) with different strategies collide within the TTL and one plan serves
|
|
1954
|
-
// another plan's cached results. Issue #1335 (codex review on #1422).
|
|
1943
|
+
// Key must capture daemon/subprocess strategies to avoid cross-instance collisions (#1335).
|
|
1955
1944
|
const strategyFingerprint = `${this.qmdSearchStrategy}:${this.qmdSubprocessStrategy}`;
|
|
1956
1945
|
const cacheKey = createHash("sha256")
|
|
1957
1946
|
.update(`${strategyFingerprint}:${col}:${n}:${optionsFingerprint}:${trimmed}`)
|
|
1958
1947
|
.digest("hex");
|
|
1959
1948
|
const cached = getCachedQmdSearch(cacheKey);
|
|
1960
1949
|
if (cached) {
|
|
1961
|
-
// No degradation
|
|
1962
|
-
// trustworthy results are ever cached (degraded empties are excluded
|
|
1963
|
-
// at the write below), so a TTL hit is a healthy serve of a recently
|
|
1964
|
-
// valid answer — the backend's live state is irrelevant because no
|
|
1965
|
-
// live call is attempted. Reporting unavailability here would fabricate
|
|
1966
|
-
// a degradation for a recall that was not degraded.
|
|
1950
|
+
// No degradation on cache hit by design (#1536): only trustworthy results are cached.
|
|
1967
1951
|
log.debug(`QMD search cache hit (${cached.length} results)`);
|
|
1968
1952
|
return cached as QmdSearchResult[];
|
|
1969
1953
|
}
|
|
@@ -2780,6 +2764,22 @@ export class QmdClient implements SearchBackend {
|
|
|
2780
2764
|
await this.runEmbedForCollection(collection, { perCollectionThrottle: true, strict: true });
|
|
2781
2765
|
}
|
|
2782
2766
|
|
|
2767
|
+
/** Trigger a collection-level embed for fresh writes (debounced by prioritized-embed). */
|
|
2768
|
+
async embedFiles(filePaths: string[]): Promise<boolean> {
|
|
2769
|
+
if (this.available === false || filePaths.length === 0) {
|
|
2770
|
+
return false;
|
|
2771
|
+
}
|
|
2772
|
+
const result = await embedQmdFiles(
|
|
2773
|
+
(args, timeoutMs) => this.runQmdCommand(args, timeoutMs),
|
|
2774
|
+
this.collection,
|
|
2775
|
+
filePaths,
|
|
2776
|
+
300_000,
|
|
2777
|
+
this.buildEmbedArgs(this.collection),
|
|
2778
|
+
);
|
|
2779
|
+
if (result.ok) clearQmdResultCaches();
|
|
2780
|
+
return result.ok;
|
|
2781
|
+
}
|
|
2782
|
+
|
|
2783
2783
|
private async runEmbedForCollection(
|
|
2784
2784
|
collection: string,
|
|
2785
2785
|
options: { perCollectionThrottle: boolean; strict?: boolean },
|
|
@@ -14,6 +14,36 @@ test("parseConfig applies recall timeout and qmd recall cache defaults", () => {
|
|
|
14
14
|
assert.equal(config.qmdRecallCacheMaxEntries, 128);
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
+
test("parseConfig applies the default profile share cap", () => {
|
|
18
|
+
assert.equal(parseConfig({}).recallProfileMaxRatio, 0.3);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("parseConfig accepts a configurable profile share cap", () => {
|
|
22
|
+
assert.equal(
|
|
23
|
+
parseConfig({ recallProfileMaxRatio: 0.5 }).recallProfileMaxRatio,
|
|
24
|
+
0.5,
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("parseConfig preserves profile share cap boundaries", () => {
|
|
29
|
+
assert.equal(parseConfig({ recallProfileMaxRatio: 0 }).recallProfileMaxRatio, 0);
|
|
30
|
+
assert.equal(parseConfig({ recallProfileMaxRatio: 1 }).recallProfileMaxRatio, 1);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("parseConfig rejects an explicit null profile share cap", () => {
|
|
34
|
+
assert.throws(
|
|
35
|
+
() => parseConfig({ recallProfileMaxRatio: null }),
|
|
36
|
+
/recallProfileMaxRatio must be a finite number in \[0, 1\]/,
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("parseConfig rejects an invalid profile share cap", () => {
|
|
41
|
+
assert.throws(
|
|
42
|
+
() => parseConfig({ recallProfileMaxRatio: 1.1 }),
|
|
43
|
+
/recallProfileMaxRatio must be a finite number in \[0, 1\]/,
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
17
47
|
test("parseConfig respects explicit recall timeout and qmd recall cache settings", () => {
|
|
18
48
|
const config = parseConfig({
|
|
19
49
|
recallOuterTimeoutMs: 18_000,
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recall-cold-deadline.test.ts — issue #1907.
|
|
3
|
+
*
|
|
4
|
+
* Pins the task-level cancellation contract of runColdStepWithinDeadline
|
|
5
|
+
* inside RecallSearchPipelineCoordinator.applyColdFallbackPipeline:
|
|
6
|
+
* - when the per-step deadline wins, the losing cold task's INJECTED signal
|
|
7
|
+
* is aborted (so an orphaned archive scan stops cooperatively) and the
|
|
8
|
+
* step returns its fallback (fail-open);
|
|
9
|
+
* - a task-level deadline must NOT abort the request-level signal;
|
|
10
|
+
* - a task that completes normally (no deadline) never aborts the injected
|
|
11
|
+
* step signal.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import assert from "node:assert/strict";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
18
|
+
import test from "node:test";
|
|
19
|
+
|
|
20
|
+
import { parseConfig } from "./config.js";
|
|
21
|
+
import {
|
|
22
|
+
RecallSearchPipelineCoordinator,
|
|
23
|
+
type RecallSearchPipelineDeps,
|
|
24
|
+
} from "./orchestration/recall-search-pipeline.js";
|
|
25
|
+
import type { PluginConfig, QmdSearchResult, RecallPlanMode } from "./types.js";
|
|
26
|
+
|
|
27
|
+
async function coldConfig() {
|
|
28
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-1907-cold-"));
|
|
29
|
+
const config = parseConfig({
|
|
30
|
+
openaiApiKey: "sk-test",
|
|
31
|
+
memoryDir,
|
|
32
|
+
workspaceDir: path.join(memoryDir, "workspace"),
|
|
33
|
+
qmdEnabled: false,
|
|
34
|
+
namespacesEnabled: false,
|
|
35
|
+
});
|
|
36
|
+
return { memoryDir, config };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Minimal deps for the archive-scan branch. qmd.isAvailable() === false forces
|
|
41
|
+
* the cold-qmd block to be skipped, so control reaches the archive-scan step;
|
|
42
|
+
* an empty archive result returns [] before any namespace/storage-router work,
|
|
43
|
+
* keeping the stub surface tight. The cast is a deliberate test double.
|
|
44
|
+
*/
|
|
45
|
+
function coldDeps(
|
|
46
|
+
config: PluginConfig,
|
|
47
|
+
searchLongTermArchiveFallback: RecallSearchPipelineDeps["searchLongTermArchiveFallback"],
|
|
48
|
+
): RecallSearchPipelineDeps {
|
|
49
|
+
return {
|
|
50
|
+
config,
|
|
51
|
+
qmd: { isAvailable: () => false },
|
|
52
|
+
namespaceFromPath: () => "default",
|
|
53
|
+
searchLongTermArchiveFallback,
|
|
54
|
+
} as unknown as RecallSearchPipelineDeps;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
test("#1907: cold archive-scan deadline aborts the injected step signal, returns fallback, leaves the request signal intact", async () => {
|
|
58
|
+
const { memoryDir, config } = await coldConfig();
|
|
59
|
+
try {
|
|
60
|
+
const stuck = Promise.withResolvers<QmdSearchResult[]>();
|
|
61
|
+
let capturedStepSignal: AbortSignal | undefined;
|
|
62
|
+
// Observable side-effect channel. A cooperatively-cancelled worker sees
|
|
63
|
+
// stepSignal.aborted === true by the time it settles late and performs no
|
|
64
|
+
// write; if the deadline's abort wiring is removed the signal never aborts,
|
|
65
|
+
// so the late completion leaks "late" here and the assertion below fails.
|
|
66
|
+
const lateWrites: string[] = [];
|
|
67
|
+
const abandonedTaskSettled = Promise.withResolvers<void>();
|
|
68
|
+
const deps = coldDeps(config, async (_prompt, _ns, _limit, _prefilter, abortSignal) => {
|
|
69
|
+
capturedStepSignal = abortSignal;
|
|
70
|
+
const late = await stuck.promise; // does not settle before the deadline wins
|
|
71
|
+
if (!abortSignal?.aborted) {
|
|
72
|
+
for (const hit of late) lateWrites.push(hit.docid);
|
|
73
|
+
}
|
|
74
|
+
abandonedTaskSettled.resolve();
|
|
75
|
+
return late;
|
|
76
|
+
});
|
|
77
|
+
const coordinator = new RecallSearchPipelineCoordinator(deps);
|
|
78
|
+
|
|
79
|
+
const requestController = new AbortController();
|
|
80
|
+
const result = await coordinator.applyColdFallbackPipeline({
|
|
81
|
+
prompt: "long term recall",
|
|
82
|
+
recallNamespaces: ["default"],
|
|
83
|
+
recallResultLimit: 5,
|
|
84
|
+
recallMode: "full" as RecallPlanMode,
|
|
85
|
+
deadlineAtMs: Date.now() + 120,
|
|
86
|
+
abortSignal: requestController.signal,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
assert.deepEqual(result, [], "the step returns its fallback when the deadline wins");
|
|
90
|
+
assert.ok(capturedStepSignal, "archive scan received an injected step signal");
|
|
91
|
+
assert.equal(
|
|
92
|
+
capturedStepSignal!.aborted,
|
|
93
|
+
true,
|
|
94
|
+
"the injected step signal is aborted on deadline so the losing task stops",
|
|
95
|
+
);
|
|
96
|
+
assert.equal(
|
|
97
|
+
requestController.signal.aborted,
|
|
98
|
+
false,
|
|
99
|
+
"a task-level deadline must NOT abort the request-level signal",
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// The abandoned task's LATE completion has no observable side effect: a
|
|
103
|
+
// cooperative worker sees its injected signal aborted and performs no write.
|
|
104
|
+
// Deterministic — we await the abandoned task's own settlement, not a bare
|
|
105
|
+
// microtask flush.
|
|
106
|
+
stuck.resolve([{ docid: "late", path: "/facts/late.md", snippet: "late", score: 1 }]);
|
|
107
|
+
await abandonedTaskSettled.promise;
|
|
108
|
+
assert.deepEqual(
|
|
109
|
+
lateWrites,
|
|
110
|
+
[],
|
|
111
|
+
"the abandoned task observed its abort and performed no late write",
|
|
112
|
+
);
|
|
113
|
+
} finally {
|
|
114
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("#1907: a cold step that completes before its deadline never aborts the injected step signal", async () => {
|
|
119
|
+
const { memoryDir, config } = await coldConfig();
|
|
120
|
+
try {
|
|
121
|
+
let capturedStepSignal: AbortSignal | undefined;
|
|
122
|
+
const deps = coldDeps(config, async (_prompt, _ns, _limit, _prefilter, abortSignal) => {
|
|
123
|
+
capturedStepSignal = abortSignal;
|
|
124
|
+
return []; // resolves immediately, well within the deadline
|
|
125
|
+
});
|
|
126
|
+
const coordinator = new RecallSearchPipelineCoordinator(deps);
|
|
127
|
+
|
|
128
|
+
const requestController = new AbortController();
|
|
129
|
+
const result = await coordinator.applyColdFallbackPipeline({
|
|
130
|
+
prompt: "long term recall",
|
|
131
|
+
recallNamespaces: ["default"],
|
|
132
|
+
recallResultLimit: 5,
|
|
133
|
+
recallMode: "full" as RecallPlanMode,
|
|
134
|
+
deadlineAtMs: Date.now() + 30_000,
|
|
135
|
+
abortSignal: requestController.signal,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
assert.deepEqual(result, [], "empty archive returns []");
|
|
139
|
+
assert.ok(capturedStepSignal, "archive scan received an injected step signal");
|
|
140
|
+
assert.equal(
|
|
141
|
+
capturedStepSignal!.aborted,
|
|
142
|
+
false,
|
|
143
|
+
"normal completion must not abort the injected step signal",
|
|
144
|
+
);
|
|
145
|
+
assert.equal(requestController.signal.aborted, false, "request signal untouched");
|
|
146
|
+
} finally {
|
|
147
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
148
|
+
}
|
|
149
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall concurrency config parsing (issue #1906), extracted from config.ts to
|
|
3
|
+
* keep that grandfathered file within its structural-ratchet ceiling (#1520/#1995).
|
|
4
|
+
* The parsed fields still live on {@link PluginConfig}; this only relocates the
|
|
5
|
+
* coercion/validation logic.
|
|
6
|
+
*/
|
|
7
|
+
import { coerceBool, coerceNumber } from "./connectors/coerce.js";
|
|
8
|
+
import type { PluginConfig } from "./types.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parse the per-principal recall concurrency knobs from raw config.
|
|
12
|
+
*
|
|
13
|
+
* `recallMaxConcurrentPerPrincipal` accepts only finite integers >= 0 so `0`
|
|
14
|
+
* means "unlimited" deliberately. A fractional typo like `0.5` must NOT floor to
|
|
15
|
+
* `0` (which would silently disable the cap); it falls back to the default 4
|
|
16
|
+
* (AGENTS.md #1/#17).
|
|
17
|
+
*/
|
|
18
|
+
export function parseRecallConcurrencyConfig(
|
|
19
|
+
cfg: Record<string, unknown>,
|
|
20
|
+
): Pick<PluginConfig, "recallMaxConcurrentPerPrincipal" | "recallSingleFlightEnabled"> {
|
|
21
|
+
return {
|
|
22
|
+
recallMaxConcurrentPerPrincipal: (() => {
|
|
23
|
+
const n = coerceNumber(cfg.recallMaxConcurrentPerPrincipal);
|
|
24
|
+
return n !== undefined && Number.isInteger(n) && n >= 0 ? n : 4;
|
|
25
|
+
})(),
|
|
26
|
+
recallSingleFlightEnabled: coerceBool(cfg.recallSingleFlightEnabled) ?? true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { MemoryFile, QmdSearchResult } from "./types.js";
|
|
2
|
+
|
|
3
|
+
export function memoryMapKey(result: Pick<QmdSearchResult, "namespace" | "path">): string {
|
|
4
|
+
// No namespace -> bare path (backward-compatible with path-keyed lookups).
|
|
5
|
+
// Namespaced -> composite so the same relative path across namespaces stays distinct.
|
|
6
|
+
return result.namespace ? `${result.namespace}\0${result.path}` : result.path;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function memoryForResult(
|
|
10
|
+
memoryByPath: ReadonlyMap<string, MemoryFile>,
|
|
11
|
+
result: Pick<QmdSearchResult, "namespace" | "path">,
|
|
12
|
+
): MemoryFile | undefined {
|
|
13
|
+
return memoryByPath.get(memoryMapKey(result));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function hasMemoryForResult(
|
|
17
|
+
memoryByPath: ReadonlyMap<string, MemoryFile>,
|
|
18
|
+
result: Pick<QmdSearchResult, "namespace" | "path">,
|
|
19
|
+
): boolean {
|
|
20
|
+
return memoryByPath.has(memoryMapKey(result));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function markResultKey(
|
|
24
|
+
keys: Set<string>,
|
|
25
|
+
result: Pick<QmdSearchResult, "namespace" | "path">,
|
|
26
|
+
): void {
|
|
27
|
+
keys.add(memoryMapKey(result));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function resultHasKey(
|
|
31
|
+
keys: ReadonlySet<string>,
|
|
32
|
+
result: Pick<QmdSearchResult, "namespace" | "path">,
|
|
33
|
+
): boolean {
|
|
34
|
+
return keys.has(memoryMapKey(result));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Merge recall results from multiple producers, deduplicating by the composite
|
|
39
|
+
* (namespace, path) identity so the same memory found by a fanout hit and a
|
|
40
|
+
* seed/hybrid/archive hit collapses to ONE entry instead of being injected and
|
|
41
|
+
* access-tracked twice (#2020). The namespace is resolved the SAME way on every
|
|
42
|
+
* producer — carried when present, else derived from the path — and stamped on
|
|
43
|
+
* the surviving result. Highest score wins; a surviving result keeps its own
|
|
44
|
+
* snippet, falling back to the displaced entry's snippet when empty. Results are
|
|
45
|
+
* returned sorted by descending score and capped to `limit`.
|
|
46
|
+
*/
|
|
47
|
+
export function dedupeResultsByNamespace(
|
|
48
|
+
results: readonly QmdSearchResult[],
|
|
49
|
+
namespaceFromPath: (path: string) => string,
|
|
50
|
+
limit: number,
|
|
51
|
+
options?: {
|
|
52
|
+
transportFallback?: QmdSearchResult["transport"];
|
|
53
|
+
filter?: (result: QmdSearchResult) => boolean;
|
|
54
|
+
},
|
|
55
|
+
): QmdSearchResult[] {
|
|
56
|
+
const merged = new Map<string, QmdSearchResult>();
|
|
57
|
+
for (const result of results) {
|
|
58
|
+
const namespace = result.namespace ?? namespaceFromPath(result.path);
|
|
59
|
+
const key = `${namespace}\0${result.path || result.docid}`;
|
|
60
|
+
const existing = merged.get(key);
|
|
61
|
+
if (existing && result.score <= existing.score) continue;
|
|
62
|
+
merged.set(key, {
|
|
63
|
+
...result,
|
|
64
|
+
namespace,
|
|
65
|
+
...(options?.transportFallback !== undefined
|
|
66
|
+
? { transport: result.transport ?? options.transportFallback }
|
|
67
|
+
: {}),
|
|
68
|
+
snippet: result.snippet || existing?.snippet || "",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
let out = [...merged.values()];
|
|
72
|
+
if (options?.filter) out = out.filter(options.filter);
|
|
73
|
+
return out.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
74
|
+
}
|