@remnic/core 9.7.15 → 9.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.d.ts +13 -6
- package/dist/access-admin-ops-surface.js +85 -71
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +35 -17
- package/dist/access-boundary.js +86 -74
- package/dist/access-citation.d.ts +28 -0
- package/dist/access-citation.js +9 -0
- package/dist/access-cli.js +194 -178
- package/dist/access-cli.js.map +1 -1
- package/dist/access-errors.d.ts +16 -1
- package/dist/access-errors.js +7 -3
- package/dist/access-http.d.ts +25 -19
- package/dist/access-http.js +100 -87
- package/dist/access-identity-continuity-surface.d.ts +13 -8
- package/dist/access-identity-continuity-surface.js +85 -71
- package/dist/access-lcm-surface.d.ts +16 -9
- package/dist/access-lcm-surface.js +85 -71
- package/dist/access-mcp.d.ts +23 -16
- package/dist/access-mcp.js +96 -84
- package/dist/access-memory-search-fanout.d.ts +93 -0
- package/dist/access-memory-search-fanout.js +18 -0
- package/dist/access-observe-write-surface.d.ts +26 -8
- package/dist/access-observe-write-surface.js +85 -71
- package/dist/access-operations-batch.js +92 -80
- package/dist/access-operations.d.ts +29 -22
- package/dist/access-operations.js +94 -82
- package/dist/access-recall-concurrency.d.ts +250 -0
- package/dist/access-recall-concurrency.js +157 -0
- package/dist/access-recall-response.d.ts +130 -0
- package/dist/access-recall-response.js +147 -0
- package/dist/access-recall-surface.d.ts +15 -7
- package/dist/access-recall-surface.js +85 -71
- package/dist/access-schema.d.ts +98 -98
- package/dist/access-schema.js +8 -6
- package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DEL4qCrc.d.ts} +25 -32
- package/dist/access-service.d.ts +13 -6
- package/dist/access-service.js +89 -72
- package/dist/access-surface-catalog.d.ts +23 -16
- package/dist/access-surface-catalog.js +1 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-token-capabilities.d.ts +2 -1
- package/dist/access-token-capabilities.js +4 -2
- package/dist/action-confidence.d.ts +3 -1
- package/dist/active-memory-bridge.d.ts +3 -1
- package/dist/active-memory-bridge.js +4 -4
- package/dist/active-recall.d.ts +4 -1
- package/dist/active-recall.js +23 -13
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
- package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
- package/dist/behavior-learner.d.ts +3 -1
- package/dist/behavior-signals.d.ts +3 -1
- package/dist/bootstrap.d.ts +12 -7
- package/dist/bootstrap.js +2 -2
- package/dist/bounded-jsonl-state.d.ts +54 -0
- package/dist/bounded-jsonl-state.js +10 -0
- package/dist/boxes.js +2 -2
- package/dist/briefing.d.ts +5 -2
- package/dist/briefing.js +34 -24
- package/dist/buffer-surprise-report.d.ts +3 -1
- package/dist/buffer.d.ts +60 -2
- package/dist/buffer.js +3 -3
- package/dist/bulk-import/index.d.ts +5 -3
- package/dist/calibration.d.ts +3 -1
- package/dist/calibration.js +6 -6
- package/dist/capabilities.d.ts +7 -7
- package/dist/capabilities.js +1 -1
- package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
- package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
- package/dist/{catalog-C9444P10.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +3 -1
- package/dist/causal-behavior.js +6 -6
- package/dist/causal-chain.js +4 -4
- package/dist/causal-consolidation.d.ts +3 -1
- package/dist/causal-consolidation.js +43 -34
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +6 -6
- package/dist/causal-trajectory-graph.d.ts +3 -1
- package/dist/causal-trajectory-graph.js +1 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
- package/dist/chunk-2CGLBUW3.js +15 -0
- package/dist/chunk-2CGLBUW3.js.map +1 -0
- package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
- package/dist/{chunk-QKQYXZVS.js → chunk-2EJOEICD.js} +1819 -1481
- package/dist/chunk-2EJOEICD.js.map +1 -0
- package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
- package/dist/{chunk-VJVNLNDQ.js → chunk-2UFO7X4Q.js} +7 -7
- package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
- package/dist/chunk-2Z24E5W2.js +22 -0
- package/dist/chunk-2Z24E5W2.js.map +1 -0
- package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
- package/dist/{chunk-HDTQVNWD.js → chunk-3QAH2S33.js} +3 -3
- package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
- package/dist/chunk-3WCASNQZ.js.map +1 -0
- package/dist/{chunk-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
- package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
- package/dist/chunk-44XZ75OQ.js.map +1 -0
- package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
- package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
- package/dist/chunk-4BJQODZF.js.map +1 -0
- package/dist/{chunk-JREB6UFH.js → chunk-57OWKFUQ.js} +17 -6
- package/dist/chunk-57OWKFUQ.js.map +1 -0
- package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
- package/dist/{chunk-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
- package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
- package/dist/chunk-5SB7SC2G.js.map +1 -0
- package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
- package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
- package/dist/chunk-6KIQT7RG.js.map +1 -0
- package/dist/{chunk-FDCTQWLW.js → chunk-6O22TZSB.js} +3 -3
- package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
- package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
- package/dist/chunk-6ZMAMSHS.js +20 -0
- package/dist/chunk-6ZMAMSHS.js.map +1 -0
- package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
- package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
- package/dist/chunk-72VAXGEI.js.map +1 -0
- package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
- package/dist/chunk-755Q3DGF.js.map +1 -0
- package/dist/{chunk-OVJ2HIPE.js → chunk-76GLCM57.js} +158 -125
- package/dist/chunk-76GLCM57.js.map +1 -0
- package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
- package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
- package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
- package/dist/chunk-7ON2JW73.js.map +1 -0
- package/dist/chunk-7RNBVZZO.js +270 -0
- package/dist/chunk-7RNBVZZO.js.map +1 -0
- package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
- package/dist/{chunk-ZHIVCODT.js → chunk-A72SWTWW.js} +7 -7
- package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
- package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
- package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
- package/dist/chunk-AIK5W3IW.js.map +1 -0
- package/dist/{chunk-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
- package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
- package/dist/chunk-AREGMX2J.js +50 -0
- package/dist/chunk-AREGMX2J.js.map +1 -0
- package/dist/chunk-AVPXXV6J.js +448 -0
- package/dist/chunk-AVPXXV6J.js.map +1 -0
- package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
- package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
- package/dist/chunk-BJMBJZ2Y.js.map +1 -0
- package/dist/{chunk-74F5STS4.js → chunk-BLAKS3CP.js} +4 -4
- package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
- package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
- package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
- package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
- package/dist/{chunk-T7Y5KPLN.js → chunk-C6XBRYVD.js} +16 -15
- package/dist/chunk-C6XBRYVD.js.map +1 -0
- package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
- package/dist/chunk-CEN6DW6X.js.map +1 -0
- package/dist/chunk-CGASUJVP.js +421 -0
- package/dist/chunk-CGASUJVP.js.map +1 -0
- package/dist/{chunk-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
- package/dist/{chunk-PBNZVPFS.js → chunk-CXZQOVIE.js} +12 -12
- package/dist/chunk-D3V3UMET.js +44 -0
- package/dist/chunk-D3V3UMET.js.map +1 -0
- package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
- package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
- package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
- package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
- package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
- package/dist/chunk-EA2H5LML.js +72 -0
- package/dist/chunk-EA2H5LML.js.map +1 -0
- package/dist/{chunk-INELTPRG.js → chunk-EEC7UJPX.js} +103 -106
- package/dist/chunk-EEC7UJPX.js.map +1 -0
- package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
- package/dist/chunk-EKBNDKDY.js.map +1 -0
- package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
- package/dist/chunk-EQWEIIKQ.js.map +1 -0
- package/dist/{chunk-DZKHSDOM.js → chunk-ES36HTSC.js} +4 -4
- package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
- package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
- package/dist/chunk-FMLKOL2Z.js +636 -0
- package/dist/chunk-FMLKOL2Z.js.map +1 -0
- package/dist/chunk-FQC3DHH2.js +20 -0
- package/dist/chunk-FQC3DHH2.js.map +1 -0
- package/dist/{chunk-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
- package/dist/chunk-GCASGYIO.js +71 -0
- package/dist/chunk-GCASGYIO.js.map +1 -0
- package/dist/{chunk-HF77M34J.js → chunk-GFPZS3F5.js} +8 -8
- package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
- package/dist/chunk-GNVZQ5JN.js.map +1 -0
- package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
- package/dist/{chunk-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
- package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
- package/dist/{chunk-OAZVR2BV.js → chunk-IDZFBSHN.js} +8 -6
- package/dist/{chunk-OAZVR2BV.js.map → chunk-IDZFBSHN.js.map} +1 -1
- package/dist/{chunk-PLQE6MJA.js → chunk-IFH6LWTO.js} +50 -8
- package/dist/chunk-IFH6LWTO.js.map +1 -0
- package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
- package/dist/chunk-ILGC6JH6.js.map +1 -0
- package/dist/chunk-IUM3VSHI.js +113 -0
- package/dist/chunk-IUM3VSHI.js.map +1 -0
- package/dist/{chunk-DCFV7A7H.js → chunk-IYNGIMVG.js} +101 -91
- package/dist/chunk-IYNGIMVG.js.map +1 -0
- package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
- package/dist/{chunk-E6CBU7XP.js → chunk-JYIFGGEM.js} +2 -2
- package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
- package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
- package/dist/{chunk-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
- package/dist/{chunk-BS4SGLWV.js → chunk-KF5EUVKQ.js} +16 -6
- package/dist/chunk-KF5EUVKQ.js.map +1 -0
- package/dist/chunk-KFZY2OFH.js +42 -0
- package/dist/chunk-KFZY2OFH.js.map +1 -0
- package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
- package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
- package/dist/{chunk-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
- package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
- package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
- package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
- package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
- package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
- package/dist/{chunk-QQGPUKMT.js → chunk-MC5Q3J7S.js} +398 -7
- package/dist/chunk-MC5Q3J7S.js.map +1 -0
- package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
- package/dist/chunk-MKQBXQKU.js +107 -0
- package/dist/chunk-MKQBXQKU.js.map +1 -0
- package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
- package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
- package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
- package/dist/{chunk-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
- package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
- package/dist/chunk-NINSR6LX.js +83 -0
- package/dist/chunk-NINSR6LX.js.map +1 -0
- package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
- package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
- package/dist/{chunk-VDW4VU7B.js → chunk-OQJIB32H.js} +28 -23
- package/dist/chunk-OQJIB32H.js.map +1 -0
- package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
- package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
- package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
- package/dist/chunk-PIG4WJFQ.js +87 -0
- package/dist/chunk-PIG4WJFQ.js.map +1 -0
- package/dist/chunk-PQVCH2AE.js +76 -0
- package/dist/chunk-PQVCH2AE.js.map +1 -0
- package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
- package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
- package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
- package/dist/{chunk-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
- package/dist/chunk-QJAQNXWI.js.map +1 -0
- package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
- package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
- package/dist/{chunk-FIJUY7GG.js.map → chunk-R26ZMXR2.js.map} +1 -1
- package/dist/chunk-R3DJVOSM.js +34 -0
- package/dist/chunk-R3DJVOSM.js.map +1 -0
- package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
- package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
- package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/chunk-ROI7BK7H.js +88 -0
- package/dist/chunk-ROI7BK7H.js.map +1 -0
- package/dist/{chunk-FNZQGN76.js → chunk-S2BBISHU.js} +4 -4
- package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
- package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
- package/dist/chunk-SCCO46KZ.js.map +1 -0
- package/dist/chunk-SICXL4MK.js +165 -0
- package/dist/chunk-SICXL4MK.js.map +1 -0
- package/dist/chunk-SK7AMF2J.js +168 -0
- package/dist/chunk-SK7AMF2J.js.map +1 -0
- package/dist/{chunk-LZOV7MX7.js → chunk-TDTXKOAJ.js} +6474 -5747
- package/dist/chunk-TDTXKOAJ.js.map +1 -0
- package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
- package/dist/chunk-TG6IHVE2.js.map +1 -0
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-DPAENM7O.js → chunk-U3ZAVRP3.js} +2 -2
- package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
- package/dist/chunk-UFGFMWAD.js.map +1 -0
- package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
- package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-AJLLIIML.js → chunk-W4FBGYGK.js} +1 -1
- package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
- package/dist/chunk-W4XJFLAL.js.map +1 -0
- package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
- package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
- package/dist/chunk-WG5HSQ4P.js.map +1 -0
- package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
- package/dist/chunk-WL5EBRDH.js.map +1 -0
- package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
- package/dist/{chunk-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
- package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
- package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
- package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
- package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
- package/dist/chunk-YV32N67O.js.map +1 -0
- package/dist/{chunk-PBSAPHHA.js → chunk-YVKF3HEW.js} +1 -1
- package/dist/chunk-YVKF3HEW.js.map +1 -0
- package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
- package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
- package/dist/chunk-ZOKZIR5K.js.map +1 -0
- package/dist/{cli-Cd5fMmhq.d.ts → cli-C_pqqTCw.d.ts} +28 -12
- package/dist/cli.d.ts +16 -9
- package/dist/cli.js +142 -127
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +36 -26
- package/dist/compounding/preference-consolidator.d.ts +3 -1
- package/dist/compounding/preference-consolidator.js +1 -1
- package/dist/compression-optimizer.d.ts +3 -1
- package/dist/config-qmd.d.ts +8 -0
- package/dist/config-qmd.js +20 -0
- package/dist/config-qmd.js.map +1 -0
- package/dist/config.d.ts +3 -1
- package/dist/config.js +15 -10
- package/dist/connectors/codex-materialize-runner.d.ts +3 -1
- package/dist/connectors/codex-materialize-runner.js +36 -26
- package/dist/connectors/codex-materialize.d.ts +3 -1
- package/dist/connectors/codex-materialize.js +2 -2
- package/dist/connectors/index.d.ts +3 -1
- package/dist/connectors/index.js +41 -32
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-undo.d.ts +5 -2
- package/dist/contradiction/index.d.ts +5 -2
- package/dist/contradiction/index.js +10 -4
- package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
- package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/backend.js +5 -5
- package/dist/conversation-index/chunker.d.ts +3 -1
- package/dist/conversation-index/cleanup.js +2 -2
- package/dist/conversation-index/faiss-adapter.d.ts +3 -1
- package/dist/conversation-index/faiss-adapter.js +2 -2
- package/dist/conversation-index/indexer.d.ts +3 -1
- package/dist/conversation-index/indexer.js +2 -2
- package/dist/conversation-index/search.d.ts +3 -1
- package/dist/conversation-index/search.js +2 -2
- package/dist/cross-namespace-budget.d.ts +45 -1
- package/dist/cross-namespace-budget.js +5 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +3 -1
- package/dist/day-summary.js +3 -3
- package/dist/delinearize.d.ts +3 -1
- package/dist/direct-answer-wiring.d.ts +3 -1
- package/dist/direct-answer.d.ts +3 -1
- package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
- package/dist/dreams-ledger-567VKVOU.js.map +1 -0
- package/dist/embedding-fallback.d.ts +3 -1
- package/dist/embedding-fallback.js +3 -3
- package/dist/enrichment/index.d.ts +3 -1
- package/dist/entity-retrieval.d.ts +5 -2
- package/dist/entity-retrieval.js +35 -26
- package/dist/entity-schema.d.ts +3 -1
- package/dist/explicit-capture.d.ts +13 -8
- package/dist/explicit-capture.js +7 -3
- package/dist/extraction-faithfulness.d.ts +3 -1
- package/dist/extraction-faithfulness.js +5 -5
- package/dist/extraction-judge-telemetry.d.ts +3 -1
- package/dist/extraction-judge-telemetry.js +2 -2
- package/dist/extraction-judge-training.d.ts +3 -1
- package/dist/extraction-judge-training.js +2 -2
- package/dist/extraction-judge.d.ts +3 -1
- package/dist/extraction-judge.js +5 -5
- package/dist/extraction.d.ts +3 -1
- package/dist/extraction.js +13 -12
- package/dist/faithfulness-config.js +3 -2
- package/dist/fallback-llm.d.ts +3 -1
- package/dist/fallback-llm.js +4 -4
- package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
- package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
- package/dist/graph-dashboard-diff.d.ts +3 -1
- package/dist/graph-dashboard-key.d.ts +3 -1
- package/dist/graph-dashboard-parser.d.ts +3 -1
- package/dist/{graph-edge-decay-IOGBBAGC.js → graph-edge-decay-Z6ENALU2.js} +3 -3
- package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +3 -1
- package/dist/graph-snapshot.d.ts +3 -1
- package/dist/graph-snapshot.js +2 -2
- package/dist/graph.d.ts +3 -1
- package/dist/graph.js +1 -1
- package/dist/identity-continuity.d.ts +1 -2
- package/dist/importance.d.ts +3 -1
- package/dist/importers/index.d.ts +3 -1
- package/dist/in-flight-reads.d.ts +3 -1
- package/dist/index.d.ts +473 -464
- package/dist/index.js +287 -239
- package/dist/intent.d.ts +3 -1
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +3 -1
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.d.ts +3 -1
- package/dist/lcm/index.js +13 -13
- package/dist/lcm/schema.js +2 -2
- package/dist/lcm/summarizer.js +3 -3
- package/dist/lcm/tools.d.ts +3 -1
- package/dist/lifecycle.d.ts +3 -1
- package/dist/live-connectors-runner.d.ts +3 -1
- package/dist/local-llm.d.ts +5 -2
- package/dist/local-llm.js +3 -3
- package/dist/local-model-endpoint.d.ts +3 -1
- package/dist/logger.d.ts +3 -1
- package/dist/logger.js +7 -3
- package/dist/maintenance/archive-observations.js +2 -2
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +35 -25
- package/dist/maintenance/migrate-observations.js +3 -3
- package/dist/maintenance/observation-ledger-utils.js +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +37 -25
- package/dist/maintenance/rebuild-memory-projection.js +38 -28
- package/dist/maintenance/rebuild-observations.js +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +22 -15
- package/dist/memory-action-policy.d.ts +3 -1
- package/dist/memory-cache.d.ts +3 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
- package/dist/memory-lifecycle-ledger-utils.js +11 -1
- package/dist/memory-projection-store.d.ts +3 -1
- package/dist/memory-projection-store.js +2 -2
- package/dist/memory-provenance.d.ts +3 -1
- package/dist/memory-worth-outcomes.d.ts +5 -2
- package/dist/model-registry.js +2 -2
- package/dist/models-json.d.ts +3 -1
- package/dist/models-json.js +2 -2
- package/dist/namespaces/migrate.d.ts +6 -3
- package/dist/namespaces/migrate.js +51 -42
- package/dist/namespaces/principal.d.ts +27 -2
- package/dist/namespaces/principal.js +6 -2
- package/dist/namespaces/search.d.ts +16 -2
- package/dist/namespaces/search.js +24 -20
- package/dist/namespaces/storage.d.ts +24 -3
- package/dist/namespaces/storage.js +35 -27
- package/dist/native-knowledge.d.ts +3 -1
- package/dist/native-knowledge.js +2 -2
- package/dist/negative.js +2 -2
- package/dist/offline-sync-exclude-globs.d.ts +13 -0
- package/dist/offline-sync-exclude-globs.js +10 -0
- package/dist/offline-sync-exclude-globs.js.map +1 -0
- package/dist/offline-sync-impression-drain.d.ts +78 -0
- package/dist/offline-sync-impression-drain.js +37 -0
- package/dist/offline-sync-impression-drain.js.map +1 -0
- package/dist/offline-sync.js +4 -2
- package/dist/operator-toolkit.d.ts +5 -2
- package/dist/operator-toolkit.js +69 -54
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
- package/dist/orchestration/compression-guideline-coordinator.js +3 -3
- package/dist/orchestration/maintenance.d.ts +121 -2
- package/dist/orchestration/maintenance.js +44 -31
- package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
- package/dist/orchestrator.d.ts +13 -8
- package/dist/orchestrator.js +194 -177
- package/dist/patterns-cli.d.ts +3 -1
- package/dist/{pipeline-BAj5bx7g.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +3 -1
- package/dist/prioritized-embed.d.ts +19 -0
- package/dist/prioritized-embed.js +8 -0
- package/dist/prioritized-embed.js.map +1 -0
- package/dist/proactive-contention.d.ts +28 -0
- package/dist/proactive-contention.js +8 -0
- package/dist/proactive-contention.js.map +1 -0
- package/dist/profiling.js +2 -2
- package/dist/provenance.d.ts +3 -1
- package/dist/provenance.js +3 -2
- package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
- package/dist/{qmd-_MDSlj1m.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
- package/dist/qmd-preflight.d.ts +5 -2
- package/dist/qmd-recall-cache.d.ts +3 -1
- package/dist/qmd-status.d.ts +57 -0
- package/dist/qmd-status.js +18 -0
- package/dist/qmd-status.js.map +1 -0
- package/dist/qmd.d.ts +5 -2
- package/dist/qmd.js +7 -3
- package/dist/recall-concurrency-config.d.ts +16 -0
- package/dist/recall-concurrency-config.js +10 -0
- package/dist/recall-concurrency-config.js.map +1 -0
- package/dist/recall-disclosure-escalation.d.ts +3 -1
- package/dist/recall-explain-renderer.d.ts +4 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +26 -0
- package/dist/recall-memory-map.js +18 -0
- package/dist/recall-memory-map.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +3 -1
- package/dist/recall-planner-llm.js +4 -4
- package/dist/recall-qos.js +2 -2
- package/dist/recall-state.d.ts +163 -2
- package/dist/recall-state.js +6 -3
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-timings.d.ts +11 -2
- package/dist/recall-timings.js +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +3 -1
- package/dist/recall-xray.js +2 -2
- package/dist/relevance.js +3 -3
- package/dist/replay/normalizers/chatgpt.d.ts +3 -1
- package/dist/replay/normalizers/claude.d.ts +3 -1
- package/dist/replay/normalizers/openclaw.d.ts +3 -1
- package/dist/replay/normalizers/shared.d.ts +3 -1
- package/dist/replay/runner.d.ts +3 -1
- package/dist/replay/types.d.ts +3 -1
- package/dist/rerank.d.ts +8 -1
- package/dist/rerank.js +3 -1
- package/dist/resolution-3K27T4VO.js +18 -0
- package/dist/resolution-3K27T4VO.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +3 -1
- package/dist/resolve-provider-secret.js +2 -2
- package/dist/resume-bundles.js +19 -14
- package/dist/retrieval-agents.d.ts +19 -16
- package/dist/retrieval-agents.js +3 -3
- package/dist/retrieval-tiers.d.ts +3 -1
- package/dist/routing/engine.d.ts +3 -1
- package/dist/routing/store.d.ts +3 -1
- package/dist/routing/store.js +2 -2
- package/dist/salvage-envelope.d.ts +18 -0
- package/dist/salvage-envelope.js +15 -0
- package/dist/salvage-envelope.js.map +1 -0
- package/dist/schemas.d.ts +98 -98
- package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
- package/dist/search/document-scanner.js +3 -2
- package/dist/search/embed-helper.d.ts +3 -1
- package/dist/search/embed-helper.js +3 -3
- package/dist/search/factory.d.ts +3 -1
- package/dist/search/factory.js +18 -16
- package/dist/search/index.d.ts +3 -1
- package/dist/search/index.js +22 -20
- package/dist/search/lancedb-backend.d.ts +3 -1
- package/dist/search/lancedb-backend.js +6 -5
- package/dist/search/meilisearch-backend.d.ts +3 -1
- package/dist/search/meilisearch-backend.js +6 -5
- package/dist/search/noop-backend.d.ts +3 -1
- package/dist/search/orama-backend.d.ts +3 -1
- package/dist/search/orama-backend.js +6 -5
- package/dist/search/port.d.ts +16 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +3 -1
- package/dist/search/remote-backend.js +3 -3
- package/dist/secure-store/index.d.ts +12 -1
- package/dist/secure-store/index.js +6 -3
- package/dist/{semantic-consolidation-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +4 -2
- package/dist/semantic-consolidation.js +38 -29
- package/dist/semantic-rule-promotion.js +34 -24
- package/dist/semantic-rule-verifier.d.ts +3 -1
- package/dist/semantic-rule-verifier.js +35 -25
- package/dist/session-observer-bands.d.ts +3 -1
- package/dist/session-observer-state.d.ts +3 -1
- package/dist/session-observer-state.js +2 -2
- package/dist/session-transcript-migration.js +2 -2
- package/dist/shared-context/manager.d.ts +11 -9
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +3 -1
- package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
- package/dist/storage-guards.js +2 -2
- package/dist/storage.d.ts +6 -3
- package/dist/storage.js +38 -26
- package/dist/structured-attributes.d.ts +23 -1
- package/dist/structured-attributes.js +7 -1
- package/dist/summarizer.d.ts +3 -1
- package/dist/summarizer.js +11 -11
- package/dist/summary-snapshot.d.ts +3 -1
- package/dist/summary-snapshot.js +2 -2
- package/dist/temporal-index-batch.d.ts +1 -0
- package/dist/temporal-index-batch.js +10 -0
- package/dist/temporal-index-batch.js.map +1 -0
- package/dist/temporal-index-compat.d.ts +279 -1
- package/dist/temporal-index-compat.js +1 -1
- package/dist/temporal-index.d.ts +1 -225
- package/dist/temporal-index.js +35 -3
- package/dist/temporal-supersession.d.ts +5 -2
- package/dist/temporal-supersession.js +2 -2
- package/dist/temporal-timeline-recall.d.ts +3 -1
- package/dist/temporal-validity.d.ts +3 -1
- package/dist/threading.d.ts +3 -1
- package/dist/threading.js +2 -2
- package/dist/tier-migration.d.ts +5 -2
- package/dist/tier-routing.d.ts +3 -1
- package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
- package/dist/tokens.js +3 -3
- package/dist/topics.d.ts +3 -1
- package/dist/transcript.d.ts +3 -1
- package/dist/transcript.js +2 -2
- package/dist/transfer/backup.js +3 -3
- package/dist/transfer/capsule-export.js +3 -3
- package/dist/transfer/capsule-import.js +3 -3
- package/dist/transfer/types.d.ts +90 -90
- package/dist/trust-score-stage.d.ts +75 -38
- package/dist/trust-score-stage.js +11 -3
- package/dist/trust-score.d.ts +3 -1
- package/dist/{types-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -63
- package/dist/types-continuity.d.ts +52 -0
- package/dist/types-continuity.js +1 -0
- package/dist/types-continuity.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +3 -1
- package/dist/utils/serialize-mutations.d.ts +31 -2
- package/dist/utils/serialize-mutations.js +1 -1
- package/dist/verified-recall.js +36 -26
- package/dist/write-envelope.d.ts +282 -0
- package/dist/write-envelope.js +35 -0
- package/dist/write-envelope.js.map +1 -0
- package/dist/write-quarantine.d.ts +79 -0
- package/dist/write-quarantine.js +11 -0
- package/dist/write-quarantine.js.map +1 -0
- package/dist/write-rate-limiter.d.ts +45 -0
- package/dist/write-rate-limiter.js +9 -0
- package/dist/write-rate-limiter.js.map +1 -0
- package/package.json +37 -2
- package/src/access-admin-ops-surface.ts +17 -7
- package/src/access-boundary.test.ts +28 -0
- package/src/access-boundary.ts +31 -2
- package/src/access-citation.test.ts +72 -0
- package/src/access-citation.ts +139 -0
- package/src/access-errors.ts +21 -0
- package/src/access-fingerprint-parity.test.ts +211 -0
- package/src/access-http-cancellation.test.ts +59 -21
- package/src/access-http.test.ts +90 -0
- package/src/access-http.ts +79 -79
- package/src/access-mcp-cancellation.test.ts +16 -7
- package/src/access-memory-search-fanout.test.ts +220 -0
- package/src/access-memory-search-fanout.ts +168 -0
- package/src/access-observe-quarantine.test.ts +120 -0
- package/src/access-observe-write-surface.ts +130 -11
- package/src/access-operations-batch.ts +2 -0
- package/src/access-recall-concurrency.ts +773 -0
- package/src/access-recall-response.ts +307 -0
- package/src/access-recall-surface.ts +100 -252
- package/src/access-service-coding-write.test.ts +22 -4
- package/src/access-service-health.test.ts +49 -0
- package/src/access-service-namespace.test.ts +486 -8
- package/src/access-service-observe-scope.test.ts +4 -0
- package/src/access-service-recall-concurrency.test.ts +1990 -0
- package/src/access-service.ts +182 -175
- package/src/access-surface-catalog.ts +1 -0
- package/src/access-token-capabilities.ts +16 -9
- package/src/active-recall.test.ts +35 -0
- package/src/active-recall.ts +7 -0
- package/src/bounded-jsonl-state.ts +93 -0
- package/src/buffer-session.test.ts +422 -5
- package/src/buffer-surprise-trigger.test.ts +41 -0
- package/src/buffer.ts +218 -3
- package/src/capabilities-cluster-b.test.ts +1 -0
- package/src/capabilities.ts +5 -6
- package/src/cli.ts +21 -22
- package/src/coding/architecture-surfaces.test.ts +6 -3
- package/src/coding/architecture-surfaces.ts +36 -25
- package/src/coding/decision-surfaces.ts +42 -34
- package/src/compounding/engine.test.ts +5 -1
- package/src/compounding/engine.ts +7 -7
- package/src/config-qmd.ts +89 -0
- package/src/config.test.ts +136 -0
- package/src/config.ts +113 -118
- package/src/connector-provenance-lifecycle.test.ts +4 -4
- package/src/connectors/coerce.test.ts +131 -0
- package/src/connectors/coerce.ts +80 -7
- package/src/contradiction/contradiction.test.ts +10 -6
- package/src/contradiction/resolution.ts +17 -4
- package/src/correction/correction-access-wiring.ts +62 -18
- package/src/cross-namespace-budget.test.ts +35 -0
- package/src/cross-namespace-budget.ts +86 -19
- package/src/explicit-capture.ts +54 -17
- package/src/extraction.ts +2 -3
- package/src/faithfulness-graph-guard.test.ts +16 -69
- package/src/graph-recall.test.ts +31 -0
- package/src/index.ts +22 -2
- package/src/local-llm.ts +4 -6
- package/src/logger.ts +16 -0
- package/src/maintenance/dreams-ledger.ts +100 -49
- package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
- package/src/memory-lifecycle-ledger-utils.ts +51 -5
- package/src/namespaces/principal.test.ts +37 -1
- package/src/namespaces/principal.ts +48 -0
- package/src/namespaces/search.test.ts +79 -5
- package/src/namespaces/search.ts +59 -6
- package/src/namespaces/storage.ts +43 -1
- package/src/offline-sync-exclude-globs.ts +58 -0
- package/src/offline-sync-impression-drain.test.ts +316 -0
- package/src/offline-sync-impression-drain.ts +260 -0
- package/src/offline-sync.test.ts +32 -5
- package/src/offline-sync.ts +1 -14
- package/src/operator-toolkit.ts +1 -1
- package/src/orchestration/batch-deindex-flush.test.ts +146 -0
- package/src/orchestration/consolidation-run.ts +96 -85
- package/src/orchestration/extraction-envelope.ts +94 -0
- package/src/orchestration/extraction-persist-promotion.ts +134 -0
- package/src/orchestration/extraction-persist.ts +325 -260
- package/src/orchestration/extraction-run.test.ts +1 -1
- package/src/orchestration/extraction-run.ts +2 -2
- package/src/orchestration/graph-recall-coordinator.ts +18 -7
- package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
- package/src/orchestration/maintenance.test.ts +2103 -3
- package/src/orchestration/maintenance.ts +574 -2
- package/src/orchestration/namespace-read-fanout.ts +14 -8
- package/src/orchestration/orchestrator-helpers.ts +8 -1
- package/src/orchestration/orchestrator-init.ts +22 -6
- package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
- package/src/orchestration/persistence-index.ts +64 -9
- package/src/orchestration/qmd-result-resolver.ts +27 -0
- package/src/orchestration/recall-entry.ts +34 -19
- package/src/orchestration/recall-internal.ts +207 -79
- package/src/orchestration/recall-rerank-coordinator.ts +229 -82
- package/src/orchestration/recall-result-formatter.ts +76 -20
- package/src/orchestration/recall-search-pipeline.test.ts +70 -0
- package/src/orchestration/recall-search-pipeline.ts +102 -129
- package/src/orchestration/recall-section-coordinator.ts +315 -85
- package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
- package/src/orchestration/session-context.ts +21 -0
- package/src/orchestration/workspace-ops.test.ts +348 -0
- package/src/orchestration/workspace-ops.ts +168 -34
- package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
- package/src/orchestrator-connector-dedup.test.ts +1061 -40
- package/src/orchestrator-flush.test.ts +155 -39
- package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
- package/src/orchestrator-source-attribution.test.ts +9 -9
- package/src/orchestrator.ts +160 -149
- package/src/prioritized-embed.ts +123 -0
- package/src/proactive-contention.test.ts +80 -0
- package/src/proactive-contention.ts +39 -0
- package/src/procedural/procedure-miner.test.ts +19 -14
- package/src/procedural/procedure-miner.ts +44 -13
- package/src/qmd-client.test.ts +111 -1
- package/src/qmd-status.ts +186 -0
- package/src/qmd.ts +47 -47
- package/src/recall-budget-config.test.ts +30 -0
- package/src/recall-cold-deadline.test.ts +149 -0
- package/src/recall-concurrency-config.ts +28 -0
- package/src/recall-memory-map.ts +74 -0
- package/src/recall-rerank-coordinator.test.ts +508 -0
- package/src/recall-state.test.ts +825 -1
- package/src/recall-state.ts +406 -7
- package/src/recall-timings-access.test.ts +41 -0
- package/src/recall-timings.ts +16 -0
- package/src/relay/mission-access.test.ts +5 -5
- package/src/rerank.ts +22 -0
- package/src/retrieval-agents.test.ts +79 -0
- package/src/retrieval-agents.ts +71 -19
- package/src/salvage-envelope.ts +28 -0
- package/src/scopes/scope-plan.test.ts +42 -0
- package/src/scopes/scope-plan.ts +45 -0
- package/src/search/port.ts +13 -0
- package/src/secure-store/index.ts +1 -0
- package/src/secure-store/secure-fs.ts +48 -0
- package/src/secure-store/secure-store.test.ts +40 -0
- package/src/semantic-rule-promotion.ts +13 -4
- package/src/storage/content-hash-index.ts +655 -0
- package/src/storage/entity-timeline.ts +473 -0
- package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
- package/src/storage/secure-line-reader.test.ts +197 -0
- package/src/storage/secure-line-reader.ts +181 -3
- package/src/storage-append-header-sniff.test.ts +195 -0
- package/src/storage-behavior-signals-cache.test.ts +237 -0
- package/src/storage-contract/cache-coherence.test.ts +96 -1
- package/src/storage-contract/content-hash.test.ts +47 -2
- package/src/storage-fact-hash-index-defer.test.ts +1200 -0
- package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
- package/src/storage.ts +882 -890
- package/src/structured-attributes.ts +52 -0
- package/src/temporal-index-batch.ts +112 -0
- package/src/temporal-index.test.ts +193 -0
- package/src/temporal-index.ts +49 -53
- package/src/testing/lifecycle-matrix.test.ts +212 -0
- package/src/testing/lifecycle-matrix.ts +271 -0
- package/src/testing/orchestrator-lite.ts +236 -0
- package/src/testing/subjects/dreams-ledger.test.ts +67 -0
- package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
- package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
- package/src/testing/subjects/recall-budget.test.ts +461 -0
- package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
- package/src/trust-score-stage.test.ts +154 -0
- package/src/trust-score-stage.ts +216 -53
- package/src/types-continuity.ts +57 -0
- package/src/types.ts +51 -77
- package/src/utils/path-containment.test.ts +75 -0
- package/src/utils/path-containment.ts +76 -0
- package/src/utils/serialize-mutations.test.ts +122 -0
- package/src/utils/serialize-mutations.ts +68 -3
- package/src/wearables/memory-gen.test.ts +31 -9
- package/src/wearables/memory-gen.ts +95 -55
- package/src/wearables/pipeline.test.ts +10 -7
- package/src/wearables/service.test.ts +6 -8
- package/src/wearables/service.ts +2 -2
- package/src/write-envelope.extension.test.ts +111 -0
- package/src/write-envelope.test.ts +683 -0
- package/src/write-envelope.ts +902 -0
- package/src/write-quarantine.test.ts +193 -0
- package/src/write-quarantine.ts +241 -0
- package/src/write-rate-limiter.test.ts +105 -0
- package/src/write-rate-limiter.ts +135 -0
- package/src/write-sealed-parity.test.ts +204 -0
- package/dist/chunk-2VN4JAX7.js.map +0 -1
- package/dist/chunk-37CTGERM.js.map +0 -1
- package/dist/chunk-3IY64MV6.js.map +0 -1
- package/dist/chunk-BCDKBDSY.js.map +0 -1
- package/dist/chunk-BFPETA3S.js.map +0 -1
- package/dist/chunk-BFVEEB7W.js.map +0 -1
- package/dist/chunk-BS4SGLWV.js.map +0 -1
- package/dist/chunk-DCFV7A7H.js.map +0 -1
- package/dist/chunk-DYP3YYJJ.js.map +0 -1
- package/dist/chunk-E5BK6CGV.js +0 -335
- package/dist/chunk-E5BK6CGV.js.map +0 -1
- package/dist/chunk-FTYDWKO6.js.map +0 -1
- package/dist/chunk-GWTFLF2P.js.map +0 -1
- package/dist/chunk-IKQTFQMI.js.map +0 -1
- package/dist/chunk-INELTPRG.js.map +0 -1
- package/dist/chunk-J2HSAU72.js.map +0 -1
- package/dist/chunk-JREB6UFH.js.map +0 -1
- package/dist/chunk-K7LOWSLU.js.map +0 -1
- package/dist/chunk-KQDNAXOM.js.map +0 -1
- package/dist/chunk-KSBEEMQF.js.map +0 -1
- package/dist/chunk-KSNVDPDF.js.map +0 -1
- package/dist/chunk-LC7OODWZ.js.map +0 -1
- package/dist/chunk-LTJAMRGI.js.map +0 -1
- package/dist/chunk-LZOV7MX7.js.map +0 -1
- package/dist/chunk-NWTGD4AN.js.map +0 -1
- package/dist/chunk-ODPLEWB6.js.map +0 -1
- package/dist/chunk-OVJ2HIPE.js.map +0 -1
- package/dist/chunk-PBSAPHHA.js.map +0 -1
- package/dist/chunk-PHK3HARR.js +0 -32
- package/dist/chunk-PHK3HARR.js.map +0 -1
- package/dist/chunk-PLQE6MJA.js.map +0 -1
- package/dist/chunk-QKQYXZVS.js.map +0 -1
- package/dist/chunk-QQGPUKMT.js.map +0 -1
- package/dist/chunk-RANHFI3P.js +0 -8
- package/dist/chunk-RANHFI3P.js.map +0 -1
- package/dist/chunk-RAR2BSEM.js.map +0 -1
- package/dist/chunk-RULE4VG5.js.map +0 -1
- package/dist/chunk-SVOZFLIQ.js +0 -16
- package/dist/chunk-SVOZFLIQ.js.map +0 -1
- package/dist/chunk-T7Y5KPLN.js.map +0 -1
- package/dist/chunk-TXLGHDHS.js.map +0 -1
- package/dist/chunk-VDW4VU7B.js.map +0 -1
- package/dist/chunk-VSMRDBFT.js +0 -17
- package/dist/chunk-VSMRDBFT.js.map +0 -1
- package/dist/chunk-X64YLC24.js.map +0 -1
- package/dist/chunk-XDSXEKYK.js +0 -118
- package/dist/chunk-XDSXEKYK.js.map +0 -1
- package/dist/chunk-YF6FMLBT.js.map +0 -1
- package/dist/resolution-VH4NGENZ.js +0 -12
- /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
- /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
- /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
- /package/dist/{graph-edge-decay-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
- /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
- /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
- /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
- /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
- /package/dist/{chunk-VJVNLNDQ.js.map → chunk-2UFO7X4Q.js.map} +0 -0
- /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
- /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
- /package/dist/{chunk-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
- /package/dist/{chunk-LRNMRXJO.js.map → chunk-3Y224NYC.js.map} +0 -0
- /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
- /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
- /package/dist/{chunk-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
- /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
- /package/dist/{chunk-FDCTQWLW.js.map → chunk-6O22TZSB.js.map} +0 -0
- /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
- /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
- /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
- /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
- /package/dist/{chunk-ZHIVCODT.js.map → chunk-A72SWTWW.js.map} +0 -0
- /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
- /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
- /package/dist/{chunk-A5UXZRRM.js.map → chunk-AJ7QCSIS.js.map} +0 -0
- /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
- /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
- /package/dist/{chunk-74F5STS4.js.map → chunk-BLAKS3CP.js.map} +0 -0
- /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
- /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
- /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
- /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
- /package/dist/{chunk-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
- /package/dist/{chunk-PBNZVPFS.js.map → chunk-CXZQOVIE.js.map} +0 -0
- /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
- /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
- /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
- /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
- /package/dist/{chunk-DZKHSDOM.js.map → chunk-ES36HTSC.js.map} +0 -0
- /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
- /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
- /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
- /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
- /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
- /package/dist/{chunk-UDQUSU27.js.map → chunk-HNZKVLAN.js.map} +0 -0
- /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
- /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
- /package/dist/{chunk-E6CBU7XP.js.map → chunk-JYIFGGEM.js.map} +0 -0
- /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
- /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
- /package/dist/{chunk-KDXVOFYY.js.map → chunk-KAVBJSBQ.js.map} +0 -0
- /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
- /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
- /package/dist/{chunk-2S6QHZGJ.js.map → chunk-L2DPF4DF.js.map} +0 -0
- /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
- /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
- /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
- /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
- /package/dist/{chunk-Q5WG43OP.js.map → chunk-MYFQ3ED4.js.map} +0 -0
- /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
- /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
- /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
- /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
- /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
- /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
- /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
- /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
- /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
- /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
- /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
- /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-FNZQGN76.js.map → chunk-S2BBISHU.js.map} +0 -0
- /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-DPAENM7O.js.map → chunk-U3ZAVRP3.js.map} +0 -0
- /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
- /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-AJLLIIML.js.map → chunk-W4FBGYGK.js.map} +0 -0
- /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
- /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
- /package/dist/{chunk-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
- /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
- /package/dist/{chunk-RVZRYUQH.js.map → chunk-YROFNEG5.js.map} +0 -0
- /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
- /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
- /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
- /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
|
@@ -0,0 +1,636 @@
|
|
|
1
|
+
import {
|
|
2
|
+
writeFileAtomically
|
|
3
|
+
} from "./chunk-R6YJI3HE.js";
|
|
4
|
+
import {
|
|
5
|
+
ensureContainedSpillDir,
|
|
6
|
+
listContainedSpillFiles
|
|
7
|
+
} from "./chunk-GCASGYIO.js";
|
|
8
|
+
import {
|
|
9
|
+
withHeldFileLock
|
|
10
|
+
} from "./chunk-WL5EBRDH.js";
|
|
11
|
+
import {
|
|
12
|
+
isErrnoCode
|
|
13
|
+
} from "./chunk-5UZXUTVO.js";
|
|
14
|
+
import {
|
|
15
|
+
log
|
|
16
|
+
} from "./chunk-3WCASNQZ.js";
|
|
17
|
+
|
|
18
|
+
// src/recall-state.ts
|
|
19
|
+
import { appendFile, mkdir, readFile, rename, rm, stat, unlink, writeFile } from "fs/promises";
|
|
20
|
+
import path from "path";
|
|
21
|
+
import { createHash, randomUUID } from "crypto";
|
|
22
|
+
function clampGraphRecallExpandedEntries(entries, maxEntries = 64) {
|
|
23
|
+
const limit = Math.max(1, Math.floor(maxEntries));
|
|
24
|
+
if (!Array.isArray(entries)) return [];
|
|
25
|
+
return entries.filter((item) => !!item && typeof item === "object").map((item) => {
|
|
26
|
+
const graphType = item.graphType === "entity" || item.graphType === "time" || item.graphType === "causal" ? item.graphType : "entity";
|
|
27
|
+
const out = {
|
|
28
|
+
path: typeof item.path === "string" ? item.path : "",
|
|
29
|
+
score: typeof item.score === "number" && Number.isFinite(item.score) ? item.score : 0,
|
|
30
|
+
namespace: typeof item.namespace === "string" ? item.namespace : "",
|
|
31
|
+
seed: typeof item.seed === "string" ? item.seed : "",
|
|
32
|
+
hopDepth: typeof item.hopDepth === "number" && Number.isFinite(item.hopDepth) ? Math.max(0, Math.floor(item.hopDepth)) : 0,
|
|
33
|
+
decayedWeight: typeof item.decayedWeight === "number" && Number.isFinite(item.decayedWeight) ? Math.max(0, item.decayedWeight) : 0,
|
|
34
|
+
graphType
|
|
35
|
+
};
|
|
36
|
+
if (typeof item.edgeConfidence === "number" && Number.isFinite(item.edgeConfidence)) {
|
|
37
|
+
out.edgeConfidence = Math.min(1, Math.max(0, item.edgeConfidence));
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}).filter((item) => item.path.length > 0 && item.namespace.length > 0).slice(0, limit);
|
|
41
|
+
}
|
|
42
|
+
function snapshotMatchesExpectedIdentity(current, expected) {
|
|
43
|
+
if (!expected) return true;
|
|
44
|
+
if (typeof expected.writeNonce === "string" && expected.writeNonce.length > 0) {
|
|
45
|
+
return current.writeNonce === expected.writeNonce;
|
|
46
|
+
}
|
|
47
|
+
const hasExpectedTraceId = typeof expected.traceId === "string" && expected.traceId.length > 0;
|
|
48
|
+
if (hasExpectedTraceId) {
|
|
49
|
+
return current.traceId === expected.traceId;
|
|
50
|
+
}
|
|
51
|
+
if (expected.recordedAt !== void 0) {
|
|
52
|
+
return current.recordedAt === expected.recordedAt;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
function cloneTierExplain(tierExplain) {
|
|
57
|
+
if (!tierExplain) return void 0;
|
|
58
|
+
return structuredClone(tierExplain);
|
|
59
|
+
}
|
|
60
|
+
function cloneLastRecallSnapshot(snapshot) {
|
|
61
|
+
if (!snapshot) return null;
|
|
62
|
+
return structuredClone(snapshot);
|
|
63
|
+
}
|
|
64
|
+
var DEFAULT_TIER_MIGRATION_STATUS = {
|
|
65
|
+
updatedAt: (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
66
|
+
lastCycle: null,
|
|
67
|
+
totals: {
|
|
68
|
+
cycles: 0,
|
|
69
|
+
scanned: 0,
|
|
70
|
+
migrated: 0,
|
|
71
|
+
promoted: 0,
|
|
72
|
+
demoted: 0,
|
|
73
|
+
errors: 0
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
var CLAIMED_IMPRESSION_SPILL_SUFFIX = ".claimed";
|
|
77
|
+
var LastRecallStore = class {
|
|
78
|
+
statePath;
|
|
79
|
+
impressionsPath;
|
|
80
|
+
writeStateFile;
|
|
81
|
+
impressionsRotateBytes;
|
|
82
|
+
impressionsRotateKeep;
|
|
83
|
+
// Lock-acquisition timing for the cross-process impression rotation lock.
|
|
84
|
+
// Only tests set this (small maxWaitMs) to force the acquisition-timeout
|
|
85
|
+
// (`acquired=false`) branch deterministically; production uses the defaults.
|
|
86
|
+
impressionsLockOptions;
|
|
87
|
+
state = {};
|
|
88
|
+
stateWriteChain = Promise.resolve();
|
|
89
|
+
// Serializes the rotate-then-append critical section so concurrent record()
|
|
90
|
+
// calls never interleave rotation renames with each other's appends (#1910).
|
|
91
|
+
impressionsWriteChain = Promise.resolve();
|
|
92
|
+
constructor(memoryDir, options = {}) {
|
|
93
|
+
this.statePath = path.join(memoryDir, "state", "last_recall.json");
|
|
94
|
+
this.impressionsPath = path.join(memoryDir, "state", "recall_impressions.jsonl");
|
|
95
|
+
this.impressionsRotateBytes = Math.max(0, Math.floor(options.impressionsRotateBytes ?? 0));
|
|
96
|
+
this.impressionsRotateKeep = Math.max(1, Math.floor(options.impressionsRotateKeep ?? 5));
|
|
97
|
+
this.impressionsLockOptions = options.impressionsLockOptions;
|
|
98
|
+
this.writeStateFile = options.writeStateFile ?? (async (filePath, content) => {
|
|
99
|
+
await writeFileAtomically(filePath, content);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async load() {
|
|
103
|
+
try {
|
|
104
|
+
const raw = await readFile(this.statePath, "utf-8");
|
|
105
|
+
const parsed = JSON.parse(raw);
|
|
106
|
+
if (parsed && typeof parsed === "object") this.state = parsed;
|
|
107
|
+
} catch {
|
|
108
|
+
this.state = {};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
get(sessionKey) {
|
|
112
|
+
return cloneLastRecallSnapshot(this.state[sessionKey] ?? null);
|
|
113
|
+
}
|
|
114
|
+
getMostRecent() {
|
|
115
|
+
const snapshots = Object.values(this.state);
|
|
116
|
+
if (snapshots.length === 0) return null;
|
|
117
|
+
snapshots.sort((a, b) => {
|
|
118
|
+
const byTime = b.recordedAt.localeCompare(a.recordedAt);
|
|
119
|
+
if (byTime !== 0) return byTime;
|
|
120
|
+
return a.sessionKey.localeCompare(b.sessionKey);
|
|
121
|
+
});
|
|
122
|
+
return cloneLastRecallSnapshot(snapshots[0] ?? null);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Persist last-recall snapshot and append an impression log entry.
|
|
126
|
+
* Does not store raw query text; uses a stable hash for correlation.
|
|
127
|
+
*/
|
|
128
|
+
async record(opts) {
|
|
129
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
130
|
+
const queryHash = createHash("sha256").update(opts.query).digest("hex");
|
|
131
|
+
const liveSnapshot = {
|
|
132
|
+
sessionKey: opts.sessionKey,
|
|
133
|
+
recordedAt: now,
|
|
134
|
+
queryHash,
|
|
135
|
+
writeNonce: randomUUID(),
|
|
136
|
+
queryLen: opts.query.length,
|
|
137
|
+
memoryIds: opts.memoryIds,
|
|
138
|
+
namespace: opts.namespace,
|
|
139
|
+
recallNamespaces: opts.recallNamespaces,
|
|
140
|
+
traceId: opts.traceId,
|
|
141
|
+
plannerMode: opts.plannerMode,
|
|
142
|
+
requestedMode: opts.requestedMode,
|
|
143
|
+
source: opts.source,
|
|
144
|
+
fallbackUsed: opts.fallbackUsed,
|
|
145
|
+
sourcesUsed: opts.sourcesUsed,
|
|
146
|
+
budgetsApplied: opts.budgetsApplied,
|
|
147
|
+
latencyMs: opts.latencyMs,
|
|
148
|
+
resultPaths: opts.resultPaths,
|
|
149
|
+
resultNamespaces: opts.resultNamespaces,
|
|
150
|
+
policyVersion: opts.policyVersion,
|
|
151
|
+
identityInjectionMode: opts.identityInjection?.mode,
|
|
152
|
+
identityInjectedChars: opts.identityInjection?.injectedChars,
|
|
153
|
+
identityInjectionTruncated: opts.identityInjection?.truncated,
|
|
154
|
+
tierExplain: opts.tierExplain,
|
|
155
|
+
backendDegradations: opts.backendDegradations && opts.backendDegradations.length > 0 ? opts.backendDegradations : void 0
|
|
156
|
+
};
|
|
157
|
+
const snapshot = cloneLastRecallSnapshot(liveSnapshot);
|
|
158
|
+
this.state[opts.sessionKey] = snapshot;
|
|
159
|
+
const keys = Object.keys(this.state);
|
|
160
|
+
if (keys.length > 50) {
|
|
161
|
+
const ordered = keys.map((k) => ({ k, at: this.state[k]?.recordedAt ?? "" })).sort((a, b) => b.at.localeCompare(a.at));
|
|
162
|
+
for (const doomed of ordered.slice(50)) {
|
|
163
|
+
delete this.state[doomed.k];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
await this.flushState();
|
|
168
|
+
} catch (err) {
|
|
169
|
+
log.debug(`last recall store write failed: ${err}`);
|
|
170
|
+
}
|
|
171
|
+
if (opts.appendImpression !== false) {
|
|
172
|
+
const line = JSON.stringify(snapshot) + "\n";
|
|
173
|
+
const chained = this.impressionsWriteChain.catch(() => {
|
|
174
|
+
}).then(() => this.appendImpressionSerialized(line));
|
|
175
|
+
this.impressionsWriteChain = chained;
|
|
176
|
+
try {
|
|
177
|
+
await chained;
|
|
178
|
+
} catch (err) {
|
|
179
|
+
log.debug(`recall impressions append failed: ${err}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Drain pending spills, rotate (best-effort, sized to the projected payload),
|
|
185
|
+
* then append one impression line under ONE shared cross-process lock (#1910,
|
|
186
|
+
* #2033). Both the archive-shift renames AND the append run inside the same
|
|
187
|
+
* held lock so a peer process holding the lock can never rename the active
|
|
188
|
+
* inode to `.1` between our open and write — which would land the impression in
|
|
189
|
+
* a rotated archive that offline-sync excludes, silently dropping it from
|
|
190
|
+
* active-state/sync consumers.
|
|
191
|
+
*
|
|
192
|
+
* On lock-acquisition timeout the impression is NEVER written to the active
|
|
193
|
+
* file unlocked (#2033): a peer holding the lock is likely mid-rotation, so an
|
|
194
|
+
* unlocked append can land in the inode it is about to rename to `.1` — the
|
|
195
|
+
* exact silent-drop this lock prevents. Instead the row is spilled to a
|
|
196
|
+
* durable node-local per-event file under `<impressions>.pending.d/` and
|
|
197
|
+
* folded back into the active file by the next append that DOES hold the lock,
|
|
198
|
+
* preserving durability without racing rotation. Rotation failure under the
|
|
199
|
+
* held lock is logged and the append still runs. Callers invoke this only
|
|
200
|
+
* through `impressionsWriteChain` so the sequence is serialized in-process.
|
|
201
|
+
*/
|
|
202
|
+
get impressionsPendingDir() {
|
|
203
|
+
return `${this.impressionsPath}.pending.d`;
|
|
204
|
+
}
|
|
205
|
+
async spillImpression(line) {
|
|
206
|
+
await ensureContainedSpillDir(this.impressionsPendingDir);
|
|
207
|
+
const id = randomUUID();
|
|
208
|
+
const tempPath = path.join(this.impressionsPendingDir, `${id}.jsonl.tmp`);
|
|
209
|
+
const finalPath = path.join(this.impressionsPendingDir, `${id}.jsonl`);
|
|
210
|
+
await writeFile(tempPath, line, "utf-8");
|
|
211
|
+
await rename(tempPath, finalPath);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Recover a claim a crashed drain left mid-flight (#2033): the crash-safe
|
|
215
|
+
* drain renames `<uuid>.jsonl` -> `<uuid>.jsonl.claimed` BEFORE committing, so
|
|
216
|
+
* a `.claimed` file with no matching commit is the ONLY durable copy of those
|
|
217
|
+
* rows. Rename each orphan back to `<uuid>.jsonl` so it re-enters the normal
|
|
218
|
+
* collect+claim+commit flow. MUST run under the held rotation lock, before
|
|
219
|
+
* collecting. listContainedSpillFiles skips symlinked/escaping entries.
|
|
220
|
+
*/
|
|
221
|
+
async recoverOrphanedImpressionClaims() {
|
|
222
|
+
const orphans = await listContainedSpillFiles(
|
|
223
|
+
this.impressionsPendingDir,
|
|
224
|
+
`.jsonl${CLAIMED_IMPRESSION_SPILL_SUFFIX}`
|
|
225
|
+
);
|
|
226
|
+
for (const claimedPath of orphans) {
|
|
227
|
+
const original = claimedPath.slice(0, -CLAIMED_IMPRESSION_SPILL_SUFFIX.length);
|
|
228
|
+
await rename(claimedPath, original).catch(() => void 0);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Recover a crash-orphaned spill temp after its write completed but before
|
|
233
|
+
* the atomic `.tmp` → `.jsonl` rename. Valid JSONL temps are promoted back
|
|
234
|
+
* into the normal queue; incomplete temps remain pending and keep offline sync
|
|
235
|
+
* deferred rather than being discarded.
|
|
236
|
+
*/
|
|
237
|
+
async recoverOrphanedImpressionTemps() {
|
|
238
|
+
const temps = await listContainedSpillFiles(this.impressionsPendingDir, ".jsonl.tmp");
|
|
239
|
+
for (const tempPath of temps) {
|
|
240
|
+
let content;
|
|
241
|
+
try {
|
|
242
|
+
content = await readFile(tempPath, "utf-8");
|
|
243
|
+
for (const line of content.split("\n")) {
|
|
244
|
+
if (line.trim().length > 0) JSON.parse(line);
|
|
245
|
+
}
|
|
246
|
+
} catch {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const finalPath = tempPath.slice(0, -".tmp".length);
|
|
250
|
+
await rename(tempPath, finalPath).catch(() => void 0);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async appendImpressionSerialized(line) {
|
|
254
|
+
await mkdir(path.dirname(this.impressionsPath), { recursive: true });
|
|
255
|
+
const lockPath = `${this.impressionsPath}.lock`;
|
|
256
|
+
await withHeldFileLock(
|
|
257
|
+
lockPath,
|
|
258
|
+
{ staleMs: 3e4, ...this.impressionsLockOptions },
|
|
259
|
+
async (acquired) => {
|
|
260
|
+
if (!acquired) {
|
|
261
|
+
log.debug("recall impressions rotation lock not acquired; spilling impression to the durable pending queue");
|
|
262
|
+
await this.spillImpression(line);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
await this.foldPendingImpressionsAndAppend(line);
|
|
266
|
+
}
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Fold any durable pending recall-impression spills into the synced active
|
|
271
|
+
* `recall_impressions.jsonl` WITHOUT recording a new impression (#2033).
|
|
272
|
+
*
|
|
273
|
+
* The pending spill dir is offline-sync-excluded, so an impression that a
|
|
274
|
+
* lock-timed-out `record()` spilled there is absent from an offline-sync
|
|
275
|
+
* snapshot and lost if this node is discarded before the next `record()`
|
|
276
|
+
* folds it back. Offline sync calls this before building a snapshot so a
|
|
277
|
+
* recorded impression always reaches the remote. Fast no-op — no lock and no
|
|
278
|
+
* dir/lock-file creation — when nothing is pending.
|
|
279
|
+
*
|
|
280
|
+
* Returns a {@link DrainPendingImpressionsResult}: `folded` is true when rows
|
|
281
|
+
* were folded into the active file; `pendingDeferred` is true when durable
|
|
282
|
+
* spills still remain in the offline-sync-EXCLUDED queue after this call —
|
|
283
|
+
* because the rotation lock could not be acquired, a spill could not be
|
|
284
|
+
* claimed, or the drain-only fold deferred rows that would only fit by
|
|
285
|
+
* rotating into a sync-excluded archive (#2033). A snapshot taken while
|
|
286
|
+
* `pendingDeferred` is true would silently drop those rows, so the caller MUST
|
|
287
|
+
* NOT report a clean snapshot — it either retries or aborts.
|
|
288
|
+
*/
|
|
289
|
+
async drainPendingImpressions() {
|
|
290
|
+
if (!await this.pendingSpillsRemain()) {
|
|
291
|
+
return { folded: false, pendingDeferred: false };
|
|
292
|
+
}
|
|
293
|
+
const lockPath = `${this.impressionsPath}.lock`;
|
|
294
|
+
let folded = false;
|
|
295
|
+
let acquiredLock = false;
|
|
296
|
+
let spillsRemain = false;
|
|
297
|
+
await withHeldFileLock(
|
|
298
|
+
lockPath,
|
|
299
|
+
{ staleMs: 3e4, ...this.impressionsLockOptions },
|
|
300
|
+
async (acquired) => {
|
|
301
|
+
if (!acquired) return;
|
|
302
|
+
acquiredLock = true;
|
|
303
|
+
folded = await this.foldPendingImpressionsAndAppend(null);
|
|
304
|
+
spillsRemain = await this.pendingSpillsRemain();
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
return { folded, pendingDeferred: !acquiredLock || spillsRemain };
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Claim/commit fold of durable pending impression spills into the active file
|
|
311
|
+
* under the held rotation lock (#2033). `line` is a new impression to append
|
|
312
|
+
* after the drained rows, or null for a drain-only pre-sync fold.
|
|
313
|
+
*
|
|
314
|
+
* Each spill is folded as an INDEPENDENT claim -> append -> finalize unit
|
|
315
|
+
* rather than materializing the whole queue as one joined payload and
|
|
316
|
+
* splitting it in a single synchronous pass (#2033). A multi-hundred-MB drain
|
|
317
|
+
* done as one join/split blocks the event loop long enough for
|
|
318
|
+
* `withHeldFileLock`'s ownership-refresh timer to miss its window, so a peer
|
|
319
|
+
* stale-breaks the 30s lock and rotates/appends concurrently — defeating the
|
|
320
|
+
* rotation lock this drain relies on. The per-file `await`s keep the payload
|
|
321
|
+
* bounded to one spill at a time and let the refresh timer fire between files.
|
|
322
|
+
*
|
|
323
|
+
* The DRAIN-ONLY path (`line === null`, run before an offline-sync snapshot)
|
|
324
|
+
* NEVER rotates a drained row into an archive. `recall_impressions.jsonl.*`
|
|
325
|
+
* is offline-sync-EXCLUDED, so rotating a just-drained row into `.1`/`.2` and
|
|
326
|
+
* then deleting its spill would leave that row only in a path sync omits —
|
|
327
|
+
* silently lost when the node is discarded after a "successful" sync (#2033).
|
|
328
|
+
* It folds only the rows that fit the synced active file under the cap and
|
|
329
|
+
* leaves the rest durable in the pending queue; {@link drainPendingImpressions}
|
|
330
|
+
* then reports the drain DEFERRED so the caller retries or aborts. The
|
|
331
|
+
* record() path (`line !== null`) keeps rotating normally — its archives stay
|
|
332
|
+
* on a live node that is not being discarded.
|
|
333
|
+
*
|
|
334
|
+
* Recovers any crash-orphaned claim first. Each impression carries a unique
|
|
335
|
+
* writeNonce, so a crash-recovered re-commit is a collapsible duplicate, never
|
|
336
|
+
* a lost row. listContainedSpillFiles rejects symlinked/escaping entries; a
|
|
337
|
+
* spill that cannot be claimed is skipped this pass. An append failure rolls
|
|
338
|
+
* that spill's claim back so the row retries on the next lock holder's drain.
|
|
339
|
+
* Returns true when the active file was written. MUST run under the held
|
|
340
|
+
* rotation lock.
|
|
341
|
+
*/
|
|
342
|
+
async foldPendingImpressionsAndAppend(line) {
|
|
343
|
+
await this.recoverOrphanedImpressionTemps();
|
|
344
|
+
await this.recoverOrphanedImpressionClaims();
|
|
345
|
+
const spillFiles = await listContainedSpillFiles(this.impressionsPendingDir);
|
|
346
|
+
const drainOnly = line === null;
|
|
347
|
+
const cap = this.impressionsRotateBytes;
|
|
348
|
+
let activeSize = 0;
|
|
349
|
+
if (cap > 0) {
|
|
350
|
+
try {
|
|
351
|
+
activeSize = (await stat(this.impressionsPath)).size;
|
|
352
|
+
} catch (err) {
|
|
353
|
+
if (!isErrnoCode(err, "ENOENT")) throw err;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
let wrote = false;
|
|
357
|
+
for (const filePath of spillFiles) {
|
|
358
|
+
const content = await readFile(filePath, "utf-8");
|
|
359
|
+
const unit = content.length === 0 || content.endsWith("\n") ? content : `${content}
|
|
360
|
+
`;
|
|
361
|
+
const unitBytes = Buffer.byteLength(unit, "utf-8");
|
|
362
|
+
if (drainOnly && cap > 0 && activeSize > 0 && activeSize + unitBytes >= cap) break;
|
|
363
|
+
const claimedPath = `${filePath}${CLAIMED_IMPRESSION_SPILL_SUFFIX}`;
|
|
364
|
+
try {
|
|
365
|
+
await rename(filePath, claimedPath);
|
|
366
|
+
} catch {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
activeSize = await this.appendImpressionUnit(unit, activeSize, drainOnly);
|
|
371
|
+
} catch (err) {
|
|
372
|
+
await rename(claimedPath, filePath).catch(() => void 0);
|
|
373
|
+
throw err;
|
|
374
|
+
}
|
|
375
|
+
await unlink(claimedPath).catch(() => void 0);
|
|
376
|
+
wrote = true;
|
|
377
|
+
}
|
|
378
|
+
if (line !== null) {
|
|
379
|
+
activeSize = await this.appendImpressionUnit(line, activeSize, false);
|
|
380
|
+
wrote = true;
|
|
381
|
+
}
|
|
382
|
+
return wrote;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Append one whole JSONL unit (a claimed spill's rows or a fresh impression
|
|
386
|
+
* line) to the active impressions file, returning the resulting active-file
|
|
387
|
+
* byte size. On the rotating (record) path, when the unit would push the
|
|
388
|
+
* current active generation to/over `impressionsRotateBytes`, the full active
|
|
389
|
+
* file is rotated aside FIRST so no generation exceeds the cap (#2033); a lone
|
|
390
|
+
* unit larger than the cap on an empty active file is written whole because
|
|
391
|
+
* splitting a JSONL row would corrupt it. `drainOnly` and disabled rotation
|
|
392
|
+
* (`impressionsRotateBytes <= 0`) both skip rotation — drain-only defers its
|
|
393
|
+
* overflow in {@link foldPendingImpressionsAndAppend} rather than rotating into
|
|
394
|
+
* a sync-excluded archive. A rotation error is logged and the append still
|
|
395
|
+
* runs so a row is never lost; an append failure propagates so the caller
|
|
396
|
+
* rolls its claim back. MUST run under the held rotation lock.
|
|
397
|
+
*/
|
|
398
|
+
async appendImpressionUnit(unit, activeSize, drainOnly) {
|
|
399
|
+
const cap = this.impressionsRotateBytes;
|
|
400
|
+
const unitBytes = Buffer.byteLength(unit, "utf-8");
|
|
401
|
+
if (cap > 0 && !drainOnly && activeSize > 0 && activeSize + unitBytes >= cap) {
|
|
402
|
+
try {
|
|
403
|
+
await this.shiftImpressionArchives();
|
|
404
|
+
activeSize = 0;
|
|
405
|
+
} catch (err) {
|
|
406
|
+
log.debug(`recall impressions rotation failed (append preserved): ${err}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
await appendFile(this.impressionsPath, unit, "utf-8");
|
|
410
|
+
return activeSize + unitBytes;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* True when any live `<uuid>.jsonl` spill, crash-orphaned `.claimed` file,
|
|
414
|
+
* or crash-orphaned `.jsonl.tmp` spill remains in the offline-sync-EXCLUDED
|
|
415
|
+
* pending queue (#2033). After a drain acquires the rotation lock, a spill
|
|
416
|
+
* the fold could not claim (rename race / read-only dir) or a `.claimed`
|
|
417
|
+
* orphan a failed commit left behind means durable rows are STILL excluded
|
|
418
|
+
* from a snapshot — the drain must report itself INCOMPLETE so the caller
|
|
419
|
+
* retries or aborts rather than snapshotting an active file that omits them.
|
|
420
|
+
*/
|
|
421
|
+
async pendingSpillsRemain() {
|
|
422
|
+
if ((await listContainedSpillFiles(this.impressionsPendingDir, ".jsonl.tmp")).length > 0) {
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
const liveSpills = await listContainedSpillFiles(this.impressionsPendingDir);
|
|
426
|
+
if (liveSpills.length > 0) return true;
|
|
427
|
+
const claimed = await listContainedSpillFiles(
|
|
428
|
+
this.impressionsPendingDir,
|
|
429
|
+
`.jsonl${CLAIMED_IMPRESSION_SPILL_SUFFIX}`
|
|
430
|
+
);
|
|
431
|
+
return claimed.length > 0;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Shift `.1..N` archives down one slot and move the active file to `.1`,
|
|
435
|
+
* dropping anything beyond `keep`. Callers invoke this only while holding the
|
|
436
|
+
* cross-process rotation lock (issue #1910).
|
|
437
|
+
*/
|
|
438
|
+
async shiftImpressionArchives() {
|
|
439
|
+
const keep = this.impressionsRotateKeep;
|
|
440
|
+
try {
|
|
441
|
+
await rm(`${this.impressionsPath}.${keep}`, { force: true });
|
|
442
|
+
} catch {
|
|
443
|
+
}
|
|
444
|
+
for (let i = keep - 1; i >= 1; i -= 1) {
|
|
445
|
+
try {
|
|
446
|
+
await rename(`${this.impressionsPath}.${i}`, `${this.impressionsPath}.${i + 1}`);
|
|
447
|
+
} catch (err) {
|
|
448
|
+
if (!isErrnoCode(err, "ENOENT")) throw err;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
try {
|
|
452
|
+
await rename(this.impressionsPath, `${this.impressionsPath}.1`);
|
|
453
|
+
} catch (err) {
|
|
454
|
+
if (!isErrnoCode(err, "ENOENT")) throw err;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Attach a RecallTierExplain block to the existing snapshot for a
|
|
459
|
+
* session without rewriting the entire snapshot. Used by the
|
|
460
|
+
* post-recall direct-answer annotation path (issue #518 slice 3c):
|
|
461
|
+
* recallInternal records the snapshot first, then the orchestrator
|
|
462
|
+
* fires the direct-answer tier in observation mode and annotates
|
|
463
|
+
* the stored snapshot with whichever tier served the query.
|
|
464
|
+
*
|
|
465
|
+
* No-op when no snapshot exists for the given session; callers do
|
|
466
|
+
* not need to guard on existence.
|
|
467
|
+
*/
|
|
468
|
+
async annotateTierExplain(sessionKey, tierExplain, expected) {
|
|
469
|
+
const current = this.state[sessionKey];
|
|
470
|
+
if (!current) return;
|
|
471
|
+
if (!snapshotMatchesExpectedIdentity(current, expected)) return;
|
|
472
|
+
this.state[sessionKey] = {
|
|
473
|
+
...current,
|
|
474
|
+
tierExplain: cloneTierExplain(tierExplain)
|
|
475
|
+
};
|
|
476
|
+
try {
|
|
477
|
+
await this.flushState();
|
|
478
|
+
} catch (err) {
|
|
479
|
+
log.debug(`last recall tier-explain annotate failed: ${err}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
flushState() {
|
|
483
|
+
const run = this.stateWriteChain.catch(() => void 0).then(async () => {
|
|
484
|
+
await mkdir(path.dirname(this.statePath), { recursive: true });
|
|
485
|
+
await this.writeStateFile(this.statePath, JSON.stringify(this.state, null, 2));
|
|
486
|
+
});
|
|
487
|
+
this.stateWriteChain = run.then(
|
|
488
|
+
() => void 0,
|
|
489
|
+
() => void 0
|
|
490
|
+
);
|
|
491
|
+
return run;
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
var TierMigrationStatusStore = class {
|
|
495
|
+
statePath;
|
|
496
|
+
state = structuredClone(DEFAULT_TIER_MIGRATION_STATUS);
|
|
497
|
+
constructor(memoryDir) {
|
|
498
|
+
this.statePath = path.join(memoryDir, "state", "tier-migration-status.json");
|
|
499
|
+
}
|
|
500
|
+
async load() {
|
|
501
|
+
try {
|
|
502
|
+
const raw = await readFile(this.statePath, "utf-8");
|
|
503
|
+
const parsed = JSON.parse(raw);
|
|
504
|
+
if (!parsed || typeof parsed !== "object") {
|
|
505
|
+
this.state = structuredClone(DEFAULT_TIER_MIGRATION_STATUS);
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
const totals = parsed.totals && typeof parsed.totals === "object" ? parsed.totals : DEFAULT_TIER_MIGRATION_STATUS.totals;
|
|
509
|
+
this.state = {
|
|
510
|
+
updatedAt: typeof parsed.updatedAt === "string" && parsed.updatedAt.length > 0 ? parsed.updatedAt : DEFAULT_TIER_MIGRATION_STATUS.updatedAt,
|
|
511
|
+
lastCycle: parsed.lastCycle && typeof parsed.lastCycle === "object" ? parsed.lastCycle : null,
|
|
512
|
+
totals: {
|
|
513
|
+
cycles: typeof totals.cycles === "number" && Number.isFinite(totals.cycles) ? totals.cycles : 0,
|
|
514
|
+
scanned: typeof totals.scanned === "number" && Number.isFinite(totals.scanned) ? totals.scanned : 0,
|
|
515
|
+
migrated: typeof totals.migrated === "number" && Number.isFinite(totals.migrated) ? totals.migrated : 0,
|
|
516
|
+
promoted: typeof totals.promoted === "number" && Number.isFinite(totals.promoted) ? totals.promoted : 0,
|
|
517
|
+
demoted: typeof totals.demoted === "number" && Number.isFinite(totals.demoted) ? totals.demoted : 0,
|
|
518
|
+
errors: typeof totals.errors === "number" && Number.isFinite(totals.errors) ? totals.errors : 0
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
} catch {
|
|
522
|
+
this.state = structuredClone(DEFAULT_TIER_MIGRATION_STATUS);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
get() {
|
|
526
|
+
return {
|
|
527
|
+
updatedAt: this.state.updatedAt,
|
|
528
|
+
lastCycle: this.state.lastCycle ? { ...this.state.lastCycle } : null,
|
|
529
|
+
totals: { ...this.state.totals }
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
async recordCycle(summary) {
|
|
533
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
534
|
+
const migratedDelta = summary.dryRun ? 0 : Math.max(0, summary.migrated);
|
|
535
|
+
const promotedDelta = summary.dryRun ? 0 : Math.max(0, summary.promoted);
|
|
536
|
+
const demotedDelta = summary.dryRun ? 0 : Math.max(0, summary.demoted);
|
|
537
|
+
const next = {
|
|
538
|
+
updatedAt: now,
|
|
539
|
+
lastCycle: { ...summary },
|
|
540
|
+
totals: {
|
|
541
|
+
cycles: this.state.totals.cycles + 1,
|
|
542
|
+
scanned: this.state.totals.scanned + Math.max(0, summary.scanned),
|
|
543
|
+
migrated: this.state.totals.migrated + migratedDelta,
|
|
544
|
+
promoted: this.state.totals.promoted + promotedDelta,
|
|
545
|
+
demoted: this.state.totals.demoted + demotedDelta,
|
|
546
|
+
errors: this.state.totals.errors + Math.max(0, summary.errorCount ?? 0)
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
this.state = next;
|
|
550
|
+
try {
|
|
551
|
+
await mkdir(path.dirname(this.statePath), { recursive: true });
|
|
552
|
+
await writeFile(this.statePath, JSON.stringify(next, null, 2), "utf-8");
|
|
553
|
+
} catch (err) {
|
|
554
|
+
log.debug(`tier migration status write failed: ${err}`);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
var RecallHandleHistoryStore = class {
|
|
559
|
+
statePath;
|
|
560
|
+
writeStateFile;
|
|
561
|
+
state = {};
|
|
562
|
+
writeChain = Promise.resolve();
|
|
563
|
+
maxDepth;
|
|
564
|
+
constructor(memoryDir, options = {}) {
|
|
565
|
+
this.statePath = path.join(memoryDir, "state", "handle_history.json");
|
|
566
|
+
this.writeStateFile = options.writeStateFile ?? (async (filePath, content) => {
|
|
567
|
+
await writeFileAtomically(filePath, content);
|
|
568
|
+
});
|
|
569
|
+
this.maxDepth = typeof options.maxDepth === "number" && Number.isFinite(options.maxDepth) ? Math.max(1, Math.min(50, Math.floor(options.maxDepth))) : 5;
|
|
570
|
+
}
|
|
571
|
+
async load() {
|
|
572
|
+
try {
|
|
573
|
+
const raw = await readFile(this.statePath, "utf-8");
|
|
574
|
+
const parsed = JSON.parse(raw);
|
|
575
|
+
if (parsed && typeof parsed === "object") this.state = parsed;
|
|
576
|
+
} catch {
|
|
577
|
+
this.state = {};
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Record one recall's admitted memory ids for a session, newest first.
|
|
582
|
+
* The ring is capped at {@link maxDepth}; older entries drop off the tail.
|
|
583
|
+
*/
|
|
584
|
+
async record(sessionKey, memoryIds) {
|
|
585
|
+
if (!sessionKey) return;
|
|
586
|
+
const ids = memoryIds.filter((id) => typeof id === "string" && id.length > 0);
|
|
587
|
+
const entry = { at: (/* @__PURE__ */ new Date()).toISOString(), ids };
|
|
588
|
+
const prior = this.state[sessionKey] ?? [];
|
|
589
|
+
const next = [entry, ...prior].slice(0, this.maxDepth);
|
|
590
|
+
this.state[sessionKey] = next;
|
|
591
|
+
this.capSessions();
|
|
592
|
+
try {
|
|
593
|
+
await this.flush();
|
|
594
|
+
} catch (err) {
|
|
595
|
+
log.debug(`recall handle history write failed: ${err}`);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Return the memory-id arrays for a session, newest first, capped at `depth`.
|
|
600
|
+
* Empty array when the session has no recorded history.
|
|
601
|
+
*/
|
|
602
|
+
recent(sessionKey, depth = this.maxDepth) {
|
|
603
|
+
const entries = this.state[sessionKey];
|
|
604
|
+
if (!entries || entries.length === 0) return [];
|
|
605
|
+
const limit = Math.max(0, Math.min(depth, entries.length));
|
|
606
|
+
return entries.slice(0, limit).map((e) => e.ids);
|
|
607
|
+
}
|
|
608
|
+
/** Test seam: drop all history (used by the corpus-scan hygiene test). */
|
|
609
|
+
clearForTest() {
|
|
610
|
+
this.state = {};
|
|
611
|
+
}
|
|
612
|
+
capSessions() {
|
|
613
|
+
const keys = Object.keys(this.state);
|
|
614
|
+
if (keys.length <= 50) return;
|
|
615
|
+
const ordered = keys.map((k) => ({ k, at: this.state[k]?.[0]?.at ?? "" })).sort((a, b) => b.at.localeCompare(a.at));
|
|
616
|
+
for (const doomed of ordered.slice(50)) {
|
|
617
|
+
delete this.state[doomed.k];
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
flush() {
|
|
621
|
+
const run = this.writeChain.catch(() => void 0).then(async () => {
|
|
622
|
+
await mkdir(path.dirname(this.statePath), { recursive: true });
|
|
623
|
+
await this.writeStateFile(this.statePath, JSON.stringify(this.state, null, 2));
|
|
624
|
+
});
|
|
625
|
+
this.writeChain = run.then(() => void 0, () => void 0);
|
|
626
|
+
return run;
|
|
627
|
+
}
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
export {
|
|
631
|
+
clampGraphRecallExpandedEntries,
|
|
632
|
+
LastRecallStore,
|
|
633
|
+
TierMigrationStatusStore,
|
|
634
|
+
RecallHandleHistoryStore
|
|
635
|
+
};
|
|
636
|
+
//# sourceMappingURL=chunk-FMLKOL2Z.js.map
|