@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.
Files changed (929) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -6
  2. package/dist/access-admin-ops-surface.js +85 -71
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +35 -17
  5. package/dist/access-boundary.js +86 -74
  6. package/dist/access-citation.d.ts +28 -0
  7. package/dist/access-citation.js +9 -0
  8. package/dist/access-cli.js +194 -178
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-errors.d.ts +16 -1
  11. package/dist/access-errors.js +7 -3
  12. package/dist/access-http.d.ts +25 -19
  13. package/dist/access-http.js +100 -87
  14. package/dist/access-identity-continuity-surface.d.ts +13 -8
  15. package/dist/access-identity-continuity-surface.js +85 -71
  16. package/dist/access-lcm-surface.d.ts +16 -9
  17. package/dist/access-lcm-surface.js +85 -71
  18. package/dist/access-mcp.d.ts +23 -16
  19. package/dist/access-mcp.js +96 -84
  20. package/dist/access-memory-search-fanout.d.ts +93 -0
  21. package/dist/access-memory-search-fanout.js +18 -0
  22. package/dist/access-observe-write-surface.d.ts +26 -8
  23. package/dist/access-observe-write-surface.js +85 -71
  24. package/dist/access-operations-batch.js +92 -80
  25. package/dist/access-operations.d.ts +29 -22
  26. package/dist/access-operations.js +94 -82
  27. package/dist/access-recall-concurrency.d.ts +250 -0
  28. package/dist/access-recall-concurrency.js +157 -0
  29. package/dist/access-recall-response.d.ts +130 -0
  30. package/dist/access-recall-response.js +147 -0
  31. package/dist/access-recall-surface.d.ts +15 -7
  32. package/dist/access-recall-surface.js +85 -71
  33. package/dist/access-schema.d.ts +98 -98
  34. package/dist/access-schema.js +8 -6
  35. package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DbZ1G3zV.d.ts} +29 -36
  36. package/dist/access-service.d.ts +13 -6
  37. package/dist/access-service.js +89 -72
  38. package/dist/access-surface-catalog.d.ts +23 -16
  39. package/dist/access-surface-catalog.js +1 -0
  40. package/dist/access-surface-catalog.js.map +1 -1
  41. package/dist/access-token-capabilities.d.ts +2 -1
  42. package/dist/access-token-capabilities.js +4 -2
  43. package/dist/action-confidence.d.ts +3 -1
  44. package/dist/active-memory-bridge.d.ts +3 -1
  45. package/dist/active-memory-bridge.js +4 -4
  46. package/dist/active-recall.d.ts +4 -1
  47. package/dist/active-recall.js +23 -13
  48. package/dist/active-recall.js.map +1 -1
  49. package/dist/adapters/index.js +4 -4
  50. package/dist/adapters/registry.js +2 -2
  51. package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
  52. package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
  53. package/dist/behavior-learner.d.ts +3 -1
  54. package/dist/behavior-signals.d.ts +3 -1
  55. package/dist/bootstrap.d.ts +12 -7
  56. package/dist/bootstrap.js +2 -2
  57. package/dist/bounded-jsonl-state.d.ts +54 -0
  58. package/dist/bounded-jsonl-state.js +10 -0
  59. package/dist/boxes.js +2 -2
  60. package/dist/briefing.d.ts +5 -2
  61. package/dist/briefing.js +34 -24
  62. package/dist/buffer-surprise-report.d.ts +3 -1
  63. package/dist/buffer.d.ts +60 -2
  64. package/dist/buffer.js +3 -3
  65. package/dist/bulk-import/index.d.ts +5 -3
  66. package/dist/calibration.d.ts +3 -1
  67. package/dist/calibration.js +6 -6
  68. package/dist/capabilities.d.ts +7 -7
  69. package/dist/capabilities.js +1 -1
  70. package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
  71. package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
  72. package/dist/{catalog-C9444P10.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +3 -1
  74. package/dist/causal-behavior.js +6 -6
  75. package/dist/causal-chain.js +4 -4
  76. package/dist/causal-consolidation.d.ts +3 -1
  77. package/dist/causal-consolidation.js +43 -34
  78. package/dist/causal-consolidation.js.map +1 -1
  79. package/dist/causal-retrieval.js +6 -6
  80. package/dist/causal-trajectory-graph.d.ts +3 -1
  81. package/dist/causal-trajectory-graph.js +1 -1
  82. package/dist/causal-trajectory.js +1 -1
  83. package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
  84. package/dist/chunk-2CGLBUW3.js +15 -0
  85. package/dist/chunk-2CGLBUW3.js.map +1 -0
  86. package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
  87. package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
  88. package/dist/{chunk-VJVNLNDQ.js → chunk-2UFO7X4Q.js} +7 -7
  89. package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
  90. package/dist/chunk-2Z24E5W2.js +22 -0
  91. package/dist/chunk-2Z24E5W2.js.map +1 -0
  92. package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
  93. package/dist/{chunk-HDTQVNWD.js → chunk-3QAH2S33.js} +3 -3
  94. package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
  95. package/dist/chunk-3WCASNQZ.js.map +1 -0
  96. package/dist/{chunk-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
  97. package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
  98. package/dist/chunk-44XZ75OQ.js.map +1 -0
  99. package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
  100. package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
  101. package/dist/chunk-4BJQODZF.js.map +1 -0
  102. package/dist/{chunk-JREB6UFH.js → chunk-57OWKFUQ.js} +17 -6
  103. package/dist/chunk-57OWKFUQ.js.map +1 -0
  104. package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
  105. package/dist/{chunk-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
  106. package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
  107. package/dist/chunk-5SB7SC2G.js.map +1 -0
  108. package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
  109. package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
  110. package/dist/chunk-6KIQT7RG.js.map +1 -0
  111. package/dist/{chunk-FDCTQWLW.js → chunk-6O22TZSB.js} +3 -3
  112. package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
  113. package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
  114. package/dist/chunk-6ZMAMSHS.js +20 -0
  115. package/dist/chunk-6ZMAMSHS.js.map +1 -0
  116. package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
  117. package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
  118. package/dist/chunk-72VAXGEI.js.map +1 -0
  119. package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
  120. package/dist/chunk-755Q3DGF.js.map +1 -0
  121. package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
  122. package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
  123. package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
  124. package/dist/chunk-7ON2JW73.js.map +1 -0
  125. package/dist/chunk-7RNBVZZO.js +270 -0
  126. package/dist/chunk-7RNBVZZO.js.map +1 -0
  127. package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
  128. package/dist/{chunk-ZHIVCODT.js → chunk-A72SWTWW.js} +7 -7
  129. package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
  130. package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
  131. package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
  132. package/dist/chunk-AIK5W3IW.js.map +1 -0
  133. package/dist/{chunk-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
  134. package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
  135. package/dist/chunk-AREGMX2J.js +50 -0
  136. package/dist/chunk-AREGMX2J.js.map +1 -0
  137. package/dist/chunk-AVPXXV6J.js +448 -0
  138. package/dist/chunk-AVPXXV6J.js.map +1 -0
  139. package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
  140. package/dist/{chunk-QKQYXZVS.js → chunk-BI2OJF6J.js} +1819 -1481
  141. package/dist/chunk-BI2OJF6J.js.map +1 -0
  142. package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
  143. package/dist/chunk-BJMBJZ2Y.js.map +1 -0
  144. package/dist/{chunk-74F5STS4.js → chunk-BLAKS3CP.js} +4 -4
  145. package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
  146. package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
  147. package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
  148. package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
  149. package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
  150. package/dist/{chunk-T7Y5KPLN.js → chunk-C6XBRYVD.js} +16 -15
  151. package/dist/chunk-C6XBRYVD.js.map +1 -0
  152. package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
  153. package/dist/chunk-CEN6DW6X.js.map +1 -0
  154. package/dist/chunk-CGASUJVP.js +421 -0
  155. package/dist/chunk-CGASUJVP.js.map +1 -0
  156. package/dist/{chunk-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
  157. package/dist/{chunk-PBNZVPFS.js → chunk-CXZQOVIE.js} +12 -12
  158. package/dist/chunk-D3V3UMET.js +44 -0
  159. package/dist/chunk-D3V3UMET.js.map +1 -0
  160. package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
  161. package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
  162. package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
  163. package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
  164. package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
  165. package/dist/chunk-EA2H5LML.js +72 -0
  166. package/dist/chunk-EA2H5LML.js.map +1 -0
  167. package/dist/{chunk-INELTPRG.js → chunk-EEC7UJPX.js} +103 -106
  168. package/dist/chunk-EEC7UJPX.js.map +1 -0
  169. package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
  170. package/dist/chunk-EKBNDKDY.js.map +1 -0
  171. package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
  172. package/dist/chunk-EQWEIIKQ.js.map +1 -0
  173. package/dist/{chunk-DZKHSDOM.js → chunk-ES36HTSC.js} +4 -4
  174. package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
  175. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  176. package/dist/{chunk-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
  177. package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
  178. package/dist/chunk-FMLKOL2Z.js +636 -0
  179. package/dist/chunk-FMLKOL2Z.js.map +1 -0
  180. package/dist/chunk-FQC3DHH2.js +20 -0
  181. package/dist/chunk-FQC3DHH2.js.map +1 -0
  182. package/dist/{chunk-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
  183. package/dist/chunk-GCASGYIO.js +71 -0
  184. package/dist/chunk-GCASGYIO.js.map +1 -0
  185. package/dist/{chunk-HF77M34J.js → chunk-GFPZS3F5.js} +8 -8
  186. package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
  187. package/dist/chunk-GNVZQ5JN.js.map +1 -0
  188. package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
  189. package/dist/{chunk-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
  190. package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
  191. package/dist/{chunk-PLQE6MJA.js → chunk-IFH6LWTO.js} +50 -8
  192. package/dist/chunk-IFH6LWTO.js.map +1 -0
  193. package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
  194. package/dist/chunk-ILGC6JH6.js.map +1 -0
  195. package/dist/chunk-IUM3VSHI.js +113 -0
  196. package/dist/chunk-IUM3VSHI.js.map +1 -0
  197. package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
  198. package/dist/{chunk-E6CBU7XP.js → chunk-JYIFGGEM.js} +2 -2
  199. package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
  200. package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
  201. package/dist/{chunk-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
  202. package/dist/{chunk-BS4SGLWV.js → chunk-KF5EUVKQ.js} +16 -6
  203. package/dist/chunk-KF5EUVKQ.js.map +1 -0
  204. package/dist/chunk-KFZY2OFH.js +42 -0
  205. package/dist/chunk-KFZY2OFH.js.map +1 -0
  206. package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
  207. package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
  208. package/dist/{chunk-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
  209. package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
  210. package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
  211. package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
  212. package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
  213. package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
  214. package/dist/{chunk-QQGPUKMT.js → chunk-MC5Q3J7S.js} +398 -7
  215. package/dist/chunk-MC5Q3J7S.js.map +1 -0
  216. package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
  217. package/dist/chunk-MKQBXQKU.js +107 -0
  218. package/dist/chunk-MKQBXQKU.js.map +1 -0
  219. package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
  220. package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
  221. package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
  222. package/dist/{chunk-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
  223. package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
  224. package/dist/chunk-NINSR6LX.js +83 -0
  225. package/dist/chunk-NINSR6LX.js.map +1 -0
  226. package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
  227. package/dist/{chunk-OAZVR2BV.js → chunk-OGCAYLNA.js} +8 -6
  228. package/dist/{chunk-OAZVR2BV.js.map → chunk-OGCAYLNA.js.map} +1 -1
  229. package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
  230. package/dist/{chunk-VDW4VU7B.js → chunk-OQJIB32H.js} +28 -23
  231. package/dist/chunk-OQJIB32H.js.map +1 -0
  232. package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
  233. package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
  234. package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
  235. package/dist/chunk-PIG4WJFQ.js +87 -0
  236. package/dist/chunk-PIG4WJFQ.js.map +1 -0
  237. package/dist/chunk-PJSK6OJM.js +201 -0
  238. package/dist/chunk-PJSK6OJM.js.map +1 -0
  239. package/dist/{chunk-OVJ2HIPE.js → chunk-PMUD7ERF.js} +158 -125
  240. package/dist/chunk-PMUD7ERF.js.map +1 -0
  241. package/dist/chunk-PQVCH2AE.js +76 -0
  242. package/dist/chunk-PQVCH2AE.js.map +1 -0
  243. package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
  244. package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
  245. package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
  246. package/dist/{chunk-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
  247. package/dist/chunk-QJAQNXWI.js.map +1 -0
  248. package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
  249. package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
  250. package/dist/{chunk-FIJUY7GG.js.map → chunk-R26ZMXR2.js.map} +1 -1
  251. package/dist/chunk-R3DJVOSM.js +34 -0
  252. package/dist/chunk-R3DJVOSM.js.map +1 -0
  253. package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
  254. package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
  255. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  256. package/dist/chunk-ROI7BK7H.js +88 -0
  257. package/dist/chunk-ROI7BK7H.js.map +1 -0
  258. package/dist/{chunk-FNZQGN76.js → chunk-S2BBISHU.js} +4 -4
  259. package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
  260. package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
  261. package/dist/chunk-SCCO46KZ.js.map +1 -0
  262. package/dist/chunk-SK7AMF2J.js +168 -0
  263. package/dist/chunk-SK7AMF2J.js.map +1 -0
  264. package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
  265. package/dist/chunk-TG6IHVE2.js.map +1 -0
  266. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  267. package/dist/{chunk-DPAENM7O.js → chunk-U3ZAVRP3.js} +2 -2
  268. package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
  269. package/dist/chunk-UFGFMWAD.js.map +1 -0
  270. package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
  271. package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
  272. package/dist/{chunk-AJLLIIML.js → chunk-W4FBGYGK.js} +1 -1
  273. package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
  274. package/dist/chunk-W4XJFLAL.js.map +1 -0
  275. package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
  276. package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
  277. package/dist/chunk-WG5HSQ4P.js.map +1 -0
  278. package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
  279. package/dist/chunk-WL5EBRDH.js.map +1 -0
  280. package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
  281. package/dist/{chunk-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
  282. package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
  283. package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
  284. package/dist/{chunk-LZOV7MX7.js → chunk-XQDRKZ7V.js} +6476 -5747
  285. package/dist/chunk-XQDRKZ7V.js.map +1 -0
  286. package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
  287. package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
  288. package/dist/chunk-YV32N67O.js.map +1 -0
  289. package/dist/{chunk-PBSAPHHA.js → chunk-YVKF3HEW.js} +1 -1
  290. package/dist/chunk-YVKF3HEW.js.map +1 -0
  291. package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
  292. package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
  293. package/dist/chunk-ZOKZIR5K.js.map +1 -0
  294. package/dist/{chunk-DCFV7A7H.js → chunk-ZVAYK7GU.js} +101 -91
  295. package/dist/chunk-ZVAYK7GU.js.map +1 -0
  296. package/dist/{cli-Cd5fMmhq.d.ts → cli-5tNLVTvJ.d.ts} +28 -12
  297. package/dist/cli.d.ts +16 -9
  298. package/dist/cli.js +142 -127
  299. package/dist/compounding/engine.d.ts +5 -2
  300. package/dist/compounding/engine.js +36 -26
  301. package/dist/compounding/preference-consolidator.d.ts +3 -1
  302. package/dist/compounding/preference-consolidator.js +1 -1
  303. package/dist/compression-optimizer.d.ts +3 -1
  304. package/dist/config-qmd.d.ts +8 -0
  305. package/dist/config-qmd.js +20 -0
  306. package/dist/config-qmd.js.map +1 -0
  307. package/dist/config.d.ts +3 -1
  308. package/dist/config.js +15 -10
  309. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  310. package/dist/connectors/codex-materialize-runner.js +36 -26
  311. package/dist/connectors/codex-materialize.d.ts +3 -1
  312. package/dist/connectors/codex-materialize.js +2 -2
  313. package/dist/connectors/index.d.ts +3 -1
  314. package/dist/connectors/index.js +41 -32
  315. package/dist/consolidation-provenance-check.d.ts +5 -2
  316. package/dist/consolidation-undo.d.ts +5 -2
  317. package/dist/contradiction/index.d.ts +5 -2
  318. package/dist/contradiction/index.js +10 -4
  319. package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
  320. package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
  321. package/dist/conversation-index/backend.d.ts +3 -1
  322. package/dist/conversation-index/backend.js +5 -5
  323. package/dist/conversation-index/chunker.d.ts +3 -1
  324. package/dist/conversation-index/cleanup.js +2 -2
  325. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  326. package/dist/conversation-index/faiss-adapter.js +2 -2
  327. package/dist/conversation-index/indexer.d.ts +3 -1
  328. package/dist/conversation-index/indexer.js +2 -2
  329. package/dist/conversation-index/search.d.ts +3 -1
  330. package/dist/conversation-index/search.js +2 -2
  331. package/dist/cross-namespace-budget.d.ts +45 -1
  332. package/dist/cross-namespace-budget.js +5 -3
  333. package/dist/dashboard-runtime.js +2 -2
  334. package/dist/day-summary.d.ts +3 -1
  335. package/dist/day-summary.js +3 -3
  336. package/dist/delinearize.d.ts +3 -1
  337. package/dist/direct-answer-wiring.d.ts +3 -1
  338. package/dist/direct-answer.d.ts +3 -1
  339. package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
  340. package/dist/dreams-ledger-567VKVOU.js.map +1 -0
  341. package/dist/embedding-fallback.d.ts +3 -1
  342. package/dist/embedding-fallback.js +3 -3
  343. package/dist/enrichment/index.d.ts +3 -1
  344. package/dist/entity-retrieval.d.ts +5 -2
  345. package/dist/entity-retrieval.js +35 -26
  346. package/dist/entity-schema.d.ts +3 -1
  347. package/dist/explicit-capture.d.ts +13 -8
  348. package/dist/explicit-capture.js +7 -3
  349. package/dist/extraction-faithfulness.d.ts +3 -1
  350. package/dist/extraction-faithfulness.js +5 -5
  351. package/dist/extraction-judge-telemetry.d.ts +3 -1
  352. package/dist/extraction-judge-telemetry.js +2 -2
  353. package/dist/extraction-judge-training.d.ts +3 -1
  354. package/dist/extraction-judge-training.js +2 -2
  355. package/dist/extraction-judge.d.ts +3 -1
  356. package/dist/extraction-judge.js +5 -5
  357. package/dist/extraction.d.ts +3 -1
  358. package/dist/extraction.js +13 -12
  359. package/dist/faithfulness-config.js +3 -2
  360. package/dist/fallback-llm.d.ts +3 -1
  361. package/dist/fallback-llm.js +4 -4
  362. package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
  363. package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
  364. package/dist/graph-dashboard-diff.d.ts +3 -1
  365. package/dist/graph-dashboard-key.d.ts +3 -1
  366. package/dist/graph-dashboard-parser.d.ts +3 -1
  367. package/dist/{graph-edge-decay-IOGBBAGC.js → graph-edge-decay-Z6ENALU2.js} +3 -3
  368. package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
  369. package/dist/graph-edge-reinforcement.d.ts +3 -1
  370. package/dist/graph-snapshot.d.ts +3 -1
  371. package/dist/graph-snapshot.js +2 -2
  372. package/dist/graph.d.ts +3 -1
  373. package/dist/graph.js +1 -1
  374. package/dist/identity-continuity.d.ts +1 -2
  375. package/dist/importance.d.ts +3 -1
  376. package/dist/importers/index.d.ts +3 -1
  377. package/dist/in-flight-reads.d.ts +3 -1
  378. package/dist/index.d.ts +473 -464
  379. package/dist/index.js +287 -239
  380. package/dist/intent.d.ts +3 -1
  381. package/dist/lcm/archive.js +2 -2
  382. package/dist/lcm/engine.d.ts +3 -1
  383. package/dist/lcm/engine.js +6 -6
  384. package/dist/lcm/index.d.ts +3 -1
  385. package/dist/lcm/index.js +13 -13
  386. package/dist/lcm/schema.js +2 -2
  387. package/dist/lcm/summarizer.js +3 -3
  388. package/dist/lcm/tools.d.ts +3 -1
  389. package/dist/lifecycle.d.ts +3 -1
  390. package/dist/live-connectors-runner.d.ts +3 -1
  391. package/dist/local-llm.d.ts +5 -2
  392. package/dist/local-llm.js +3 -3
  393. package/dist/local-model-endpoint.d.ts +3 -1
  394. package/dist/logger.d.ts +3 -1
  395. package/dist/logger.js +7 -3
  396. package/dist/maintenance/archive-observations.js +2 -2
  397. package/dist/maintenance/memory-governance.d.ts +3 -1
  398. package/dist/maintenance/memory-governance.js +35 -25
  399. package/dist/maintenance/migrate-observations.js +3 -3
  400. package/dist/maintenance/observation-ledger-utils.js +2 -2
  401. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
  402. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +37 -25
  403. package/dist/maintenance/rebuild-memory-projection.js +38 -28
  404. package/dist/maintenance/rebuild-observations.js +3 -3
  405. package/dist/mcp-memory-inspector-app.d.ts +22 -15
  406. package/dist/memory-action-policy.d.ts +3 -1
  407. package/dist/memory-cache.d.ts +3 -1
  408. package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
  409. package/dist/memory-lifecycle-ledger-utils.js +11 -1
  410. package/dist/memory-projection-store.d.ts +3 -1
  411. package/dist/memory-projection-store.js +2 -2
  412. package/dist/memory-provenance.d.ts +3 -1
  413. package/dist/memory-worth-outcomes.d.ts +5 -2
  414. package/dist/model-registry.js +2 -2
  415. package/dist/models-json.d.ts +3 -1
  416. package/dist/models-json.js +2 -2
  417. package/dist/namespaces/migrate.d.ts +6 -3
  418. package/dist/namespaces/migrate.js +51 -42
  419. package/dist/namespaces/principal.d.ts +27 -2
  420. package/dist/namespaces/principal.js +6 -2
  421. package/dist/namespaces/search.d.ts +16 -2
  422. package/dist/namespaces/search.js +24 -20
  423. package/dist/namespaces/storage.d.ts +24 -3
  424. package/dist/namespaces/storage.js +35 -27
  425. package/dist/native-knowledge.d.ts +3 -1
  426. package/dist/native-knowledge.js +2 -2
  427. package/dist/negative.js +2 -2
  428. package/dist/offline-sync-exclude-globs.d.ts +13 -0
  429. package/dist/offline-sync-exclude-globs.js +10 -0
  430. package/dist/offline-sync-exclude-globs.js.map +1 -0
  431. package/dist/offline-sync-impression-drain.d.ts +78 -0
  432. package/dist/offline-sync-impression-drain.js +37 -0
  433. package/dist/offline-sync-impression-drain.js.map +1 -0
  434. package/dist/offline-sync.js +4 -2
  435. package/dist/operator-toolkit.d.ts +5 -2
  436. package/dist/operator-toolkit.js +69 -54
  437. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
  438. package/dist/orchestration/compression-guideline-coordinator.js +3 -3
  439. package/dist/orchestration/maintenance.d.ts +121 -2
  440. package/dist/orchestration/maintenance.js +44 -31
  441. package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
  442. package/dist/orchestrator.d.ts +13 -8
  443. package/dist/orchestrator.js +194 -177
  444. package/dist/patterns-cli.d.ts +3 -1
  445. package/dist/{pipeline-BAj5bx7g.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
  446. package/dist/policy-runtime.d.ts +3 -1
  447. package/dist/prioritized-embed.d.ts +19 -0
  448. package/dist/prioritized-embed.js +8 -0
  449. package/dist/prioritized-embed.js.map +1 -0
  450. package/dist/proactive-contention.d.ts +28 -0
  451. package/dist/proactive-contention.js +8 -0
  452. package/dist/proactive-contention.js.map +1 -0
  453. package/dist/profiling.js +2 -2
  454. package/dist/provenance.d.ts +3 -1
  455. package/dist/provenance.js +3 -2
  456. package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
  457. package/dist/{qmd-_MDSlj1m.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
  458. package/dist/qmd-preflight.d.ts +5 -2
  459. package/dist/qmd-recall-cache.d.ts +3 -1
  460. package/dist/qmd-status.d.ts +57 -0
  461. package/dist/qmd-status.js +18 -0
  462. package/dist/qmd-status.js.map +1 -0
  463. package/dist/qmd.d.ts +5 -2
  464. package/dist/qmd.js +7 -3
  465. package/dist/recall-concurrency-config.d.ts +16 -0
  466. package/dist/recall-concurrency-config.js +10 -0
  467. package/dist/recall-concurrency-config.js.map +1 -0
  468. package/dist/recall-disclosure-escalation.d.ts +3 -1
  469. package/dist/recall-explain-renderer.d.ts +4 -1
  470. package/dist/recall-explain-renderer.js +3 -3
  471. package/dist/recall-memory-map.d.ts +26 -0
  472. package/dist/recall-memory-map.js +18 -0
  473. package/dist/recall-memory-map.js.map +1 -0
  474. package/dist/recall-planner-llm.d.ts +3 -1
  475. package/dist/recall-planner-llm.js +4 -4
  476. package/dist/recall-qos.js +2 -2
  477. package/dist/recall-state.d.ts +163 -2
  478. package/dist/recall-state.js +6 -3
  479. package/dist/recall-tag-filter.d.ts +3 -1
  480. package/dist/recall-timings.d.ts +11 -2
  481. package/dist/recall-timings.js +3 -1
  482. package/dist/recall-xray-cli.d.ts +3 -1
  483. package/dist/recall-xray-cli.js +4 -4
  484. package/dist/recall-xray-renderer.d.ts +3 -1
  485. package/dist/recall-xray-renderer.js +3 -3
  486. package/dist/recall-xray.d.ts +3 -1
  487. package/dist/recall-xray.js +2 -2
  488. package/dist/relevance.js +3 -3
  489. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  490. package/dist/replay/normalizers/claude.d.ts +3 -1
  491. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  492. package/dist/replay/normalizers/shared.d.ts +3 -1
  493. package/dist/replay/runner.d.ts +3 -1
  494. package/dist/replay/types.d.ts +3 -1
  495. package/dist/rerank.d.ts +8 -1
  496. package/dist/rerank.js +3 -1
  497. package/dist/resolution-3K27T4VO.js +18 -0
  498. package/dist/resolution-3K27T4VO.js.map +1 -0
  499. package/dist/resolve-auth-token.d.ts +3 -1
  500. package/dist/resolve-provider-secret.js +2 -2
  501. package/dist/resume-bundles.js +19 -14
  502. package/dist/retrieval-agents.d.ts +19 -16
  503. package/dist/retrieval-agents.js +3 -3
  504. package/dist/retrieval-tiers.d.ts +3 -1
  505. package/dist/routing/engine.d.ts +3 -1
  506. package/dist/routing/store.d.ts +3 -1
  507. package/dist/routing/store.js +2 -2
  508. package/dist/salvage-envelope.d.ts +18 -0
  509. package/dist/salvage-envelope.js +15 -0
  510. package/dist/salvage-envelope.js.map +1 -0
  511. package/dist/schemas.d.ts +98 -98
  512. package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
  513. package/dist/search/document-scanner.js +3 -2
  514. package/dist/search/embed-helper.d.ts +3 -1
  515. package/dist/search/embed-helper.js +3 -3
  516. package/dist/search/factory.d.ts +3 -1
  517. package/dist/search/factory.js +18 -16
  518. package/dist/search/index.d.ts +3 -1
  519. package/dist/search/index.js +22 -20
  520. package/dist/search/lancedb-backend.d.ts +3 -1
  521. package/dist/search/lancedb-backend.js +6 -5
  522. package/dist/search/meilisearch-backend.d.ts +3 -1
  523. package/dist/search/meilisearch-backend.js +6 -5
  524. package/dist/search/noop-backend.d.ts +3 -1
  525. package/dist/search/orama-backend.d.ts +3 -1
  526. package/dist/search/orama-backend.js +6 -5
  527. package/dist/search/port.d.ts +16 -2
  528. package/dist/search/port.js +1 -1
  529. package/dist/search/remote-backend.d.ts +3 -1
  530. package/dist/search/remote-backend.js +3 -3
  531. package/dist/secure-store/index.d.ts +12 -1
  532. package/dist/secure-store/index.js +6 -3
  533. package/dist/{semantic-consolidation-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
  534. package/dist/semantic-consolidation.d.ts +4 -2
  535. package/dist/semantic-consolidation.js +38 -29
  536. package/dist/semantic-rule-promotion.js +34 -24
  537. package/dist/semantic-rule-verifier.d.ts +3 -1
  538. package/dist/semantic-rule-verifier.js +35 -25
  539. package/dist/session-observer-bands.d.ts +3 -1
  540. package/dist/session-observer-state.d.ts +3 -1
  541. package/dist/session-observer-state.js +2 -2
  542. package/dist/session-transcript-migration.js +2 -2
  543. package/dist/shared-context/manager.d.ts +11 -9
  544. package/dist/shared-context/manager.js +3 -3
  545. package/dist/signal.d.ts +3 -1
  546. package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
  547. package/dist/storage-guards.js +2 -2
  548. package/dist/storage.d.ts +6 -3
  549. package/dist/storage.js +38 -26
  550. package/dist/structured-attributes.d.ts +23 -1
  551. package/dist/structured-attributes.js +7 -1
  552. package/dist/summarizer.d.ts +3 -1
  553. package/dist/summarizer.js +11 -11
  554. package/dist/summary-snapshot.d.ts +3 -1
  555. package/dist/summary-snapshot.js +2 -2
  556. package/dist/temporal-index-batch.d.ts +1 -0
  557. package/dist/temporal-index-batch.js +10 -0
  558. package/dist/temporal-index-batch.js.map +1 -0
  559. package/dist/temporal-index-compat.d.ts +279 -1
  560. package/dist/temporal-index-compat.js +1 -1
  561. package/dist/temporal-index.d.ts +1 -225
  562. package/dist/temporal-index.js +35 -3
  563. package/dist/temporal-supersession.d.ts +5 -2
  564. package/dist/temporal-supersession.js +2 -2
  565. package/dist/temporal-timeline-recall.d.ts +3 -1
  566. package/dist/temporal-validity.d.ts +3 -1
  567. package/dist/threading.d.ts +3 -1
  568. package/dist/threading.js +2 -2
  569. package/dist/tier-migration.d.ts +5 -2
  570. package/dist/tier-routing.d.ts +3 -1
  571. package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
  572. package/dist/tokens.js +3 -3
  573. package/dist/topics.d.ts +3 -1
  574. package/dist/transcript.d.ts +3 -1
  575. package/dist/transcript.js +2 -2
  576. package/dist/transfer/backup.js +3 -3
  577. package/dist/transfer/capsule-export.js +3 -3
  578. package/dist/transfer/capsule-import.js +3 -3
  579. package/dist/transfer/types.d.ts +90 -90
  580. package/dist/trust-score-stage.d.ts +75 -38
  581. package/dist/trust-score-stage.js +11 -3
  582. package/dist/trust-score.d.ts +3 -1
  583. package/dist/{types-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -63
  584. package/dist/types-continuity.d.ts +52 -0
  585. package/dist/types-continuity.js +1 -0
  586. package/dist/types-continuity.js.map +1 -0
  587. package/dist/types.d.ts +3 -1
  588. package/dist/types.js +1 -1
  589. package/dist/utility-runtime.d.ts +3 -1
  590. package/dist/utils/serialize-mutations.d.ts +31 -2
  591. package/dist/utils/serialize-mutations.js +1 -1
  592. package/dist/verified-recall.js +36 -26
  593. package/dist/write-envelope.d.ts +282 -0
  594. package/dist/write-envelope.js +35 -0
  595. package/dist/write-envelope.js.map +1 -0
  596. package/dist/write-quarantine.d.ts +94 -0
  597. package/dist/write-quarantine.js +11 -0
  598. package/dist/write-quarantine.js.map +1 -0
  599. package/dist/write-rate-limiter.d.ts +45 -0
  600. package/dist/write-rate-limiter.js +9 -0
  601. package/dist/write-rate-limiter.js.map +1 -0
  602. package/package.json +37 -2
  603. package/src/access-admin-ops-surface.ts +17 -7
  604. package/src/access-boundary.test.ts +28 -0
  605. package/src/access-boundary.ts +31 -2
  606. package/src/access-citation.test.ts +72 -0
  607. package/src/access-citation.ts +139 -0
  608. package/src/access-errors.ts +21 -0
  609. package/src/access-fingerprint-parity.test.ts +211 -0
  610. package/src/access-http-cancellation.test.ts +59 -21
  611. package/src/access-http.test.ts +90 -0
  612. package/src/access-http.ts +79 -79
  613. package/src/access-mcp-cancellation.test.ts +16 -7
  614. package/src/access-memory-search-fanout.test.ts +220 -0
  615. package/src/access-memory-search-fanout.ts +168 -0
  616. package/src/access-observe-quarantine.test.ts +172 -0
  617. package/src/access-observe-write-surface.ts +137 -11
  618. package/src/access-operations-batch.ts +2 -0
  619. package/src/access-recall-concurrency.ts +773 -0
  620. package/src/access-recall-response.ts +307 -0
  621. package/src/access-recall-surface.ts +100 -252
  622. package/src/access-service-coding-write.test.ts +22 -4
  623. package/src/access-service-health.test.ts +49 -0
  624. package/src/access-service-namespace.test.ts +486 -8
  625. package/src/access-service-observe-scope.test.ts +4 -0
  626. package/src/access-service-recall-concurrency.test.ts +1990 -0
  627. package/src/access-service.ts +186 -179
  628. package/src/access-surface-catalog.ts +1 -0
  629. package/src/access-token-capabilities.ts +16 -9
  630. package/src/active-recall.test.ts +35 -0
  631. package/src/active-recall.ts +7 -0
  632. package/src/bounded-jsonl-state.ts +93 -0
  633. package/src/buffer-session.test.ts +422 -5
  634. package/src/buffer-surprise-trigger.test.ts +41 -0
  635. package/src/buffer.ts +218 -3
  636. package/src/capabilities-cluster-b.test.ts +1 -0
  637. package/src/capabilities.ts +5 -6
  638. package/src/cli.ts +21 -22
  639. package/src/coding/architecture-surfaces.test.ts +6 -3
  640. package/src/coding/architecture-surfaces.ts +36 -25
  641. package/src/coding/decision-surfaces.ts +42 -34
  642. package/src/compounding/engine.test.ts +5 -1
  643. package/src/compounding/engine.ts +7 -7
  644. package/src/config-qmd.ts +89 -0
  645. package/src/config.test.ts +136 -0
  646. package/src/config.ts +113 -118
  647. package/src/connector-provenance-lifecycle.test.ts +4 -4
  648. package/src/connectors/coerce.test.ts +131 -0
  649. package/src/connectors/coerce.ts +80 -7
  650. package/src/contradiction/contradiction.test.ts +10 -6
  651. package/src/contradiction/resolution.ts +17 -4
  652. package/src/correction/correction-access-wiring.ts +62 -18
  653. package/src/cross-namespace-budget.test.ts +35 -0
  654. package/src/cross-namespace-budget.ts +86 -19
  655. package/src/explicit-capture.ts +54 -17
  656. package/src/extraction.ts +2 -3
  657. package/src/faithfulness-graph-guard.test.ts +16 -69
  658. package/src/graph-recall.test.ts +31 -0
  659. package/src/index.ts +22 -2
  660. package/src/local-llm.ts +4 -6
  661. package/src/logger.ts +16 -0
  662. package/src/maintenance/dreams-ledger.ts +100 -49
  663. package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
  664. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
  665. package/src/memory-lifecycle-ledger-utils.ts +51 -5
  666. package/src/namespaces/principal.test.ts +37 -1
  667. package/src/namespaces/principal.ts +48 -0
  668. package/src/namespaces/search.test.ts +79 -5
  669. package/src/namespaces/search.ts +59 -6
  670. package/src/namespaces/storage.ts +43 -1
  671. package/src/offline-sync-exclude-globs.ts +58 -0
  672. package/src/offline-sync-impression-drain.test.ts +316 -0
  673. package/src/offline-sync-impression-drain.ts +260 -0
  674. package/src/offline-sync.test.ts +32 -5
  675. package/src/offline-sync.ts +1 -14
  676. package/src/operator-toolkit.ts +1 -1
  677. package/src/orchestration/batch-deindex-flush.test.ts +146 -0
  678. package/src/orchestration/consolidation-run.ts +96 -85
  679. package/src/orchestration/extraction-envelope.ts +94 -0
  680. package/src/orchestration/extraction-persist-promotion.ts +134 -0
  681. package/src/orchestration/extraction-persist.ts +325 -260
  682. package/src/orchestration/extraction-run.test.ts +1 -1
  683. package/src/orchestration/extraction-run.ts +2 -2
  684. package/src/orchestration/graph-recall-coordinator.ts +18 -7
  685. package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
  686. package/src/orchestration/maintenance.test.ts +2103 -3
  687. package/src/orchestration/maintenance.ts +574 -2
  688. package/src/orchestration/namespace-read-fanout.ts +14 -8
  689. package/src/orchestration/orchestrator-helpers.ts +8 -1
  690. package/src/orchestration/orchestrator-init.ts +22 -6
  691. package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
  692. package/src/orchestration/persistence-index.ts +64 -9
  693. package/src/orchestration/qmd-result-resolver.ts +27 -0
  694. package/src/orchestration/recall-entry.ts +34 -19
  695. package/src/orchestration/recall-internal.ts +207 -79
  696. package/src/orchestration/recall-rerank-coordinator.ts +229 -82
  697. package/src/orchestration/recall-result-formatter.ts +76 -20
  698. package/src/orchestration/recall-search-pipeline.test.ts +70 -0
  699. package/src/orchestration/recall-search-pipeline.ts +102 -129
  700. package/src/orchestration/recall-section-coordinator.ts +315 -85
  701. package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
  702. package/src/orchestration/session-context.ts +21 -0
  703. package/src/orchestration/workspace-ops.test.ts +348 -0
  704. package/src/orchestration/workspace-ops.ts +168 -34
  705. package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
  706. package/src/orchestrator-connector-dedup.test.ts +1061 -40
  707. package/src/orchestrator-flush.test.ts +155 -39
  708. package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
  709. package/src/orchestrator-source-attribution.test.ts +9 -9
  710. package/src/orchestrator.ts +160 -149
  711. package/src/prioritized-embed.ts +123 -0
  712. package/src/proactive-contention.test.ts +80 -0
  713. package/src/proactive-contention.ts +39 -0
  714. package/src/procedural/procedure-miner.test.ts +19 -14
  715. package/src/procedural/procedure-miner.ts +44 -13
  716. package/src/qmd-client.test.ts +111 -1
  717. package/src/qmd-status.ts +186 -0
  718. package/src/qmd.ts +47 -47
  719. package/src/recall-budget-config.test.ts +30 -0
  720. package/src/recall-cold-deadline.test.ts +149 -0
  721. package/src/recall-concurrency-config.ts +28 -0
  722. package/src/recall-memory-map.ts +74 -0
  723. package/src/recall-rerank-coordinator.test.ts +508 -0
  724. package/src/recall-state.test.ts +825 -1
  725. package/src/recall-state.ts +406 -7
  726. package/src/recall-timings-access.test.ts +41 -0
  727. package/src/recall-timings.ts +16 -0
  728. package/src/relay/mission-access.test.ts +5 -5
  729. package/src/rerank.ts +22 -0
  730. package/src/retrieval-agents.test.ts +79 -0
  731. package/src/retrieval-agents.ts +71 -19
  732. package/src/salvage-envelope.ts +28 -0
  733. package/src/scopes/scope-plan.test.ts +42 -0
  734. package/src/scopes/scope-plan.ts +45 -0
  735. package/src/search/port.ts +13 -0
  736. package/src/secure-store/index.ts +1 -0
  737. package/src/secure-store/secure-fs.ts +48 -0
  738. package/src/secure-store/secure-store.test.ts +40 -0
  739. package/src/semantic-rule-promotion.ts +13 -4
  740. package/src/storage/content-hash-index.ts +655 -0
  741. package/src/storage/entity-timeline.ts +473 -0
  742. package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
  743. package/src/storage/secure-line-reader.test.ts +197 -0
  744. package/src/storage/secure-line-reader.ts +181 -3
  745. package/src/storage-append-header-sniff.test.ts +195 -0
  746. package/src/storage-behavior-signals-cache.test.ts +237 -0
  747. package/src/storage-contract/cache-coherence.test.ts +96 -1
  748. package/src/storage-contract/content-hash.test.ts +47 -2
  749. package/src/storage-fact-hash-index-defer.test.ts +1200 -0
  750. package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
  751. package/src/storage.ts +882 -890
  752. package/src/structured-attributes.ts +52 -0
  753. package/src/temporal-index-batch.ts +112 -0
  754. package/src/temporal-index.test.ts +193 -0
  755. package/src/temporal-index.ts +49 -53
  756. package/src/testing/lifecycle-matrix.test.ts +212 -0
  757. package/src/testing/lifecycle-matrix.ts +271 -0
  758. package/src/testing/orchestrator-lite.ts +236 -0
  759. package/src/testing/subjects/dreams-ledger.test.ts +67 -0
  760. package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
  761. package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
  762. package/src/testing/subjects/recall-budget.test.ts +461 -0
  763. package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
  764. package/src/trust-score-stage.test.ts +154 -0
  765. package/src/trust-score-stage.ts +216 -53
  766. package/src/types-continuity.ts +57 -0
  767. package/src/types.ts +51 -77
  768. package/src/utils/path-containment.test.ts +75 -0
  769. package/src/utils/path-containment.ts +76 -0
  770. package/src/utils/serialize-mutations.test.ts +122 -0
  771. package/src/utils/serialize-mutations.ts +68 -3
  772. package/src/wearables/memory-gen.test.ts +31 -9
  773. package/src/wearables/memory-gen.ts +95 -55
  774. package/src/wearables/pipeline.test.ts +10 -7
  775. package/src/wearables/service.test.ts +6 -8
  776. package/src/wearables/service.ts +2 -2
  777. package/src/write-envelope.extension.test.ts +111 -0
  778. package/src/write-envelope.test.ts +683 -0
  779. package/src/write-envelope.ts +902 -0
  780. package/src/write-quarantine.test.ts +245 -0
  781. package/src/write-quarantine.ts +290 -0
  782. package/src/write-rate-limiter.test.ts +105 -0
  783. package/src/write-rate-limiter.ts +135 -0
  784. package/src/write-sealed-parity.test.ts +204 -0
  785. package/dist/chunk-2VN4JAX7.js.map +0 -1
  786. package/dist/chunk-37CTGERM.js.map +0 -1
  787. package/dist/chunk-3IY64MV6.js.map +0 -1
  788. package/dist/chunk-BCDKBDSY.js.map +0 -1
  789. package/dist/chunk-BFPETA3S.js.map +0 -1
  790. package/dist/chunk-BFVEEB7W.js.map +0 -1
  791. package/dist/chunk-BS4SGLWV.js.map +0 -1
  792. package/dist/chunk-DCFV7A7H.js.map +0 -1
  793. package/dist/chunk-DYP3YYJJ.js.map +0 -1
  794. package/dist/chunk-E5BK6CGV.js +0 -335
  795. package/dist/chunk-E5BK6CGV.js.map +0 -1
  796. package/dist/chunk-FTYDWKO6.js.map +0 -1
  797. package/dist/chunk-GWTFLF2P.js.map +0 -1
  798. package/dist/chunk-IKQTFQMI.js.map +0 -1
  799. package/dist/chunk-INELTPRG.js.map +0 -1
  800. package/dist/chunk-J2HSAU72.js.map +0 -1
  801. package/dist/chunk-JREB6UFH.js.map +0 -1
  802. package/dist/chunk-K7LOWSLU.js.map +0 -1
  803. package/dist/chunk-KQDNAXOM.js.map +0 -1
  804. package/dist/chunk-KSBEEMQF.js.map +0 -1
  805. package/dist/chunk-KSNVDPDF.js.map +0 -1
  806. package/dist/chunk-LC7OODWZ.js.map +0 -1
  807. package/dist/chunk-LTJAMRGI.js.map +0 -1
  808. package/dist/chunk-LZOV7MX7.js.map +0 -1
  809. package/dist/chunk-NWTGD4AN.js.map +0 -1
  810. package/dist/chunk-ODPLEWB6.js.map +0 -1
  811. package/dist/chunk-OVJ2HIPE.js.map +0 -1
  812. package/dist/chunk-PBSAPHHA.js.map +0 -1
  813. package/dist/chunk-PHK3HARR.js +0 -32
  814. package/dist/chunk-PHK3HARR.js.map +0 -1
  815. package/dist/chunk-PLQE6MJA.js.map +0 -1
  816. package/dist/chunk-QKQYXZVS.js.map +0 -1
  817. package/dist/chunk-QQGPUKMT.js.map +0 -1
  818. package/dist/chunk-RANHFI3P.js +0 -8
  819. package/dist/chunk-RANHFI3P.js.map +0 -1
  820. package/dist/chunk-RAR2BSEM.js.map +0 -1
  821. package/dist/chunk-RULE4VG5.js.map +0 -1
  822. package/dist/chunk-SVOZFLIQ.js +0 -16
  823. package/dist/chunk-SVOZFLIQ.js.map +0 -1
  824. package/dist/chunk-T7Y5KPLN.js.map +0 -1
  825. package/dist/chunk-TXLGHDHS.js.map +0 -1
  826. package/dist/chunk-VDW4VU7B.js.map +0 -1
  827. package/dist/chunk-VSMRDBFT.js +0 -17
  828. package/dist/chunk-VSMRDBFT.js.map +0 -1
  829. package/dist/chunk-X64YLC24.js.map +0 -1
  830. package/dist/chunk-XDSXEKYK.js +0 -118
  831. package/dist/chunk-XDSXEKYK.js.map +0 -1
  832. package/dist/chunk-YF6FMLBT.js.map +0 -1
  833. package/dist/resolution-VH4NGENZ.js +0 -12
  834. /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
  835. /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
  836. /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
  837. /package/dist/{graph-edge-decay-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
  838. /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
  839. /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
  840. /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
  841. /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
  842. /package/dist/{chunk-VJVNLNDQ.js.map → chunk-2UFO7X4Q.js.map} +0 -0
  843. /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
  844. /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
  845. /package/dist/{chunk-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
  846. /package/dist/{chunk-LRNMRXJO.js.map → chunk-3Y224NYC.js.map} +0 -0
  847. /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
  848. /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
  849. /package/dist/{chunk-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
  850. /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
  851. /package/dist/{chunk-FDCTQWLW.js.map → chunk-6O22TZSB.js.map} +0 -0
  852. /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
  853. /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
  854. /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
  855. /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
  856. /package/dist/{chunk-ZHIVCODT.js.map → chunk-A72SWTWW.js.map} +0 -0
  857. /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
  858. /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
  859. /package/dist/{chunk-A5UXZRRM.js.map → chunk-AJ7QCSIS.js.map} +0 -0
  860. /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
  861. /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
  862. /package/dist/{chunk-74F5STS4.js.map → chunk-BLAKS3CP.js.map} +0 -0
  863. /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
  864. /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  865. /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
  866. /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
  867. /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
  868. /package/dist/{chunk-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
  869. /package/dist/{chunk-PBNZVPFS.js.map → chunk-CXZQOVIE.js.map} +0 -0
  870. /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
  871. /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
  872. /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
  873. /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
  874. /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
  875. /package/dist/{chunk-DZKHSDOM.js.map → chunk-ES36HTSC.js.map} +0 -0
  876. /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
  877. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  878. /package/dist/{chunk-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
  879. /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
  880. /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
  881. /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
  882. /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
  883. /package/dist/{chunk-UDQUSU27.js.map → chunk-HNZKVLAN.js.map} +0 -0
  884. /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
  885. /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
  886. /package/dist/{chunk-E6CBU7XP.js.map → chunk-JYIFGGEM.js.map} +0 -0
  887. /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
  888. /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
  889. /package/dist/{chunk-KDXVOFYY.js.map → chunk-KAVBJSBQ.js.map} +0 -0
  890. /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
  891. /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
  892. /package/dist/{chunk-2S6QHZGJ.js.map → chunk-L2DPF4DF.js.map} +0 -0
  893. /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
  894. /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
  895. /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
  896. /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
  897. /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
  898. /package/dist/{chunk-Q5WG43OP.js.map → chunk-MYFQ3ED4.js.map} +0 -0
  899. /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
  900. /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
  901. /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
  902. /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
  903. /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
  904. /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
  905. /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
  906. /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
  907. /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
  908. /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
  909. /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
  910. /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
  911. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  912. /package/dist/{chunk-FNZQGN76.js.map → chunk-S2BBISHU.js.map} +0 -0
  913. /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
  914. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  915. /package/dist/{chunk-DPAENM7O.js.map → chunk-U3ZAVRP3.js.map} +0 -0
  916. /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
  917. /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
  918. /package/dist/{chunk-AJLLIIML.js.map → chunk-W4FBGYGK.js.map} +0 -0
  919. /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
  920. /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
  921. /package/dist/{chunk-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
  922. /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
  923. /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
  924. /package/dist/{chunk-RVZRYUQH.js.map → chunk-YROFNEG5.js.map} +0 -0
  925. /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  926. /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
  927. /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
  928. /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
  929. /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
@@ -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
+ });
@@ -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 writeRequestSlots: Array<{ readonly recordedAt: number }> = [];
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
- // Defensive inline validation (config parsers reject invalid values
444
- // loudly upstream; this only guards direct programmatic constructions).
445
- this.writeRateLimitMaxRequests =
446
- typeof options.writeRateLimitMaxRequests === "number" &&
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
- const now = Date.now();
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.writeRequestSlots.push({ recordedAt: Date.now() });
3887
+ private recordWriteRateLimitHit(req?: IncomingMessage): void {
3888
+ this.writeLimiter.record(this.principalForRateLimit(req));
3892
3889
  }
3893
3890
 
3894
- private reserveWriteRateLimitSlot(): () => void {
3895
- this.ensureWriteRateLimitAvailable();
3896
- const slot = { recordedAt: Date.now() };
3897
- this.writeRequestSlots.push(slot);
3898
- let active = true;
3899
- return () => {
3900
- if (!active) return;
3901
- active = false;
3902
- const index = this.writeRequestSlots.indexOf(slot);
3903
- if (index >= 0) this.writeRequestSlots.splice(index, 1);
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
- writeRequestSlots: Array<{ readonly recordedAt: number }>;
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.writeRequestSlots.length, 1);
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
- budgetLocks: Map<string, Promise<void>>;
342
- withBudgetLock<T>(
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.budgetLocks = new Map();
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.withBudgetLock("principal", input.abortSignal, async () => {
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;