@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
package/src/access-http.test.ts
CHANGED
|
@@ -1636,6 +1636,9 @@ test("HTTP externalRequestHandler runs pre-auth, can end responses, and falls th
|
|
|
1636
1636
|
upgradeAvailable: null,
|
|
1637
1637
|
doctorAvailable: null,
|
|
1638
1638
|
debugStatus: "disabled",
|
|
1639
|
+
pendingEmbeddings: null,
|
|
1640
|
+
oldestPendingAgeMs: null,
|
|
1641
|
+
embeddingBacklogThreshold: 1000,
|
|
1639
1642
|
},
|
|
1640
1643
|
nativeKnowledgeEnabled: false,
|
|
1641
1644
|
projectionAvailable: false,
|
|
@@ -1748,6 +1751,9 @@ test("HTTP authTokenEntriesGetter is authoritative: scope policy binds connector
|
|
|
1748
1751
|
upgradeAvailable: null,
|
|
1749
1752
|
doctorAvailable: null,
|
|
1750
1753
|
debugStatus: "disabled",
|
|
1754
|
+
pendingEmbeddings: null,
|
|
1755
|
+
oldestPendingAgeMs: null,
|
|
1756
|
+
embeddingBacklogThreshold: 1000,
|
|
1751
1757
|
},
|
|
1752
1758
|
nativeKnowledgeEnabled: false,
|
|
1753
1759
|
projectionAvailable: false,
|
|
@@ -2714,3 +2720,87 @@ test("PR #1852: static operator token has no connector provenance under rotation
|
|
|
2714
2720
|
await server.stop();
|
|
2715
2721
|
}
|
|
2716
2722
|
});
|
|
2723
|
+
|
|
2724
|
+
test("HTTP namespace/writable preflight returns the structured writability result", async () => {
|
|
2725
|
+
// Real config through the pure resolver: the default namespace is writable
|
|
2726
|
+
// for any principal; a foreign namespace with no policy is not. A rejection
|
|
2727
|
+
// is a valid 200 answer (read via `ok`), not an HTTP error.
|
|
2728
|
+
const service = {
|
|
2729
|
+
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-test", defaultNamespace: "default" }),
|
|
2730
|
+
} as unknown as EngramAccessService;
|
|
2731
|
+
const server = new EngramAccessHttpServer({
|
|
2732
|
+
service,
|
|
2733
|
+
port: 0,
|
|
2734
|
+
authToken: "test-token",
|
|
2735
|
+
adminConsoleEnabled: false,
|
|
2736
|
+
});
|
|
2737
|
+
|
|
2738
|
+
const status = await server.start();
|
|
2739
|
+
try {
|
|
2740
|
+
const okRes = await fetch(
|
|
2741
|
+
`http://127.0.0.1:${status.port}/engram/v1/namespace/writable?namespace=default`,
|
|
2742
|
+
{ headers: { authorization: "Bearer test-token" } },
|
|
2743
|
+
);
|
|
2744
|
+
assert.equal(okRes.status, 200);
|
|
2745
|
+
assert.deepEqual(await okRes.json(), { ok: true, namespace: "default" });
|
|
2746
|
+
|
|
2747
|
+
const badRes = await fetch(
|
|
2748
|
+
`http://127.0.0.1:${status.port}/engram/v1/namespace/writable?namespace=team-x`,
|
|
2749
|
+
{ headers: { authorization: "Bearer test-token" } },
|
|
2750
|
+
);
|
|
2751
|
+
assert.equal(badRes.status, 200);
|
|
2752
|
+
const badBody = (await badRes.json()) as { ok: boolean; namespace: string };
|
|
2753
|
+
assert.equal(badBody.ok, false);
|
|
2754
|
+
assert.equal(badBody.namespace, "team-x");
|
|
2755
|
+
} finally {
|
|
2756
|
+
await server.stop();
|
|
2757
|
+
}
|
|
2758
|
+
});
|
|
2759
|
+
|
|
2760
|
+
test("HTTP namespace/writable preflight admits write-scoped tokens and rejects read-only ops", async () => {
|
|
2761
|
+
const service = {
|
|
2762
|
+
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-ops-test", defaultNamespace: "default" }),
|
|
2763
|
+
} as unknown as EngramAccessService;
|
|
2764
|
+
const server = new EngramAccessHttpServer({
|
|
2765
|
+
service,
|
|
2766
|
+
port: 0,
|
|
2767
|
+
authTokenEntriesGetter: () => [
|
|
2768
|
+
{ token: "write-scoped", capabilities: { version: 1, ops: ["observe", "memory_store"] } },
|
|
2769
|
+
{ token: "store-only", capabilities: { version: 1, ops: ["memory_store"] } },
|
|
2770
|
+
{ token: "diagnostic-only", capabilities: { version: 1, ops: ["namespace_writable"] } },
|
|
2771
|
+
{ token: "read-only", capabilities: { version: 1, ops: ["recall"] } },
|
|
2772
|
+
],
|
|
2773
|
+
adminConsoleEnabled: false,
|
|
2774
|
+
});
|
|
2775
|
+
const status = await server.start();
|
|
2776
|
+
const request = (token: string, op?: string) =>
|
|
2777
|
+
fetch(
|
|
2778
|
+
`http://127.0.0.1:${status.port}/engram/v1/namespace/writable?namespace=default${op ? `&op=${op}` : ""}`,
|
|
2779
|
+
{ headers: { authorization: `Bearer ${token}` } },
|
|
2780
|
+
);
|
|
2781
|
+
const okOf = async (r: Response) => {
|
|
2782
|
+
const body = (await r.json()) as { ok?: unknown };
|
|
2783
|
+
return body.ok;
|
|
2784
|
+
};
|
|
2785
|
+
try {
|
|
2786
|
+
// A token scoped to write ops but NOT the namespace_writable op (e.g. minted
|
|
2787
|
+
// before this endpoint existed) may still run the preflight.
|
|
2788
|
+
const writeScoped = await request("write-scoped");
|
|
2789
|
+
assert.equal(writeScoped.status, 200);
|
|
2790
|
+
assert.equal(await okOf(writeScoped), true);
|
|
2791
|
+
// Config-aware write op: a memory_store-only token is writable for the
|
|
2792
|
+
// explicit store path (?op=memory_store) but not for the automatic observe
|
|
2793
|
+
// path (default), which it cannot perform.
|
|
2794
|
+
assert.equal(await okOf(await request("store-only", "memory_store")), true);
|
|
2795
|
+
assert.equal(await okOf(await request("store-only")), false);
|
|
2796
|
+
// A token scoped to the diagnostic op ONLY can call the endpoint but cannot
|
|
2797
|
+
// write, so the answer is a definitive not-writable (never a false ok:true).
|
|
2798
|
+
const diag = await request("diagnostic-only");
|
|
2799
|
+
assert.equal(diag.status, 200);
|
|
2800
|
+
assert.equal(await okOf(diag), false);
|
|
2801
|
+
// A read-only token cannot write, so it has nothing to preflight → 403.
|
|
2802
|
+
assert.equal((await request("read-only")).status, 403);
|
|
2803
|
+
} finally {
|
|
2804
|
+
await server.stop();
|
|
2805
|
+
}
|
|
2806
|
+
});
|
package/src/access-http.ts
CHANGED
|
@@ -7,6 +7,7 @@ import path from "node:path";
|
|
|
7
7
|
import { fileURLToPath, URL } from "node:url";
|
|
8
8
|
import { gunzipSync } from "node:zlib";
|
|
9
9
|
import { log } from "./logger.js";
|
|
10
|
+
import { WriteRateLimiter } from "./write-rate-limiter.js";
|
|
10
11
|
import { abortError, isAbortError } from "./abort-error.js";
|
|
11
12
|
import { EngramAccessForbiddenError } from "./access-errors.js";
|
|
12
13
|
import {
|
|
@@ -36,8 +37,10 @@ import {
|
|
|
36
37
|
import { expandTildePath } from "./utils/path.js";
|
|
37
38
|
import { projectTagProjectId } from "./coding/coding-namespace.js";
|
|
38
39
|
import { getOperation, type OperationName } from "./access-boundary.js";
|
|
40
|
+
import { resolveNamespacePreflight } from "./scopes/scope-plan.js";
|
|
39
41
|
import {
|
|
40
42
|
assertOperationAllowed,
|
|
43
|
+
capabilityAllowsOp,
|
|
41
44
|
enforceNamespaceAllowList,
|
|
42
45
|
isCapabilityRestricted,
|
|
43
46
|
tokenCapabilityStore,
|
|
@@ -220,10 +223,6 @@ const RELAY_ADMIN_CONSOLE_ASSETS = new Map<string, string>([
|
|
|
220
223
|
["replay.json", "application/json; charset=utf-8"],
|
|
221
224
|
]);
|
|
222
225
|
|
|
223
|
-
// Defaults for the write rate limit; overridable per instance via
|
|
224
|
-
// `writeRateLimitWindowMs` / `writeRateLimitMaxRequests` (issue #1937).
|
|
225
|
-
const WRITE_RATE_LIMIT_WINDOW_MS = 60_000;
|
|
226
|
-
const WRITE_RATE_LIMIT_MAX_REQUESTS = 30;
|
|
227
226
|
const TRUST_ZONE_RECORD_KINDS = ["memory", "artifact", "state", "trajectory", "external"] as const;
|
|
228
227
|
const TRUST_ZONE_SOURCE_CLASSES = ["tool_output", "web_content", "subagent_trace", "system_memory", "user_input", "manual"] as const;
|
|
229
228
|
|
|
@@ -401,9 +400,7 @@ export class EngramAccessHttpServer {
|
|
|
401
400
|
res: ServerResponse,
|
|
402
401
|
ctx: { authorized: boolean },
|
|
403
402
|
) => Promise<boolean>;
|
|
404
|
-
private readonly
|
|
405
|
-
private readonly writeRateLimitMaxRequests: number;
|
|
406
|
-
private readonly writeRateLimitWindowMs: number;
|
|
403
|
+
private readonly writeLimiter: WriteRateLimiter;
|
|
407
404
|
private readonly mcpServer: EngramMcpServer;
|
|
408
405
|
private server: Server | null = null;
|
|
409
406
|
private boundPort = 0;
|
|
@@ -440,20 +437,10 @@ export class EngramAccessHttpServer {
|
|
|
440
437
|
this.maxBodyBytes = Number.isFinite(options.maxBodyBytes)
|
|
441
438
|
? Math.max(1, Math.floor(options.maxBodyBytes ?? 131072))
|
|
442
439
|
: 131072;
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
Number.isInteger(options.writeRateLimitMaxRequests) &&
|
|
448
|
-
options.writeRateLimitMaxRequests >= 1
|
|
449
|
-
? options.writeRateLimitMaxRequests
|
|
450
|
-
: WRITE_RATE_LIMIT_MAX_REQUESTS;
|
|
451
|
-
this.writeRateLimitWindowMs =
|
|
452
|
-
typeof options.writeRateLimitWindowMs === "number" &&
|
|
453
|
-
Number.isInteger(options.writeRateLimitWindowMs) &&
|
|
454
|
-
options.writeRateLimitWindowMs >= 1
|
|
455
|
-
? options.writeRateLimitWindowMs
|
|
456
|
-
: WRITE_RATE_LIMIT_WINDOW_MS;
|
|
440
|
+
this.writeLimiter = new WriteRateLimiter(
|
|
441
|
+
options.writeRateLimitMaxRequests,
|
|
442
|
+
options.writeRateLimitWindowMs,
|
|
443
|
+
);
|
|
457
444
|
this.adminConsoleEnabled = options.adminConsoleEnabled !== false;
|
|
458
445
|
this.adminConsolePublicDir = options.adminConsolePublicDir ?? defaultAdminConsolePublicDir;
|
|
459
446
|
this.adminConsolePrefillToken = options.adminConsolePrefillToken === true ? this.authToken : undefined;
|
|
@@ -1098,7 +1085,7 @@ export class EngramAccessHttpServer {
|
|
|
1098
1085
|
) {
|
|
1099
1086
|
this.enforceTokenOp("capsule_export"); // boundary dispatch (issue #1525)
|
|
1100
1087
|
const body = await this.readValidatedBody(req, "capsuleExport");
|
|
1101
|
-
this.ensureWriteRateLimitAvailable();
|
|
1088
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1102
1089
|
const result = await this.service.capsuleExport({
|
|
1103
1090
|
name: body.name,
|
|
1104
1091
|
namespace: this.resolveNamespace(req, body.namespace),
|
|
@@ -1109,7 +1096,7 @@ export class EngramAccessHttpServer {
|
|
|
1109
1096
|
includeTranscripts: body.includeTranscripts,
|
|
1110
1097
|
encrypt: body.encrypt,
|
|
1111
1098
|
});
|
|
1112
|
-
this.recordWriteRateLimitHit();
|
|
1099
|
+
this.recordWriteRateLimitHit(req);
|
|
1113
1100
|
this.respondJson(res, 200, result);
|
|
1114
1101
|
return;
|
|
1115
1102
|
}
|
|
@@ -1120,7 +1107,7 @@ export class EngramAccessHttpServer {
|
|
|
1120
1107
|
) {
|
|
1121
1108
|
this.enforceTokenOp("capsule_import"); // boundary dispatch (issue #1525)
|
|
1122
1109
|
const body = await this.readValidatedBody(req, "capsuleImport");
|
|
1123
|
-
this.ensureWriteRateLimitAvailable();
|
|
1110
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1124
1111
|
const result = await this.service.capsuleImport({
|
|
1125
1112
|
archivePath: expandTildePath(body.archivePath),
|
|
1126
1113
|
namespace: this.resolveNamespace(req, body.namespace),
|
|
@@ -1128,7 +1115,7 @@ export class EngramAccessHttpServer {
|
|
|
1128
1115
|
mode: body.mode,
|
|
1129
1116
|
passphrase: body.passphrase,
|
|
1130
1117
|
});
|
|
1131
|
-
this.recordWriteRateLimitHit();
|
|
1118
|
+
this.recordWriteRateLimitHit(req);
|
|
1132
1119
|
this.respondJson(res, 200, result);
|
|
1133
1120
|
return;
|
|
1134
1121
|
}
|
|
@@ -1480,6 +1467,23 @@ export class EngramAccessHttpServer {
|
|
|
1480
1467
|
return;
|
|
1481
1468
|
}
|
|
1482
1469
|
|
|
1470
|
+
// Namespace-writability preflight (issue #1888 part 3): would the client's
|
|
1471
|
+
// enabled write (`?op=observe|memory_store`, default observe) to the
|
|
1472
|
+
// requested namespace by THIS token succeed? Out-of-allow-list → 200
|
|
1473
|
+
// {ok:false}; any allowedByOps token may run it (HTTP + batch admit alike).
|
|
1474
|
+
if (req.method === "GET" && pathname === "/engram/v1/namespace/writable") {
|
|
1475
|
+
const preflightOp = getOperation("namespace_writable"); // boundary marker (catalog parity, issue #1888)
|
|
1476
|
+
const caps = tokenCapabilityStore.getStore();
|
|
1477
|
+
if (!(preflightOp?.spec.allowedByOps ?? []).some((op) => capabilityAllowsOp(caps, op))) {
|
|
1478
|
+
throw new EngramAccessForbiddenError("token is not permitted to run the namespace preflight");
|
|
1479
|
+
}
|
|
1480
|
+
const ns = parsed.searchParams.get("namespace") || undefined;
|
|
1481
|
+
const sk = parsed.searchParams.get("session") || undefined;
|
|
1482
|
+
const writeOp = parsed.searchParams.get("op") === "memory_store" ? "memory_store" : "observe";
|
|
1483
|
+
this.respondJson(res, 200, resolveNamespacePreflight(caps, ns, sk, this.resolveRequestPrincipal(req), this.service.configRef, writeOp));
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1483
1487
|
// -- Wearables (Limitless / Bee / Omi transcript ingestion). All
|
|
1484
1488
|
// behavior + validation lives in WearablesService; these routes
|
|
1485
1489
|
// translate transport shape only. Service validation errors map
|
|
@@ -1639,12 +1643,12 @@ export class EngramAccessHttpServer {
|
|
|
1639
1643
|
// attempt may have consumed the last quota slot; the retry returns the
|
|
1640
1644
|
// cached response without requiring another. Matches memory_store's
|
|
1641
1645
|
// hook-in-the-lock pattern (#1434 invariant).
|
|
1642
|
-
{ enforceWriteQuota: () => this.ensureWriteRateLimitAvailable() },
|
|
1646
|
+
{ enforceWriteQuota: () => this.ensureWriteRateLimitAvailable(req) },
|
|
1643
1647
|
);
|
|
1644
1648
|
// A replayed (deduplicated) observe must not consume a second write-quota
|
|
1645
1649
|
// slot — same invariant as memory_store/suggestion_submit (#1434).
|
|
1646
1650
|
if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
1647
|
-
this.recordWriteRateLimitHit();
|
|
1651
|
+
this.recordWriteRateLimitHit(req);
|
|
1648
1652
|
}
|
|
1649
1653
|
this.respondJson(res, 202, response);
|
|
1650
1654
|
return;
|
|
@@ -1671,13 +1675,13 @@ export class EngramAccessHttpServer {
|
|
|
1671
1675
|
) {
|
|
1672
1676
|
this.enforceTokenOp("lcm_compaction_flush"); // boundary dispatch (issue #1525)
|
|
1673
1677
|
const body = await this.readValidatedBody(req, "lcmCompactionFlush");
|
|
1674
|
-
this.ensureWriteRateLimitAvailable();
|
|
1678
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1675
1679
|
const response = await this.service.lcmCompactionFlush({
|
|
1676
1680
|
sessionKey: body.sessionKey,
|
|
1677
1681
|
namespace: this.resolveNamespace(req, body.namespace),
|
|
1678
1682
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1679
1683
|
});
|
|
1680
|
-
this.recordWriteRateLimitHit();
|
|
1684
|
+
this.recordWriteRateLimitHit(req);
|
|
1681
1685
|
this.respondJson(res, 200, response);
|
|
1682
1686
|
return;
|
|
1683
1687
|
}
|
|
@@ -1688,7 +1692,7 @@ export class EngramAccessHttpServer {
|
|
|
1688
1692
|
) {
|
|
1689
1693
|
this.enforceTokenOp("lcm_compaction_record"); // boundary dispatch (issue #1525)
|
|
1690
1694
|
const body = await this.readValidatedBody(req, "lcmCompactionRecord");
|
|
1691
|
-
this.ensureWriteRateLimitAvailable();
|
|
1695
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1692
1696
|
const response = await this.service.lcmCompactionRecord({
|
|
1693
1697
|
sessionKey: body.sessionKey,
|
|
1694
1698
|
namespace: this.resolveNamespace(req, body.namespace),
|
|
@@ -1696,7 +1700,7 @@ export class EngramAccessHttpServer {
|
|
|
1696
1700
|
tokensAfter: body.tokensAfter,
|
|
1697
1701
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1698
1702
|
});
|
|
1699
|
-
this.recordWriteRateLimitHit();
|
|
1703
|
+
this.recordWriteRateLimitHit(req);
|
|
1700
1704
|
this.respondJson(res, 200, response);
|
|
1701
1705
|
return;
|
|
1702
1706
|
}
|
|
@@ -1754,7 +1758,7 @@ export class EngramAccessHttpServer {
|
|
|
1754
1758
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1755
1759
|
hooks: {
|
|
1756
1760
|
enforceWriteQuota: () => {
|
|
1757
|
-
releaseWriteQuota ??= this.reserveWriteRateLimitSlot();
|
|
1761
|
+
releaseWriteQuota ??= this.reserveWriteRateLimitSlot(req);
|
|
1758
1762
|
},
|
|
1759
1763
|
},
|
|
1760
1764
|
},
|
|
@@ -1836,14 +1840,14 @@ export class EngramAccessHttpServer {
|
|
|
1836
1840
|
const output = (await op.run(envelope, {
|
|
1837
1841
|
service: this.service,
|
|
1838
1842
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1839
|
-
hooks: { enforceWriteQuota: () => this.ensureWriteRateLimitAvailable() },
|
|
1843
|
+
hooks: { enforceWriteQuota: () => this.ensureWriteRateLimitAvailable(req) },
|
|
1840
1844
|
// Phase 1 provenance: server-resolved connector identity from the
|
|
1841
1845
|
// bearer token (REST path, mirroring the MCP tools/call dispatch).
|
|
1842
1846
|
sourceConnector: this.resolveConnector(req),
|
|
1843
1847
|
})) as { result: EngramAccessWriteResponse };
|
|
1844
1848
|
const response = output.result;
|
|
1845
1849
|
if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
1846
|
-
this.recordWriteRateLimitHit();
|
|
1850
|
+
this.recordWriteRateLimitHit(req);
|
|
1847
1851
|
}
|
|
1848
1852
|
this.respondJson(res, this.writeResponseStatus(response), response);
|
|
1849
1853
|
return;
|
|
@@ -1861,7 +1865,7 @@ export class EngramAccessHttpServer {
|
|
|
1861
1865
|
const isWriteSubcommand =
|
|
1862
1866
|
body.subcommand === "record" || body.subcommand === "supersede";
|
|
1863
1867
|
if (isWriteSubcommand) {
|
|
1864
|
-
this.ensureWriteRateLimitAvailable();
|
|
1868
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1865
1869
|
}
|
|
1866
1870
|
const op = getOperation("coding_decision");
|
|
1867
1871
|
if (!op) {
|
|
@@ -1873,7 +1877,7 @@ export class EngramAccessHttpServer {
|
|
|
1873
1877
|
sourceConnector: this.resolveConnector(req),
|
|
1874
1878
|
})) as { result: unknown };
|
|
1875
1879
|
if (isWriteSubcommand) {
|
|
1876
|
-
this.recordWriteRateLimitHit();
|
|
1880
|
+
this.recordWriteRateLimitHit(req);
|
|
1877
1881
|
}
|
|
1878
1882
|
this.respondJson(res, 200, output.result);
|
|
1879
1883
|
return;
|
|
@@ -1886,7 +1890,7 @@ export class EngramAccessHttpServer {
|
|
|
1886
1890
|
const body = await this.readJsonBody(req);
|
|
1887
1891
|
const isWriteSubcommand = body.subcommand === "refresh";
|
|
1888
1892
|
if (isWriteSubcommand) {
|
|
1889
|
-
this.ensureWriteRateLimitAvailable();
|
|
1893
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1890
1894
|
}
|
|
1891
1895
|
const op = getOperation("coding_architecture");
|
|
1892
1896
|
if (!op) {
|
|
@@ -1898,7 +1902,7 @@ export class EngramAccessHttpServer {
|
|
|
1898
1902
|
sourceConnector: this.resolveConnector(req),
|
|
1899
1903
|
})) as { result: unknown };
|
|
1900
1904
|
if (isWriteSubcommand) {
|
|
1901
|
-
this.recordWriteRateLimitHit();
|
|
1905
|
+
this.recordWriteRateLimitHit(req);
|
|
1902
1906
|
}
|
|
1903
1907
|
this.respondJson(res, 200, output.result);
|
|
1904
1908
|
return;
|
|
@@ -1932,7 +1936,7 @@ export class EngramAccessHttpServer {
|
|
|
1932
1936
|
// mirror the apply route's precheck + accounting to bound files under
|
|
1933
1937
|
// state/corrections/pending instead of letting an HTTP client create
|
|
1934
1938
|
// unbounded plan files without consuming write quota.
|
|
1935
|
-
this.ensureWriteRateLimitAvailable();
|
|
1939
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1936
1940
|
const body = await this.readJsonBody(req);
|
|
1937
1941
|
const op = getOperation("memory_correct_plan");
|
|
1938
1942
|
if (!op) {
|
|
@@ -1942,13 +1946,13 @@ export class EngramAccessHttpServer {
|
|
|
1942
1946
|
service: this.service,
|
|
1943
1947
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1944
1948
|
})) as { result: unknown };
|
|
1945
|
-
this.recordWriteRateLimitHit();
|
|
1949
|
+
this.recordWriteRateLimitHit(req);
|
|
1946
1950
|
this.respondJson(res, 200, output.result);
|
|
1947
1951
|
return;
|
|
1948
1952
|
}
|
|
1949
1953
|
|
|
1950
1954
|
if (req.method === "POST" && pathname === "/engram/v1/correction/apply") {
|
|
1951
|
-
this.ensureWriteRateLimitAvailable();
|
|
1955
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
1952
1956
|
const body = await this.readJsonBody(req);
|
|
1953
1957
|
const op = getOperation("memory_correct_apply");
|
|
1954
1958
|
if (!op) {
|
|
@@ -1958,7 +1962,7 @@ export class EngramAccessHttpServer {
|
|
|
1958
1962
|
service: this.service,
|
|
1959
1963
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
1960
1964
|
})) as { result: unknown };
|
|
1961
|
-
this.recordWriteRateLimitHit();
|
|
1965
|
+
this.recordWriteRateLimitHit(req);
|
|
1962
1966
|
this.respondJson(res, 200, output.result);
|
|
1963
1967
|
return;
|
|
1964
1968
|
}
|
|
@@ -2011,10 +2015,10 @@ export class EngramAccessHttpServer {
|
|
|
2011
2015
|
// (enforceWriteQuota), atomic with the real miss and never on a replay; no
|
|
2012
2016
|
// HTTP pre-check, so a stale peek can't 429 a safe replay (#1434 Codex review).
|
|
2013
2017
|
const response = await this.service.suggestionSubmit(request, {
|
|
2014
|
-
enforceWriteQuota: () => this.ensureWriteRateLimitAvailable(),
|
|
2018
|
+
enforceWriteQuota: () => this.ensureWriteRateLimitAvailable(req),
|
|
2015
2019
|
});
|
|
2016
2020
|
if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
2017
|
-
this.recordWriteRateLimitHit();
|
|
2021
|
+
this.recordWriteRateLimitHit(req);
|
|
2018
2022
|
}
|
|
2019
2023
|
this.respondJson(res, this.writeResponseStatus(response), response);
|
|
2020
2024
|
return;
|
|
@@ -2203,7 +2207,7 @@ export class EngramAccessHttpServer {
|
|
|
2203
2207
|
if (req.method === "POST" && pathname === "/engram/v1/review-disposition") {
|
|
2204
2208
|
this.enforceTokenOp("review_disposition"); // boundary dispatch (issue #1525)
|
|
2205
2209
|
const body = await this.readValidatedBody(req, "reviewDisposition");
|
|
2206
|
-
this.ensureWriteRateLimitAvailable();
|
|
2210
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
2207
2211
|
const response = await this.service.reviewDisposition({
|
|
2208
2212
|
memoryId: body.memoryId,
|
|
2209
2213
|
status: body.status,
|
|
@@ -2212,7 +2216,7 @@ export class EngramAccessHttpServer {
|
|
|
2212
2216
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
2213
2217
|
});
|
|
2214
2218
|
if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
2215
|
-
this.recordWriteRateLimitHit();
|
|
2219
|
+
this.recordWriteRateLimitHit(req);
|
|
2216
2220
|
}
|
|
2217
2221
|
this.respondJson(res, 200, response);
|
|
2218
2222
|
return;
|
|
@@ -2223,7 +2227,7 @@ export class EngramAccessHttpServer {
|
|
|
2223
2227
|
const body = await this.readValidatedBody(req, "trustZonePromote");
|
|
2224
2228
|
const dryRun = body.dryRun === true;
|
|
2225
2229
|
if (!dryRun) {
|
|
2226
|
-
this.ensureWriteRateLimitAvailable();
|
|
2230
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
2227
2231
|
}
|
|
2228
2232
|
const response = await this.service.trustZonePromote({
|
|
2229
2233
|
recordId: body.recordId,
|
|
@@ -2236,7 +2240,7 @@ export class EngramAccessHttpServer {
|
|
|
2236
2240
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
2237
2241
|
});
|
|
2238
2242
|
if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
2239
|
-
this.recordWriteRateLimitHit();
|
|
2243
|
+
this.recordWriteRateLimitHit(req);
|
|
2240
2244
|
}
|
|
2241
2245
|
this.respondJson(res, response.dryRun ? 200 : 201, response);
|
|
2242
2246
|
return;
|
|
@@ -2247,7 +2251,7 @@ export class EngramAccessHttpServer {
|
|
|
2247
2251
|
const body = await this.readValidatedBody(req, "trustZoneDemoSeed");
|
|
2248
2252
|
const dryRun = body.dryRun === true;
|
|
2249
2253
|
if (!dryRun) {
|
|
2250
|
-
this.ensureWriteRateLimitAvailable();
|
|
2254
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
2251
2255
|
}
|
|
2252
2256
|
const response = await this.service.trustZoneDemoSeed({
|
|
2253
2257
|
scenario: body.scenario,
|
|
@@ -2257,7 +2261,7 @@ export class EngramAccessHttpServer {
|
|
|
2257
2261
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
2258
2262
|
});
|
|
2259
2263
|
if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
2260
|
-
this.recordWriteRateLimitHit();
|
|
2264
|
+
this.recordWriteRateLimitHit(req);
|
|
2261
2265
|
}
|
|
2262
2266
|
this.respondJson(res, response.dryRun ? 200 : 201, response);
|
|
2263
2267
|
return;
|
|
@@ -2832,7 +2836,7 @@ export class EngramAccessHttpServer {
|
|
|
2832
2836
|
const dryRun = body.dryRun === true;
|
|
2833
2837
|
const namespace = this.resolveNamespace(req, typeof body.namespace === "string" ? body.namespace : undefined);
|
|
2834
2838
|
if (!dryRun) {
|
|
2835
|
-
this.ensureWriteRateLimitAvailable();
|
|
2839
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
2836
2840
|
}
|
|
2837
2841
|
const result = await this.service.dreamsRun({
|
|
2838
2842
|
phase: phase as import("./types.js").DreamsPhase,
|
|
@@ -2841,7 +2845,7 @@ export class EngramAccessHttpServer {
|
|
|
2841
2845
|
authenticatedPrincipal: this.resolveRequestPrincipal(req),
|
|
2842
2846
|
});
|
|
2843
2847
|
if (this.shouldCountWriteRateLimit(result as { dryRun?: boolean; idempotencyReplay?: boolean })) {
|
|
2844
|
-
this.recordWriteRateLimitHit();
|
|
2848
|
+
this.recordWriteRateLimitHit(req);
|
|
2845
2849
|
}
|
|
2846
2850
|
this.respondJson(res, 200, result);
|
|
2847
2851
|
return;
|
|
@@ -2984,7 +2988,7 @@ export class EngramAccessHttpServer {
|
|
|
2984
2988
|
// Rate-limit the promotion write, matching every other write route
|
|
2985
2989
|
// (observe, trust-zone promotion, etc.). The check throws on limit
|
|
2986
2990
|
// exceeded; the hit is recorded after the write succeeds.
|
|
2987
|
-
this.ensureWriteRateLimitAvailable();
|
|
2991
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
2988
2992
|
const result = await this.service.adminPromoteMemory({
|
|
2989
2993
|
sourceMemoryId: body.sourceMemoryId,
|
|
2990
2994
|
namespace: typeof body.namespace === "string" ? body.namespace : undefined,
|
|
@@ -2994,7 +2998,7 @@ export class EngramAccessHttpServer {
|
|
|
2994
2998
|
reason: body.reason,
|
|
2995
2999
|
});
|
|
2996
3000
|
// actor is derived from the authenticated principal inside adminPromoteMemory;
|
|
2997
|
-
this.recordWriteRateLimitHit();
|
|
3001
|
+
this.recordWriteRateLimitHit(req);
|
|
2998
3002
|
this.respondJson(res, 200, result);
|
|
2999
3003
|
} catch (err) {
|
|
3000
3004
|
if (err instanceof EngramAccessInputError) {
|
|
@@ -3251,7 +3255,7 @@ export class EngramAccessHttpServer {
|
|
|
3251
3255
|
const observeSelfEnforcesQuota =
|
|
3252
3256
|
toolName === "engram.observe" || toolName === "remnic.observe";
|
|
3253
3257
|
if (isMcpWrite && !observeSelfEnforcesQuota) {
|
|
3254
|
-
this.ensureWriteRateLimitAvailable();
|
|
3258
|
+
this.ensureWriteRateLimitAvailable(req);
|
|
3255
3259
|
}
|
|
3256
3260
|
|
|
3257
3261
|
const sessionId = (() => {
|
|
@@ -3290,7 +3294,7 @@ export class EngramAccessHttpServer {
|
|
|
3290
3294
|
sessionId,
|
|
3291
3295
|
correlationId: mcpCorrelationId,
|
|
3292
3296
|
enforceWriteQuota: observeSelfEnforcesQuota
|
|
3293
|
-
? () => this.ensureWriteRateLimitAvailable()
|
|
3297
|
+
? () => this.ensureWriteRateLimitAvailable(req)
|
|
3294
3298
|
: undefined,
|
|
3295
3299
|
sourceConnector: this.resolveConnector(req),
|
|
3296
3300
|
abortSignal,
|
|
@@ -3314,7 +3318,7 @@ export class EngramAccessHttpServer {
|
|
|
3314
3318
|
// dryRun/idempotencyReplay guards.
|
|
3315
3319
|
const counts = structured ? this.shouldCountWriteRateLimit(structured) : true;
|
|
3316
3320
|
if (!isError && !isRejectedCodegraph && counts) {
|
|
3317
|
-
this.recordWriteRateLimitHit();
|
|
3321
|
+
this.recordWriteRateLimitHit(req);
|
|
3318
3322
|
}
|
|
3319
3323
|
}
|
|
3320
3324
|
// A mutating tool may have committed just before the client disconnected.
|
|
@@ -3874,34 +3878,30 @@ export class EngramAccessHttpServer {
|
|
|
3874
3878
|
return 200;
|
|
3875
3879
|
}
|
|
3876
3880
|
|
|
3877
|
-
private ensureWriteRateLimitAvailable(): void {
|
|
3878
|
-
|
|
3879
|
-
while (
|
|
3880
|
-
this.writeRequestSlots.length > 0 &&
|
|
3881
|
-
now - (this.writeRequestSlots[0]?.recordedAt ?? 0) > this.writeRateLimitWindowMs
|
|
3882
|
-
) {
|
|
3883
|
-
this.writeRequestSlots.shift();
|
|
3884
|
-
}
|
|
3885
|
-
if (this.writeRequestSlots.length >= this.writeRateLimitMaxRequests) {
|
|
3881
|
+
private ensureWriteRateLimitAvailable(req?: IncomingMessage): void {
|
|
3882
|
+
if (!this.writeLimiter.hasCapacity(this.principalForRateLimit(req))) {
|
|
3886
3883
|
throw new HttpError(429, "write_rate_limited", "write_rate_limited");
|
|
3887
3884
|
}
|
|
3888
3885
|
}
|
|
3889
3886
|
|
|
3890
|
-
private recordWriteRateLimitHit(): void {
|
|
3891
|
-
this.
|
|
3887
|
+
private recordWriteRateLimitHit(req?: IncomingMessage): void {
|
|
3888
|
+
this.writeLimiter.record(this.principalForRateLimit(req));
|
|
3892
3889
|
}
|
|
3893
3890
|
|
|
3894
|
-
private reserveWriteRateLimitSlot(): () => void {
|
|
3895
|
-
this.
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
return
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3891
|
+
private reserveWriteRateLimitSlot(req?: IncomingMessage): () => void {
|
|
3892
|
+
const release = this.writeLimiter.reserve(this.principalForRateLimit(req));
|
|
3893
|
+
if (!release) {
|
|
3894
|
+
throw new HttpError(429, "write_rate_limited", "write_rate_limited");
|
|
3895
|
+
}
|
|
3896
|
+
return release;
|
|
3897
|
+
}
|
|
3898
|
+
|
|
3899
|
+
private principalForRateLimit(req?: IncomingMessage): string | undefined {
|
|
3900
|
+
if (!req) return undefined;
|
|
3901
|
+
// Fall back to the authenticated connector identity when no principal is
|
|
3902
|
+
// resolved, so per-connector bearer tokens are isolated from each other
|
|
3903
|
+
// even without a principal header/server principal (issue #2029 review).
|
|
3904
|
+
return this.resolveRequestPrincipal(req) ?? this.resolveConnector(req);
|
|
3905
3905
|
}
|
|
3906
3906
|
|
|
3907
3907
|
private shouldCountWriteRateLimit(response: { dryRun?: boolean; idempotencyReplay?: boolean }): boolean {
|
|
@@ -6,6 +6,10 @@ import { abortError } from "./abort-error.js";
|
|
|
6
6
|
import { EngramAccessHttpServer } from "./access-http.js";
|
|
7
7
|
import { EngramMcpServer } from "./access-mcp.js";
|
|
8
8
|
import { EngramAccessService, type EngramAccessRecallRequest } from "./access-service.js";
|
|
9
|
+
import {
|
|
10
|
+
type RecallCoordinatorHost,
|
|
11
|
+
withRecallConcurrency,
|
|
12
|
+
} from "./access-recall-concurrency.js";
|
|
9
13
|
|
|
10
14
|
function deferred<T = void>(): {
|
|
11
15
|
promise: Promise<T>;
|
|
@@ -282,7 +286,7 @@ test("MCP write quota is recorded after commit even when the client disconnects
|
|
|
282
286
|
});
|
|
283
287
|
const serverHost = server as unknown as {
|
|
284
288
|
mcpServer: EngramMcpServer;
|
|
285
|
-
|
|
289
|
+
writeLimiter: { totalSlots(): number };
|
|
286
290
|
};
|
|
287
291
|
const originalHandleRequest = serverHost.mcpServer.handleRequest.bind(serverHost.mcpServer);
|
|
288
292
|
serverHost.mcpServer.handleRequest = async (request, options) => {
|
|
@@ -318,7 +322,7 @@ test("MCP write quota is recorded after commit even when the client disconnects
|
|
|
318
322
|
|
|
319
323
|
await waitFor(operationSettled.promise);
|
|
320
324
|
await new Promise<void>((resolve) => setImmediate(resolve));
|
|
321
|
-
assert.equal(serverHost.
|
|
325
|
+
assert.equal(serverHost.writeLimiter.totalSlots(), 1);
|
|
322
326
|
assert.equal(responseStarted, false, "the disconnected client must not receive the committed write response");
|
|
323
327
|
} finally {
|
|
324
328
|
releaseOperation.resolve();
|
|
@@ -338,14 +342,19 @@ test("a disconnected MCP recall queued on the budget lock never starts and does
|
|
|
338
342
|
|
|
339
343
|
const lockService = Object.create(EngramAccessService.prototype) as EngramAccessService;
|
|
340
344
|
const lockHost = lockService as unknown as {
|
|
341
|
-
|
|
342
|
-
|
|
345
|
+
recallSemaphores: Map<string, unknown>;
|
|
346
|
+
orchestrator: { config: Record<string, unknown> };
|
|
347
|
+
withRecallConcurrency<T>(
|
|
343
348
|
principal: string,
|
|
344
349
|
abortSignal: AbortSignal | undefined,
|
|
345
|
-
operation: () => Promise<T>,
|
|
350
|
+
operation: (queueWaitMs: number) => Promise<T>,
|
|
346
351
|
): Promise<T>;
|
|
347
352
|
};
|
|
348
|
-
lockHost.
|
|
353
|
+
lockHost.recallSemaphores = new Map();
|
|
354
|
+
// limit=1 preserves the exact pre-#1906 serialization this test exercises:
|
|
355
|
+
// the second recall queues behind the first, and an abort while queued now
|
|
356
|
+
// rejects it immediately (before the holder releases).
|
|
357
|
+
lockHost.orchestrator = { config: { recallMaxConcurrentPerPrincipal: 1 } };
|
|
349
358
|
|
|
350
359
|
const service = {
|
|
351
360
|
recall: async (input: EngramAccessRecallRequest) => {
|
|
@@ -356,7 +365,7 @@ test("a disconnected MCP recall queued on the budget lock never starts and does
|
|
|
356
365
|
secondQueued.resolve();
|
|
357
366
|
}
|
|
358
367
|
try {
|
|
359
|
-
return await lockHost
|
|
368
|
+
return await withRecallConcurrency(lockHost as unknown as RecallCoordinatorHost, "principal", input.abortSignal, async () => {
|
|
360
369
|
if (call === 1) {
|
|
361
370
|
firstStarted.resolve();
|
|
362
371
|
await releaseFirst.promise;
|