@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
|
@@ -67,6 +67,17 @@ export type BudgetDecisionReason =
|
|
|
67
67
|
| "warn-over-soft"
|
|
68
68
|
| "deny-over-hard";
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Opaque token identifying the EXACT window entry a {@link CrossNamespaceBudget.record}
|
|
72
|
+
* reserve created (issue #1906 review #4). Pass it to `release()` to remove
|
|
73
|
+
* that specific entry — never "the newest", which under concurrency could evict
|
|
74
|
+
* a different (newer) recall's reservation and reopen the limiter early.
|
|
75
|
+
*/
|
|
76
|
+
export interface BudgetReservation {
|
|
77
|
+
principal: string;
|
|
78
|
+
id: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
70
81
|
export interface BudgetDecision {
|
|
71
82
|
allowed: boolean;
|
|
72
83
|
reason: BudgetDecisionReason;
|
|
@@ -78,11 +89,40 @@ export interface BudgetDecision {
|
|
|
78
89
|
hardLimit: number;
|
|
79
90
|
windowMs: number;
|
|
80
91
|
};
|
|
92
|
+
/**
|
|
93
|
+
* Present only when this decision RESERVED a window entry (an allowed
|
|
94
|
+
* `record()`), so the caller can later `release(reservation)` that exact
|
|
95
|
+
* entry on a failed/aborted recall. Absent on denials, peeks, and
|
|
96
|
+
* same-namespace/no-limit decisions.
|
|
97
|
+
*/
|
|
98
|
+
reservation?: BudgetReservation;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Response-safe projection of a soft-limit warning: a {@link BudgetDecision}
|
|
103
|
+
* WITHOUT the server-only `reservation` rollback token (which carries the
|
|
104
|
+
* principal id). This is what may be surfaced on HTTP/MCP recall responses and
|
|
105
|
+
* persisted in idempotency-cache entries, so it must never carry internal quota
|
|
106
|
+
* state (issue #1906 review round 10 #2).
|
|
107
|
+
*/
|
|
108
|
+
export type BudgetWarning = Omit<BudgetDecision, "reservation">;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Project a decision to its response-safe {@link BudgetWarning}, stripping the
|
|
112
|
+
* internal `reservation` token. Returns `undefined` unless the decision is a
|
|
113
|
+
* soft-limit warning (`warn-over-soft`) — so callers can assign the result to
|
|
114
|
+
* `budgetWarning` directly.
|
|
115
|
+
*/
|
|
116
|
+
export function toBudgetWarning(decision: BudgetDecision): BudgetWarning | undefined {
|
|
117
|
+
if (decision.reason !== "warn-over-soft") return undefined;
|
|
118
|
+
const { reservation: _reservation, ...warning } = decision;
|
|
119
|
+
return warning;
|
|
81
120
|
}
|
|
82
121
|
|
|
83
122
|
interface PrincipalBucket {
|
|
84
|
-
/**
|
|
85
|
-
|
|
123
|
+
/** Cross-namespace reads in the active window, each tagged with a unique id
|
|
124
|
+
* so a specific reservation can be released without disturbing others. */
|
|
125
|
+
entries: Array<{ id: number; ts: number }>;
|
|
86
126
|
}
|
|
87
127
|
|
|
88
128
|
/**
|
|
@@ -149,6 +189,8 @@ function normalizeClock(now: number | undefined): number {
|
|
|
149
189
|
export class CrossNamespaceBudget {
|
|
150
190
|
private readonly config: Required<CrossNamespaceBudgetConfig>;
|
|
151
191
|
private readonly buckets = new Map<string, PrincipalBucket>();
|
|
192
|
+
/** Monotonic id source for reservation tokens (issue #1906 review #4). */
|
|
193
|
+
private reservationSeq = 0;
|
|
152
194
|
|
|
153
195
|
constructor(config?: CrossNamespaceBudgetConfig) {
|
|
154
196
|
this.config = effectiveConfig(config);
|
|
@@ -192,46 +234,51 @@ export class CrossNamespaceBudget {
|
|
|
192
234
|
principal = "__anonymous__";
|
|
193
235
|
}
|
|
194
236
|
|
|
195
|
-
const bucket = this.buckets.get(principal) ?? {
|
|
237
|
+
const bucket = this.buckets.get(principal) ?? { entries: [] };
|
|
196
238
|
const cutoff = normalizedNow - windowMs;
|
|
197
|
-
// Drop
|
|
198
|
-
while (bucket.
|
|
199
|
-
bucket.
|
|
239
|
+
// Drop entries that slid out of the window.
|
|
240
|
+
while (bucket.entries.length > 0 && bucket.entries[0]!.ts < cutoff) {
|
|
241
|
+
bucket.entries.shift();
|
|
200
242
|
}
|
|
201
243
|
|
|
202
244
|
// Count the current call against the window BEFORE deciding — a call
|
|
203
245
|
// that crosses the deny threshold should itself be denied, not the
|
|
204
246
|
// next one. This is what the threat model calls "fail at the Nth,
|
|
205
247
|
// not the (N+1)th".
|
|
206
|
-
|
|
248
|
+
const id = ++this.reservationSeq;
|
|
249
|
+
bucket.entries.push({ id, ts: normalizedNow });
|
|
207
250
|
this.buckets.set(principal, bucket);
|
|
208
|
-
const count = bucket.
|
|
251
|
+
const count = bucket.entries.length;
|
|
209
252
|
|
|
210
253
|
if (count >= hardLimit) {
|
|
211
|
-
// Denied: roll back the
|
|
254
|
+
// Denied: roll back the entry we just added so a repeated denied
|
|
212
255
|
// call does not push the bucket further into the future. This keeps
|
|
213
256
|
// the limiter stateless with respect to denied attempts.
|
|
214
|
-
bucket.
|
|
257
|
+
bucket.entries.pop();
|
|
215
258
|
// Evict empty buckets (e.g. the first record after a long idle
|
|
216
|
-
// rolled the only
|
|
259
|
+
// rolled the only entry out, then got denied and rolled back).
|
|
217
260
|
// Prevents unbounded map growth across many transient principals.
|
|
218
|
-
if (bucket.
|
|
261
|
+
if (bucket.entries.length === 0) {
|
|
219
262
|
this.buckets.delete(principal);
|
|
220
263
|
}
|
|
221
264
|
return {
|
|
222
265
|
allowed: false,
|
|
223
266
|
reason: "deny-over-hard",
|
|
224
|
-
count: bucket.
|
|
267
|
+
count: bucket.entries.length,
|
|
225
268
|
limit,
|
|
226
269
|
};
|
|
227
270
|
}
|
|
228
271
|
|
|
272
|
+
// Allowed: the entry stands as a reservation the caller can later release
|
|
273
|
+
// by token (issue #1906 review #4).
|
|
274
|
+
const reservation: BudgetReservation = { principal, id };
|
|
229
275
|
if (count > softLimit) {
|
|
230
276
|
return {
|
|
231
277
|
allowed: true,
|
|
232
278
|
reason: "warn-over-soft",
|
|
233
279
|
count,
|
|
234
280
|
limit,
|
|
281
|
+
reservation,
|
|
235
282
|
};
|
|
236
283
|
}
|
|
237
284
|
|
|
@@ -240,6 +287,7 @@ export class CrossNamespaceBudget {
|
|
|
240
287
|
reason: "allowed-under-soft",
|
|
241
288
|
count,
|
|
242
289
|
limit,
|
|
290
|
+
reservation,
|
|
243
291
|
};
|
|
244
292
|
}
|
|
245
293
|
|
|
@@ -283,11 +331,11 @@ export class CrossNamespaceBudget {
|
|
|
283
331
|
principal = "__anonymous__";
|
|
284
332
|
}
|
|
285
333
|
const now = normalizeClock(args.now);
|
|
286
|
-
const bucket = this.buckets.get(principal) ?? {
|
|
334
|
+
const bucket = this.buckets.get(principal) ?? { entries: [] };
|
|
287
335
|
const cutoff = now - windowMs;
|
|
288
336
|
let liveCount = 0;
|
|
289
|
-
for (const
|
|
290
|
-
if (ts >= cutoff) liveCount++;
|
|
337
|
+
for (const entry of bucket.entries) {
|
|
338
|
+
if (entry.ts >= cutoff) liveCount++;
|
|
291
339
|
}
|
|
292
340
|
const projected = liveCount + 1; // +1 for the current call
|
|
293
341
|
if (projected >= hardLimit) {
|
|
@@ -335,6 +383,25 @@ export class CrossNamespaceBudget {
|
|
|
335
383
|
return this.record(args.principal, args.now);
|
|
336
384
|
}
|
|
337
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Roll back the EXACT reservation made by an allowed {@link record} (issue
|
|
388
|
+
* #1906 review #4). When a recall reserves budget at admission but then fails
|
|
389
|
+
* or is aborted, the caller releases its own `reservation` token so the
|
|
390
|
+
* errored recall does not consume budget permanently — and, critically, does
|
|
391
|
+
* NOT evict a different concurrent recall's entry (which could expire early
|
|
392
|
+
* and reopen the limiter). A no-op when the token is absent or already gone.
|
|
393
|
+
* Evicts empty buckets.
|
|
394
|
+
*/
|
|
395
|
+
release(reservation: BudgetReservation | null | undefined): void {
|
|
396
|
+
if (!reservation) return;
|
|
397
|
+
const bucket = this.buckets.get(reservation.principal);
|
|
398
|
+
if (!bucket) return;
|
|
399
|
+
const index = bucket.entries.findIndex((entry) => entry.id === reservation.id);
|
|
400
|
+
if (index < 0) return;
|
|
401
|
+
bucket.entries.splice(index, 1);
|
|
402
|
+
if (bucket.entries.length === 0) this.buckets.delete(reservation.principal);
|
|
403
|
+
}
|
|
404
|
+
|
|
338
405
|
/**
|
|
339
406
|
* Clear all state. Intended for tests and for the orchestrator's
|
|
340
407
|
* lifecycle `before_reset` hook.
|
|
@@ -355,10 +422,10 @@ export class CrossNamespaceBudget {
|
|
|
355
422
|
const cutoff = normalizedNow - this.config.windowMs;
|
|
356
423
|
let evicted = 0;
|
|
357
424
|
for (const [principal, bucket] of this.buckets.entries()) {
|
|
358
|
-
while (bucket.
|
|
359
|
-
bucket.
|
|
425
|
+
while (bucket.entries.length > 0 && bucket.entries[0]!.ts < cutoff) {
|
|
426
|
+
bucket.entries.shift();
|
|
360
427
|
}
|
|
361
|
-
if (bucket.
|
|
428
|
+
if (bucket.entries.length === 0) {
|
|
362
429
|
this.buckets.delete(principal);
|
|
363
430
|
evicted++;
|
|
364
431
|
}
|
package/src/explicit-capture.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { composeMemoryEnvelope, TAG_LIMITS } from "./write-envelope.js";
|
|
1
2
|
import { resolveNamespaceCapabilities } from "./capabilities.js";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
4
|
import type { Orchestrator } from "./orchestrator.js";
|
|
@@ -366,15 +367,31 @@ export function validateExplicitCaptureInput(
|
|
|
366
367
|
}
|
|
367
368
|
const expiresAt = parseExplicitCaptureTtl(input.ttl);
|
|
368
369
|
|
|
370
|
+
// #2014 review round: enforce the composer's tag contract HERE so a capture
|
|
371
|
+
// that passes validation can never fail later at strict compose time
|
|
372
|
+
// (validated-then-thrown was a broken contract). Same limits as TAG_LIMITS.
|
|
373
|
+
const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));
|
|
374
|
+
if (dedupedTags.length > TAG_LIMITS.maxTags) {
|
|
375
|
+
throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);
|
|
376
|
+
}
|
|
377
|
+
for (const tag of dedupedTags) {
|
|
378
|
+
if (tag.length > TAG_LIMITS.maxTagLength) {
|
|
379
|
+
throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}…`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
369
383
|
return {
|
|
370
384
|
content,
|
|
371
385
|
category,
|
|
372
386
|
confidence,
|
|
373
387
|
namespace: asTrimmed(input.namespace),
|
|
374
|
-
tags:
|
|
388
|
+
tags: dedupedTags,
|
|
375
389
|
entityRef: asTrimmed(input.entityRef),
|
|
376
390
|
sourceReason: asTrimmed(input.sourceReason),
|
|
377
|
-
|
|
391
|
+
// Trimmed like the other optional metadata (#2017 review round): a
|
|
392
|
+
// whitespace-only connector previously passed validation and then blew
|
|
393
|
+
// up at strict compose time - validated input must always compose.
|
|
394
|
+
sourceConnector: asTrimmed(input.sourceConnector),
|
|
378
395
|
expiresAt,
|
|
379
396
|
};
|
|
380
397
|
}
|
|
@@ -442,14 +459,21 @@ export async function persistExplicitCapture(
|
|
|
442
459
|
// #1645 (review thread yG-): surface the tombstone block so callers
|
|
443
460
|
// (memory_store tool, access-service HTTP/MCP) can report the capture as
|
|
444
461
|
// queued for review instead of a successfully stored active memory.
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
462
|
+
// Sealed-envelope write (issue #1989 PR2).
|
|
463
|
+
const captureEnvelope = composeMemoryEnvelope(
|
|
464
|
+
{
|
|
465
|
+
content: candidate.content,
|
|
466
|
+
category: candidate.category,
|
|
467
|
+
confidence: candidate.confidence,
|
|
468
|
+
tags: candidate.tags,
|
|
469
|
+
...(candidate.entityRef ? { entityRef: candidate.entityRef } : {}),
|
|
470
|
+
...(candidate.expiresAt ? { ttl: candidate.expiresAt } : {}),
|
|
471
|
+
...(candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {}),
|
|
472
|
+
...(candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}),
|
|
473
|
+
},
|
|
474
|
+
{ source: source === "inline" ? "explicit-inline" : "explicit" },
|
|
475
|
+
);
|
|
476
|
+
const { id, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);
|
|
453
477
|
// #1522: catalog touch handled at the storage chokepoint — the StorageManager's
|
|
454
478
|
// post-write hook records the namespace touch automatically.
|
|
455
479
|
|
|
@@ -547,13 +571,26 @@ export async function queueExplicitCaptureForReview(
|
|
|
547
571
|
: "fact";
|
|
548
572
|
const requestedTags = sanitizeReviewTags(input.tags);
|
|
549
573
|
const storage = await orchestrator.getStorage(queueNamespace);
|
|
550
|
-
const
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
574
|
+
const reviewEnvelope = composeMemoryEnvelope(
|
|
575
|
+
{
|
|
576
|
+
content,
|
|
577
|
+
category: reviewCategory,
|
|
578
|
+
confidence: 0.2,
|
|
579
|
+
tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),
|
|
580
|
+
...(sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {}),
|
|
581
|
+
...(input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}),
|
|
582
|
+
},
|
|
583
|
+
{ source: source === "inline" ? "explicit-inline-review" : "explicit-review" },
|
|
584
|
+
// The review queue is the FALLBACK for a capture that already failed
|
|
585
|
+
// primary validation — it must never be un-queueable. The tag list is
|
|
586
|
+
// machine-assembled (requested tags + the two fixed review tags), so 49+
|
|
587
|
+
// requested tags would push past the 50-tag limit and strict compose
|
|
588
|
+
// would throw, losing the capture (#2014 review round). Salvage clamps
|
|
589
|
+
// instead; the fixed review tags sort first in the assembly above, so
|
|
590
|
+
// they always survive the clamp.
|
|
591
|
+
{ salvage: true },
|
|
592
|
+
);
|
|
593
|
+
const { id: id } = await storage.writeSealedMemory(reviewEnvelope);
|
|
557
594
|
try {
|
|
558
595
|
const created = await storage.getMemoryById(id);
|
|
559
596
|
if (created) {
|
package/src/extraction.ts
CHANGED
|
@@ -2,6 +2,7 @@ import OpenAI from "openai";
|
|
|
2
2
|
import { log } from "./logger.js";
|
|
3
3
|
import { delinearize } from "./delinearize.js";
|
|
4
4
|
import { LocalLlmClient } from "./local-llm.js";
|
|
5
|
+
import { shouldRunProactivePass } from "./proactive-contention.js";
|
|
5
6
|
import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig, gatewayTaskChainOptions } from "./fallback-llm.js";
|
|
6
7
|
import {
|
|
7
8
|
ExtractionResultSchema,
|
|
@@ -633,9 +634,7 @@ export class ExtractionEngine {
|
|
|
633
634
|
): Promise<ExtractionResult> {
|
|
634
635
|
if (!resolvePipelineProcessingCapabilities(this.config).proactiveExtraction) return base;
|
|
635
636
|
const maxAdditional = Math.max(0, Math.floor(this.config.maxProactiveQuestionsPerExtraction));
|
|
636
|
-
if (maxAdditional
|
|
637
|
-
if (this.config.proactiveExtractionTimeoutMs === 0) return base;
|
|
638
|
-
if (this.config.proactiveExtractionMaxTokens === 0) return base;
|
|
637
|
+
if (!shouldRunProactivePass(this.config, maxAdditional, this.shouldUseLocalLlm, this.localLlm)) return base;
|
|
639
638
|
|
|
640
639
|
try {
|
|
641
640
|
const proactive = await this.generateProactiveQuestions(conversation, base, maxAdditional);
|
|
@@ -26,6 +26,8 @@ import { readEdges } from "./graph.js";
|
|
|
26
26
|
import type { ExtractionResult, PluginConfig } from "./types.js";
|
|
27
27
|
import type { LocalLlmClient } from "./local-llm.js";
|
|
28
28
|
import type { BufferTurn, ConversationThread } from "./types.js";
|
|
29
|
+
import type { PersistExtractionFn } from "./testing/orchestrator-lite.js";
|
|
30
|
+
import type { StorageManager } from "./storage.js";
|
|
29
31
|
|
|
30
32
|
/**
|
|
31
33
|
* Stub local LLM whose `chatCompletion` only answers faithfulness-gate calls
|
|
@@ -126,33 +128,18 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
126
128
|
faithfulnessStubLocalLlm((c) =>
|
|
127
129
|
c.includes("closed permanently") ? "unsupported" : "entailed",
|
|
128
130
|
);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
frontmatter: { id: string; status?: string };
|
|
136
|
-
}>
|
|
137
|
-
>;
|
|
138
|
-
}>;
|
|
139
|
-
}).getStorage("default");
|
|
131
|
+
// getStorage + persistExtraction are private; reach them through a named production-typed surface.
|
|
132
|
+
const persist = orchestrator as unknown as {
|
|
133
|
+
getStorage: (ns: string) => Promise<StorageManager>;
|
|
134
|
+
persistExtraction: PersistExtractionFn;
|
|
135
|
+
};
|
|
136
|
+
const storage = await persist.getStorage("default");
|
|
140
137
|
await storage.ensureDirectories();
|
|
141
138
|
|
|
142
139
|
const sourceText =
|
|
143
140
|
"The widget factory produces widgets. It launched last year. The team is small.";
|
|
144
141
|
|
|
145
|
-
const ids0 = await (
|
|
146
|
-
persistExtraction: (
|
|
147
|
-
r: ExtractionResult,
|
|
148
|
-
s: unknown,
|
|
149
|
-
t: unknown,
|
|
150
|
-
ctx: unknown,
|
|
151
|
-
bn: unknown,
|
|
152
|
-
plan: unknown,
|
|
153
|
-
src: string,
|
|
154
|
-
) => Promise<string[]>;
|
|
155
|
-
}).persistExtraction(
|
|
142
|
+
const { persistedIds: ids0 } = await persist.persistExtraction(
|
|
156
143
|
factResult("The widget factory produces widgets daily.", "widget-factory"),
|
|
157
144
|
storage,
|
|
158
145
|
null,
|
|
@@ -166,17 +153,7 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
166
153
|
|
|
167
154
|
// fact1 → unsupported (pending_review). Under the bug it would originate an
|
|
168
155
|
// entity edge to fact0; under the guard it must NOT.
|
|
169
|
-
const ids1 = await (
|
|
170
|
-
persistExtraction: (
|
|
171
|
-
r: ExtractionResult,
|
|
172
|
-
s: unknown,
|
|
173
|
-
t: unknown,
|
|
174
|
-
ctx: unknown,
|
|
175
|
-
bn: unknown,
|
|
176
|
-
plan: unknown,
|
|
177
|
-
src: string,
|
|
178
|
-
) => Promise<string[]>;
|
|
179
|
-
}).persistExtraction(
|
|
156
|
+
const { persistedIds: ids1 } = await persist.persistExtraction(
|
|
180
157
|
factResult(
|
|
181
158
|
"The widget factory closed permanently.",
|
|
182
159
|
"widget-factory",
|
|
@@ -216,17 +193,7 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
216
193
|
|
|
217
194
|
// Control: an ACTIVE fact with the same entityRef DOES create entity edges
|
|
218
195
|
// (proving the graph is wired and only pending_review is excluded).
|
|
219
|
-
const ids2 = await (
|
|
220
|
-
persistExtraction: (
|
|
221
|
-
r: ExtractionResult,
|
|
222
|
-
s: unknown,
|
|
223
|
-
t: unknown,
|
|
224
|
-
ctx: unknown,
|
|
225
|
-
bn: unknown,
|
|
226
|
-
plan: unknown,
|
|
227
|
-
src: string,
|
|
228
|
-
) => Promise<string[]>;
|
|
229
|
-
}).persistExtraction(
|
|
196
|
+
const { persistedIds: ids2 } = await persist.persistExtraction(
|
|
230
197
|
factResult("The widget factory reopened this quarter.", "widget-factory"),
|
|
231
198
|
storage,
|
|
232
199
|
null,
|
|
@@ -312,26 +279,6 @@ function twoFactResult(
|
|
|
312
279
|
} as unknown as ExtractionResult;
|
|
313
280
|
}
|
|
314
281
|
|
|
315
|
-
interface StorageLike {
|
|
316
|
-
ensureDirectories: () => Promise<void>;
|
|
317
|
-
dir: string;
|
|
318
|
-
readAllMemories: () => Promise<
|
|
319
|
-
Array<{ path: string; frontmatter: { id: string; status?: string } }>
|
|
320
|
-
>;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
interface PersistExtractionSig {
|
|
324
|
-
(
|
|
325
|
-
r: ExtractionResult,
|
|
326
|
-
s: unknown,
|
|
327
|
-
t: string | null,
|
|
328
|
-
ctx: unknown,
|
|
329
|
-
bn: unknown,
|
|
330
|
-
plan: unknown,
|
|
331
|
-
src: string,
|
|
332
|
-
): Promise<string[]>;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
282
|
test("pending_review id must NOT enter persisted thread episodes across a cross-flush (#1635)", async () => {
|
|
336
283
|
const { orchestrator, memoryDir } = await makeThreadHarness();
|
|
337
284
|
try {
|
|
@@ -342,7 +289,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
342
289
|
);
|
|
343
290
|
|
|
344
291
|
const getStorage = orchestrator as unknown as {
|
|
345
|
-
getStorage: (ns: string) => Promise<
|
|
292
|
+
getStorage: (ns: string) => Promise<StorageManager>;
|
|
346
293
|
};
|
|
347
294
|
const storage = await getStorage.getStorage("default");
|
|
348
295
|
await storage.ensureDirectories();
|
|
@@ -365,10 +312,10 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
365
312
|
assert.ok(threadId, "thread established via processTurn");
|
|
366
313
|
|
|
367
314
|
const persist = orchestrator as unknown as {
|
|
368
|
-
persistExtraction:
|
|
315
|
+
persistExtraction: PersistExtractionFn;
|
|
369
316
|
appendPersistedThreadEpisodes: (
|
|
370
317
|
threadId: string,
|
|
371
|
-
persistedIds: string[]
|
|
318
|
+
persistedIds: string[]
|
|
372
319
|
) => Promise<void>;
|
|
373
320
|
};
|
|
374
321
|
|
|
@@ -376,7 +323,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
376
323
|
"The widget factory reopened this quarter after being closed permanently last year.";
|
|
377
324
|
|
|
378
325
|
// --- Flush 1: an active fact + a pending_review fact, same thread ---
|
|
379
|
-
const flush1 = await persist.persistExtraction(
|
|
326
|
+
const { persistedIds: flush1 } = await persist.persistExtraction(
|
|
380
327
|
twoFactResult(
|
|
381
328
|
"The widget factory reopened this quarter.", "wf-active",
|
|
382
329
|
"The widget factory closed permanently last year.", "wf-pending",
|
|
@@ -419,7 +366,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
419
366
|
);
|
|
420
367
|
|
|
421
368
|
// --- Flush 2: an active fact in the SAME thread ---
|
|
422
|
-
const flush2 = await persist.persistExtraction(
|
|
369
|
+
const { persistedIds: flush2 } = await persist.persistExtraction(
|
|
423
370
|
factResult("The widget factory hired ten new engineers.", "wf-active"),
|
|
424
371
|
storage,
|
|
425
372
|
threadId,
|
package/src/graph-recall.test.ts
CHANGED
|
@@ -6,8 +6,39 @@ import {
|
|
|
6
6
|
type GraphRecallOptions,
|
|
7
7
|
runGraphRecall,
|
|
8
8
|
} from "./graph-recall.js";
|
|
9
|
+
import { mergeGraphExpandedResults } from "./orchestration/graph-recall-coordinator.js";
|
|
9
10
|
import type { MemoryEdgeSource } from "./graph-retrieval.js";
|
|
10
11
|
|
|
12
|
+
test("mergeGraphExpandedResults preserves same paths from different namespaces", () => {
|
|
13
|
+
const merged = mergeGraphExpandedResults(
|
|
14
|
+
[
|
|
15
|
+
{
|
|
16
|
+
docid: "default-memory",
|
|
17
|
+
path: "facts/same-id.md",
|
|
18
|
+
namespace: "default",
|
|
19
|
+
snippet: "default",
|
|
20
|
+
score: 0.8,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
docid: "project-memory",
|
|
24
|
+
path: "facts/same-id.md",
|
|
25
|
+
namespace: "project-x",
|
|
26
|
+
snippet: "project",
|
|
27
|
+
score: 0.7,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
[],
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
assert.deepEqual(
|
|
34
|
+
merged.map((result) => [result.namespace, result.path]),
|
|
35
|
+
[
|
|
36
|
+
["default", "facts/same-id.md"],
|
|
37
|
+
["project-x", "facts/same-id.md"],
|
|
38
|
+
],
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
11
42
|
const DEFAULT_CONFIG: GraphRecallConfig = {
|
|
12
43
|
recallGraphEnabled: true,
|
|
13
44
|
recallGraphDamping: 0.85,
|
package/src/index.ts
CHANGED
|
@@ -111,6 +111,26 @@ export {
|
|
|
111
111
|
serializeEntityFile,
|
|
112
112
|
type MemoryWriteResult,
|
|
113
113
|
} from "./storage.js";
|
|
114
|
+
export {
|
|
115
|
+
composeMemoryEnvelope,
|
|
116
|
+
buildAccessWriteRequestFingerprint,
|
|
117
|
+
buildObserveRequestFingerprint,
|
|
118
|
+
buildWriteIdempotencyPayload,
|
|
119
|
+
isSealedMemoryEnvelope,
|
|
120
|
+
sealedWriteToLegacyArgs,
|
|
121
|
+
TAG_LIMITS,
|
|
122
|
+
STRUCTURED_ATTRIBUTE_LIMITS,
|
|
123
|
+
WRITE_FINGERPRINT_FIELDS,
|
|
124
|
+
FINGERPRINT_EXEMPT_FIELDS,
|
|
125
|
+
FINGERPRINT_SCOPE_FIELDS,
|
|
126
|
+
type SealedMemoryEnvelope,
|
|
127
|
+
type MemoryWriteInput,
|
|
128
|
+
type WriteContext,
|
|
129
|
+
type FingerprintScope,
|
|
130
|
+
type AccessWriteFingerprintParts,
|
|
131
|
+
type ObserveFingerprintParts,
|
|
132
|
+
type ComposeEnvelopeOptions,
|
|
133
|
+
} from "./write-envelope.js";
|
|
114
134
|
export {
|
|
115
135
|
getHostEmbeddingProvider,
|
|
116
136
|
normalizeHostEmbeddingVector,
|
|
@@ -329,7 +349,7 @@ export { MeilisearchBackend } from "./search/meilisearch-backend.js";
|
|
|
329
349
|
// ---------------------------------------------------------------------------
|
|
330
350
|
|
|
331
351
|
export { buildEntityRecallSection } from "./entity-retrieval.js";
|
|
332
|
-
export { resolvePrincipal } from "./namespaces/principal.js";
|
|
352
|
+
export { isNamespacePolicyCovered, resolvePrincipal } from "./namespaces/principal.js";
|
|
333
353
|
export {
|
|
334
354
|
NamespaceCatalog,
|
|
335
355
|
type NamespaceRecord,
|
|
@@ -810,7 +830,7 @@ export {
|
|
|
810
830
|
// ---------------------------------------------------------------------------
|
|
811
831
|
// Offline Sync
|
|
812
832
|
// ---------------------------------------------------------------------------
|
|
813
|
-
|
|
833
|
+
export { drainPendingImpressionsForOfflineSync, drainPendingLifecycleForOfflineSync } from "./offline-sync-impression-drain.js";
|
|
814
834
|
export {
|
|
815
835
|
OFFLINE_SYNC_APPLY_MAX_BODY_BYTES,
|
|
816
836
|
OFFLINE_SYNC_CHANGESET_FORMAT,
|
package/src/local-llm.ts
CHANGED
|
@@ -858,11 +858,9 @@ export class LocalLlmClient {
|
|
|
858
858
|
});
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
this.requestQueues.background.length > 0
|
|
865
|
-
);
|
|
861
|
+
/** True when a background-priority request occupies or awaits this client's local lane (issue #2011). */
|
|
862
|
+
isBackgroundLaneContended(): boolean {
|
|
863
|
+
return this.queueProcessing.has("background") || this.requestQueues.background.length > 0;
|
|
866
864
|
}
|
|
867
865
|
|
|
868
866
|
private dequeueQueuedRequest(priority: LocalLlmRequestPriority): LocalLlmQueuedRequest | null {
|
|
@@ -924,7 +922,7 @@ export class LocalLlmClient {
|
|
|
924
922
|
next.resolve(result);
|
|
925
923
|
} finally {
|
|
926
924
|
this.queueProcessing.delete(next.priority);
|
|
927
|
-
if (this.
|
|
925
|
+
if (this.requestQueues["recall-critical"].length > 0 || this.requestQueues.background.length > 0) {
|
|
928
926
|
this.scheduleQueueDrain();
|
|
929
927
|
}
|
|
930
928
|
}
|
package/src/logger.ts
CHANGED
|
@@ -60,6 +60,22 @@ export function initLogger(backend?: LoggerBackend, debug?: boolean, options?: L
|
|
|
60
60
|
_clock = options?.clock ?? (() => new Date().toISOString());
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
// Whether a real backend has been installed via initLogger. Lets diagnostics
|
|
64
|
+
// that must not be swallowed (config misconfiguration warnings) fall back to
|
|
65
|
+
// console when a host-agnostic consumer uses core without calling initLogger.
|
|
66
|
+
export function isLoggerInitialized(): boolean {
|
|
67
|
+
return _backend !== NOOP_LOGGER;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Restore the pristine no-op backend (as at module load, before initLogger).
|
|
71
|
+
// Primarily a test seam for exercising the standalone/no-host path.
|
|
72
|
+
export function resetLogger(): void {
|
|
73
|
+
_backend = NOOP_LOGGER;
|
|
74
|
+
_debug = false;
|
|
75
|
+
_timestamps = true;
|
|
76
|
+
_clock = () => new Date().toISOString();
|
|
77
|
+
}
|
|
78
|
+
|
|
63
79
|
// Format one log line: "<iso> remnic: <msg>" when timestamps are enabled,
|
|
64
80
|
// otherwise the legacy "remnic: <msg>". Timestamp is per-call.
|
|
65
81
|
function fmt(msg: string, label = "remnic"): string {
|