@remnic/core 9.7.15 → 9.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.d.ts +13 -6
- package/dist/access-admin-ops-surface.js +85 -71
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +35 -17
- package/dist/access-boundary.js +86 -74
- package/dist/access-citation.d.ts +28 -0
- package/dist/access-citation.js +9 -0
- package/dist/access-cli.js +194 -178
- package/dist/access-cli.js.map +1 -1
- package/dist/access-errors.d.ts +16 -1
- package/dist/access-errors.js +7 -3
- package/dist/access-http.d.ts +25 -19
- package/dist/access-http.js +100 -87
- package/dist/access-identity-continuity-surface.d.ts +13 -8
- package/dist/access-identity-continuity-surface.js +85 -71
- package/dist/access-lcm-surface.d.ts +16 -9
- package/dist/access-lcm-surface.js +85 -71
- package/dist/access-mcp.d.ts +23 -16
- package/dist/access-mcp.js +96 -84
- package/dist/access-memory-search-fanout.d.ts +93 -0
- package/dist/access-memory-search-fanout.js +18 -0
- package/dist/access-observe-write-surface.d.ts +26 -8
- package/dist/access-observe-write-surface.js +85 -71
- package/dist/access-operations-batch.js +92 -80
- package/dist/access-operations.d.ts +29 -22
- package/dist/access-operations.js +94 -82
- package/dist/access-recall-concurrency.d.ts +250 -0
- package/dist/access-recall-concurrency.js +157 -0
- package/dist/access-recall-response.d.ts +130 -0
- package/dist/access-recall-response.js +147 -0
- package/dist/access-recall-surface.d.ts +15 -7
- package/dist/access-recall-surface.js +85 -71
- package/dist/access-schema.d.ts +98 -98
- package/dist/access-schema.js +8 -6
- package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DbZ1G3zV.d.ts} +29 -36
- package/dist/access-service.d.ts +13 -6
- package/dist/access-service.js +89 -72
- package/dist/access-surface-catalog.d.ts +23 -16
- package/dist/access-surface-catalog.js +1 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-token-capabilities.d.ts +2 -1
- package/dist/access-token-capabilities.js +4 -2
- package/dist/action-confidence.d.ts +3 -1
- package/dist/active-memory-bridge.d.ts +3 -1
- package/dist/active-memory-bridge.js +4 -4
- package/dist/active-recall.d.ts +4 -1
- package/dist/active-recall.js +23 -13
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
- package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
- package/dist/behavior-learner.d.ts +3 -1
- package/dist/behavior-signals.d.ts +3 -1
- package/dist/bootstrap.d.ts +12 -7
- package/dist/bootstrap.js +2 -2
- package/dist/bounded-jsonl-state.d.ts +54 -0
- package/dist/bounded-jsonl-state.js +10 -0
- package/dist/boxes.js +2 -2
- package/dist/briefing.d.ts +5 -2
- package/dist/briefing.js +34 -24
- package/dist/buffer-surprise-report.d.ts +3 -1
- package/dist/buffer.d.ts +60 -2
- package/dist/buffer.js +3 -3
- package/dist/bulk-import/index.d.ts +5 -3
- package/dist/calibration.d.ts +3 -1
- package/dist/calibration.js +6 -6
- package/dist/capabilities.d.ts +7 -7
- package/dist/capabilities.js +1 -1
- package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
- package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
- package/dist/{catalog-C9444P10.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +3 -1
- package/dist/causal-behavior.js +6 -6
- package/dist/causal-chain.js +4 -4
- package/dist/causal-consolidation.d.ts +3 -1
- package/dist/causal-consolidation.js +43 -34
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +6 -6
- package/dist/causal-trajectory-graph.d.ts +3 -1
- package/dist/causal-trajectory-graph.js +1 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
- package/dist/chunk-2CGLBUW3.js +15 -0
- package/dist/chunk-2CGLBUW3.js.map +1 -0
- package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
- package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
- package/dist/{chunk-VJVNLNDQ.js → chunk-2UFO7X4Q.js} +7 -7
- package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
- package/dist/chunk-2Z24E5W2.js +22 -0
- package/dist/chunk-2Z24E5W2.js.map +1 -0
- package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
- package/dist/{chunk-HDTQVNWD.js → chunk-3QAH2S33.js} +3 -3
- package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
- package/dist/chunk-3WCASNQZ.js.map +1 -0
- package/dist/{chunk-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
- package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
- package/dist/chunk-44XZ75OQ.js.map +1 -0
- package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
- package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
- package/dist/chunk-4BJQODZF.js.map +1 -0
- package/dist/{chunk-JREB6UFH.js → chunk-57OWKFUQ.js} +17 -6
- package/dist/chunk-57OWKFUQ.js.map +1 -0
- package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
- package/dist/{chunk-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
- package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
- package/dist/chunk-5SB7SC2G.js.map +1 -0
- package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
- package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
- package/dist/chunk-6KIQT7RG.js.map +1 -0
- package/dist/{chunk-FDCTQWLW.js → chunk-6O22TZSB.js} +3 -3
- package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
- package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
- package/dist/chunk-6ZMAMSHS.js +20 -0
- package/dist/chunk-6ZMAMSHS.js.map +1 -0
- package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
- package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
- package/dist/chunk-72VAXGEI.js.map +1 -0
- package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
- package/dist/chunk-755Q3DGF.js.map +1 -0
- package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
- package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
- package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
- package/dist/chunk-7ON2JW73.js.map +1 -0
- package/dist/chunk-7RNBVZZO.js +270 -0
- package/dist/chunk-7RNBVZZO.js.map +1 -0
- package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
- package/dist/{chunk-ZHIVCODT.js → chunk-A72SWTWW.js} +7 -7
- package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
- package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
- package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
- package/dist/chunk-AIK5W3IW.js.map +1 -0
- package/dist/{chunk-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
- package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
- package/dist/chunk-AREGMX2J.js +50 -0
- package/dist/chunk-AREGMX2J.js.map +1 -0
- package/dist/chunk-AVPXXV6J.js +448 -0
- package/dist/chunk-AVPXXV6J.js.map +1 -0
- package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
- package/dist/{chunk-QKQYXZVS.js → chunk-BI2OJF6J.js} +1819 -1481
- package/dist/chunk-BI2OJF6J.js.map +1 -0
- package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
- package/dist/chunk-BJMBJZ2Y.js.map +1 -0
- package/dist/{chunk-74F5STS4.js → chunk-BLAKS3CP.js} +4 -4
- package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
- package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
- package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
- package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
- package/dist/{chunk-T7Y5KPLN.js → chunk-C6XBRYVD.js} +16 -15
- package/dist/chunk-C6XBRYVD.js.map +1 -0
- package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
- package/dist/chunk-CEN6DW6X.js.map +1 -0
- package/dist/chunk-CGASUJVP.js +421 -0
- package/dist/chunk-CGASUJVP.js.map +1 -0
- package/dist/{chunk-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
- package/dist/{chunk-PBNZVPFS.js → chunk-CXZQOVIE.js} +12 -12
- package/dist/chunk-D3V3UMET.js +44 -0
- package/dist/chunk-D3V3UMET.js.map +1 -0
- package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
- package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
- package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
- package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
- package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
- package/dist/chunk-EA2H5LML.js +72 -0
- package/dist/chunk-EA2H5LML.js.map +1 -0
- package/dist/{chunk-INELTPRG.js → chunk-EEC7UJPX.js} +103 -106
- package/dist/chunk-EEC7UJPX.js.map +1 -0
- package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
- package/dist/chunk-EKBNDKDY.js.map +1 -0
- package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
- package/dist/chunk-EQWEIIKQ.js.map +1 -0
- package/dist/{chunk-DZKHSDOM.js → chunk-ES36HTSC.js} +4 -4
- package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
- package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
- package/dist/chunk-FMLKOL2Z.js +636 -0
- package/dist/chunk-FMLKOL2Z.js.map +1 -0
- package/dist/chunk-FQC3DHH2.js +20 -0
- package/dist/chunk-FQC3DHH2.js.map +1 -0
- package/dist/{chunk-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
- package/dist/chunk-GCASGYIO.js +71 -0
- package/dist/chunk-GCASGYIO.js.map +1 -0
- package/dist/{chunk-HF77M34J.js → chunk-GFPZS3F5.js} +8 -8
- package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
- package/dist/chunk-GNVZQ5JN.js.map +1 -0
- package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
- package/dist/{chunk-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
- package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
- package/dist/{chunk-PLQE6MJA.js → chunk-IFH6LWTO.js} +50 -8
- package/dist/chunk-IFH6LWTO.js.map +1 -0
- package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
- package/dist/chunk-ILGC6JH6.js.map +1 -0
- package/dist/chunk-IUM3VSHI.js +113 -0
- package/dist/chunk-IUM3VSHI.js.map +1 -0
- package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
- package/dist/{chunk-E6CBU7XP.js → chunk-JYIFGGEM.js} +2 -2
- package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
- package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
- package/dist/{chunk-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
- package/dist/{chunk-BS4SGLWV.js → chunk-KF5EUVKQ.js} +16 -6
- package/dist/chunk-KF5EUVKQ.js.map +1 -0
- package/dist/chunk-KFZY2OFH.js +42 -0
- package/dist/chunk-KFZY2OFH.js.map +1 -0
- package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
- package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
- package/dist/{chunk-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
- package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
- package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
- package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
- package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
- package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
- package/dist/{chunk-QQGPUKMT.js → chunk-MC5Q3J7S.js} +398 -7
- package/dist/chunk-MC5Q3J7S.js.map +1 -0
- package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
- package/dist/chunk-MKQBXQKU.js +107 -0
- package/dist/chunk-MKQBXQKU.js.map +1 -0
- package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
- package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
- package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
- package/dist/{chunk-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
- package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
- package/dist/chunk-NINSR6LX.js +83 -0
- package/dist/chunk-NINSR6LX.js.map +1 -0
- package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
- package/dist/{chunk-OAZVR2BV.js → chunk-OGCAYLNA.js} +8 -6
- package/dist/{chunk-OAZVR2BV.js.map → chunk-OGCAYLNA.js.map} +1 -1
- package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
- package/dist/{chunk-VDW4VU7B.js → chunk-OQJIB32H.js} +28 -23
- package/dist/chunk-OQJIB32H.js.map +1 -0
- package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
- package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
- package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
- package/dist/chunk-PIG4WJFQ.js +87 -0
- package/dist/chunk-PIG4WJFQ.js.map +1 -0
- package/dist/chunk-PJSK6OJM.js +201 -0
- package/dist/chunk-PJSK6OJM.js.map +1 -0
- package/dist/{chunk-OVJ2HIPE.js → chunk-PMUD7ERF.js} +158 -125
- package/dist/chunk-PMUD7ERF.js.map +1 -0
- package/dist/chunk-PQVCH2AE.js +76 -0
- package/dist/chunk-PQVCH2AE.js.map +1 -0
- package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
- package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
- package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
- package/dist/{chunk-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
- package/dist/chunk-QJAQNXWI.js.map +1 -0
- package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
- package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
- package/dist/{chunk-FIJUY7GG.js.map → chunk-R26ZMXR2.js.map} +1 -1
- package/dist/chunk-R3DJVOSM.js +34 -0
- package/dist/chunk-R3DJVOSM.js.map +1 -0
- package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
- package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
- package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/chunk-ROI7BK7H.js +88 -0
- package/dist/chunk-ROI7BK7H.js.map +1 -0
- package/dist/{chunk-FNZQGN76.js → chunk-S2BBISHU.js} +4 -4
- package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
- package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
- package/dist/chunk-SCCO46KZ.js.map +1 -0
- package/dist/chunk-SK7AMF2J.js +168 -0
- package/dist/chunk-SK7AMF2J.js.map +1 -0
- package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
- package/dist/chunk-TG6IHVE2.js.map +1 -0
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-DPAENM7O.js → chunk-U3ZAVRP3.js} +2 -2
- package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
- package/dist/chunk-UFGFMWAD.js.map +1 -0
- package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
- package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-AJLLIIML.js → chunk-W4FBGYGK.js} +1 -1
- package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
- package/dist/chunk-W4XJFLAL.js.map +1 -0
- package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
- package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
- package/dist/chunk-WG5HSQ4P.js.map +1 -0
- package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
- package/dist/chunk-WL5EBRDH.js.map +1 -0
- package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
- package/dist/{chunk-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
- package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
- package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
- package/dist/{chunk-LZOV7MX7.js → chunk-XQDRKZ7V.js} +6476 -5747
- package/dist/chunk-XQDRKZ7V.js.map +1 -0
- package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
- package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
- package/dist/chunk-YV32N67O.js.map +1 -0
- package/dist/{chunk-PBSAPHHA.js → chunk-YVKF3HEW.js} +1 -1
- package/dist/chunk-YVKF3HEW.js.map +1 -0
- package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
- package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
- package/dist/chunk-ZOKZIR5K.js.map +1 -0
- package/dist/{chunk-DCFV7A7H.js → chunk-ZVAYK7GU.js} +101 -91
- package/dist/chunk-ZVAYK7GU.js.map +1 -0
- package/dist/{cli-Cd5fMmhq.d.ts → cli-5tNLVTvJ.d.ts} +28 -12
- package/dist/cli.d.ts +16 -9
- package/dist/cli.js +142 -127
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +36 -26
- package/dist/compounding/preference-consolidator.d.ts +3 -1
- package/dist/compounding/preference-consolidator.js +1 -1
- package/dist/compression-optimizer.d.ts +3 -1
- package/dist/config-qmd.d.ts +8 -0
- package/dist/config-qmd.js +20 -0
- package/dist/config-qmd.js.map +1 -0
- package/dist/config.d.ts +3 -1
- package/dist/config.js +15 -10
- package/dist/connectors/codex-materialize-runner.d.ts +3 -1
- package/dist/connectors/codex-materialize-runner.js +36 -26
- package/dist/connectors/codex-materialize.d.ts +3 -1
- package/dist/connectors/codex-materialize.js +2 -2
- package/dist/connectors/index.d.ts +3 -1
- package/dist/connectors/index.js +41 -32
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-undo.d.ts +5 -2
- package/dist/contradiction/index.d.ts +5 -2
- package/dist/contradiction/index.js +10 -4
- package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
- package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/backend.js +5 -5
- package/dist/conversation-index/chunker.d.ts +3 -1
- package/dist/conversation-index/cleanup.js +2 -2
- package/dist/conversation-index/faiss-adapter.d.ts +3 -1
- package/dist/conversation-index/faiss-adapter.js +2 -2
- package/dist/conversation-index/indexer.d.ts +3 -1
- package/dist/conversation-index/indexer.js +2 -2
- package/dist/conversation-index/search.d.ts +3 -1
- package/dist/conversation-index/search.js +2 -2
- package/dist/cross-namespace-budget.d.ts +45 -1
- package/dist/cross-namespace-budget.js +5 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +3 -1
- package/dist/day-summary.js +3 -3
- package/dist/delinearize.d.ts +3 -1
- package/dist/direct-answer-wiring.d.ts +3 -1
- package/dist/direct-answer.d.ts +3 -1
- package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
- package/dist/dreams-ledger-567VKVOU.js.map +1 -0
- package/dist/embedding-fallback.d.ts +3 -1
- package/dist/embedding-fallback.js +3 -3
- package/dist/enrichment/index.d.ts +3 -1
- package/dist/entity-retrieval.d.ts +5 -2
- package/dist/entity-retrieval.js +35 -26
- package/dist/entity-schema.d.ts +3 -1
- package/dist/explicit-capture.d.ts +13 -8
- package/dist/explicit-capture.js +7 -3
- package/dist/extraction-faithfulness.d.ts +3 -1
- package/dist/extraction-faithfulness.js +5 -5
- package/dist/extraction-judge-telemetry.d.ts +3 -1
- package/dist/extraction-judge-telemetry.js +2 -2
- package/dist/extraction-judge-training.d.ts +3 -1
- package/dist/extraction-judge-training.js +2 -2
- package/dist/extraction-judge.d.ts +3 -1
- package/dist/extraction-judge.js +5 -5
- package/dist/extraction.d.ts +3 -1
- package/dist/extraction.js +13 -12
- package/dist/faithfulness-config.js +3 -2
- package/dist/fallback-llm.d.ts +3 -1
- package/dist/fallback-llm.js +4 -4
- package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
- package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
- package/dist/graph-dashboard-diff.d.ts +3 -1
- package/dist/graph-dashboard-key.d.ts +3 -1
- package/dist/graph-dashboard-parser.d.ts +3 -1
- package/dist/{graph-edge-decay-IOGBBAGC.js → graph-edge-decay-Z6ENALU2.js} +3 -3
- package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +3 -1
- package/dist/graph-snapshot.d.ts +3 -1
- package/dist/graph-snapshot.js +2 -2
- package/dist/graph.d.ts +3 -1
- package/dist/graph.js +1 -1
- package/dist/identity-continuity.d.ts +1 -2
- package/dist/importance.d.ts +3 -1
- package/dist/importers/index.d.ts +3 -1
- package/dist/in-flight-reads.d.ts +3 -1
- package/dist/index.d.ts +473 -464
- package/dist/index.js +287 -239
- package/dist/intent.d.ts +3 -1
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +3 -1
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.d.ts +3 -1
- package/dist/lcm/index.js +13 -13
- package/dist/lcm/schema.js +2 -2
- package/dist/lcm/summarizer.js +3 -3
- package/dist/lcm/tools.d.ts +3 -1
- package/dist/lifecycle.d.ts +3 -1
- package/dist/live-connectors-runner.d.ts +3 -1
- package/dist/local-llm.d.ts +5 -2
- package/dist/local-llm.js +3 -3
- package/dist/local-model-endpoint.d.ts +3 -1
- package/dist/logger.d.ts +3 -1
- package/dist/logger.js +7 -3
- package/dist/maintenance/archive-observations.js +2 -2
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +35 -25
- package/dist/maintenance/migrate-observations.js +3 -3
- package/dist/maintenance/observation-ledger-utils.js +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +37 -25
- package/dist/maintenance/rebuild-memory-projection.js +38 -28
- package/dist/maintenance/rebuild-observations.js +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +22 -15
- package/dist/memory-action-policy.d.ts +3 -1
- package/dist/memory-cache.d.ts +3 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
- package/dist/memory-lifecycle-ledger-utils.js +11 -1
- package/dist/memory-projection-store.d.ts +3 -1
- package/dist/memory-projection-store.js +2 -2
- package/dist/memory-provenance.d.ts +3 -1
- package/dist/memory-worth-outcomes.d.ts +5 -2
- package/dist/model-registry.js +2 -2
- package/dist/models-json.d.ts +3 -1
- package/dist/models-json.js +2 -2
- package/dist/namespaces/migrate.d.ts +6 -3
- package/dist/namespaces/migrate.js +51 -42
- package/dist/namespaces/principal.d.ts +27 -2
- package/dist/namespaces/principal.js +6 -2
- package/dist/namespaces/search.d.ts +16 -2
- package/dist/namespaces/search.js +24 -20
- package/dist/namespaces/storage.d.ts +24 -3
- package/dist/namespaces/storage.js +35 -27
- package/dist/native-knowledge.d.ts +3 -1
- package/dist/native-knowledge.js +2 -2
- package/dist/negative.js +2 -2
- package/dist/offline-sync-exclude-globs.d.ts +13 -0
- package/dist/offline-sync-exclude-globs.js +10 -0
- package/dist/offline-sync-exclude-globs.js.map +1 -0
- package/dist/offline-sync-impression-drain.d.ts +78 -0
- package/dist/offline-sync-impression-drain.js +37 -0
- package/dist/offline-sync-impression-drain.js.map +1 -0
- package/dist/offline-sync.js +4 -2
- package/dist/operator-toolkit.d.ts +5 -2
- package/dist/operator-toolkit.js +69 -54
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
- package/dist/orchestration/compression-guideline-coordinator.js +3 -3
- package/dist/orchestration/maintenance.d.ts +121 -2
- package/dist/orchestration/maintenance.js +44 -31
- package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
- package/dist/orchestrator.d.ts +13 -8
- package/dist/orchestrator.js +194 -177
- package/dist/patterns-cli.d.ts +3 -1
- package/dist/{pipeline-BAj5bx7g.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +3 -1
- package/dist/prioritized-embed.d.ts +19 -0
- package/dist/prioritized-embed.js +8 -0
- package/dist/prioritized-embed.js.map +1 -0
- package/dist/proactive-contention.d.ts +28 -0
- package/dist/proactive-contention.js +8 -0
- package/dist/proactive-contention.js.map +1 -0
- package/dist/profiling.js +2 -2
- package/dist/provenance.d.ts +3 -1
- package/dist/provenance.js +3 -2
- package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
- package/dist/{qmd-_MDSlj1m.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
- package/dist/qmd-preflight.d.ts +5 -2
- package/dist/qmd-recall-cache.d.ts +3 -1
- package/dist/qmd-status.d.ts +57 -0
- package/dist/qmd-status.js +18 -0
- package/dist/qmd-status.js.map +1 -0
- package/dist/qmd.d.ts +5 -2
- package/dist/qmd.js +7 -3
- package/dist/recall-concurrency-config.d.ts +16 -0
- package/dist/recall-concurrency-config.js +10 -0
- package/dist/recall-concurrency-config.js.map +1 -0
- package/dist/recall-disclosure-escalation.d.ts +3 -1
- package/dist/recall-explain-renderer.d.ts +4 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +26 -0
- package/dist/recall-memory-map.js +18 -0
- package/dist/recall-memory-map.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +3 -1
- package/dist/recall-planner-llm.js +4 -4
- package/dist/recall-qos.js +2 -2
- package/dist/recall-state.d.ts +163 -2
- package/dist/recall-state.js +6 -3
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-timings.d.ts +11 -2
- package/dist/recall-timings.js +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +3 -1
- package/dist/recall-xray.js +2 -2
- package/dist/relevance.js +3 -3
- package/dist/replay/normalizers/chatgpt.d.ts +3 -1
- package/dist/replay/normalizers/claude.d.ts +3 -1
- package/dist/replay/normalizers/openclaw.d.ts +3 -1
- package/dist/replay/normalizers/shared.d.ts +3 -1
- package/dist/replay/runner.d.ts +3 -1
- package/dist/replay/types.d.ts +3 -1
- package/dist/rerank.d.ts +8 -1
- package/dist/rerank.js +3 -1
- package/dist/resolution-3K27T4VO.js +18 -0
- package/dist/resolution-3K27T4VO.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +3 -1
- package/dist/resolve-provider-secret.js +2 -2
- package/dist/resume-bundles.js +19 -14
- package/dist/retrieval-agents.d.ts +19 -16
- package/dist/retrieval-agents.js +3 -3
- package/dist/retrieval-tiers.d.ts +3 -1
- package/dist/routing/engine.d.ts +3 -1
- package/dist/routing/store.d.ts +3 -1
- package/dist/routing/store.js +2 -2
- package/dist/salvage-envelope.d.ts +18 -0
- package/dist/salvage-envelope.js +15 -0
- package/dist/salvage-envelope.js.map +1 -0
- package/dist/schemas.d.ts +98 -98
- package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
- package/dist/search/document-scanner.js +3 -2
- package/dist/search/embed-helper.d.ts +3 -1
- package/dist/search/embed-helper.js +3 -3
- package/dist/search/factory.d.ts +3 -1
- package/dist/search/factory.js +18 -16
- package/dist/search/index.d.ts +3 -1
- package/dist/search/index.js +22 -20
- package/dist/search/lancedb-backend.d.ts +3 -1
- package/dist/search/lancedb-backend.js +6 -5
- package/dist/search/meilisearch-backend.d.ts +3 -1
- package/dist/search/meilisearch-backend.js +6 -5
- package/dist/search/noop-backend.d.ts +3 -1
- package/dist/search/orama-backend.d.ts +3 -1
- package/dist/search/orama-backend.js +6 -5
- package/dist/search/port.d.ts +16 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +3 -1
- package/dist/search/remote-backend.js +3 -3
- package/dist/secure-store/index.d.ts +12 -1
- package/dist/secure-store/index.js +6 -3
- package/dist/{semantic-consolidation-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +4 -2
- package/dist/semantic-consolidation.js +38 -29
- package/dist/semantic-rule-promotion.js +34 -24
- package/dist/semantic-rule-verifier.d.ts +3 -1
- package/dist/semantic-rule-verifier.js +35 -25
- package/dist/session-observer-bands.d.ts +3 -1
- package/dist/session-observer-state.d.ts +3 -1
- package/dist/session-observer-state.js +2 -2
- package/dist/session-transcript-migration.js +2 -2
- package/dist/shared-context/manager.d.ts +11 -9
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +3 -1
- package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
- package/dist/storage-guards.js +2 -2
- package/dist/storage.d.ts +6 -3
- package/dist/storage.js +38 -26
- package/dist/structured-attributes.d.ts +23 -1
- package/dist/structured-attributes.js +7 -1
- package/dist/summarizer.d.ts +3 -1
- package/dist/summarizer.js +11 -11
- package/dist/summary-snapshot.d.ts +3 -1
- package/dist/summary-snapshot.js +2 -2
- package/dist/temporal-index-batch.d.ts +1 -0
- package/dist/temporal-index-batch.js +10 -0
- package/dist/temporal-index-batch.js.map +1 -0
- package/dist/temporal-index-compat.d.ts +279 -1
- package/dist/temporal-index-compat.js +1 -1
- package/dist/temporal-index.d.ts +1 -225
- package/dist/temporal-index.js +35 -3
- package/dist/temporal-supersession.d.ts +5 -2
- package/dist/temporal-supersession.js +2 -2
- package/dist/temporal-timeline-recall.d.ts +3 -1
- package/dist/temporal-validity.d.ts +3 -1
- package/dist/threading.d.ts +3 -1
- package/dist/threading.js +2 -2
- package/dist/tier-migration.d.ts +5 -2
- package/dist/tier-routing.d.ts +3 -1
- package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
- package/dist/tokens.js +3 -3
- package/dist/topics.d.ts +3 -1
- package/dist/transcript.d.ts +3 -1
- package/dist/transcript.js +2 -2
- package/dist/transfer/backup.js +3 -3
- package/dist/transfer/capsule-export.js +3 -3
- package/dist/transfer/capsule-import.js +3 -3
- package/dist/transfer/types.d.ts +90 -90
- package/dist/trust-score-stage.d.ts +75 -38
- package/dist/trust-score-stage.js +11 -3
- package/dist/trust-score.d.ts +3 -1
- package/dist/{types-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -63
- package/dist/types-continuity.d.ts +52 -0
- package/dist/types-continuity.js +1 -0
- package/dist/types-continuity.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +3 -1
- package/dist/utils/serialize-mutations.d.ts +31 -2
- package/dist/utils/serialize-mutations.js +1 -1
- package/dist/verified-recall.js +36 -26
- package/dist/write-envelope.d.ts +282 -0
- package/dist/write-envelope.js +35 -0
- package/dist/write-envelope.js.map +1 -0
- package/dist/write-quarantine.d.ts +94 -0
- package/dist/write-quarantine.js +11 -0
- package/dist/write-quarantine.js.map +1 -0
- package/dist/write-rate-limiter.d.ts +45 -0
- package/dist/write-rate-limiter.js +9 -0
- package/dist/write-rate-limiter.js.map +1 -0
- package/package.json +37 -2
- package/src/access-admin-ops-surface.ts +17 -7
- package/src/access-boundary.test.ts +28 -0
- package/src/access-boundary.ts +31 -2
- package/src/access-citation.test.ts +72 -0
- package/src/access-citation.ts +139 -0
- package/src/access-errors.ts +21 -0
- package/src/access-fingerprint-parity.test.ts +211 -0
- package/src/access-http-cancellation.test.ts +59 -21
- package/src/access-http.test.ts +90 -0
- package/src/access-http.ts +79 -79
- package/src/access-mcp-cancellation.test.ts +16 -7
- package/src/access-memory-search-fanout.test.ts +220 -0
- package/src/access-memory-search-fanout.ts +168 -0
- package/src/access-observe-quarantine.test.ts +172 -0
- package/src/access-observe-write-surface.ts +137 -11
- package/src/access-operations-batch.ts +2 -0
- package/src/access-recall-concurrency.ts +773 -0
- package/src/access-recall-response.ts +307 -0
- package/src/access-recall-surface.ts +100 -252
- package/src/access-service-coding-write.test.ts +22 -4
- package/src/access-service-health.test.ts +49 -0
- package/src/access-service-namespace.test.ts +486 -8
- package/src/access-service-observe-scope.test.ts +4 -0
- package/src/access-service-recall-concurrency.test.ts +1990 -0
- package/src/access-service.ts +186 -179
- package/src/access-surface-catalog.ts +1 -0
- package/src/access-token-capabilities.ts +16 -9
- package/src/active-recall.test.ts +35 -0
- package/src/active-recall.ts +7 -0
- package/src/bounded-jsonl-state.ts +93 -0
- package/src/buffer-session.test.ts +422 -5
- package/src/buffer-surprise-trigger.test.ts +41 -0
- package/src/buffer.ts +218 -3
- package/src/capabilities-cluster-b.test.ts +1 -0
- package/src/capabilities.ts +5 -6
- package/src/cli.ts +21 -22
- package/src/coding/architecture-surfaces.test.ts +6 -3
- package/src/coding/architecture-surfaces.ts +36 -25
- package/src/coding/decision-surfaces.ts +42 -34
- package/src/compounding/engine.test.ts +5 -1
- package/src/compounding/engine.ts +7 -7
- package/src/config-qmd.ts +89 -0
- package/src/config.test.ts +136 -0
- package/src/config.ts +113 -118
- package/src/connector-provenance-lifecycle.test.ts +4 -4
- package/src/connectors/coerce.test.ts +131 -0
- package/src/connectors/coerce.ts +80 -7
- package/src/contradiction/contradiction.test.ts +10 -6
- package/src/contradiction/resolution.ts +17 -4
- package/src/correction/correction-access-wiring.ts +62 -18
- package/src/cross-namespace-budget.test.ts +35 -0
- package/src/cross-namespace-budget.ts +86 -19
- package/src/explicit-capture.ts +54 -17
- package/src/extraction.ts +2 -3
- package/src/faithfulness-graph-guard.test.ts +16 -69
- package/src/graph-recall.test.ts +31 -0
- package/src/index.ts +22 -2
- package/src/local-llm.ts +4 -6
- package/src/logger.ts +16 -0
- package/src/maintenance/dreams-ledger.ts +100 -49
- package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
- package/src/memory-lifecycle-ledger-utils.ts +51 -5
- package/src/namespaces/principal.test.ts +37 -1
- package/src/namespaces/principal.ts +48 -0
- package/src/namespaces/search.test.ts +79 -5
- package/src/namespaces/search.ts +59 -6
- package/src/namespaces/storage.ts +43 -1
- package/src/offline-sync-exclude-globs.ts +58 -0
- package/src/offline-sync-impression-drain.test.ts +316 -0
- package/src/offline-sync-impression-drain.ts +260 -0
- package/src/offline-sync.test.ts +32 -5
- package/src/offline-sync.ts +1 -14
- package/src/operator-toolkit.ts +1 -1
- package/src/orchestration/batch-deindex-flush.test.ts +146 -0
- package/src/orchestration/consolidation-run.ts +96 -85
- package/src/orchestration/extraction-envelope.ts +94 -0
- package/src/orchestration/extraction-persist-promotion.ts +134 -0
- package/src/orchestration/extraction-persist.ts +325 -260
- package/src/orchestration/extraction-run.test.ts +1 -1
- package/src/orchestration/extraction-run.ts +2 -2
- package/src/orchestration/graph-recall-coordinator.ts +18 -7
- package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
- package/src/orchestration/maintenance.test.ts +2103 -3
- package/src/orchestration/maintenance.ts +574 -2
- package/src/orchestration/namespace-read-fanout.ts +14 -8
- package/src/orchestration/orchestrator-helpers.ts +8 -1
- package/src/orchestration/orchestrator-init.ts +22 -6
- package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
- package/src/orchestration/persistence-index.ts +64 -9
- package/src/orchestration/qmd-result-resolver.ts +27 -0
- package/src/orchestration/recall-entry.ts +34 -19
- package/src/orchestration/recall-internal.ts +207 -79
- package/src/orchestration/recall-rerank-coordinator.ts +229 -82
- package/src/orchestration/recall-result-formatter.ts +76 -20
- package/src/orchestration/recall-search-pipeline.test.ts +70 -0
- package/src/orchestration/recall-search-pipeline.ts +102 -129
- package/src/orchestration/recall-section-coordinator.ts +315 -85
- package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
- package/src/orchestration/session-context.ts +21 -0
- package/src/orchestration/workspace-ops.test.ts +348 -0
- package/src/orchestration/workspace-ops.ts +168 -34
- package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
- package/src/orchestrator-connector-dedup.test.ts +1061 -40
- package/src/orchestrator-flush.test.ts +155 -39
- package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
- package/src/orchestrator-source-attribution.test.ts +9 -9
- package/src/orchestrator.ts +160 -149
- package/src/prioritized-embed.ts +123 -0
- package/src/proactive-contention.test.ts +80 -0
- package/src/proactive-contention.ts +39 -0
- package/src/procedural/procedure-miner.test.ts +19 -14
- package/src/procedural/procedure-miner.ts +44 -13
- package/src/qmd-client.test.ts +111 -1
- package/src/qmd-status.ts +186 -0
- package/src/qmd.ts +47 -47
- package/src/recall-budget-config.test.ts +30 -0
- package/src/recall-cold-deadline.test.ts +149 -0
- package/src/recall-concurrency-config.ts +28 -0
- package/src/recall-memory-map.ts +74 -0
- package/src/recall-rerank-coordinator.test.ts +508 -0
- package/src/recall-state.test.ts +825 -1
- package/src/recall-state.ts +406 -7
- package/src/recall-timings-access.test.ts +41 -0
- package/src/recall-timings.ts +16 -0
- package/src/relay/mission-access.test.ts +5 -5
- package/src/rerank.ts +22 -0
- package/src/retrieval-agents.test.ts +79 -0
- package/src/retrieval-agents.ts +71 -19
- package/src/salvage-envelope.ts +28 -0
- package/src/scopes/scope-plan.test.ts +42 -0
- package/src/scopes/scope-plan.ts +45 -0
- package/src/search/port.ts +13 -0
- package/src/secure-store/index.ts +1 -0
- package/src/secure-store/secure-fs.ts +48 -0
- package/src/secure-store/secure-store.test.ts +40 -0
- package/src/semantic-rule-promotion.ts +13 -4
- package/src/storage/content-hash-index.ts +655 -0
- package/src/storage/entity-timeline.ts +473 -0
- package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
- package/src/storage/secure-line-reader.test.ts +197 -0
- package/src/storage/secure-line-reader.ts +181 -3
- package/src/storage-append-header-sniff.test.ts +195 -0
- package/src/storage-behavior-signals-cache.test.ts +237 -0
- package/src/storage-contract/cache-coherence.test.ts +96 -1
- package/src/storage-contract/content-hash.test.ts +47 -2
- package/src/storage-fact-hash-index-defer.test.ts +1200 -0
- package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
- package/src/storage.ts +882 -890
- package/src/structured-attributes.ts +52 -0
- package/src/temporal-index-batch.ts +112 -0
- package/src/temporal-index.test.ts +193 -0
- package/src/temporal-index.ts +49 -53
- package/src/testing/lifecycle-matrix.test.ts +212 -0
- package/src/testing/lifecycle-matrix.ts +271 -0
- package/src/testing/orchestrator-lite.ts +236 -0
- package/src/testing/subjects/dreams-ledger.test.ts +67 -0
- package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
- package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
- package/src/testing/subjects/recall-budget.test.ts +461 -0
- package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
- package/src/trust-score-stage.test.ts +154 -0
- package/src/trust-score-stage.ts +216 -53
- package/src/types-continuity.ts +57 -0
- package/src/types.ts +51 -77
- package/src/utils/path-containment.test.ts +75 -0
- package/src/utils/path-containment.ts +76 -0
- package/src/utils/serialize-mutations.test.ts +122 -0
- package/src/utils/serialize-mutations.ts +68 -3
- package/src/wearables/memory-gen.test.ts +31 -9
- package/src/wearables/memory-gen.ts +95 -55
- package/src/wearables/pipeline.test.ts +10 -7
- package/src/wearables/service.test.ts +6 -8
- package/src/wearables/service.ts +2 -2
- package/src/write-envelope.extension.test.ts +111 -0
- package/src/write-envelope.test.ts +683 -0
- package/src/write-envelope.ts +902 -0
- package/src/write-quarantine.test.ts +245 -0
- package/src/write-quarantine.ts +290 -0
- package/src/write-rate-limiter.test.ts +105 -0
- package/src/write-rate-limiter.ts +135 -0
- package/src/write-sealed-parity.test.ts +204 -0
- package/dist/chunk-2VN4JAX7.js.map +0 -1
- package/dist/chunk-37CTGERM.js.map +0 -1
- package/dist/chunk-3IY64MV6.js.map +0 -1
- package/dist/chunk-BCDKBDSY.js.map +0 -1
- package/dist/chunk-BFPETA3S.js.map +0 -1
- package/dist/chunk-BFVEEB7W.js.map +0 -1
- package/dist/chunk-BS4SGLWV.js.map +0 -1
- package/dist/chunk-DCFV7A7H.js.map +0 -1
- package/dist/chunk-DYP3YYJJ.js.map +0 -1
- package/dist/chunk-E5BK6CGV.js +0 -335
- package/dist/chunk-E5BK6CGV.js.map +0 -1
- package/dist/chunk-FTYDWKO6.js.map +0 -1
- package/dist/chunk-GWTFLF2P.js.map +0 -1
- package/dist/chunk-IKQTFQMI.js.map +0 -1
- package/dist/chunk-INELTPRG.js.map +0 -1
- package/dist/chunk-J2HSAU72.js.map +0 -1
- package/dist/chunk-JREB6UFH.js.map +0 -1
- package/dist/chunk-K7LOWSLU.js.map +0 -1
- package/dist/chunk-KQDNAXOM.js.map +0 -1
- package/dist/chunk-KSBEEMQF.js.map +0 -1
- package/dist/chunk-KSNVDPDF.js.map +0 -1
- package/dist/chunk-LC7OODWZ.js.map +0 -1
- package/dist/chunk-LTJAMRGI.js.map +0 -1
- package/dist/chunk-LZOV7MX7.js.map +0 -1
- package/dist/chunk-NWTGD4AN.js.map +0 -1
- package/dist/chunk-ODPLEWB6.js.map +0 -1
- package/dist/chunk-OVJ2HIPE.js.map +0 -1
- package/dist/chunk-PBSAPHHA.js.map +0 -1
- package/dist/chunk-PHK3HARR.js +0 -32
- package/dist/chunk-PHK3HARR.js.map +0 -1
- package/dist/chunk-PLQE6MJA.js.map +0 -1
- package/dist/chunk-QKQYXZVS.js.map +0 -1
- package/dist/chunk-QQGPUKMT.js.map +0 -1
- package/dist/chunk-RANHFI3P.js +0 -8
- package/dist/chunk-RANHFI3P.js.map +0 -1
- package/dist/chunk-RAR2BSEM.js.map +0 -1
- package/dist/chunk-RULE4VG5.js.map +0 -1
- package/dist/chunk-SVOZFLIQ.js +0 -16
- package/dist/chunk-SVOZFLIQ.js.map +0 -1
- package/dist/chunk-T7Y5KPLN.js.map +0 -1
- package/dist/chunk-TXLGHDHS.js.map +0 -1
- package/dist/chunk-VDW4VU7B.js.map +0 -1
- package/dist/chunk-VSMRDBFT.js +0 -17
- package/dist/chunk-VSMRDBFT.js.map +0 -1
- package/dist/chunk-X64YLC24.js.map +0 -1
- package/dist/chunk-XDSXEKYK.js +0 -118
- package/dist/chunk-XDSXEKYK.js.map +0 -1
- package/dist/chunk-YF6FMLBT.js.map +0 -1
- package/dist/resolution-VH4NGENZ.js +0 -12
- /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
- /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
- /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
- /package/dist/{graph-edge-decay-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
- /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
- /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
- /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
- /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
- /package/dist/{chunk-VJVNLNDQ.js.map → chunk-2UFO7X4Q.js.map} +0 -0
- /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
- /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
- /package/dist/{chunk-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
- /package/dist/{chunk-LRNMRXJO.js.map → chunk-3Y224NYC.js.map} +0 -0
- /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
- /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
- /package/dist/{chunk-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
- /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
- /package/dist/{chunk-FDCTQWLW.js.map → chunk-6O22TZSB.js.map} +0 -0
- /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
- /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
- /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
- /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
- /package/dist/{chunk-ZHIVCODT.js.map → chunk-A72SWTWW.js.map} +0 -0
- /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
- /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
- /package/dist/{chunk-A5UXZRRM.js.map → chunk-AJ7QCSIS.js.map} +0 -0
- /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
- /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
- /package/dist/{chunk-74F5STS4.js.map → chunk-BLAKS3CP.js.map} +0 -0
- /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
- /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
- /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
- /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
- /package/dist/{chunk-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
- /package/dist/{chunk-PBNZVPFS.js.map → chunk-CXZQOVIE.js.map} +0 -0
- /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
- /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
- /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
- /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
- /package/dist/{chunk-DZKHSDOM.js.map → chunk-ES36HTSC.js.map} +0 -0
- /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
- /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
- /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
- /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
- /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
- /package/dist/{chunk-UDQUSU27.js.map → chunk-HNZKVLAN.js.map} +0 -0
- /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
- /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
- /package/dist/{chunk-E6CBU7XP.js.map → chunk-JYIFGGEM.js.map} +0 -0
- /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
- /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
- /package/dist/{chunk-KDXVOFYY.js.map → chunk-KAVBJSBQ.js.map} +0 -0
- /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
- /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
- /package/dist/{chunk-2S6QHZGJ.js.map → chunk-L2DPF4DF.js.map} +0 -0
- /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
- /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
- /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
- /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
- /package/dist/{chunk-Q5WG43OP.js.map → chunk-MYFQ3ED4.js.map} +0 -0
- /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
- /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
- /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
- /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
- /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
- /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
- /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
- /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
- /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
- /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
- /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
- /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-FNZQGN76.js.map → chunk-S2BBISHU.js.map} +0 -0
- /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-DPAENM7O.js.map → chunk-U3ZAVRP3.js.map} +0 -0
- /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
- /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-AJLLIIML.js.map → chunk-W4FBGYGK.js.map} +0 -0
- /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
- /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
- /package/dist/{chunk-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
- /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
- /package/dist/{chunk-RVZRYUQH.js.map → chunk-YROFNEG5.js.map} +0 -0
- /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
- /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
- /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
- /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
|
|
4
|
+
import { PARALLEL_AGENT_WEIGHTS, mergeWithAgentResults } from "./retrieval-agents.js";
|
|
5
|
+
import type { ParallelSearchResult } from "./retrieval-agents.js";
|
|
6
|
+
import type { QmdSearchResult } from "./types.js";
|
|
7
|
+
|
|
8
|
+
const P = "/abs/mem/a.md";
|
|
9
|
+
|
|
10
|
+
function contextual(namespace: string | undefined, snippet: string, score: number): QmdSearchResult {
|
|
11
|
+
return { docid: "a", path: P, namespace, snippet, score, transport: "hybrid" };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function direct(namespace: string | undefined, score: number): ParallelSearchResult {
|
|
15
|
+
return { docid: "a", path: P, namespace, snippet: "", score, transport: "scoped_prefilter", agentSource: "direct" };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// (a) Same resolved namespace + same path → ONE merged entry, snippet + weighted score preserved.
|
|
19
|
+
test("collapses direct + contextual for same (namespace, path) via resolver", async () => {
|
|
20
|
+
const merged = await mergeWithAgentResults(
|
|
21
|
+
[contextual("shared", "ctx", 1)],
|
|
22
|
+
[direct(undefined, 1)],
|
|
23
|
+
[],
|
|
24
|
+
PARALLEL_AGENT_WEIGHTS,
|
|
25
|
+
10,
|
|
26
|
+
undefined,
|
|
27
|
+
() => "shared",
|
|
28
|
+
);
|
|
29
|
+
assert.equal(merged.length, 1);
|
|
30
|
+
assert.equal(merged[0].namespace, "shared");
|
|
31
|
+
// Higher-weighted direct (1.0) wins the score but the contextual snippet is preserved.
|
|
32
|
+
assert.equal(merged[0].score, 1 * PARALLEL_AGENT_WEIGHTS.direct);
|
|
33
|
+
assert.equal(merged[0].snippet, "ctx");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Regression guard for the bug: without namespace normalization the same memory
|
|
37
|
+
// would occupy two keys ("shared\0P" and "\0P") and be injected twice.
|
|
38
|
+
test("without resolver an unstamped direct hit double-counts (the bug the resolver fixes)", async () => {
|
|
39
|
+
const withoutResolver = await mergeWithAgentResults(
|
|
40
|
+
[contextual("shared", "ctx", 1)],
|
|
41
|
+
[direct(undefined, 1)],
|
|
42
|
+
[],
|
|
43
|
+
PARALLEL_AGENT_WEIGHTS,
|
|
44
|
+
10,
|
|
45
|
+
undefined,
|
|
46
|
+
);
|
|
47
|
+
assert.equal(withoutResolver.length, 2);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// (b) Same path but DIFFERENT resolved namespaces stay DISTINCT.
|
|
51
|
+
test("keeps two same-path results under different namespaces distinct", async () => {
|
|
52
|
+
const merged = await mergeWithAgentResults(
|
|
53
|
+
[contextual("projA", "a", 1), contextual("projB", "b", 1)],
|
|
54
|
+
[direct("projA", 1)],
|
|
55
|
+
[],
|
|
56
|
+
PARALLEL_AGENT_WEIGHTS,
|
|
57
|
+
10,
|
|
58
|
+
undefined,
|
|
59
|
+
() => "projA",
|
|
60
|
+
);
|
|
61
|
+
assert.equal(merged.length, 2);
|
|
62
|
+
const namespaces = merged.map((r) => r.namespace).sort();
|
|
63
|
+
assert.deepEqual(namespaces, ["projA", "projB"]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// (c) Results genuinely lacking any namespace behave as before (single "" bucket).
|
|
67
|
+
test("namespace-less results merge on path alone, unchanged behavior", async () => {
|
|
68
|
+
const merged = await mergeWithAgentResults(
|
|
69
|
+
[contextual(undefined, "ctx", 1)],
|
|
70
|
+
[direct(undefined, 1)],
|
|
71
|
+
[],
|
|
72
|
+
PARALLEL_AGENT_WEIGHTS,
|
|
73
|
+
10,
|
|
74
|
+
undefined,
|
|
75
|
+
() => "",
|
|
76
|
+
);
|
|
77
|
+
assert.equal(merged.length, 1);
|
|
78
|
+
assert.equal(merged[0].namespace ?? "", "");
|
|
79
|
+
});
|
package/src/retrieval-agents.ts
CHANGED
|
@@ -123,10 +123,25 @@ async function resolveContainedRegularFile(
|
|
|
123
123
|
* Cost: readdir on entities/ + filename scoring. Typically <5ms.
|
|
124
124
|
*
|
|
125
125
|
*/
|
|
126
|
+
// Agents scan one namespace storage dir and return absolute paths. Contextual
|
|
127
|
+
// fanout hits are also absolute (globally-unique identity), so we keep the
|
|
128
|
+
// agent path absolute and only stamp the owning namespace here — that carries
|
|
129
|
+
// the namespace through merge/tracking without re-deriving it (#2020). No-op
|
|
130
|
+
// without a resolver.
|
|
131
|
+
function namespaceRelativeResult(
|
|
132
|
+
result: ParallelSearchResult,
|
|
133
|
+
_memoryDir: string,
|
|
134
|
+
namespaceFromPath?: (p: string) => string,
|
|
135
|
+
): ParallelSearchResult {
|
|
136
|
+
if (!namespaceFromPath || !result.path || result.namespace) return result;
|
|
137
|
+
return { ...result, namespace: namespaceFromPath(result.path) };
|
|
138
|
+
}
|
|
139
|
+
|
|
126
140
|
export async function runDirectAgent(
|
|
127
141
|
query: string,
|
|
128
142
|
memoryDir: string,
|
|
129
143
|
maxResults = 10,
|
|
144
|
+
namespaceFromPath?: (p: string) => string,
|
|
130
145
|
): Promise<ParallelSearchResult[]> {
|
|
131
146
|
try {
|
|
132
147
|
const canonicalRoot = await realpath(memoryDir);
|
|
@@ -156,14 +171,20 @@ export async function runDirectAgent(
|
|
|
156
171
|
const safePath = await resolveContainedRegularFile(memoryDir, fullPath, canonicalRoot);
|
|
157
172
|
if (!safePath) continue;
|
|
158
173
|
|
|
159
|
-
results.push(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
results.push(
|
|
175
|
+
namespaceRelativeResult(
|
|
176
|
+
{
|
|
177
|
+
docid: nameWithoutExt,
|
|
178
|
+
path: safePath,
|
|
179
|
+
snippet: "", // populated by augmentWithDirectAndTemporal after merge
|
|
180
|
+
score,
|
|
181
|
+
transport: "scoped_prefilter",
|
|
182
|
+
agentSource: "direct",
|
|
183
|
+
},
|
|
184
|
+
memoryDir,
|
|
185
|
+
namespaceFromPath,
|
|
186
|
+
),
|
|
187
|
+
);
|
|
167
188
|
}
|
|
168
189
|
|
|
169
190
|
return results
|
|
@@ -194,6 +215,7 @@ export async function runTemporalAgent(
|
|
|
194
215
|
/** Optional candidate set from query-aware prefilter. Applied BEFORE the top-K cap so
|
|
195
216
|
* in-scope entries are not displaced by newer out-of-scope entries. */
|
|
196
217
|
candidatePaths?: Set<string> | null,
|
|
218
|
+
namespaceFromPath?: (p: string) => string,
|
|
197
219
|
): Promise<ParallelSearchResult[]> {
|
|
198
220
|
try {
|
|
199
221
|
const canonicalRoot = await realpath(memoryDir);
|
|
@@ -306,14 +328,20 @@ export async function runTemporalAgent(
|
|
|
306
328
|
|
|
307
329
|
const baseName = path.basename(safePath, ".md");
|
|
308
330
|
|
|
309
|
-
results.push(
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
331
|
+
results.push(
|
|
332
|
+
namespaceRelativeResult(
|
|
333
|
+
{
|
|
334
|
+
docid: baseName,
|
|
335
|
+
path: safePath,
|
|
336
|
+
snippet: "", // populated by augmentWithDirectAndTemporal after merge
|
|
337
|
+
score,
|
|
338
|
+
transport: "scoped_prefilter",
|
|
339
|
+
agentSource: "temporal",
|
|
340
|
+
},
|
|
341
|
+
memoryDir,
|
|
342
|
+
namespaceFromPath,
|
|
343
|
+
),
|
|
344
|
+
);
|
|
317
345
|
}
|
|
318
346
|
|
|
319
347
|
return results
|
|
@@ -359,23 +387,34 @@ export async function runContextualAgent(
|
|
|
359
387
|
|
|
360
388
|
/**
|
|
361
389
|
* Merge results from multiple agents into a single deduplicated, weighted list.
|
|
362
|
-
*
|
|
363
|
-
*
|
|
390
|
+
* Deduplicates by (namespace, path). Contextual results carry a `namespace`
|
|
391
|
+
* (from the namespace-fanout search); direct/temporal results do not. When a
|
|
392
|
+
* `resolveNamespace` resolver is supplied, the missing namespace is derived from
|
|
393
|
+
* the result path the same canonical way the contextual side derives it
|
|
394
|
+
* (`result.namespace ?? resolveNamespace(result.path)`), so a direct/temporal hit
|
|
395
|
+
* and a contextual hit for the same (namespace, path) collapse to ONE merge key
|
|
396
|
+
* instead of being injected and access-counted twice. Preserves snippets: if a
|
|
397
|
+
* higher-scoring result lacks a snippet, the existing snippet from a lower-scoring
|
|
398
|
+
* source is retained.
|
|
364
399
|
*/
|
|
365
400
|
function mergeAgentResults(
|
|
366
401
|
allResults: ParallelSearchResult[],
|
|
367
402
|
weights: Record<SearchAgentSource, number>,
|
|
368
403
|
maxResults: number,
|
|
404
|
+
resolveNamespace?: (path: string) => string,
|
|
369
405
|
): QmdSearchResult[] {
|
|
370
406
|
const merged = new Map<string, QmdSearchResult>();
|
|
371
407
|
for (const result of allResults) {
|
|
372
|
-
const
|
|
408
|
+
const namespace =
|
|
409
|
+
result.namespace ?? (resolveNamespace && result.path ? resolveNamespace(result.path) : undefined);
|
|
410
|
+
const key = `${namespace ?? ""}\0${result.path || result.docid}`;
|
|
373
411
|
const weightedScore = result.score * weights[result.agentSource];
|
|
374
412
|
const existing = merged.get(key);
|
|
375
413
|
if (!existing || weightedScore > existing.score) {
|
|
376
414
|
merged.set(key, {
|
|
377
415
|
docid: result.docid,
|
|
378
416
|
path: result.path,
|
|
417
|
+
namespace,
|
|
379
418
|
// Preserve any snippet from the existing entry when the new one has none
|
|
380
419
|
snippet: result.snippet || existing?.snippet || "",
|
|
381
420
|
score: weightedScore,
|
|
@@ -455,6 +494,10 @@ export async function mergeWithAgentResults(
|
|
|
455
494
|
weights: Record<SearchAgentSource, number>,
|
|
456
495
|
maxResults: number,
|
|
457
496
|
memoryDir?: string,
|
|
497
|
+
/** Optional namespace resolver. Direct/temporal results lack a namespace under
|
|
498
|
+
* namespace fanout; deriving it from the path lets them collapse onto the same
|
|
499
|
+
* merge key as the contextual result for the same (namespace, path). */
|
|
500
|
+
resolveNamespace?: (path: string) => string,
|
|
458
501
|
): Promise<QmdSearchResult[]> {
|
|
459
502
|
if (directResults.length === 0 && temporalResults.length === 0) {
|
|
460
503
|
return contextualResults.slice(0, maxResults);
|
|
@@ -469,6 +512,7 @@ export async function mergeWithAgentResults(
|
|
|
469
512
|
[...contextualTagged, ...directResults, ...temporalResults],
|
|
470
513
|
weights,
|
|
471
514
|
maxResults,
|
|
515
|
+
resolveNamespace,
|
|
472
516
|
);
|
|
473
517
|
return populateEmptySnippets(merged, memoryDir);
|
|
474
518
|
}
|
|
@@ -511,6 +555,9 @@ export async function augmentWithDirectAndTemporal(
|
|
|
511
555
|
/** Optional candidate set from query-aware prefilter (time/tag scoped). Agents' results are
|
|
512
556
|
* filtered to this set when provided so recall stays within the operator-specified scope. */
|
|
513
557
|
candidatePaths?: Set<string> | null,
|
|
558
|
+
/** Optional namespace resolver so direct/temporal results collapse onto the same
|
|
559
|
+
* (namespace, path) merge key as their contextual counterpart. */
|
|
560
|
+
resolveNamespace?: (path: string) => string,
|
|
514
561
|
): Promise<QmdSearchResult[]> {
|
|
515
562
|
// maxPerAgent=0 is a hard disable: skip agents entirely and return contextual unchanged
|
|
516
563
|
if (maxPerAgent === 0) return contextualResults;
|
|
@@ -575,6 +622,7 @@ export async function augmentWithDirectAndTemporal(
|
|
|
575
622
|
[...contextualTagged, ...scopedDirect, ...temporalResults],
|
|
576
623
|
weights,
|
|
577
624
|
maxResults,
|
|
625
|
+
resolveNamespace,
|
|
578
626
|
);
|
|
579
627
|
|
|
580
628
|
// Populate snippets for results discovered only by direct/temporal (no contextual preview)
|
|
@@ -593,6 +641,9 @@ export interface ParallelRetrievalOptions {
|
|
|
593
641
|
maxResultsPerAgent?: number;
|
|
594
642
|
/** Override default agent weights. Falls back to PARALLEL_AGENT_WEIGHTS when absent. */
|
|
595
643
|
agentWeights?: Record<SearchAgentSource, number>;
|
|
644
|
+
/** Optional namespace resolver so direct/temporal results collapse onto the same
|
|
645
|
+
* (namespace, path) merge key as the contextual result for the same path. */
|
|
646
|
+
resolveNamespace?: (path: string) => string;
|
|
596
647
|
}
|
|
597
648
|
|
|
598
649
|
/**
|
|
@@ -655,6 +706,7 @@ export async function parallelRetrieval(
|
|
|
655
706
|
[...contextualResults, ...directResults, ...temporalResults],
|
|
656
707
|
options.agentWeights ?? PARALLEL_AGENT_WEIGHTS,
|
|
657
708
|
maxResults,
|
|
709
|
+
options.resolveNamespace,
|
|
658
710
|
);
|
|
659
711
|
return populateEmptySnippets(merged, memoryDir);
|
|
660
712
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
composeMemoryEnvelope,
|
|
3
|
+
type MemoryWriteInput,
|
|
4
|
+
type SealedMemoryEnvelope,
|
|
5
|
+
type WriteContext,
|
|
6
|
+
} from "./write-envelope.js";
|
|
7
|
+
import { log } from "./logger.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Shared salvage-compose helper for MACHINE-GENERATED or replayed-from-store
|
|
11
|
+
* write input (issue #1989 PR4): one malformed optional field must not abort
|
|
12
|
+
* the surrounding batch/action, and every drop is warn-logged with the
|
|
13
|
+
* caller's label — visible, never silent (rule 34).
|
|
14
|
+
*
|
|
15
|
+
* Operator/system-built input must NOT use this — compose strict so caller
|
|
16
|
+
* bugs surface (see AGENTS.md "Sealed memory-write envelope").
|
|
17
|
+
*/
|
|
18
|
+
export function composeSalvagedEnvelope(
|
|
19
|
+
label: string,
|
|
20
|
+
input: MemoryWriteInput,
|
|
21
|
+
ctx: WriteContext,
|
|
22
|
+
): SealedMemoryEnvelope {
|
|
23
|
+
const envelope = composeMemoryEnvelope(input, ctx, { salvage: true });
|
|
24
|
+
if (envelope.salvageNotes.length > 0) {
|
|
25
|
+
log.warn(`${label} write salvaged invalid fields: ${envelope.salvageNotes.join("; ")}`);
|
|
26
|
+
}
|
|
27
|
+
return envelope;
|
|
28
|
+
}
|
|
@@ -24,9 +24,11 @@ import test from "node:test";
|
|
|
24
24
|
import {
|
|
25
25
|
getConfiguredNamespaces,
|
|
26
26
|
resolveNamespaceFromStorageDir,
|
|
27
|
+
resolveNamespacePreflight,
|
|
27
28
|
resolveScopePlan,
|
|
28
29
|
resolveWritableNamespaceValue,
|
|
29
30
|
} from "./scope-plan.js";
|
|
31
|
+
import type { TokenCapabilities } from "../access-token-capabilities.js";
|
|
30
32
|
import {
|
|
31
33
|
combineNamespaces,
|
|
32
34
|
lcmSessionKeyForNamespace,
|
|
@@ -525,3 +527,43 @@ test("resolveWritableNamespaceValue: namespaces disabled, default namespace →
|
|
|
525
527
|
assert.equal(result.ok, true);
|
|
526
528
|
if (result.ok) assert.equal(result.namespace, "default");
|
|
527
529
|
});
|
|
530
|
+
|
|
531
|
+
test("resolveNamespacePreflight gates on the allow-list, policy, and the requested write op", () => {
|
|
532
|
+
const config = baseConfig({ namespacesEnabled: false });
|
|
533
|
+
// Unrestricted token, observe path: default writable, foreign policy-rejected.
|
|
534
|
+
assert.deepEqual(
|
|
535
|
+
resolveNamespacePreflight(undefined, "default", undefined, undefined, config, "observe"),
|
|
536
|
+
{ ok: true, namespace: "default" },
|
|
537
|
+
);
|
|
538
|
+
assert.equal(
|
|
539
|
+
resolveNamespacePreflight(undefined, "team-b", undefined, undefined, config, "observe").ok,
|
|
540
|
+
false,
|
|
541
|
+
);
|
|
542
|
+
// Namespace-scoped token: in-list writable; out-of-list definitive not_writable.
|
|
543
|
+
const scoped = { namespaces: ["default"] } as unknown as TokenCapabilities;
|
|
544
|
+
assert.deepEqual(
|
|
545
|
+
resolveNamespacePreflight(scoped, "default", undefined, undefined, config, "observe"),
|
|
546
|
+
{ ok: true, namespace: "default" },
|
|
547
|
+
);
|
|
548
|
+
assert.deepEqual(
|
|
549
|
+
resolveNamespacePreflight(scoped, "team-b", undefined, undefined, config, "observe"),
|
|
550
|
+
{ ok: false, reason: "not_writable", namespace: "team-b" },
|
|
551
|
+
);
|
|
552
|
+
// Write-op awareness: a memory_store-only token is not_writable for the
|
|
553
|
+
// observe path but writable for the memory_store path; a token lacking BOTH
|
|
554
|
+
// (diagnostic-only) is never writable.
|
|
555
|
+
const storeOnly = { ops: ["memory_store"] } as unknown as TokenCapabilities;
|
|
556
|
+
assert.equal(
|
|
557
|
+
resolveNamespacePreflight(storeOnly, "default", undefined, undefined, config, "observe").ok,
|
|
558
|
+
false,
|
|
559
|
+
);
|
|
560
|
+
assert.deepEqual(
|
|
561
|
+
resolveNamespacePreflight(storeOnly, "default", undefined, undefined, config, "memory_store"),
|
|
562
|
+
{ ok: true, namespace: "default" },
|
|
563
|
+
);
|
|
564
|
+
const diagnosticOnly = { ops: ["namespace_writable"] } as unknown as TokenCapabilities;
|
|
565
|
+
assert.equal(
|
|
566
|
+
resolveNamespacePreflight(diagnosticOnly, "default", undefined, undefined, config, "observe").ok,
|
|
567
|
+
false,
|
|
568
|
+
);
|
|
569
|
+
});
|
package/src/scopes/scope-plan.ts
CHANGED
|
@@ -44,6 +44,12 @@ import {
|
|
|
44
44
|
namespaceIdentityToken,
|
|
45
45
|
} from "../namespaces/identity.js";
|
|
46
46
|
import path from "node:path";
|
|
47
|
+
import {
|
|
48
|
+
capabilityAllowsOp,
|
|
49
|
+
isNamespaceAllowed,
|
|
50
|
+
resolveEffectiveNamespace,
|
|
51
|
+
type TokenCapabilities,
|
|
52
|
+
} from "../access-token-capabilities.js";
|
|
47
53
|
import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
|
|
48
54
|
import {
|
|
49
55
|
expandScopeProfileReadNamespaces,
|
|
@@ -482,3 +488,42 @@ export function resolveWritableNamespaceValue(
|
|
|
482
488
|
}
|
|
483
489
|
return { ok: true, namespace: resolved };
|
|
484
490
|
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Namespace preflight (issue #1888 part 3): would a write to `namespace` by a
|
|
494
|
+
* caller carrying `caps` succeed? Combines the token's write-op scope, its
|
|
495
|
+
* namespace allow-list, and policy writability so one call answers the real
|
|
496
|
+
* question. A token that cannot actually write (no `observe`/`memory_store` in
|
|
497
|
+
* its ops allow-list) or is asking about a namespace outside its allow-list
|
|
498
|
+
* gets a definitive `not_writable` — revealing nothing about the namespace's
|
|
499
|
+
* policy beyond what the token's own scope already implies, and never throwing
|
|
500
|
+
* a hard authorization error the caller cannot distinguish from a transport
|
|
501
|
+
* fault. (Unrestricted tokens pass both scope checks unchanged.)
|
|
502
|
+
*/
|
|
503
|
+
export function resolveNamespacePreflight(
|
|
504
|
+
caps: TokenCapabilities | undefined | null,
|
|
505
|
+
namespace: string | undefined,
|
|
506
|
+
sessionKey: string | undefined,
|
|
507
|
+
authenticatedPrincipal: string | undefined,
|
|
508
|
+
config: PluginConfig,
|
|
509
|
+
writeOp: string,
|
|
510
|
+
): WritableNamespaceResult {
|
|
511
|
+
const notWritable = (): WritableNamespaceResult => ({
|
|
512
|
+
ok: false,
|
|
513
|
+
reason: "not_writable",
|
|
514
|
+
namespace: resolveEffectiveNamespace(namespace, config.defaultNamespace) ?? namespace ?? "",
|
|
515
|
+
});
|
|
516
|
+
// The token must be able to perform the write op the caller's ENABLED write
|
|
517
|
+
// path actually uses (`observe` for automatic turn capture — the silent
|
|
518
|
+
// #1888 data-loss path — or `memory_store` for an explicit-only install).
|
|
519
|
+
// A token that cannot perform that op would drop the write, so an otherwise
|
|
520
|
+
// policy-writable namespace is still reported not_writable rather than a
|
|
521
|
+
// false ok:true that promises a write the token cannot make.
|
|
522
|
+
if (!capabilityAllowsOp(caps, writeOp)) {
|
|
523
|
+
return notWritable();
|
|
524
|
+
}
|
|
525
|
+
if (!isNamespaceAllowed(caps, namespace, config.defaultNamespace)) {
|
|
526
|
+
return notWritable();
|
|
527
|
+
}
|
|
528
|
+
return resolveWritableNamespaceValue(namespace, sessionKey, authenticatedPrincipal, config);
|
|
529
|
+
}
|
package/src/search/port.ts
CHANGED
|
@@ -64,6 +64,17 @@ export function resolveEnsureCollectionArgs(
|
|
|
64
64
|
return { collection: undefined, execution: collectionOrExecution ?? execution };
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Optional status report for search backends that track embedding backlog.
|
|
69
|
+
* Backends without embedding pipelines return null from status().
|
|
70
|
+
*/
|
|
71
|
+
export interface SearchBackendStatus {
|
|
72
|
+
pendingEmbeddings: number | null;
|
|
73
|
+
oldestPendingAgeMs: number | null;
|
|
74
|
+
totalFiles: number | null;
|
|
75
|
+
embeddedFiles: number | null;
|
|
76
|
+
}
|
|
77
|
+
|
|
67
78
|
/**
|
|
68
79
|
* Abstract search backend interface.
|
|
69
80
|
*
|
|
@@ -88,6 +99,8 @@ export interface SearchBackend {
|
|
|
88
99
|
checkAvailability?(execution?: SearchExecutionOptions): Promise<boolean>;
|
|
89
100
|
isAvailable(): boolean;
|
|
90
101
|
debugStatus(): string;
|
|
102
|
+
/** Optional embedding backlog status for health surfaces. */
|
|
103
|
+
status?(): Promise<SearchBackendStatus>;
|
|
91
104
|
|
|
92
105
|
// ── Search ──
|
|
93
106
|
search(
|
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
seal,
|
|
61
61
|
} from "./cipher.js";
|
|
62
62
|
import { RECALL_FALLBACK_DIRS } from "../utils/category-dir.js";
|
|
63
|
+
import { isErrnoCode } from "../utils/errno.js";
|
|
63
64
|
|
|
64
65
|
// ---------------------------------------------------------------------------
|
|
65
66
|
// Error classes
|
|
@@ -105,6 +106,18 @@ export const FILE_FORMAT_FLAGS = 0x00;
|
|
|
105
106
|
/** Total size of the magic header prefix (magic + version + flags). */
|
|
106
107
|
export const MAGIC_HEADER_SIZE = MAGIC_BYTES.length + 2; // 12 bytes
|
|
107
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Exact, deterministic bytes `writeMaybeEncryptedFile` adds to an encrypted
|
|
111
|
+
* file beyond its plaintext body: the magic header prefix plus the fixed
|
|
112
|
+
* envelope header (version + salt + IV + auth tag). AES-256-GCM ciphertext
|
|
113
|
+
* matches the plaintext length and the state-file write path applies no
|
|
114
|
+
* compression, so an encrypted state file is exactly `plaintext +
|
|
115
|
+
* SECURE_STORE_ENVELOPE_OVERHEAD_BYTES` on disk. Compaction reserves this so an
|
|
116
|
+
* encrypted ledger lands strictly below the reader's whole-file decrypt cap
|
|
117
|
+
* (issue #2033).
|
|
118
|
+
*/
|
|
119
|
+
export const SECURE_STORE_ENVELOPE_OVERHEAD_BYTES = MAGIC_HEADER_SIZE + ENVELOPE_HEADER_SIZE;
|
|
120
|
+
|
|
108
121
|
// ---------------------------------------------------------------------------
|
|
109
122
|
// Detection
|
|
110
123
|
// ---------------------------------------------------------------------------
|
|
@@ -119,6 +132,41 @@ export function isEncryptedFile(buf: Uint8Array): boolean {
|
|
|
119
132
|
return b.subarray(0, MAGIC_BYTES.length).equals(MAGIC_BYTES);
|
|
120
133
|
}
|
|
121
134
|
|
|
135
|
+
/**
|
|
136
|
+
* True when the REGULAR file at `probePath` is encrypted at rest (its first
|
|
137
|
+
* bytes are the REMNIC-ENC magic header). ENOENT resolves to false — an absent
|
|
138
|
+
* file has nothing to probe. A symlink, FIFO, device, or any other non-regular
|
|
139
|
+
* path is REFUSED with a throw rather than opened: opening a FIFO blocks until a
|
|
140
|
+
* writer appears and a symlink would redirect the probe outside our tree. The
|
|
141
|
+
* ledgers and per-event spills we manage are always regular files, so a
|
|
142
|
+
* non-regular path is an anomaly the caller must treat as unsafe, never follow
|
|
143
|
+
* (#2033). Shared by the CLI ledger recovery probe and the auto-compaction probe
|
|
144
|
+
* so both enforce identical open safety.
|
|
145
|
+
*/
|
|
146
|
+
export async function probeEncryptedRegularFileHeader(probePath: string): Promise<boolean> {
|
|
147
|
+
let entryStat;
|
|
148
|
+
try {
|
|
149
|
+
entryStat = await lstat(probePath);
|
|
150
|
+
} catch (err) {
|
|
151
|
+
if (isErrnoCode(err, "ENOENT")) return false;
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
if (!entryStat.isFile()) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`refusing to probe non-regular state path ${probePath} `
|
|
157
|
+
+ `(symlink/FIFO/device); opening it could block or escape containment (#2033)`,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
const handle = await openFile(probePath, "r");
|
|
161
|
+
try {
|
|
162
|
+
const header = Buffer.alloc(MAGIC_HEADER_SIZE);
|
|
163
|
+
const { bytesRead } = await handle.read(header, 0, header.length, 0);
|
|
164
|
+
return isEncryptedFile(header.subarray(0, bytesRead));
|
|
165
|
+
} finally {
|
|
166
|
+
await handle.close();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
122
170
|
// ---------------------------------------------------------------------------
|
|
123
171
|
// Encrypt / decrypt file body
|
|
124
172
|
// ---------------------------------------------------------------------------
|
|
@@ -75,6 +75,7 @@ import {
|
|
|
75
75
|
filePathAad,
|
|
76
76
|
isEncryptedFile,
|
|
77
77
|
migrateMemoryDirToEncrypted,
|
|
78
|
+
probeEncryptedRegularFileHeader,
|
|
78
79
|
readMaybeEncryptedFile,
|
|
79
80
|
} from "./secure-fs.js";
|
|
80
81
|
|
|
@@ -963,3 +964,42 @@ test("secure-store migration encrypts memory category dirs but leaves the questi
|
|
|
963
964
|
await rm(tempRoot, { recursive: true, force: true });
|
|
964
965
|
}
|
|
965
966
|
});
|
|
967
|
+
|
|
968
|
+
test("probeEncryptedRegularFileHeader detects encryption, treats absent as false, and refuses non-regular paths (#2033)", async () => {
|
|
969
|
+
const dir = await mkdtemp(path.join(tmpdir(), "remnic-probe-header-"));
|
|
970
|
+
try {
|
|
971
|
+
// Plaintext regular file → not encrypted.
|
|
972
|
+
const plainPath = path.join(dir, "plain.jsonl");
|
|
973
|
+
await writeFile(plainPath, "row-1\nrow-2\n", "utf8");
|
|
974
|
+
assert.equal(await probeEncryptedRegularFileHeader(plainPath), false, "plaintext file is not encrypted");
|
|
975
|
+
|
|
976
|
+
// Encrypted-at-rest regular file → encrypted.
|
|
977
|
+
const encPath = path.join(dir, "enc.jsonl");
|
|
978
|
+
const key = Buffer.alloc(32, 5);
|
|
979
|
+
await writeFile(encPath, encryptFileBody("secret\n", key, filePathAad(encPath, dir)));
|
|
980
|
+
assert.equal(await probeEncryptedRegularFileHeader(encPath), true, "encrypted file detected via magic header");
|
|
981
|
+
|
|
982
|
+
// Absent file → false (nothing to probe), not a throw.
|
|
983
|
+
assert.equal(await probeEncryptedRegularFileHeader(path.join(dir, "missing.jsonl")), false);
|
|
984
|
+
|
|
985
|
+
// A symlink (even to a regular file) is REFUSED before opening — a poisoned
|
|
986
|
+
// link must never redirect the probe outside our tree (#2033).
|
|
987
|
+
const linkPath = path.join(dir, "link.jsonl");
|
|
988
|
+
await symlink(plainPath, linkPath);
|
|
989
|
+
await assert.rejects(
|
|
990
|
+
() => probeEncryptedRegularFileHeader(linkPath),
|
|
991
|
+
(err: unknown) => {
|
|
992
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
993
|
+
assert.match(message, /non-regular state path/);
|
|
994
|
+
assert.match(message, /symlink\/FIFO\/device/);
|
|
995
|
+
assert.ok(message.includes(linkPath));
|
|
996
|
+
return true;
|
|
997
|
+
},
|
|
998
|
+
);
|
|
999
|
+
|
|
1000
|
+
// A directory is likewise non-regular and refused.
|
|
1001
|
+
await assert.rejects(() => probeEncryptedRegularFileHeader(dir), /non-regular state path/);
|
|
1002
|
+
} finally {
|
|
1003
|
+
await rm(dir, { recursive: true, force: true });
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { composeMemoryEnvelope } from "./write-envelope.js";
|
|
3
|
+
import { log } from "./logger.js";
|
|
2
4
|
import { link, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
5
|
import path from "node:path";
|
|
4
6
|
import { setTimeout as sleep } from "node:timers/promises";
|
|
@@ -638,10 +640,17 @@ export async function promoteSemanticRuleFromMemory(options: {
|
|
|
638
640
|
}
|
|
639
641
|
|
|
640
642
|
await lock.beforePromotedRuleWrite();
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
643
|
+
// Sealed-envelope write (issue #1989 PR4): rule content and tags are
|
|
644
|
+
// derived from stored/LLM data — salvage; drops are warn-logged.
|
|
645
|
+
const ruleEnvelope = composeMemoryEnvelope(
|
|
646
|
+
{ content, category: "rule", confidence, tags: candidateBase.tags },
|
|
647
|
+
{ source: "semantic-rule-promotion" },
|
|
648
|
+
{ salvage: true },
|
|
649
|
+
);
|
|
650
|
+
if (ruleEnvelope.salvageNotes.length > 0) {
|
|
651
|
+
log.warn(`rule-promotion write salvaged invalid fields: ${ruleEnvelope.salvageNotes.join("; ")}`);
|
|
652
|
+
}
|
|
653
|
+
const { id: id } = await storage.writeSealedMemory(ruleEnvelope, {
|
|
645
654
|
lineage: candidateBase.lineage,
|
|
646
655
|
sourceMemoryId: options.sourceMemoryId,
|
|
647
656
|
memoryKind: "note",
|