@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
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { log } from "../logger.js";
|
|
9
|
+
import { composeMemoryEnvelope } from "../write-envelope.js";
|
|
9
10
|
import type { StorageManager } from "../storage.js";
|
|
10
11
|
import type { MemoryCategory, MemoryFile } from "../types.js";
|
|
11
12
|
import type { ResolutionVerb } from "./contradiction-review.js";
|
|
@@ -386,11 +387,23 @@ async function prepareMergeReplacement(
|
|
|
386
387
|
const category = options.mergedCategory ?? mergedMemoryCategory(sourceA, sourceB);
|
|
387
388
|
let mergedId: string;
|
|
388
389
|
try {
|
|
389
|
-
|
|
390
|
+
// Sealed-envelope write (issue #1989 PR4): merged content is
|
|
391
|
+
// LLM-produced — salvage; drops are warn-logged.
|
|
392
|
+
const mergeEnvelope = composeMemoryEnvelope(
|
|
393
|
+
{
|
|
394
|
+
content: mergedContent,
|
|
395
|
+
category,
|
|
396
|
+
confidence: Math.min(sourceA.frontmatter.confidence ?? 0.8, sourceB.frontmatter.confidence ?? 0.8),
|
|
397
|
+
tags: ["contradiction-resolution", "merge"],
|
|
398
|
+
},
|
|
399
|
+
{ source: "contradiction-resolution" },
|
|
400
|
+
{ salvage: true },
|
|
401
|
+
);
|
|
402
|
+
if (mergeEnvelope.salvageNotes.length > 0) {
|
|
403
|
+
log.warn(`contradiction-resolution write salvaged invalid fields: ${mergeEnvelope.salvageNotes.join("; ")}`);
|
|
404
|
+
}
|
|
405
|
+
const mergeResult = await storage.writeSealedMemory(mergeEnvelope, {
|
|
390
406
|
actor: "contradiction-resolution",
|
|
391
|
-
confidence: Math.min(sourceA.frontmatter.confidence ?? 0.8, sourceB.frontmatter.confidence ?? 0.8),
|
|
392
|
-
tags: ["contradiction-resolution", "merge"],
|
|
393
|
-
source: "contradiction-resolution",
|
|
394
407
|
lineage: [idA, idB],
|
|
395
408
|
derivedVia: "merge",
|
|
396
409
|
});
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
import path from "node:path";
|
|
24
|
+
import { composeMemoryEnvelope, isMemoryCategory } from "../write-envelope.js";
|
|
25
|
+
import { log } from "../logger.js";
|
|
24
26
|
import { createHash } from "node:crypto";
|
|
25
27
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
26
28
|
import type { Orchestrator } from "../orchestrator.js";
|
|
@@ -402,20 +404,39 @@ async function writeReplacementMemory(
|
|
|
402
404
|
// writeMemory is the single storage chokepoint — catalog/dedup/reindex fire
|
|
403
405
|
// here (rule 43). Tombstone blocking also fires here (#1579), so a
|
|
404
406
|
// resurrected fact lands as pending_review rather than silently overwriting.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
407
|
+
// Sealed-envelope write (issue #1989 PR4): correction drafts carry
|
|
408
|
+
// plan-derived (machine) field values — salvage so one malformed optional
|
|
409
|
+
// field cannot make a correction unapplicable; drops are warn-logged.
|
|
410
|
+
// Category is IDENTITY and stays fatal (#2022 review): default to "fact"
|
|
411
|
+
// only when ABSENT (the legacy default); an explicit unrecognized value
|
|
412
|
+
// must surface as a contract error, not silently change the correction's
|
|
413
|
+
// meaning before it supersedes the target.
|
|
414
|
+
if (draft.category !== undefined && !isMemoryCategory(draft.category)) {
|
|
415
|
+
throw new CorrectionContractError(
|
|
416
|
+
`correction draft carries unrecognized category ${JSON.stringify(draft.category)} — expected a valid memory category`,
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
const draftCategory = draft.category ?? ("fact" as const);
|
|
420
|
+
const draftEnvelope = composeMemoryEnvelope(
|
|
408
421
|
{
|
|
409
|
-
|
|
422
|
+
content: draft.content,
|
|
423
|
+
category: draftCategory,
|
|
410
424
|
confidence: draft.confidence ?? 0.9,
|
|
411
425
|
tags: draft.tags ?? [],
|
|
412
426
|
...(draft.entityRef ? { entityRef: draft.entityRef } : {}),
|
|
413
427
|
...(draft.validAt ? { validAt: draft.validAt } : {}),
|
|
414
|
-
...(draft.observedAt ? { observedAt: draft.observedAt } : {}),
|
|
415
428
|
...(draft.structuredAttributes ? { structuredAttributes: draft.structuredAttributes } : {}),
|
|
416
|
-
...(draft.supersedes ? { supersedes: draft.supersedes } : {}),
|
|
417
429
|
},
|
|
430
|
+
{ source: "correction" },
|
|
431
|
+
{ salvage: true },
|
|
418
432
|
);
|
|
433
|
+
if (draftEnvelope.salvageNotes.length > 0) {
|
|
434
|
+
log.warn(`correction write salvaged invalid fields: ${draftEnvelope.salvageNotes.join("; ")}`);
|
|
435
|
+
}
|
|
436
|
+
const { id, tombstoneBlocked } = await storage.writeSealedMemory(draftEnvelope, {
|
|
437
|
+
...(draft.observedAt ? { observedAt: draft.observedAt } : {}),
|
|
438
|
+
...(draft.supersedes ? { supersedes: draft.supersedes } : {}),
|
|
439
|
+
});
|
|
419
440
|
if (tombstoneBlocked) {
|
|
420
441
|
// #1645 (review thread): the replacement content matched a tombstone, so it
|
|
421
442
|
// landed pending_review (non-active). Returning the id would let the
|
|
@@ -516,13 +537,27 @@ async function rescopeMemoryFn(
|
|
|
516
537
|
const destContent = fm.structuredAttributes
|
|
517
538
|
? stripAttributesSuffix(memory.content)
|
|
518
539
|
: memory.content;
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
540
|
+
// Sealed-envelope write (issue #1989 PR4): a rescope REPLAYS stored
|
|
541
|
+
// frontmatter — legacy rows may predate current field limits, and a
|
|
542
|
+
// rescope must never be impossible for data already in the store, so
|
|
543
|
+
// compose in salvage mode (drops warn-logged).
|
|
544
|
+
const rescopeEnvelope = composeMemoryEnvelope(
|
|
545
|
+
{
|
|
546
|
+
content: destContent,
|
|
547
|
+
category: fm.category,
|
|
548
|
+
...(typeof fm.confidence === "number" ? { confidence: fm.confidence } : {}),
|
|
549
|
+
...(Array.isArray(fm.tags) ? { tags: fm.tags } : {}),
|
|
550
|
+
...(fm.entityRef ? { entityRef: fm.entityRef } : {}),
|
|
551
|
+
...(fm.structuredAttributes ? { structuredAttributes: fm.structuredAttributes } : {}),
|
|
552
|
+
...(fm.valid_at ? { validAt: fm.valid_at } : {}),
|
|
553
|
+
},
|
|
554
|
+
{ source: `correction:rescope:${namespace}` },
|
|
555
|
+
{ salvage: true },
|
|
556
|
+
);
|
|
557
|
+
if (rescopeEnvelope.salvageNotes.length > 0) {
|
|
558
|
+
log.warn(`rescope write salvaged invalid fields: ${rescopeEnvelope.salvageNotes.join("; ")}`);
|
|
559
|
+
}
|
|
560
|
+
const { id: destId, tombstoneBlocked: destBlocked } = await destStorage.writeSealedMemory(rescopeEnvelope, {
|
|
526
561
|
...(fm.observedAt ? { observedAt: fm.observedAt } : {}),
|
|
527
562
|
...(fm.memoryKind ? { memoryKind: fm.memoryKind } : {}),
|
|
528
563
|
...(Array.isArray(fm.links) ? { links: fm.links } : {}),
|
|
@@ -669,11 +704,20 @@ async function appendAuditRecordFn(
|
|
|
669
704
|
// Corrections are themselves memories, searchable and namespaced (issue
|
|
670
705
|
// #1580 design §4). Write a correction-category memory capturing the
|
|
671
706
|
// plan + outcome as the audit trail.
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
707
|
+
// Sealed-envelope write (issue #1989 PR4): system-built audit body —
|
|
708
|
+
// strict compose; an invalid audit record is a code bug.
|
|
709
|
+
const { id: id } = await storage.writeSealedMemory(
|
|
710
|
+
composeMemoryEnvelope(
|
|
711
|
+
{
|
|
712
|
+
content: buildAuditBody(record),
|
|
713
|
+
category: "correction",
|
|
714
|
+
confidence: 1.0,
|
|
715
|
+
tags: ["correction-audit", `plan:${record.planId}`, `classification:${record.classification}`],
|
|
716
|
+
},
|
|
717
|
+
{ source: "correction-contract" },
|
|
718
|
+
),
|
|
719
|
+
{},
|
|
720
|
+
);
|
|
677
721
|
return id;
|
|
678
722
|
}
|
|
679
723
|
|
|
@@ -355,3 +355,38 @@ test("inverted soft/hard limits clamp soft <= hard", () => {
|
|
|
355
355
|
const cfg = limiter.getConfig();
|
|
356
356
|
assert.equal(cfg.softLimit, cfg.hardLimit);
|
|
357
357
|
});
|
|
358
|
+
|
|
359
|
+
test("release(token) removes the EXACT reserved entry, not the newest (issue #1906 review #4)", () => {
|
|
360
|
+
const limiter = new CrossNamespaceBudget({
|
|
361
|
+
enabled: true,
|
|
362
|
+
softLimit: 0,
|
|
363
|
+
hardLimit: 10,
|
|
364
|
+
windowMs: 60_000,
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// A reserves first (older), B reserves later (newer).
|
|
368
|
+
const a = limiter.record("p1", 0);
|
|
369
|
+
const b = limiter.record("p1", 1_000);
|
|
370
|
+
assert.ok(a.reservation, "an allowed record returns a reservation token");
|
|
371
|
+
assert.ok(b.reservation);
|
|
372
|
+
assert.equal(a.count, 1);
|
|
373
|
+
assert.equal(b.count, 2);
|
|
374
|
+
|
|
375
|
+
// A fails and releases ITS token. A naive pop-newest would drop B's entry.
|
|
376
|
+
limiter.release(a.reservation);
|
|
377
|
+
|
|
378
|
+
// Advance so A's original timestamp (t=0) would have expired but B's (t=1000)
|
|
379
|
+
// is still live. A fresh record counts only B + itself => 2. If B had been
|
|
380
|
+
// wrongly removed, only the fresh entry would remain => 1.
|
|
381
|
+
const after = limiter.record("p1", 60_500);
|
|
382
|
+
assert.equal(
|
|
383
|
+
after.count,
|
|
384
|
+
2,
|
|
385
|
+
"B's newer reservation survives A's release (A's exact entry was removed)",
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
// release() is idempotent and a no-op for an unknown/already-freed token.
|
|
389
|
+
limiter.release(a.reservation);
|
|
390
|
+
limiter.release(undefined);
|
|
391
|
+
assert.equal(limiter.bucketCount(), 1);
|
|
392
|
+
});
|
|
@@ -67,6 +67,17 @@ export type BudgetDecisionReason =
|
|
|
67
67
|
| "warn-over-soft"
|
|
68
68
|
| "deny-over-hard";
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Opaque token identifying the EXACT window entry a {@link CrossNamespaceBudget.record}
|
|
72
|
+
* reserve created (issue #1906 review #4). Pass it to `release()` to remove
|
|
73
|
+
* that specific entry — never "the newest", which under concurrency could evict
|
|
74
|
+
* a different (newer) recall's reservation and reopen the limiter early.
|
|
75
|
+
*/
|
|
76
|
+
export interface BudgetReservation {
|
|
77
|
+
principal: string;
|
|
78
|
+
id: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
70
81
|
export interface BudgetDecision {
|
|
71
82
|
allowed: boolean;
|
|
72
83
|
reason: BudgetDecisionReason;
|
|
@@ -78,11 +89,40 @@ export interface BudgetDecision {
|
|
|
78
89
|
hardLimit: number;
|
|
79
90
|
windowMs: number;
|
|
80
91
|
};
|
|
92
|
+
/**
|
|
93
|
+
* Present only when this decision RESERVED a window entry (an allowed
|
|
94
|
+
* `record()`), so the caller can later `release(reservation)` that exact
|
|
95
|
+
* entry on a failed/aborted recall. Absent on denials, peeks, and
|
|
96
|
+
* same-namespace/no-limit decisions.
|
|
97
|
+
*/
|
|
98
|
+
reservation?: BudgetReservation;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Response-safe projection of a soft-limit warning: a {@link BudgetDecision}
|
|
103
|
+
* WITHOUT the server-only `reservation` rollback token (which carries the
|
|
104
|
+
* principal id). This is what may be surfaced on HTTP/MCP recall responses and
|
|
105
|
+
* persisted in idempotency-cache entries, so it must never carry internal quota
|
|
106
|
+
* state (issue #1906 review round 10 #2).
|
|
107
|
+
*/
|
|
108
|
+
export type BudgetWarning = Omit<BudgetDecision, "reservation">;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Project a decision to its response-safe {@link BudgetWarning}, stripping the
|
|
112
|
+
* internal `reservation` token. Returns `undefined` unless the decision is a
|
|
113
|
+
* soft-limit warning (`warn-over-soft`) — so callers can assign the result to
|
|
114
|
+
* `budgetWarning` directly.
|
|
115
|
+
*/
|
|
116
|
+
export function toBudgetWarning(decision: BudgetDecision): BudgetWarning | undefined {
|
|
117
|
+
if (decision.reason !== "warn-over-soft") return undefined;
|
|
118
|
+
const { reservation: _reservation, ...warning } = decision;
|
|
119
|
+
return warning;
|
|
81
120
|
}
|
|
82
121
|
|
|
83
122
|
interface PrincipalBucket {
|
|
84
|
-
/**
|
|
85
|
-
|
|
123
|
+
/** Cross-namespace reads in the active window, each tagged with a unique id
|
|
124
|
+
* so a specific reservation can be released without disturbing others. */
|
|
125
|
+
entries: Array<{ id: number; ts: number }>;
|
|
86
126
|
}
|
|
87
127
|
|
|
88
128
|
/**
|
|
@@ -149,6 +189,8 @@ function normalizeClock(now: number | undefined): number {
|
|
|
149
189
|
export class CrossNamespaceBudget {
|
|
150
190
|
private readonly config: Required<CrossNamespaceBudgetConfig>;
|
|
151
191
|
private readonly buckets = new Map<string, PrincipalBucket>();
|
|
192
|
+
/** Monotonic id source for reservation tokens (issue #1906 review #4). */
|
|
193
|
+
private reservationSeq = 0;
|
|
152
194
|
|
|
153
195
|
constructor(config?: CrossNamespaceBudgetConfig) {
|
|
154
196
|
this.config = effectiveConfig(config);
|
|
@@ -192,46 +234,51 @@ export class CrossNamespaceBudget {
|
|
|
192
234
|
principal = "__anonymous__";
|
|
193
235
|
}
|
|
194
236
|
|
|
195
|
-
const bucket = this.buckets.get(principal) ?? {
|
|
237
|
+
const bucket = this.buckets.get(principal) ?? { entries: [] };
|
|
196
238
|
const cutoff = normalizedNow - windowMs;
|
|
197
|
-
// Drop
|
|
198
|
-
while (bucket.
|
|
199
|
-
bucket.
|
|
239
|
+
// Drop entries that slid out of the window.
|
|
240
|
+
while (bucket.entries.length > 0 && bucket.entries[0]!.ts < cutoff) {
|
|
241
|
+
bucket.entries.shift();
|
|
200
242
|
}
|
|
201
243
|
|
|
202
244
|
// Count the current call against the window BEFORE deciding — a call
|
|
203
245
|
// that crosses the deny threshold should itself be denied, not the
|
|
204
246
|
// next one. This is what the threat model calls "fail at the Nth,
|
|
205
247
|
// not the (N+1)th".
|
|
206
|
-
|
|
248
|
+
const id = ++this.reservationSeq;
|
|
249
|
+
bucket.entries.push({ id, ts: normalizedNow });
|
|
207
250
|
this.buckets.set(principal, bucket);
|
|
208
|
-
const count = bucket.
|
|
251
|
+
const count = bucket.entries.length;
|
|
209
252
|
|
|
210
253
|
if (count >= hardLimit) {
|
|
211
|
-
// Denied: roll back the
|
|
254
|
+
// Denied: roll back the entry we just added so a repeated denied
|
|
212
255
|
// call does not push the bucket further into the future. This keeps
|
|
213
256
|
// the limiter stateless with respect to denied attempts.
|
|
214
|
-
bucket.
|
|
257
|
+
bucket.entries.pop();
|
|
215
258
|
// Evict empty buckets (e.g. the first record after a long idle
|
|
216
|
-
// rolled the only
|
|
259
|
+
// rolled the only entry out, then got denied and rolled back).
|
|
217
260
|
// Prevents unbounded map growth across many transient principals.
|
|
218
|
-
if (bucket.
|
|
261
|
+
if (bucket.entries.length === 0) {
|
|
219
262
|
this.buckets.delete(principal);
|
|
220
263
|
}
|
|
221
264
|
return {
|
|
222
265
|
allowed: false,
|
|
223
266
|
reason: "deny-over-hard",
|
|
224
|
-
count: bucket.
|
|
267
|
+
count: bucket.entries.length,
|
|
225
268
|
limit,
|
|
226
269
|
};
|
|
227
270
|
}
|
|
228
271
|
|
|
272
|
+
// Allowed: the entry stands as a reservation the caller can later release
|
|
273
|
+
// by token (issue #1906 review #4).
|
|
274
|
+
const reservation: BudgetReservation = { principal, id };
|
|
229
275
|
if (count > softLimit) {
|
|
230
276
|
return {
|
|
231
277
|
allowed: true,
|
|
232
278
|
reason: "warn-over-soft",
|
|
233
279
|
count,
|
|
234
280
|
limit,
|
|
281
|
+
reservation,
|
|
235
282
|
};
|
|
236
283
|
}
|
|
237
284
|
|
|
@@ -240,6 +287,7 @@ export class CrossNamespaceBudget {
|
|
|
240
287
|
reason: "allowed-under-soft",
|
|
241
288
|
count,
|
|
242
289
|
limit,
|
|
290
|
+
reservation,
|
|
243
291
|
};
|
|
244
292
|
}
|
|
245
293
|
|
|
@@ -283,11 +331,11 @@ export class CrossNamespaceBudget {
|
|
|
283
331
|
principal = "__anonymous__";
|
|
284
332
|
}
|
|
285
333
|
const now = normalizeClock(args.now);
|
|
286
|
-
const bucket = this.buckets.get(principal) ?? {
|
|
334
|
+
const bucket = this.buckets.get(principal) ?? { entries: [] };
|
|
287
335
|
const cutoff = now - windowMs;
|
|
288
336
|
let liveCount = 0;
|
|
289
|
-
for (const
|
|
290
|
-
if (ts >= cutoff) liveCount++;
|
|
337
|
+
for (const entry of bucket.entries) {
|
|
338
|
+
if (entry.ts >= cutoff) liveCount++;
|
|
291
339
|
}
|
|
292
340
|
const projected = liveCount + 1; // +1 for the current call
|
|
293
341
|
if (projected >= hardLimit) {
|
|
@@ -335,6 +383,25 @@ export class CrossNamespaceBudget {
|
|
|
335
383
|
return this.record(args.principal, args.now);
|
|
336
384
|
}
|
|
337
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Roll back the EXACT reservation made by an allowed {@link record} (issue
|
|
388
|
+
* #1906 review #4). When a recall reserves budget at admission but then fails
|
|
389
|
+
* or is aborted, the caller releases its own `reservation` token so the
|
|
390
|
+
* errored recall does not consume budget permanently — and, critically, does
|
|
391
|
+
* NOT evict a different concurrent recall's entry (which could expire early
|
|
392
|
+
* and reopen the limiter). A no-op when the token is absent or already gone.
|
|
393
|
+
* Evicts empty buckets.
|
|
394
|
+
*/
|
|
395
|
+
release(reservation: BudgetReservation | null | undefined): void {
|
|
396
|
+
if (!reservation) return;
|
|
397
|
+
const bucket = this.buckets.get(reservation.principal);
|
|
398
|
+
if (!bucket) return;
|
|
399
|
+
const index = bucket.entries.findIndex((entry) => entry.id === reservation.id);
|
|
400
|
+
if (index < 0) return;
|
|
401
|
+
bucket.entries.splice(index, 1);
|
|
402
|
+
if (bucket.entries.length === 0) this.buckets.delete(reservation.principal);
|
|
403
|
+
}
|
|
404
|
+
|
|
338
405
|
/**
|
|
339
406
|
* Clear all state. Intended for tests and for the orchestrator's
|
|
340
407
|
* lifecycle `before_reset` hook.
|
|
@@ -355,10 +422,10 @@ export class CrossNamespaceBudget {
|
|
|
355
422
|
const cutoff = normalizedNow - this.config.windowMs;
|
|
356
423
|
let evicted = 0;
|
|
357
424
|
for (const [principal, bucket] of this.buckets.entries()) {
|
|
358
|
-
while (bucket.
|
|
359
|
-
bucket.
|
|
425
|
+
while (bucket.entries.length > 0 && bucket.entries[0]!.ts < cutoff) {
|
|
426
|
+
bucket.entries.shift();
|
|
360
427
|
}
|
|
361
|
-
if (bucket.
|
|
428
|
+
if (bucket.entries.length === 0) {
|
|
362
429
|
this.buckets.delete(principal);
|
|
363
430
|
evicted++;
|
|
364
431
|
}
|
package/src/explicit-capture.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { composeMemoryEnvelope, TAG_LIMITS } from "./write-envelope.js";
|
|
1
2
|
import { resolveNamespaceCapabilities } from "./capabilities.js";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
4
|
import type { Orchestrator } from "./orchestrator.js";
|
|
@@ -366,15 +367,31 @@ export function validateExplicitCaptureInput(
|
|
|
366
367
|
}
|
|
367
368
|
const expiresAt = parseExplicitCaptureTtl(input.ttl);
|
|
368
369
|
|
|
370
|
+
// #2014 review round: enforce the composer's tag contract HERE so a capture
|
|
371
|
+
// that passes validation can never fail later at strict compose time
|
|
372
|
+
// (validated-then-thrown was a broken contract). Same limits as TAG_LIMITS.
|
|
373
|
+
const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));
|
|
374
|
+
if (dedupedTags.length > TAG_LIMITS.maxTags) {
|
|
375
|
+
throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);
|
|
376
|
+
}
|
|
377
|
+
for (const tag of dedupedTags) {
|
|
378
|
+
if (tag.length > TAG_LIMITS.maxTagLength) {
|
|
379
|
+
throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}…`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
369
383
|
return {
|
|
370
384
|
content,
|
|
371
385
|
category,
|
|
372
386
|
confidence,
|
|
373
387
|
namespace: asTrimmed(input.namespace),
|
|
374
|
-
tags:
|
|
388
|
+
tags: dedupedTags,
|
|
375
389
|
entityRef: asTrimmed(input.entityRef),
|
|
376
390
|
sourceReason: asTrimmed(input.sourceReason),
|
|
377
|
-
|
|
391
|
+
// Trimmed like the other optional metadata (#2017 review round): a
|
|
392
|
+
// whitespace-only connector previously passed validation and then blew
|
|
393
|
+
// up at strict compose time - validated input must always compose.
|
|
394
|
+
sourceConnector: asTrimmed(input.sourceConnector),
|
|
378
395
|
expiresAt,
|
|
379
396
|
};
|
|
380
397
|
}
|
|
@@ -442,14 +459,21 @@ export async function persistExplicitCapture(
|
|
|
442
459
|
// #1645 (review thread yG-): surface the tombstone block so callers
|
|
443
460
|
// (memory_store tool, access-service HTTP/MCP) can report the capture as
|
|
444
461
|
// queued for review instead of a successfully stored active memory.
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
462
|
+
// Sealed-envelope write (issue #1989 PR2).
|
|
463
|
+
const captureEnvelope = composeMemoryEnvelope(
|
|
464
|
+
{
|
|
465
|
+
content: candidate.content,
|
|
466
|
+
category: candidate.category,
|
|
467
|
+
confidence: candidate.confidence,
|
|
468
|
+
tags: candidate.tags,
|
|
469
|
+
...(candidate.entityRef ? { entityRef: candidate.entityRef } : {}),
|
|
470
|
+
...(candidate.expiresAt ? { ttl: candidate.expiresAt } : {}),
|
|
471
|
+
...(candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {}),
|
|
472
|
+
...(candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}),
|
|
473
|
+
},
|
|
474
|
+
{ source: source === "inline" ? "explicit-inline" : "explicit" },
|
|
475
|
+
);
|
|
476
|
+
const { id, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);
|
|
453
477
|
// #1522: catalog touch handled at the storage chokepoint — the StorageManager's
|
|
454
478
|
// post-write hook records the namespace touch automatically.
|
|
455
479
|
|
|
@@ -547,13 +571,26 @@ export async function queueExplicitCaptureForReview(
|
|
|
547
571
|
: "fact";
|
|
548
572
|
const requestedTags = sanitizeReviewTags(input.tags);
|
|
549
573
|
const storage = await orchestrator.getStorage(queueNamespace);
|
|
550
|
-
const
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
574
|
+
const reviewEnvelope = composeMemoryEnvelope(
|
|
575
|
+
{
|
|
576
|
+
content,
|
|
577
|
+
category: reviewCategory,
|
|
578
|
+
confidence: 0.2,
|
|
579
|
+
tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),
|
|
580
|
+
...(sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {}),
|
|
581
|
+
...(input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}),
|
|
582
|
+
},
|
|
583
|
+
{ source: source === "inline" ? "explicit-inline-review" : "explicit-review" },
|
|
584
|
+
// The review queue is the FALLBACK for a capture that already failed
|
|
585
|
+
// primary validation — it must never be un-queueable. The tag list is
|
|
586
|
+
// machine-assembled (requested tags + the two fixed review tags), so 49+
|
|
587
|
+
// requested tags would push past the 50-tag limit and strict compose
|
|
588
|
+
// would throw, losing the capture (#2014 review round). Salvage clamps
|
|
589
|
+
// instead; the fixed review tags sort first in the assembly above, so
|
|
590
|
+
// they always survive the clamp.
|
|
591
|
+
{ salvage: true },
|
|
592
|
+
);
|
|
593
|
+
const { id: id } = await storage.writeSealedMemory(reviewEnvelope);
|
|
557
594
|
try {
|
|
558
595
|
const created = await storage.getMemoryById(id);
|
|
559
596
|
if (created) {
|
package/src/extraction.ts
CHANGED
|
@@ -2,6 +2,7 @@ import OpenAI from "openai";
|
|
|
2
2
|
import { log } from "./logger.js";
|
|
3
3
|
import { delinearize } from "./delinearize.js";
|
|
4
4
|
import { LocalLlmClient } from "./local-llm.js";
|
|
5
|
+
import { shouldRunProactivePass } from "./proactive-contention.js";
|
|
5
6
|
import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig, gatewayTaskChainOptions } from "./fallback-llm.js";
|
|
6
7
|
import {
|
|
7
8
|
ExtractionResultSchema,
|
|
@@ -633,9 +634,7 @@ export class ExtractionEngine {
|
|
|
633
634
|
): Promise<ExtractionResult> {
|
|
634
635
|
if (!resolvePipelineProcessingCapabilities(this.config).proactiveExtraction) return base;
|
|
635
636
|
const maxAdditional = Math.max(0, Math.floor(this.config.maxProactiveQuestionsPerExtraction));
|
|
636
|
-
if (maxAdditional
|
|
637
|
-
if (this.config.proactiveExtractionTimeoutMs === 0) return base;
|
|
638
|
-
if (this.config.proactiveExtractionMaxTokens === 0) return base;
|
|
637
|
+
if (!shouldRunProactivePass(this.config, maxAdditional, this.shouldUseLocalLlm, this.localLlm)) return base;
|
|
639
638
|
|
|
640
639
|
try {
|
|
641
640
|
const proactive = await this.generateProactiveQuestions(conversation, base, maxAdditional);
|
|
@@ -26,6 +26,8 @@ import { readEdges } from "./graph.js";
|
|
|
26
26
|
import type { ExtractionResult, PluginConfig } from "./types.js";
|
|
27
27
|
import type { LocalLlmClient } from "./local-llm.js";
|
|
28
28
|
import type { BufferTurn, ConversationThread } from "./types.js";
|
|
29
|
+
import type { PersistExtractionFn } from "./testing/orchestrator-lite.js";
|
|
30
|
+
import type { StorageManager } from "./storage.js";
|
|
29
31
|
|
|
30
32
|
/**
|
|
31
33
|
* Stub local LLM whose `chatCompletion` only answers faithfulness-gate calls
|
|
@@ -126,33 +128,18 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
126
128
|
faithfulnessStubLocalLlm((c) =>
|
|
127
129
|
c.includes("closed permanently") ? "unsupported" : "entailed",
|
|
128
130
|
);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
frontmatter: { id: string; status?: string };
|
|
136
|
-
}>
|
|
137
|
-
>;
|
|
138
|
-
}>;
|
|
139
|
-
}).getStorage("default");
|
|
131
|
+
// getStorage + persistExtraction are private; reach them through a named production-typed surface.
|
|
132
|
+
const persist = orchestrator as unknown as {
|
|
133
|
+
getStorage: (ns: string) => Promise<StorageManager>;
|
|
134
|
+
persistExtraction: PersistExtractionFn;
|
|
135
|
+
};
|
|
136
|
+
const storage = await persist.getStorage("default");
|
|
140
137
|
await storage.ensureDirectories();
|
|
141
138
|
|
|
142
139
|
const sourceText =
|
|
143
140
|
"The widget factory produces widgets. It launched last year. The team is small.";
|
|
144
141
|
|
|
145
|
-
const ids0 = await (
|
|
146
|
-
persistExtraction: (
|
|
147
|
-
r: ExtractionResult,
|
|
148
|
-
s: unknown,
|
|
149
|
-
t: unknown,
|
|
150
|
-
ctx: unknown,
|
|
151
|
-
bn: unknown,
|
|
152
|
-
plan: unknown,
|
|
153
|
-
src: string,
|
|
154
|
-
) => Promise<string[]>;
|
|
155
|
-
}).persistExtraction(
|
|
142
|
+
const { persistedIds: ids0 } = await persist.persistExtraction(
|
|
156
143
|
factResult("The widget factory produces widgets daily.", "widget-factory"),
|
|
157
144
|
storage,
|
|
158
145
|
null,
|
|
@@ -166,17 +153,7 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
166
153
|
|
|
167
154
|
// fact1 → unsupported (pending_review). Under the bug it would originate an
|
|
168
155
|
// entity edge to fact0; under the guard it must NOT.
|
|
169
|
-
const ids1 = await (
|
|
170
|
-
persistExtraction: (
|
|
171
|
-
r: ExtractionResult,
|
|
172
|
-
s: unknown,
|
|
173
|
-
t: unknown,
|
|
174
|
-
ctx: unknown,
|
|
175
|
-
bn: unknown,
|
|
176
|
-
plan: unknown,
|
|
177
|
-
src: string,
|
|
178
|
-
) => Promise<string[]>;
|
|
179
|
-
}).persistExtraction(
|
|
156
|
+
const { persistedIds: ids1 } = await persist.persistExtraction(
|
|
180
157
|
factResult(
|
|
181
158
|
"The widget factory closed permanently.",
|
|
182
159
|
"widget-factory",
|
|
@@ -216,17 +193,7 @@ test("pending_review fact gets no graph edge; an active fact with the same entit
|
|
|
216
193
|
|
|
217
194
|
// Control: an ACTIVE fact with the same entityRef DOES create entity edges
|
|
218
195
|
// (proving the graph is wired and only pending_review is excluded).
|
|
219
|
-
const ids2 = await (
|
|
220
|
-
persistExtraction: (
|
|
221
|
-
r: ExtractionResult,
|
|
222
|
-
s: unknown,
|
|
223
|
-
t: unknown,
|
|
224
|
-
ctx: unknown,
|
|
225
|
-
bn: unknown,
|
|
226
|
-
plan: unknown,
|
|
227
|
-
src: string,
|
|
228
|
-
) => Promise<string[]>;
|
|
229
|
-
}).persistExtraction(
|
|
196
|
+
const { persistedIds: ids2 } = await persist.persistExtraction(
|
|
230
197
|
factResult("The widget factory reopened this quarter.", "widget-factory"),
|
|
231
198
|
storage,
|
|
232
199
|
null,
|
|
@@ -312,26 +279,6 @@ function twoFactResult(
|
|
|
312
279
|
} as unknown as ExtractionResult;
|
|
313
280
|
}
|
|
314
281
|
|
|
315
|
-
interface StorageLike {
|
|
316
|
-
ensureDirectories: () => Promise<void>;
|
|
317
|
-
dir: string;
|
|
318
|
-
readAllMemories: () => Promise<
|
|
319
|
-
Array<{ path: string; frontmatter: { id: string; status?: string } }>
|
|
320
|
-
>;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
interface PersistExtractionSig {
|
|
324
|
-
(
|
|
325
|
-
r: ExtractionResult,
|
|
326
|
-
s: unknown,
|
|
327
|
-
t: string | null,
|
|
328
|
-
ctx: unknown,
|
|
329
|
-
bn: unknown,
|
|
330
|
-
plan: unknown,
|
|
331
|
-
src: string,
|
|
332
|
-
): Promise<string[]>;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
282
|
test("pending_review id must NOT enter persisted thread episodes across a cross-flush (#1635)", async () => {
|
|
336
283
|
const { orchestrator, memoryDir } = await makeThreadHarness();
|
|
337
284
|
try {
|
|
@@ -342,7 +289,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
342
289
|
);
|
|
343
290
|
|
|
344
291
|
const getStorage = orchestrator as unknown as {
|
|
345
|
-
getStorage: (ns: string) => Promise<
|
|
292
|
+
getStorage: (ns: string) => Promise<StorageManager>;
|
|
346
293
|
};
|
|
347
294
|
const storage = await getStorage.getStorage("default");
|
|
348
295
|
await storage.ensureDirectories();
|
|
@@ -365,10 +312,10 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
365
312
|
assert.ok(threadId, "thread established via processTurn");
|
|
366
313
|
|
|
367
314
|
const persist = orchestrator as unknown as {
|
|
368
|
-
persistExtraction:
|
|
315
|
+
persistExtraction: PersistExtractionFn;
|
|
369
316
|
appendPersistedThreadEpisodes: (
|
|
370
317
|
threadId: string,
|
|
371
|
-
persistedIds: string[]
|
|
318
|
+
persistedIds: string[]
|
|
372
319
|
) => Promise<void>;
|
|
373
320
|
};
|
|
374
321
|
|
|
@@ -376,7 +323,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
376
323
|
"The widget factory reopened this quarter after being closed permanently last year.";
|
|
377
324
|
|
|
378
325
|
// --- Flush 1: an active fact + a pending_review fact, same thread ---
|
|
379
|
-
const flush1 = await persist.persistExtraction(
|
|
326
|
+
const { persistedIds: flush1 } = await persist.persistExtraction(
|
|
380
327
|
twoFactResult(
|
|
381
328
|
"The widget factory reopened this quarter.", "wf-active",
|
|
382
329
|
"The widget factory closed permanently last year.", "wf-pending",
|
|
@@ -419,7 +366,7 @@ test("pending_review id must NOT enter persisted thread episodes across a cross-
|
|
|
419
366
|
);
|
|
420
367
|
|
|
421
368
|
// --- Flush 2: an active fact in the SAME thread ---
|
|
422
|
-
const flush2 = await persist.persistExtraction(
|
|
369
|
+
const { persistedIds: flush2 } = await persist.persistExtraction(
|
|
423
370
|
factResult("The widget factory hired ten new engineers.", "wf-active"),
|
|
424
371
|
storage,
|
|
425
372
|
threadId,
|