@remnic/core 9.69.37 → 9.69.39

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 (697) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -12
  2. package/dist/access-admin-ops-surface.js +86 -83
  3. package/dist/access-authorization-probe.d.ts +14 -12
  4. package/dist/access-authorization-probe.js +87 -84
  5. package/dist/access-boundary.d.ts +14 -12
  6. package/dist/access-boundary.js +86 -83
  7. package/dist/access-cli.js +197 -191
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +2 -1
  10. package/dist/access-extraction-force-flush.d.ts +14 -12
  11. package/dist/access-extraction-force-flush.js +86 -83
  12. package/dist/access-health-types.d.ts +2 -1
  13. package/dist/access-http-briefing.d.ts +14 -12
  14. package/dist/access-http-briefing.js +87 -84
  15. package/dist/access-http-lcm-compaction.d.ts +14 -12
  16. package/dist/access-http-lifecycle-flush.d.ts +14 -12
  17. package/dist/access-http-offline-stream.d.ts +14 -12
  18. package/dist/access-http-query.d.ts +3 -2
  19. package/dist/access-http-query.js +88 -85
  20. package/dist/access-http.d.ts +15 -13
  21. package/dist/access-http.js +108 -105
  22. package/dist/access-identity-continuity-surface.d.ts +12 -10
  23. package/dist/access-identity-continuity-surface.js +86 -83
  24. package/dist/access-lcm-surface.d.ts +14 -12
  25. package/dist/access-lcm-surface.js +86 -83
  26. package/dist/access-mcp.d.ts +14 -12
  27. package/dist/access-mcp.js +97 -94
  28. package/dist/access-memory-search-fanout.d.ts +3 -2
  29. package/dist/{access-namespace-preflight-CV5cHujx.d.ts → access-namespace-preflight-DY4z6L5X.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +4 -3
  31. package/dist/access-namespace-preflight.js +86 -83
  32. package/dist/access-observe-transcript.d.ts +12 -10
  33. package/dist/access-observe-write-category.d.ts +37 -0
  34. package/dist/access-observe-write-category.js +34 -0
  35. package/dist/access-observe-write-surface.d.ts +17 -15
  36. package/dist/access-observe-write-surface.js +86 -83
  37. package/dist/access-offline-manifest.d.ts +12 -10
  38. package/dist/access-offline-manifest.js +15 -15
  39. package/dist/access-operations-batch.js +91 -88
  40. package/dist/access-operations.d.ts +17 -30
  41. package/dist/access-operations.js +96 -93
  42. package/dist/access-recall-concurrency.d.ts +14 -12
  43. package/dist/access-recall-concurrency.js +86 -83
  44. package/dist/access-recall-response.d.ts +14 -12
  45. package/dist/access-recall-response.js +86 -83
  46. package/dist/access-recall-surface.d.ts +14 -12
  47. package/dist/access-recall-surface.js +86 -83
  48. package/dist/access-schema.d.ts +210 -107
  49. package/dist/access-schema.js +9 -15
  50. package/dist/{access-service-DwHC7lcV.d.ts → access-service-MY4bsr_Q.d.ts} +101 -77
  51. package/dist/access-service-helpers.d.ts +14 -12
  52. package/dist/access-service.d.ts +14 -12
  53. package/dist/access-service.js +86 -83
  54. package/dist/access-surface-catalog.d.ts +14 -12
  55. package/dist/access-surface-catalog.js +88 -85
  56. package/dist/access-surface-catalog.js.map +1 -1
  57. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  58. package/dist/action-confidence.d.ts +2 -1
  59. package/dist/active-memory-bridge.d.ts +2 -1
  60. package/dist/active-memory-bridge.js +3 -3
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +20 -17
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +2 -1
  65. package/dist/adapters/index.js +4 -4
  66. package/dist/adapters/registry.js +2 -2
  67. package/dist/ambient-provenance.d.ts +2 -1
  68. package/dist/artifact-search.d.ts +2 -1
  69. package/dist/{auto-sync-FSRJDU63.js → auto-sync-RP4C6ZPF.js} +11 -9
  70. package/dist/{auto-sync-FSRJDU63.js.map → auto-sync-RP4C6ZPF.js.map} +1 -1
  71. package/dist/background-generation-config.d.ts +10 -0
  72. package/dist/background-generation-config.js +9 -0
  73. package/dist/background-generation.d.ts +25 -0
  74. package/dist/background-generation.js +11 -0
  75. package/dist/behavior-learner.d.ts +2 -1
  76. package/dist/behavior-signals.d.ts +2 -1
  77. package/dist/bootstrap.d.ts +12 -10
  78. package/dist/briefing-window.d.ts +3 -2
  79. package/dist/briefing.d.ts +3 -2
  80. package/dist/briefing.js +27 -26
  81. package/dist/buffer-surprise-report.d.ts +2 -1
  82. package/dist/buffer-turn-helpers.d.ts +2 -1
  83. package/dist/buffer.d.ts +3 -2
  84. package/dist/buffer.js +8 -8
  85. package/dist/bulk-import/index.d.ts +4 -3
  86. package/dist/calibration.d.ts +3 -1
  87. package/dist/calibration.js +4 -2
  88. package/dist/calibration.js.map +1 -1
  89. package/dist/capabilities.d.ts +2 -1
  90. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  91. package/dist/{capsule-merge-ZCXUPLNJ.js → capsule-merge-IPG4IOFP.js} +2 -2
  92. package/dist/{catalog-Cl4H8N89.d.ts → catalog-CW87xGx8.d.ts} +1 -1
  93. package/dist/causal-behavior.d.ts +2 -1
  94. package/dist/causal-behavior.js +2 -2
  95. package/dist/causal-chain.js +2 -2
  96. package/dist/causal-consolidation.d.ts +2 -1
  97. package/dist/causal-consolidation.js +29 -28
  98. package/dist/causal-consolidation.js.map +1 -1
  99. package/dist/causal-retrieval.js +2 -2
  100. package/dist/causal-trajectory-graph.d.ts +2 -1
  101. package/dist/causal-trajectory-graph.js +2 -2
  102. package/dist/causal-trajectory.js +1 -1
  103. package/dist/{chunk-YHU5XUF4.js → chunk-27MKMTBY.js} +2 -2
  104. package/dist/{chunk-TK4FHQRN.js → chunk-2J3V5QEO.js} +4 -4
  105. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  106. package/dist/chunk-2QG4SLZI.js +44 -0
  107. package/dist/chunk-2QG4SLZI.js.map +1 -0
  108. package/dist/{chunk-TFRDUD3M.js → chunk-2ZTDRNCS.js} +2 -2
  109. package/dist/{chunk-PWPIERBM.js → chunk-37CAEC7E.js} +4 -4
  110. package/dist/{chunk-X7BCM2NA.js → chunk-3EKVN2OP.js} +2 -2
  111. package/dist/{chunk-S2ULTQZR.js → chunk-3N3PBBEH.js} +2 -2
  112. package/dist/{chunk-XCF3SFHD.js → chunk-3NPNBVFR.js} +2 -2
  113. package/dist/{chunk-JO5TQAKW.js → chunk-4BCHFSC7.js} +3 -3
  114. package/dist/{chunk-Q6D7EUSQ.js → chunk-4JVQRFZD.js} +10 -10
  115. package/dist/{chunk-YEDVOYL2.js → chunk-4RX5O34R.js} +2 -2
  116. package/dist/{chunk-JMPYZJQN.js → chunk-4RZLTZVM.js} +4 -4
  117. package/dist/{chunk-Q7JK6YEB.js → chunk-54NX5EG4.js} +2 -2
  118. package/dist/{chunk-GWK7FEUL.js → chunk-5FAGCOZD.js} +4 -4
  119. package/dist/{chunk-2PUE5P7C.js → chunk-5N4MZLEH.js} +5 -5
  120. package/dist/{chunk-B2YKTE7P.js → chunk-5SPCMAUC.js} +10 -10
  121. package/dist/{chunk-3OHISDDW.js → chunk-5U7K4W6K.js} +2 -2
  122. package/dist/{chunk-CYEMS2PG.js → chunk-5YCNDC3C.js} +3 -3
  123. package/dist/{chunk-PAAJWQH5.js → chunk-62D2PAAM.js} +4 -4
  124. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  125. package/dist/chunk-6AGWBKQU.js +94 -0
  126. package/dist/chunk-6AGWBKQU.js.map +1 -0
  127. package/dist/{chunk-326KUXIR.js → chunk-6EHM2AV7.js} +6 -6
  128. package/dist/{chunk-YM7YN37H.js → chunk-6ET2VII7.js} +2 -2
  129. package/dist/chunk-6H2G7RFT.js +58 -0
  130. package/dist/chunk-6H2G7RFT.js.map +1 -0
  131. package/dist/{chunk-A2YQL2FF.js → chunk-6P4REYKL.js} +5 -5
  132. package/dist/{chunk-7RKBPXY6.js → chunk-6YAIN5XJ.js} +2 -2
  133. package/dist/{chunk-2L5FSNPC.js → chunk-A7GQBJP5.js} +10 -10
  134. package/dist/{chunk-UYVXIY6C.js → chunk-AAZEKXUP.js} +2 -2
  135. package/dist/{chunk-JR6PP7UM.js → chunk-ACY4ZPF7.js} +28 -2
  136. package/dist/chunk-ACY4ZPF7.js.map +1 -0
  137. package/dist/{chunk-IQZ6ISFX.js → chunk-AECJY3GJ.js} +2 -2
  138. package/dist/{chunk-76DRU7C4.js → chunk-AENM6GKU.js} +2 -2
  139. package/dist/{chunk-KTRXQQFN.js → chunk-B36GUU6T.js} +4 -4
  140. package/dist/{chunk-TLHNF6GA.js → chunk-BV4ZKIZH.js} +1 -1
  141. package/dist/{chunk-ZWEZXVYH.js → chunk-CEO4DONG.js} +2 -2
  142. package/dist/chunk-CWTCMZGE.js +858 -0
  143. package/dist/chunk-CWTCMZGE.js.map +1 -0
  144. package/dist/{chunk-ZEPVWLCN.js → chunk-CZTPU65V.js} +25 -25
  145. package/dist/{chunk-TRU6JBOI.js → chunk-D545Z7UH.js} +3 -3
  146. package/dist/{chunk-6E5GYDIE.js → chunk-DGS34QSY.js} +2 -2
  147. package/dist/{chunk-65RENJGB.js → chunk-E2AWJ7KQ.js} +8 -4
  148. package/dist/chunk-E2AWJ7KQ.js.map +1 -0
  149. package/dist/{chunk-6Z3WW2MW.js → chunk-ENBPQEVU.js} +3 -3
  150. package/dist/{chunk-DOKKRZPH.js → chunk-EYKIDK33.js} +21 -19
  151. package/dist/chunk-EYKIDK33.js.map +1 -0
  152. package/dist/{chunk-PNEDMJ53.js → chunk-F4EHXVP7.js} +2 -2
  153. package/dist/{chunk-JPKZTCWZ.js → chunk-FNHLI2RE.js} +3 -3
  154. package/dist/{chunk-D2DIYEFW.js → chunk-FWWWUPOE.js} +12 -36
  155. package/dist/chunk-FWWWUPOE.js.map +1 -0
  156. package/dist/{chunk-M3MYMWXG.js → chunk-FXHOZGSE.js} +2 -2
  157. package/dist/{chunk-SAKA6PPL.js → chunk-GAS7KYC7.js} +5 -5
  158. package/dist/{chunk-LSLCFCCQ.js → chunk-GDYU6VF4.js} +1 -1
  159. package/dist/chunk-GDYU6VF4.js.map +1 -0
  160. package/dist/{chunk-2AR5JFD7.js → chunk-GG5FHZJJ.js} +6 -6
  161. package/dist/{chunk-WS3WNLST.js → chunk-GI4ZBWPQ.js} +3 -3
  162. package/dist/{chunk-JYR4LH76.js → chunk-GMIQV6DD.js} +2 -2
  163. package/dist/{chunk-WIKO4SCR.js → chunk-H3TKENU4.js} +5 -5
  164. package/dist/{chunk-ZLN7AROH.js → chunk-HIP6DKJJ.js} +5 -5
  165. package/dist/{chunk-SF6RFI5Z.js → chunk-HWLIMQE2.js} +2 -2
  166. package/dist/{chunk-JZYECQWN.js → chunk-IL6ODG6M.js} +2 -2
  167. package/dist/{chunk-GNR6YEWZ.js → chunk-IQEJIOEU.js} +6 -6
  168. package/dist/{chunk-BICNRVEC.js → chunk-IWO6QXWJ.js} +2 -2
  169. package/dist/{chunk-RN3MVLW3.js → chunk-IYKZJVL5.js} +1 -1
  170. package/dist/chunk-IYKZJVL5.js.map +1 -0
  171. package/dist/{chunk-42DJ235G.js → chunk-J272ODKJ.js} +2 -2
  172. package/dist/{chunk-R3TLVTWW.js → chunk-JDX2OA4R.js} +3 -3
  173. package/dist/{chunk-G5MO3VQA.js → chunk-JKKII6GX.js} +2 -2
  174. package/dist/{chunk-L5OXE4PX.js → chunk-JTQR6L2N.js} +3 -3
  175. package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
  176. package/dist/{chunk-AKE4GGQ3.js → chunk-KQW3YGEN.js} +2 -2
  177. package/dist/{chunk-LMMQKZK3.js → chunk-L63GFNKL.js} +1 -1
  178. package/dist/{chunk-BRZWWUCJ.js → chunk-LMLGBG6H.js} +2 -2
  179. package/dist/{chunk-3IXB77DA.js → chunk-LPYYY4AP.js} +318 -278
  180. package/dist/chunk-LPYYY4AP.js.map +1 -0
  181. package/dist/{chunk-YEN4TREG.js → chunk-LQNRVPTV.js} +54 -567
  182. package/dist/chunk-LQNRVPTV.js.map +1 -0
  183. package/dist/{chunk-CQ7SSBO4.js → chunk-M6HBPLBA.js} +2 -2
  184. package/dist/chunk-MCRVQ5YQ.js +14 -0
  185. package/dist/chunk-MCRVQ5YQ.js.map +1 -0
  186. package/dist/{chunk-3YMDY3ZF.js → chunk-MUTVRKKY.js} +16 -16
  187. package/dist/{chunk-FCFAYMTU.js → chunk-NXGSONWM.js} +2 -2
  188. package/dist/{chunk-4WGAMREC.js → chunk-O4M4BDIJ.js} +2 -2
  189. package/dist/{chunk-5SYI2F47.js → chunk-O76F5QPP.js} +2 -2
  190. package/dist/{chunk-SROIT6QY.js → chunk-OPBFP4TF.js} +28 -11
  191. package/dist/chunk-OPBFP4TF.js.map +1 -0
  192. package/dist/{chunk-7MJBKZPU.js → chunk-P4ZAEYKG.js} +68 -34
  193. package/dist/chunk-P4ZAEYKG.js.map +1 -0
  194. package/dist/{chunk-57GDHV2D.js → chunk-PCOVEDPK.js} +6 -6
  195. package/dist/{chunk-PPTOAHTZ.js → chunk-PGAB2V53.js} +2 -2
  196. package/dist/{chunk-HHDTBYDJ.js → chunk-Q432REND.js} +2 -2
  197. package/dist/{chunk-XAITGGX5.js → chunk-Q4AUIFUA.js} +4 -4
  198. package/dist/{chunk-5LLQAUMI.js → chunk-Q7CLGFA7.js} +3 -3
  199. package/dist/{chunk-KUK56OPR.js → chunk-QHT7MOUF.js} +12 -12
  200. package/dist/{chunk-W6IJMWTZ.js → chunk-QTQ6XKGT.js} +4 -4
  201. package/dist/{chunk-FLLORID2.js → chunk-RLJHJQUY.js} +9 -9
  202. package/dist/{chunk-353KGBKY.js → chunk-RW4QNB4J.js} +4 -4
  203. package/dist/{chunk-GWQVMKUJ.js → chunk-SCXURCVT.js} +3 -3
  204. package/dist/{chunk-FQXJAC3T.js → chunk-SGUDMW2K.js} +4 -4
  205. package/dist/{chunk-LSDEIZ76.js → chunk-TA4C3XB7.js} +6 -6
  206. package/dist/{chunk-YIZ2EUUL.js → chunk-TNZNSMVJ.js} +94 -94
  207. package/dist/{chunk-CIYUWSMZ.js → chunk-TRLOFIQC.js} +2 -2
  208. package/dist/{chunk-TL7NLM2L.js → chunk-TSP5WH72.js} +2 -2
  209. package/dist/{chunk-3K6UFW5B.js → chunk-UHRZ324M.js} +8 -8
  210. package/dist/{chunk-JLXWRQNR.js → chunk-UZEHHXYC.js} +170 -167
  211. package/dist/chunk-UZEHHXYC.js.map +1 -0
  212. package/dist/{chunk-A5UQ52YQ.js → chunk-UZZ7SQT3.js} +5 -5
  213. package/dist/{chunk-GHX5PNXW.js → chunk-VBSNUH4J.js} +2 -2
  214. package/dist/{chunk-MR6LQVZ5.js → chunk-VJIE4D2I.js} +3 -3
  215. package/dist/{chunk-OTPXEE6W.js → chunk-VSL63CFJ.js} +15 -12
  216. package/dist/chunk-VSL63CFJ.js.map +1 -0
  217. package/dist/{chunk-2JGGZICG.js → chunk-WBM2MVBK.js} +2 -2
  218. package/dist/{chunk-CD3C4BJN.js → chunk-WIWLX65T.js} +2 -2
  219. package/dist/{chunk-GDDSXVWR.js → chunk-X4TD4O2F.js} +3 -3
  220. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  221. package/dist/{chunk-FPQDZCUX.js → chunk-XH3HGI2N.js} +2 -2
  222. package/dist/{chunk-C6KRO3SU.js → chunk-XVDZFTN5.js} +4 -4
  223. package/dist/{chunk-3SL52JKD.js → chunk-XVZA6VXC.js} +4 -4
  224. package/dist/chunk-YDVAM7S4.js +221 -0
  225. package/dist/chunk-YDVAM7S4.js.map +1 -0
  226. package/dist/chunk-YFTNZMGR.js +71 -0
  227. package/dist/chunk-YFTNZMGR.js.map +1 -0
  228. package/dist/{chunk-VELCIWJZ.js → chunk-YKREX63Z.js} +19 -10
  229. package/dist/chunk-YKREX63Z.js.map +1 -0
  230. package/dist/{chunk-BLHX5FQW.js → chunk-YUW66UAH.js} +2 -2
  231. package/dist/{chunk-DOQLHCSS.js → chunk-ZBW7A667.js} +2 -2
  232. package/dist/{chunk-4DPDIOVA.js → chunk-ZEGL7YCC.js} +2 -2
  233. package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
  234. package/dist/{chunk-GCBIXUPT.js → chunk-ZMWSYUUL.js} +2 -2
  235. package/dist/{chunk-X2QPKLPL.js → chunk-ZZUVBZL2.js} +2 -2
  236. package/dist/{cli-1mzd5TM4.d.ts → cli-DGq0MNpO.d.ts} +5 -5
  237. package/dist/cli-fallback.d.ts +4 -2
  238. package/dist/cli-fallback.js +3 -1
  239. package/dist/cli.d.ts +16 -14
  240. package/dist/cli.js +139 -134
  241. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  242. package/dist/coding/export-okf-codegraph.js +26 -25
  243. package/dist/coding/export-okf-codegraph.js.map +1 -1
  244. package/dist/coding/pre-action-gate.d.ts +2 -1
  245. package/dist/coding/pre-action-gate.js +2 -2
  246. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  247. package/dist/compat/codex-cli-fallback.js +3 -1
  248. package/dist/compat/codex-cli-fallback.js.map +1 -1
  249. package/dist/compounding/engine.d.ts +3 -2
  250. package/dist/compounding/engine.js +27 -26
  251. package/dist/compounding/preference-consolidator.d.ts +2 -1
  252. package/dist/compression-optimizer.d.ts +2 -1
  253. package/dist/config.d.ts +2 -1
  254. package/dist/config.js +18 -15
  255. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  256. package/dist/connectors/codex-materialize-runner.js +26 -25
  257. package/dist/connectors/codex-materialize.d.ts +2 -1
  258. package/dist/connectors/index.d.ts +2 -1
  259. package/dist/connectors/index.js +29 -28
  260. package/dist/consolidation-provenance-check.d.ts +3 -2
  261. package/dist/consolidation-undo.d.ts +3 -2
  262. package/dist/contradiction/index.d.ts +5 -3
  263. package/dist/contradiction/index.js +7 -7
  264. package/dist/{contradiction-scan-GVD4JJ7B.js → contradiction-scan-BSGKZHYJ.js} +4 -4
  265. package/dist/contradiction-scan-BSGKZHYJ.js.map +1 -0
  266. package/dist/converge-config.d.ts +2 -1
  267. package/dist/convergence-refresh.d.ts +3 -2
  268. package/dist/convergence-refresh.js +29 -28
  269. package/dist/conversation-index/backend.d.ts +2 -1
  270. package/dist/conversation-index/chunker.d.ts +2 -1
  271. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  272. package/dist/conversation-index/indexer.d.ts +2 -1
  273. package/dist/conversation-index/search.d.ts +2 -1
  274. package/dist/corpus-watermark.d.ts +2 -1
  275. package/dist/corpus-watermark.js +29 -28
  276. package/dist/cross-lingual-recall.d.ts +2 -1
  277. package/dist/day-summary.d.ts +2 -1
  278. package/dist/deep-recall-http-glue.d.ts +14 -12
  279. package/dist/deep-recall-http-glue.js +4 -14
  280. package/dist/deep-recall-mcp-tools.d.ts +14 -12
  281. package/dist/deep-recall-policy-llm.d.ts +3 -1
  282. package/dist/deep-recall-policy-llm.js +5 -3
  283. package/dist/deep-recall-seeds.d.ts +2 -1
  284. package/dist/delinearize.d.ts +2 -1
  285. package/dist/dependency-propagation-config.d.ts +2 -1
  286. package/dist/{dependency-propagation-delivery-Bua2ApHV.d.ts → dependency-propagation-delivery-Cq1ekOwV.d.ts} +1 -1
  287. package/dist/direct-answer-wiring.d.ts +2 -1
  288. package/dist/direct-answer.d.ts +2 -1
  289. package/dist/embedding-fallback.d.ts +2 -1
  290. package/dist/enrichment/index.d.ts +2 -1
  291. package/dist/entity-origin-fields.d.ts +2 -1
  292. package/dist/entity-retrieval.d.ts +3 -2
  293. package/dist/entity-retrieval.js +28 -27
  294. package/dist/entity-schema.d.ts +2 -1
  295. package/dist/episodic-context.d.ts +2 -1
  296. package/dist/eval-trajectory-contracts.d.ts +2 -1
  297. package/dist/eval-trajectory-store.d.ts +2 -1
  298. package/dist/eval-trajectory.d.ts +2 -1
  299. package/dist/event-order-recall.js +3 -3
  300. package/dist/explicit-capture.d.ts +12 -10
  301. package/dist/explicit-capture.js +6 -6
  302. package/dist/external-wiki-access.d.ts +14 -12
  303. package/dist/external-wiki-access.js +87 -84
  304. package/dist/external-wiki-collection-registration.d.ts +2 -1
  305. package/dist/external-wiki-collection.d.ts +2 -1
  306. package/dist/external-wiki-mcp-tools.d.ts +14 -12
  307. package/dist/extraction-error-classification.d.ts +2 -1
  308. package/dist/extraction-faithfulness.d.ts +3 -1
  309. package/dist/extraction-faithfulness.js +5 -3
  310. package/dist/extraction-judge-telemetry.d.ts +3 -1
  311. package/dist/extraction-judge-training.d.ts +3 -1
  312. package/dist/extraction-judge.d.ts +3 -1
  313. package/dist/extraction-judge.js +5 -3
  314. package/dist/extraction-liveness.d.ts +2 -1
  315. package/dist/extraction-normalization.d.ts +2 -1
  316. package/dist/extraction-prompt.d.ts +2 -1
  317. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  318. package/dist/extraction-source-grounding.d.ts +2 -1
  319. package/dist/extraction-source-grounding.js +3 -3
  320. package/dist/extraction-span-config.d.ts +2 -1
  321. package/dist/extraction-span-materialize.d.ts +2 -1
  322. package/dist/extraction-span-materialize.js +2 -2
  323. package/dist/extraction.d.ts +2 -1
  324. package/dist/extraction.js +46 -45
  325. package/dist/fallback-llm-codex-subscription.d.ts +79 -0
  326. package/dist/fallback-llm-codex-subscription.js +22 -0
  327. package/dist/fallback-llm-codex-subscription.js.map +1 -0
  328. package/dist/fallback-llm.d.ts +5 -1
  329. package/dist/fallback-llm.js +4 -2
  330. package/dist/{first-start-migration-GZ45G5FS.js → first-start-migration-ZWMV5CX4.js} +6 -6
  331. package/dist/{generic-recall-paths-DJBADojG.d.ts → generic-recall-paths-BcySh_f9.d.ts} +1 -1
  332. package/dist/graph-append-error.d.ts +2 -1
  333. package/dist/graph-dashboard-diff.d.ts +2 -1
  334. package/dist/graph-dashboard-key.d.ts +2 -1
  335. package/dist/graph-dashboard-parser.d.ts +2 -1
  336. package/dist/{graph-edge-decay-ROSUPDX3.js → graph-edge-decay-MKIRZ762.js} +5 -5
  337. package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
  338. package/dist/graph-edge-reinforcement.d.ts +2 -1
  339. package/dist/graph-jsonl.d.ts +2 -1
  340. package/dist/graph-jsonl.js +3 -3
  341. package/dist/graph-path-reconstruction.d.ts +2 -1
  342. package/dist/graph-path-scoring.d.ts +2 -1
  343. package/dist/graph-snapshot.d.ts +2 -1
  344. package/dist/graph-snapshot.js +3 -3
  345. package/dist/graph.d.ts +2 -1
  346. package/dist/graph.js +2 -2
  347. package/dist/harmonic-retrieval.js +3 -3
  348. package/dist/importance.d.ts +2 -1
  349. package/dist/importers/index.d.ts +2 -1
  350. package/dist/importers/test-utils.d.ts +2 -1
  351. package/dist/in-flight-reads.d.ts +2 -1
  352. package/dist/{index-Bsy8ygLL.d.ts → index-DWOb4wz9.d.ts} +2 -2
  353. package/dist/index.d.ts +713 -705
  354. package/dist/index.js +419 -346
  355. package/dist/intent.d.ts +2 -1
  356. package/dist/lcm/engine.d.ts +2 -1
  357. package/dist/lcm/engine.js +4 -4
  358. package/dist/lcm/index.d.ts +2 -1
  359. package/dist/lcm/index.js +12 -12
  360. package/dist/lcm/tools.d.ts +2 -1
  361. package/dist/lifecycle.d.ts +2 -1
  362. package/dist/live-connectors-runner.d.ts +2 -1
  363. package/dist/local-llm-config.d.ts +7 -1
  364. package/dist/local-llm-config.js +12 -0
  365. package/dist/local-llm.d.ts +2 -1
  366. package/dist/local-model-endpoint.d.ts +2 -1
  367. package/dist/location/index.d.ts +4 -3
  368. package/dist/location/index.js +60 -59
  369. package/dist/maintenance/memory-governance.d.ts +2 -1
  370. package/dist/maintenance/memory-governance.js +26 -25
  371. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  372. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +27 -26
  373. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  374. package/dist/maintenance/rebuild-memory-projection.js +28 -27
  375. package/dist/{maintenance-DItyBwTC.d.ts → maintenance-CW9wCzMP.d.ts} +3 -3
  376. package/dist/mcp-memory-inspector-app.d.ts +14 -12
  377. package/dist/memory-action-policy.d.ts +2 -1
  378. package/dist/memory-cache.d.ts +2 -1
  379. package/dist/memory-controller.d.ts +2 -1
  380. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  381. package/dist/memory-projection-store.d.ts +2 -1
  382. package/dist/memory-provenance.d.ts +2 -1
  383. package/dist/memory-snapshot.d.ts +2 -1
  384. package/dist/memory-subject-cli.d.ts +14 -12
  385. package/dist/memory-subject.d.ts +14 -12
  386. package/dist/memory-worth-outcomes.d.ts +3 -2
  387. package/dist/models-json.d.ts +2 -1
  388. package/dist/namespaces/migrate.d.ts +4 -3
  389. package/dist/namespaces/migrate.js +27 -26
  390. package/dist/namespaces/principal.d.ts +2 -1
  391. package/dist/namespaces/search.d.ts +2 -1
  392. package/dist/namespaces/search.js +6 -6
  393. package/dist/namespaces/storage.d.ts +4 -3
  394. package/dist/namespaces/storage.js +26 -25
  395. package/dist/native-knowledge.d.ts +2 -1
  396. package/dist/offline-sync-impression-drain.d.ts +2 -1
  397. package/dist/offline-sync-impression-drain.js +4 -4
  398. package/dist/operator-doctor-corpus.d.ts +2 -1
  399. package/dist/operator-doctor-corpus.js +30 -29
  400. package/dist/operator-doctor-replica.d.ts +2 -1
  401. package/dist/operator-toolkit.d.ts +4 -3
  402. package/dist/operator-toolkit.js +53 -49
  403. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  404. package/dist/orchestration/maintenance.d.ts +5 -4
  405. package/dist/orchestration/maintenance.js +39 -38
  406. package/dist/{orchestrator-DBUX-aAM.d.ts → orchestrator-ComHLm49.d.ts} +22 -11
  407. package/dist/orchestrator.d.ts +12 -10
  408. package/dist/orchestrator.js +224 -218
  409. package/dist/patterns-cli.d.ts +2 -1
  410. package/dist/{pipeline-BqgcOk1Z.d.ts → pipeline-CiYcqqhl.d.ts} +1 -1
  411. package/dist/policy-runtime.d.ts +2 -1
  412. package/dist/proactive-contention.d.ts +2 -1
  413. package/dist/provenance.d.ts +2 -1
  414. package/dist/provenance.js +2 -2
  415. package/dist/{public-http-CqtZ5kv3.d.ts → public-http-CuK4_Cb1.d.ts} +1 -1
  416. package/dist/qmd-preflight.d.ts +3 -2
  417. package/dist/{qmd-BD0ikV_Y.d.ts → qmd-qXD4vatU.d.ts} +1 -1
  418. package/dist/qmd-recall-cache.d.ts +2 -1
  419. package/dist/qmd.d.ts +3 -2
  420. package/dist/recall-concurrency-config.d.ts +2 -1
  421. package/dist/recall-disclosure-escalation.d.ts +2 -1
  422. package/dist/recall-explain-renderer.d.ts +2 -1
  423. package/dist/recall-explain-renderer.js +3 -3
  424. package/dist/recall-memory-map.d.ts +2 -1
  425. package/dist/recall-navigate-access.d.ts +2 -1
  426. package/dist/recall-navigate-access.js +2 -2
  427. package/dist/recall-navigate-disclosure.d.ts +2 -1
  428. package/dist/recall-navigate-disclosure.js +1 -1
  429. package/dist/recall-navigate.d.ts +2 -1
  430. package/dist/recall-navigate.js +2 -2
  431. package/dist/recall-planner-llm.d.ts +3 -1
  432. package/dist/recall-planner-llm.js +4 -2
  433. package/dist/recall-planner-llm.js.map +1 -1
  434. package/dist/recall-state-view-admission.d.ts +3 -2
  435. package/dist/recall-state-view-admission.js +9 -9
  436. package/dist/recall-state-view-anchors.d.ts +85 -0
  437. package/dist/recall-state-view-anchors.js +21 -0
  438. package/dist/recall-state-view-anchors.js.map +1 -0
  439. package/dist/recall-state-view-inject.js +2 -2
  440. package/dist/recall-state-view-render.js +2 -2
  441. package/dist/recall-state-view-widen.js +2 -2
  442. package/dist/recall-state-view-wire.js +3 -3
  443. package/dist/recall-state-view.d.ts +37 -1
  444. package/dist/recall-state-view.js +11 -3
  445. package/dist/recall-state.d.ts +2 -1
  446. package/dist/recall-tag-filter.d.ts +2 -1
  447. package/dist/recall-timings.d.ts +2 -1
  448. package/dist/recall-xray-cli.d.ts +2 -1
  449. package/dist/recall-xray-cli.js +4 -4
  450. package/dist/recall-xray-renderer.d.ts +2 -1
  451. package/dist/recall-xray-renderer.js +3 -3
  452. package/dist/recall-xray.d.ts +2 -1
  453. package/dist/recall-xray.js +2 -2
  454. package/dist/reconcile/cursor.d.ts +2 -1
  455. package/dist/reconcile/cursor.js +2 -2
  456. package/dist/reconcile/manifest.d.ts +2 -1
  457. package/dist/reconcile/manifest.js +4 -4
  458. package/dist/reconcile/plan.d.ts +2 -1
  459. package/dist/reconcile/plan.js +2 -2
  460. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  461. package/dist/replay/normalizers/claude.d.ts +2 -1
  462. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  463. package/dist/replay/normalizers/shared.d.ts +2 -1
  464. package/dist/replay/runner.d.ts +2 -1
  465. package/dist/replay/types.d.ts +2 -1
  466. package/dist/replica-divergence.d.ts +2 -1
  467. package/dist/replica-peers-config.d.ts +2 -1
  468. package/dist/{resolution-OHJZG45O.js → resolution-4GG3QZRJ.js} +8 -8
  469. package/dist/resolution-4GG3QZRJ.js.map +1 -0
  470. package/dist/resolve-auth-token.d.ts +2 -1
  471. package/dist/resume-bundles.js +19 -16
  472. package/dist/retrieval-agents.d.ts +3 -2
  473. package/dist/retrieval-tiers.d.ts +2 -1
  474. package/dist/routing/engine.d.ts +2 -1
  475. package/dist/routing/store.d.ts +2 -1
  476. package/dist/salvage-envelope.d.ts +2 -1
  477. package/dist/salvage-envelope.js +2 -2
  478. package/dist/schemas.d.ts +160 -160
  479. package/dist/{scope-profiles-BIJMsd0B.d.ts → scope-profiles-BT9rqC3w.d.ts} +1 -1
  480. package/dist/search/embed-helper.d.ts +2 -1
  481. package/dist/search/factory.d.ts +2 -1
  482. package/dist/search/factory.js +5 -5
  483. package/dist/search/index.d.ts +2 -1
  484. package/dist/search/index.js +13 -13
  485. package/dist/search/lancedb-backend.d.ts +2 -1
  486. package/dist/search/meilisearch-backend.d.ts +2 -1
  487. package/dist/search/noop-backend.d.ts +2 -1
  488. package/dist/search/orama-backend.d.ts +2 -1
  489. package/dist/search/port.d.ts +2 -1
  490. package/dist/search/remote-backend.d.ts +2 -1
  491. package/dist/{semantic-consolidation-D7sJocll.d.ts → semantic-consolidation-CmZi7thY.d.ts} +1 -1
  492. package/dist/semantic-consolidation.d.ts +3 -2
  493. package/dist/semantic-consolidation.js +27 -26
  494. package/dist/semantic-rule-promotion.js +26 -25
  495. package/dist/semantic-rule-verifier.d.ts +2 -1
  496. package/dist/semantic-rule-verifier.js +26 -25
  497. package/dist/{service-fwgEngUj.d.ts → service-CLkA7AQB.d.ts} +2 -2
  498. package/dist/session-observer-bands.d.ts +2 -1
  499. package/dist/session-observer-state.d.ts +2 -1
  500. package/dist/shared-context/manager.d.ts +8 -7
  501. package/dist/signal.d.ts +2 -1
  502. package/dist/source-agent-qualifier.d.ts +2 -1
  503. package/dist/source-agent-qualifier.js +41 -40
  504. package/dist/standup/build.js +27 -26
  505. package/dist/{storage-Cbll3-Tk.d.ts → storage-wvX01lht.d.ts} +1 -1
  506. package/dist/storage.d.ts +3 -2
  507. package/dist/storage.js +25 -24
  508. package/dist/subject-config.d.ts +2 -1
  509. package/dist/subject-config.js +2 -2
  510. package/dist/summarizer.d.ts +2 -1
  511. package/dist/summarizer.js +6 -3
  512. package/dist/summary-snapshot.d.ts +2 -1
  513. package/dist/support-passport/index.d.ts +17 -15
  514. package/dist/support-passport/index.js +92 -89
  515. package/dist/temporal-supersession.d.ts +3 -2
  516. package/dist/temporal-timeline-recall.d.ts +2 -1
  517. package/dist/temporal-validity.d.ts +2 -1
  518. package/dist/threading.d.ts +2 -1
  519. package/dist/tier-migration.d.ts +3 -2
  520. package/dist/tier-routing.d.ts +2 -1
  521. package/dist/tier-routing.js +3 -3
  522. package/dist/{tier-stats-VK5PCO2L.js → tier-stats-LUSUUNU6.js} +4 -4
  523. package/dist/topics.d.ts +2 -1
  524. package/dist/transcript.d.ts +2 -1
  525. package/dist/transfer/backup.js +2 -2
  526. package/dist/transfer/capsule-export.js +2 -2
  527. package/dist/transfer/capsule-import.js +3 -3
  528. package/dist/transfer/export-okf.d.ts +2 -1
  529. package/dist/transfer/export-okf.js +26 -25
  530. package/dist/transfer/types.d.ts +78 -78
  531. package/dist/trust-score-stage.d.ts +2 -1
  532. package/dist/trust-score.d.ts +2 -1
  533. package/dist/{types-48sPkWB0.d.ts → types-Cyr32ABj.d.ts} +3 -1
  534. package/dist/types.d.ts +2 -1
  535. package/dist/types.js +1 -1
  536. package/dist/utility-runtime.d.ts +2 -1
  537. package/dist/verified-recall.js +26 -25
  538. package/dist/who-knows-cli.d.ts +14 -12
  539. package/dist/who-knows-cli.js +27 -26
  540. package/dist/who-knows.d.ts +14 -12
  541. package/dist/who-knows.js +26 -25
  542. package/dist/write-envelope.d.ts +7 -1
  543. package/dist/write-envelope.js +1 -1
  544. package/package.json +2 -2
  545. package/src/access-boundary.ts +21 -6
  546. package/src/access-category-alias.test.ts +488 -51
  547. package/src/access-http.test.ts +249 -0
  548. package/src/access-http.ts +2 -0
  549. package/src/access-mcp.test.ts +2 -2
  550. package/src/access-observe-write-category.ts +25 -0
  551. package/src/access-observe-write-surface.ts +58 -57
  552. package/src/access-operations-batch.ts +28 -2
  553. package/src/access-operations.ts +6 -4
  554. package/src/access-schema.ts +106 -50
  555. package/src/access-service.ts +23 -9
  556. package/src/background-generation-config.ts +79 -0
  557. package/src/background-generation.test.ts +123 -0
  558. package/src/background-generation.ts +52 -0
  559. package/src/cli-fallback.ts +8 -2
  560. package/src/config.test.ts +172 -0
  561. package/src/config.ts +2 -43
  562. package/src/fallback-llm-codex-subscription.ts +168 -0
  563. package/src/fallback-llm.test.ts +46 -0
  564. package/src/fallback-llm.ts +60 -48
  565. package/src/index.ts +2 -16
  566. package/src/local-llm-config.ts +84 -0
  567. package/src/orchestration/recall-internal.ts +91 -74
  568. package/src/orchestration/recall-rerank-coordinator.ts +41 -4
  569. package/src/orchestration/recall-search-pipeline.ts +25 -18
  570. package/src/orchestration/recall-state-view-pipeline.test.ts +89 -0
  571. package/src/providers/codex-subscription.test.ts +804 -1
  572. package/src/providers/codex-subscription.ts +407 -65
  573. package/src/recall-rerank-coordinator.test.ts +153 -0
  574. package/src/recall-state-view-anchors.ts +163 -0
  575. package/src/recall-state-view-widen.ts +21 -7
  576. package/src/recall-state-view-zero-diff.test.ts +30 -0
  577. package/src/recall-state-view.test.ts +161 -0
  578. package/src/recall-state-view.ts +206 -35
  579. package/src/summarizer.ts +25 -0
  580. package/src/trust-score-recall-paths.test.ts +1 -1
  581. package/src/types.ts +3 -2
  582. package/src/write-envelope.ts +5 -0
  583. package/dist/chunk-255PC37A.js +0 -120
  584. package/dist/chunk-255PC37A.js.map +0 -1
  585. package/dist/chunk-3IXB77DA.js.map +0 -1
  586. package/dist/chunk-65RENJGB.js.map +0 -1
  587. package/dist/chunk-7MJBKZPU.js.map +0 -1
  588. package/dist/chunk-D2DIYEFW.js.map +0 -1
  589. package/dist/chunk-DOKKRZPH.js.map +0 -1
  590. package/dist/chunk-JLXWRQNR.js.map +0 -1
  591. package/dist/chunk-JR6PP7UM.js.map +0 -1
  592. package/dist/chunk-LSLCFCCQ.js.map +0 -1
  593. package/dist/chunk-OTPXEE6W.js.map +0 -1
  594. package/dist/chunk-RN3MVLW3.js.map +0 -1
  595. package/dist/chunk-SROIT6QY.js.map +0 -1
  596. package/dist/chunk-VELCIWJZ.js.map +0 -1
  597. package/dist/chunk-YEN4TREG.js.map +0 -1
  598. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-observe-write-category.js.map} +0 -0
  599. /package/dist/{contradiction-scan-GVD4JJ7B.js.map → background-generation-config.js.map} +0 -0
  600. /package/dist/{graph-edge-decay-ROSUPDX3.js.map → background-generation.js.map} +0 -0
  601. /package/dist/{resolution-OHJZG45O.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  602. /package/dist/{capsule-merge-ZCXUPLNJ.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
  603. /package/dist/{chunk-YHU5XUF4.js.map → chunk-27MKMTBY.js.map} +0 -0
  604. /package/dist/{chunk-TK4FHQRN.js.map → chunk-2J3V5QEO.js.map} +0 -0
  605. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  606. /package/dist/{chunk-TFRDUD3M.js.map → chunk-2ZTDRNCS.js.map} +0 -0
  607. /package/dist/{chunk-PWPIERBM.js.map → chunk-37CAEC7E.js.map} +0 -0
  608. /package/dist/{chunk-X7BCM2NA.js.map → chunk-3EKVN2OP.js.map} +0 -0
  609. /package/dist/{chunk-S2ULTQZR.js.map → chunk-3N3PBBEH.js.map} +0 -0
  610. /package/dist/{chunk-XCF3SFHD.js.map → chunk-3NPNBVFR.js.map} +0 -0
  611. /package/dist/{chunk-JO5TQAKW.js.map → chunk-4BCHFSC7.js.map} +0 -0
  612. /package/dist/{chunk-Q6D7EUSQ.js.map → chunk-4JVQRFZD.js.map} +0 -0
  613. /package/dist/{chunk-YEDVOYL2.js.map → chunk-4RX5O34R.js.map} +0 -0
  614. /package/dist/{chunk-JMPYZJQN.js.map → chunk-4RZLTZVM.js.map} +0 -0
  615. /package/dist/{chunk-Q7JK6YEB.js.map → chunk-54NX5EG4.js.map} +0 -0
  616. /package/dist/{chunk-GWK7FEUL.js.map → chunk-5FAGCOZD.js.map} +0 -0
  617. /package/dist/{chunk-2PUE5P7C.js.map → chunk-5N4MZLEH.js.map} +0 -0
  618. /package/dist/{chunk-B2YKTE7P.js.map → chunk-5SPCMAUC.js.map} +0 -0
  619. /package/dist/{chunk-3OHISDDW.js.map → chunk-5U7K4W6K.js.map} +0 -0
  620. /package/dist/{chunk-CYEMS2PG.js.map → chunk-5YCNDC3C.js.map} +0 -0
  621. /package/dist/{chunk-PAAJWQH5.js.map → chunk-62D2PAAM.js.map} +0 -0
  622. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  623. /package/dist/{chunk-326KUXIR.js.map → chunk-6EHM2AV7.js.map} +0 -0
  624. /package/dist/{chunk-YM7YN37H.js.map → chunk-6ET2VII7.js.map} +0 -0
  625. /package/dist/{chunk-A2YQL2FF.js.map → chunk-6P4REYKL.js.map} +0 -0
  626. /package/dist/{chunk-7RKBPXY6.js.map → chunk-6YAIN5XJ.js.map} +0 -0
  627. /package/dist/{chunk-2L5FSNPC.js.map → chunk-A7GQBJP5.js.map} +0 -0
  628. /package/dist/{chunk-UYVXIY6C.js.map → chunk-AAZEKXUP.js.map} +0 -0
  629. /package/dist/{chunk-IQZ6ISFX.js.map → chunk-AECJY3GJ.js.map} +0 -0
  630. /package/dist/{chunk-76DRU7C4.js.map → chunk-AENM6GKU.js.map} +0 -0
  631. /package/dist/{chunk-KTRXQQFN.js.map → chunk-B36GUU6T.js.map} +0 -0
  632. /package/dist/{chunk-TLHNF6GA.js.map → chunk-BV4ZKIZH.js.map} +0 -0
  633. /package/dist/{chunk-ZWEZXVYH.js.map → chunk-CEO4DONG.js.map} +0 -0
  634. /package/dist/{chunk-ZEPVWLCN.js.map → chunk-CZTPU65V.js.map} +0 -0
  635. /package/dist/{chunk-TRU6JBOI.js.map → chunk-D545Z7UH.js.map} +0 -0
  636. /package/dist/{chunk-6E5GYDIE.js.map → chunk-DGS34QSY.js.map} +0 -0
  637. /package/dist/{chunk-6Z3WW2MW.js.map → chunk-ENBPQEVU.js.map} +0 -0
  638. /package/dist/{chunk-PNEDMJ53.js.map → chunk-F4EHXVP7.js.map} +0 -0
  639. /package/dist/{chunk-JPKZTCWZ.js.map → chunk-FNHLI2RE.js.map} +0 -0
  640. /package/dist/{chunk-M3MYMWXG.js.map → chunk-FXHOZGSE.js.map} +0 -0
  641. /package/dist/{chunk-SAKA6PPL.js.map → chunk-GAS7KYC7.js.map} +0 -0
  642. /package/dist/{chunk-2AR5JFD7.js.map → chunk-GG5FHZJJ.js.map} +0 -0
  643. /package/dist/{chunk-WS3WNLST.js.map → chunk-GI4ZBWPQ.js.map} +0 -0
  644. /package/dist/{chunk-JYR4LH76.js.map → chunk-GMIQV6DD.js.map} +0 -0
  645. /package/dist/{chunk-WIKO4SCR.js.map → chunk-H3TKENU4.js.map} +0 -0
  646. /package/dist/{chunk-ZLN7AROH.js.map → chunk-HIP6DKJJ.js.map} +0 -0
  647. /package/dist/{chunk-SF6RFI5Z.js.map → chunk-HWLIMQE2.js.map} +0 -0
  648. /package/dist/{chunk-JZYECQWN.js.map → chunk-IL6ODG6M.js.map} +0 -0
  649. /package/dist/{chunk-GNR6YEWZ.js.map → chunk-IQEJIOEU.js.map} +0 -0
  650. /package/dist/{chunk-BICNRVEC.js.map → chunk-IWO6QXWJ.js.map} +0 -0
  651. /package/dist/{chunk-42DJ235G.js.map → chunk-J272ODKJ.js.map} +0 -0
  652. /package/dist/{chunk-R3TLVTWW.js.map → chunk-JDX2OA4R.js.map} +0 -0
  653. /package/dist/{chunk-G5MO3VQA.js.map → chunk-JKKII6GX.js.map} +0 -0
  654. /package/dist/{chunk-L5OXE4PX.js.map → chunk-JTQR6L2N.js.map} +0 -0
  655. /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
  656. /package/dist/{chunk-AKE4GGQ3.js.map → chunk-KQW3YGEN.js.map} +0 -0
  657. /package/dist/{chunk-LMMQKZK3.js.map → chunk-L63GFNKL.js.map} +0 -0
  658. /package/dist/{chunk-BRZWWUCJ.js.map → chunk-LMLGBG6H.js.map} +0 -0
  659. /package/dist/{chunk-CQ7SSBO4.js.map → chunk-M6HBPLBA.js.map} +0 -0
  660. /package/dist/{chunk-3YMDY3ZF.js.map → chunk-MUTVRKKY.js.map} +0 -0
  661. /package/dist/{chunk-FCFAYMTU.js.map → chunk-NXGSONWM.js.map} +0 -0
  662. /package/dist/{chunk-4WGAMREC.js.map → chunk-O4M4BDIJ.js.map} +0 -0
  663. /package/dist/{chunk-5SYI2F47.js.map → chunk-O76F5QPP.js.map} +0 -0
  664. /package/dist/{chunk-57GDHV2D.js.map → chunk-PCOVEDPK.js.map} +0 -0
  665. /package/dist/{chunk-PPTOAHTZ.js.map → chunk-PGAB2V53.js.map} +0 -0
  666. /package/dist/{chunk-HHDTBYDJ.js.map → chunk-Q432REND.js.map} +0 -0
  667. /package/dist/{chunk-XAITGGX5.js.map → chunk-Q4AUIFUA.js.map} +0 -0
  668. /package/dist/{chunk-5LLQAUMI.js.map → chunk-Q7CLGFA7.js.map} +0 -0
  669. /package/dist/{chunk-KUK56OPR.js.map → chunk-QHT7MOUF.js.map} +0 -0
  670. /package/dist/{chunk-W6IJMWTZ.js.map → chunk-QTQ6XKGT.js.map} +0 -0
  671. /package/dist/{chunk-FLLORID2.js.map → chunk-RLJHJQUY.js.map} +0 -0
  672. /package/dist/{chunk-353KGBKY.js.map → chunk-RW4QNB4J.js.map} +0 -0
  673. /package/dist/{chunk-GWQVMKUJ.js.map → chunk-SCXURCVT.js.map} +0 -0
  674. /package/dist/{chunk-FQXJAC3T.js.map → chunk-SGUDMW2K.js.map} +0 -0
  675. /package/dist/{chunk-LSDEIZ76.js.map → chunk-TA4C3XB7.js.map} +0 -0
  676. /package/dist/{chunk-YIZ2EUUL.js.map → chunk-TNZNSMVJ.js.map} +0 -0
  677. /package/dist/{chunk-CIYUWSMZ.js.map → chunk-TRLOFIQC.js.map} +0 -0
  678. /package/dist/{chunk-TL7NLM2L.js.map → chunk-TSP5WH72.js.map} +0 -0
  679. /package/dist/{chunk-3K6UFW5B.js.map → chunk-UHRZ324M.js.map} +0 -0
  680. /package/dist/{chunk-A5UQ52YQ.js.map → chunk-UZZ7SQT3.js.map} +0 -0
  681. /package/dist/{chunk-GHX5PNXW.js.map → chunk-VBSNUH4J.js.map} +0 -0
  682. /package/dist/{chunk-MR6LQVZ5.js.map → chunk-VJIE4D2I.js.map} +0 -0
  683. /package/dist/{chunk-2JGGZICG.js.map → chunk-WBM2MVBK.js.map} +0 -0
  684. /package/dist/{chunk-CD3C4BJN.js.map → chunk-WIWLX65T.js.map} +0 -0
  685. /package/dist/{chunk-GDDSXVWR.js.map → chunk-X4TD4O2F.js.map} +0 -0
  686. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  687. /package/dist/{chunk-FPQDZCUX.js.map → chunk-XH3HGI2N.js.map} +0 -0
  688. /package/dist/{chunk-C6KRO3SU.js.map → chunk-XVDZFTN5.js.map} +0 -0
  689. /package/dist/{chunk-3SL52JKD.js.map → chunk-XVZA6VXC.js.map} +0 -0
  690. /package/dist/{chunk-BLHX5FQW.js.map → chunk-YUW66UAH.js.map} +0 -0
  691. /package/dist/{chunk-DOQLHCSS.js.map → chunk-ZBW7A667.js.map} +0 -0
  692. /package/dist/{chunk-4DPDIOVA.js.map → chunk-ZEGL7YCC.js.map} +0 -0
  693. /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
  694. /package/dist/{chunk-GCBIXUPT.js.map → chunk-ZMWSYUUL.js.map} +0 -0
  695. /package/dist/{chunk-X2QPKLPL.js.map → chunk-ZZUVBZL2.js.map} +0 -0
  696. /package/dist/{first-start-migration-GZ45G5FS.js.map → first-start-migration-ZWMV5CX4.js.map} +0 -0
  697. /package/dist/{tier-stats-VK5PCO2L.js.map → tier-stats-LUSUUNU6.js.map} +0 -0
@@ -4058,6 +4058,84 @@ test("PR #1852: token rotation between authorization and write does not stamp th
4058
4058
  }
4059
4059
  });
4060
4060
 
4061
+ test("issue #2829: memory_store category aliases canonicalize with a retained spelling; near-misses 400", async () => {
4062
+ const captured: Array<Record<string, unknown>> = [];
4063
+ const service = {
4064
+ memoryStore: (req: Record<string, unknown>) => {
4065
+ captured.push(req);
4066
+ return Promise.resolve({
4067
+ schemaVersion: 1,
4068
+ operation: "memory_store",
4069
+ namespace: "default",
4070
+ dryRun: false,
4071
+ accepted: true,
4072
+ queued: false,
4073
+ status: "stored",
4074
+ });
4075
+ },
4076
+ suggestionSubmit: (req: Record<string, unknown>) => {
4077
+ captured.push(req);
4078
+ return Promise.resolve({
4079
+ schemaVersion: 1,
4080
+ operation: "suggestion_submit",
4081
+ namespace: "default",
4082
+ dryRun: false,
4083
+ accepted: true,
4084
+ queued: true,
4085
+ status: "queued_for_review",
4086
+ });
4087
+ },
4088
+ } as unknown as EngramAccessService;
4089
+
4090
+ const server = new EngramAccessHttpServer({
4091
+ service,
4092
+ port: 0,
4093
+ authToken: "test-token",
4094
+ adminConsoleEnabled: false,
4095
+ });
4096
+ const status = await server.start();
4097
+ try {
4098
+ const post = (pathname: string, body: unknown) =>
4099
+ fetch(`http://127.0.0.1:${status.port}${pathname}`, {
4100
+ method: "POST",
4101
+ headers: { authorization: "Bearer test-token", "content-type": "application/json" },
4102
+ body: JSON.stringify(body),
4103
+ });
4104
+
4105
+ const aliased = await post("/engram/v1/memories", {
4106
+ content: "alias over http",
4107
+ category: "project_state",
4108
+ });
4109
+ assert.equal(aliased.status, 201);
4110
+ assert.equal(captured[0]?.category, "fact", "HTTP memory_store must canonicalize the alias");
4111
+ assert.equal(captured[0]?.rawCategory, "project_state", "HTTP memory_store must retain the spelling");
4112
+
4113
+ const suggested = await post("/engram/v1/suggestions", {
4114
+ content: "alias over http suggestion",
4115
+ category: "project_update",
4116
+ });
4117
+ assert.equal(suggested.status, 201);
4118
+ assert.equal(captured[1]?.category, "fact");
4119
+ assert.equal(captured[1]?.rawCategory, "project_update", "the suggestions route forwards the retained spelling");
4120
+
4121
+ const nearMiss = await post("/engram/v1/memories", {
4122
+ content: "near miss over http",
4123
+ category: "projection",
4124
+ });
4125
+ assert.equal(nearMiss.status, 400, "a near-miss category must reject");
4126
+ const nearMissBody = (await nearMiss.json()) as {
4127
+ error?: string;
4128
+ details?: Array<{ field: string; message: string }>;
4129
+ };
4130
+ const categoryDetail = nearMissBody.details?.find((detail) => detail.field === "category");
4131
+ assert.ok(categoryDetail, "the 400 must name the category field");
4132
+ assert.match(categoryDetail.message, /one of: fact/, "the 400 must list valid options");
4133
+ assert.equal(captured.length, 2, "the near-miss must not dispatch");
4134
+ } finally {
4135
+ await server.stop();
4136
+ }
4137
+ });
4138
+
4061
4139
  test("PR #1852: static operator token has no connector provenance under rotation", async () => {
4062
4140
  // An operator-supplied static token must never acquire connector provenance,
4063
4141
  // even when an entries getter is also configured and the static token
@@ -5003,6 +5081,177 @@ test("HTTP authorization probe verifies requested operation grants without invok
5003
5081
  }
5004
5082
  });
5005
5083
 
5084
+ test("HTTP authorization probe fails closed for transformed suggestion/memory schemas (#2866)", async () => {
5085
+ const service = {
5086
+ configRef: parseConfig({
5087
+ memoryDir: "/tmp/remnic-http-write-authorization-probe",
5088
+ defaultNamespace: "default",
5089
+ }),
5090
+ memoryStore: () => {
5091
+ throw new Error("authorization probe must not invoke memory_store");
5092
+ },
5093
+ suggestionSubmit: () => {
5094
+ throw new Error("authorization probe must not invoke suggestion_submit");
5095
+ },
5096
+ } as unknown as EngramAccessService;
5097
+ const writeOperations = ["memory_store", "suggestion_submit"] as const;
5098
+ const server = new EngramAccessHttpServer({
5099
+ service,
5100
+ port: 0,
5101
+ authTokenEntriesGetter: () => [
5102
+ {
5103
+ token: "scoped-write-token",
5104
+ capabilities: {
5105
+ version: 1,
5106
+ ops: [...writeOperations],
5107
+ namespaces: ["other"],
5108
+ },
5109
+ },
5110
+ ],
5111
+ adminConsoleEnabled: false,
5112
+ });
5113
+ const status = await server.start();
5114
+ const probe = (operation: string, namespace?: string) => {
5115
+ const query = new URLSearchParams({ op: operation });
5116
+ if (namespace !== undefined) query.set("namespace", namespace);
5117
+ return fetch(`http://127.0.0.1:${status.port}/engram/v1/authorization?${query}`, {
5118
+ headers: { authorization: "Bearer scoped-write-token" },
5119
+ });
5120
+ };
5121
+ try {
5122
+ for (const operation of writeOperations) {
5123
+ const missing = await probe(operation);
5124
+ assert.equal(
5125
+ missing.status,
5126
+ 403,
5127
+ `${operation} probe must deny the missing/default namespace`,
5128
+ );
5129
+ await missing.text();
5130
+
5131
+ const wrong = await probe(operation, "default");
5132
+ assert.equal(
5133
+ wrong.status,
5134
+ 403,
5135
+ `${operation} probe must deny a namespace outside the token scope`,
5136
+ );
5137
+ await wrong.text();
5138
+
5139
+ const allowed = await probe(operation, "other");
5140
+ assert.equal(allowed.status, 200, `${operation} probe must allow the scoped namespace`);
5141
+ assert.deepEqual(await allowed.json(), {
5142
+ authorized: true,
5143
+ operations: [operation],
5144
+ });
5145
+ }
5146
+ } finally {
5147
+ await server.stop();
5148
+ }
5149
+ });
5150
+
5151
+ test("HTTP-MCP tools/call fails closed for memory_store/suggestion_submit aliases (#2866)", async () => {
5152
+ const calls: Array<{ op: string; args: Record<string, unknown> }> = [];
5153
+ const service = {
5154
+ configRef: parseConfig({
5155
+ memoryDir: "/tmp/remnic-mcp-write-authorization-probe",
5156
+ namespacesEnabled: true,
5157
+ defaultNamespace: "default",
5158
+ }),
5159
+ memoryStore: async (args: Record<string, unknown>) => {
5160
+ calls.push({ op: "memory_store", args });
5161
+ return {
5162
+ schemaVersion: 1,
5163
+ operation: "memory_store",
5164
+ namespace: args.namespace ?? "default",
5165
+ dryRun: true,
5166
+ accepted: true,
5167
+ queued: false,
5168
+ status: "validated",
5169
+ };
5170
+ },
5171
+ suggestionSubmit: async (args: Record<string, unknown>) => {
5172
+ calls.push({ op: "suggestion_submit", args });
5173
+ return {
5174
+ schemaVersion: 1,
5175
+ operation: "suggestion_submit",
5176
+ namespace: args.namespace ?? "default",
5177
+ dryRun: true,
5178
+ accepted: true,
5179
+ queued: false,
5180
+ status: "validated",
5181
+ };
5182
+ },
5183
+ } as unknown as EngramAccessService;
5184
+ const server = new EngramAccessHttpServer({
5185
+ service,
5186
+ port: 0,
5187
+ authTokenEntriesGetter: () => [
5188
+ {
5189
+ token: "scoped-write-token",
5190
+ capabilities: {
5191
+ version: 1,
5192
+ ops: ["memory_store", "suggestion_submit"],
5193
+ namespaces: ["ns_a"],
5194
+ },
5195
+ },
5196
+ ],
5197
+ adminConsoleEnabled: false,
5198
+ });
5199
+ const status = await server.start();
5200
+ const mcpCall = (name: string, args: Record<string, unknown>) =>
5201
+ fetch(`http://127.0.0.1:${status.port}/mcp`, {
5202
+ method: "POST",
5203
+ headers: {
5204
+ authorization: "Bearer scoped-write-token",
5205
+ "content-type": "application/json",
5206
+ },
5207
+ body: JSON.stringify({
5208
+ jsonrpc: "2.0",
5209
+ id: 1,
5210
+ method: "tools/call",
5211
+ params: { name, arguments: args },
5212
+ }),
5213
+ });
5214
+ const aliases = [
5215
+ "engram.memory_store",
5216
+ "remnic.memory_store",
5217
+ "engram.suggestion_submit",
5218
+ "remnic.suggestion_submit",
5219
+ ] as const;
5220
+ try {
5221
+ for (const name of aliases) {
5222
+ const wrong = await mcpCall(name, {
5223
+ content: "aliased write",
5224
+ category: "project_state",
5225
+ namespace: "ns_b",
5226
+ dryRun: true,
5227
+ });
5228
+ assert.equal(wrong.status, 403, `${name} must deny a namespace outside the token scope`);
5229
+ await wrong.text();
5230
+
5231
+ const missing = await mcpCall(name, {
5232
+ content: "aliased write",
5233
+ category: "project_update",
5234
+ dryRun: true,
5235
+ });
5236
+ assert.equal(missing.status, 403, `${name} must deny the missing/default namespace`);
5237
+ await missing.text();
5238
+ }
5239
+ assert.equal(calls.length, 0, "denied MCP writes must not reach the handler");
5240
+
5241
+ const allowed = await mcpCall("engram.memory_store", {
5242
+ content: "aliased write",
5243
+ category: "project",
5244
+ namespace: "ns_a",
5245
+ dryRun: true,
5246
+ });
5247
+ assert.notEqual(allowed.status, 403, "the allowed namespace must proceed past the gate");
5248
+ assert.equal(calls.at(-1)?.op, "memory_store");
5249
+ assert.equal(calls.at(-1)?.args.namespace, "ns_a");
5250
+ } finally {
5251
+ await server.stop();
5252
+ }
5253
+ });
5254
+
5006
5255
  test("HTTP authorization probe checks the principal-derived support passport namespace", async () => {
5007
5256
  let namespaceResolutions = 0;
5008
5257
  const service = {
@@ -2118,6 +2118,8 @@ export class EngramAccessHttpServer extends ReviewDeckAccessHttpBase {
2118
2118
  sourceReason: body.sourceReason,
2119
2119
  cwd: body.cwd,
2120
2120
  projectTag: body.projectTag,
2121
+ // #2829: raw alias spelling retained by the schema transform.
2122
+ ...(body.rawCategory !== undefined ? { rawCategory: body.rawCategory } : {}),
2121
2123
  // Phase 1 provenance: server-resolved connector identity from the
2122
2124
  // bearer token (REST path, mirroring the MCP tools/call dispatch).
2123
2125
  sourceConnector: this.resolveConnector(req),
@@ -307,8 +307,8 @@ test("MCP memory write tools admit project-shaped category aliases (#2780)", asy
307
307
  assert.equal(result?.isError, false, `${toolName} must admit project-shaped category aliases`);
308
308
  assert.equal(
309
309
  received?.category,
310
- "project_state",
311
- `${toolName} must forward the alias; the write surface coerces it to "fact"`
310
+ "fact",
311
+ `${toolName} must dispatch the schema-canonicalized category`
312
312
  );
313
313
  }
314
314
  });
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Category-alias split + replay restamp for observe/write (#2829).
3
+ * Extracted from access-observe-write-surface.ts to stay under the 1200-line cap.
4
+ *
5
+ * The wire schema already maps an alias to "fact". `rawCategory` is the
6
+ * caller's spelling: it must not reach the write candidate or fingerprint,
7
+ * and a replay must rebuild the note from THIS request's spelling.
8
+ */
9
+ import {
10
+ categoryAliasCoercion,
11
+ reapplyCategoryCoercion,
12
+ type CategoryAliasCoercion,
13
+ } from "./access-schema.js";
14
+
15
+ export { reapplyCategoryCoercion };
16
+
17
+ export function splitCanonicalWriteRequest<T extends { rawCategory?: string }>(
18
+ request: T,
19
+ ): {
20
+ canonical: Omit<T, "rawCategory">;
21
+ categoryCoercion: CategoryAliasCoercion | undefined;
22
+ } {
23
+ const { rawCategory, ...canonical } = request;
24
+ return { canonical, categoryCoercion: categoryAliasCoercion(rawCategory) };
25
+ }
@@ -29,8 +29,8 @@ import {
29
29
  type MemoryScopePlan,
30
30
  NamespaceNotWritableError,
31
31
  } from "./access-service.js";
32
+ import { reapplyCategoryCoercion, splitCanonicalWriteRequest } from "./access-observe-write-category.js";
32
33
  import { extractionForceFlush } from "./access-extraction-force-flush.js";
33
- import { coerceProjectCategoryAlias, reapplyCategoryCoercion } from "./access-schema.js";
34
34
  import { ObserveTranscriptPersister, observeTranscriptSessionKey } from "./access-observe-transcript.js";
35
35
  import { FileCalendarSource, buildBriefing, parseBriefingFocus, parseBriefingWindow } from "./briefing.js";
36
36
  import {
@@ -486,30 +486,30 @@ export class AccessObserveWriteSurface {
486
486
  rawRequest: EngramAccessMemoryStoreRequest,
487
487
  hooks?: { enforceWriteQuota?: () => void | Promise<void> }
488
488
  ): Promise<EngramAccessWriteResponse> {
489
- // #2780: the boundary schema admits project-shaped category guesses;
490
- // this funnel (MCP/HTTP/CLI all dispatch here) coerces them to the
491
- // canonical "fact" once and reports the coercion on the response.
492
- const { request, categoryCoercion } = coerceProjectCategoryAlias(rawRequest);
489
+ const request = rawRequest;
490
+ const { canonical, categoryCoercion } = splitCanonicalWriteRequest(request);
493
491
  let namespace: string;
494
492
  try {
495
- namespace = await this.deps.resolveCodingScopedWriteNamespace(request);
493
+ namespace = await this.deps.resolveCodingScopedWriteNamespace(canonical);
496
494
  } catch (err) {
497
495
  // A dry run is a no-persist validation, and a replay re-submit sets
498
496
  // suppressQuarantine so a still-unwritable target propagates instead of
499
- // re-parking (issue #1888): never dead-letter either.
497
+ // re-parking (issue #1888): never dead-letter either. Park the FULL
498
+ // request (rawCategory included) so quarantine replay can re-report the
499
+ // alias coercion (Codex review, PR #2826).
500
500
  if (request.dryRun !== true && request.suppressQuarantine !== true) {
501
501
  await this.parkRejectedWrite(err, "memory_store", request);
502
502
  }
503
503
  throw err;
504
504
  }
505
- const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
505
+ const schemaVersion = canonical.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
506
506
  if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
507
507
  throw new EngramAccessInputError(`unsupported schemaVersion: ${schemaVersion}`);
508
508
  }
509
509
  const execute = async (): Promise<EngramAccessWriteResponse> => {
510
- const candidate = this.deps.validateWriteCandidate(request, namespace);
511
- if (request.dryRun === true) {
512
- return {
510
+ const candidate = this.deps.validateWriteCandidate(canonical, namespace);
511
+ if (canonical.dryRun === true) {
512
+ return reapplyCategoryCoercion<EngramAccessWriteResponse>({
513
513
  schemaVersion: ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
514
514
  operation: "memory_store",
515
515
  namespace,
@@ -517,9 +517,8 @@ export class AccessObserveWriteSurface {
517
517
  accepted: true,
518
518
  queued: false,
519
519
  status: "validated",
520
- idempotencyKey: request.idempotencyKey?.trim() || undefined,
521
- ...(categoryCoercion ? { categoryCoercion } : {}),
522
- };
520
+ idempotencyKey: canonical.idempotencyKey?.trim() || undefined,
521
+ }, categoryCoercion);
523
522
  }
524
523
  const result = await persistExplicitCapture(this.deps.orchestrator, candidate, "memory_store");
525
524
  // Seed the session's coding binding ONLY after a real write commits, and
@@ -529,12 +528,12 @@ export class AccessObserveWriteSurface {
529
528
  // but never binds the session on a dryRun, replay/conflict, quota
530
529
  // rejection, or an explicit-namespace write (which bypasses the overlay),
531
530
  // since those don't reach this point or aren't project-scoped (Codex review).
532
- await this.deps.attachCodingContextAfterScopedWrite(request);
531
+ await this.deps.attachCodingContextAfterScopedWrite(canonical);
533
532
  // #1645 (review thread yG-): a tombstone-blocked capture is pending_review
534
533
  // (no active copy) — report it as queued_for_review so the HTTP/MCP caller
535
534
  // doesn't read it as a successfully stored active memory.
536
535
  const blocked = result.tombstoneBlocked === true && result.duplicateOf === undefined;
537
- const response: EngramAccessWriteResponse = {
536
+ const response = reapplyCategoryCoercion<EngramAccessWriteResponse>({
538
537
  schemaVersion: ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
539
538
  operation: "memory_store",
540
539
  namespace,
@@ -544,9 +543,8 @@ export class AccessObserveWriteSurface {
544
543
  status: blocked ? "queued_for_review" : result.duplicateOf ? "duplicate" : "stored",
545
544
  memoryId: result.id,
546
545
  duplicateOf: result.duplicateOf,
547
- idempotencyKey: request.idempotencyKey?.trim() || undefined,
548
- ...(categoryCoercion ? { categoryCoercion } : {}),
549
- };
546
+ idempotencyKey: canonical.idempotencyKey?.trim() || undefined,
547
+ }, categoryCoercion);
550
548
  log.info(
551
549
  `access-write op=memory_store namespace=${namespace} dryRun=false status=${response.status} memoryId=${response.memoryId ?? "-"} idempotency=${response.idempotencyKey ? "yes" : "no"}`
552
550
  );
@@ -554,22 +552,24 @@ export class AccessObserveWriteSurface {
554
552
  };
555
553
  const response = await this.deps.handleIdempotentWrite({
556
554
  operation: "memory_store",
557
- idempotencyKey: request.idempotencyKey,
555
+ idempotencyKey: canonical.idempotencyKey,
558
556
  // Shared builder (issue #1989 PR3): byte-parity with the historical
559
557
  // inline literal is asserted by access-fingerprint-parity.test.ts.
558
+ // Fingerprints the CANONICAL category, so `fact` and an alias spelling
559
+ // under one idempotency key are the same request (#2829).
560
560
  requestFingerprint: buildAccessWriteRequestFingerprint({
561
561
  schemaVersion,
562
562
  namespace,
563
- content: request.content,
564
- category: request.category,
565
- confidence: request.confidence,
566
- tags: request.tags,
567
- entityRef: request.entityRef,
568
- ttl: request.ttl,
569
- sourceReason: request.sourceReason,
570
- sourceConnector: request.sourceConnector,
563
+ content: canonical.content,
564
+ category: canonical.category,
565
+ confidence: canonical.confidence,
566
+ tags: canonical.tags,
567
+ entityRef: canonical.entityRef,
568
+ ttl: canonical.ttl,
569
+ sourceReason: canonical.sourceReason,
570
+ sourceConnector: canonical.sourceConnector,
571
571
  }),
572
- skip: request.dryRun === true,
572
+ skip: canonical.dryRun === true,
573
573
  beforeExecute: hooks?.enforceWriteQuota,
574
574
  execute,
575
575
  });
@@ -581,27 +581,29 @@ export class AccessObserveWriteSurface {
581
581
  rawRequest: EngramAccessSuggestionSubmitRequest,
582
582
  hooks?: { enforceWriteQuota?: () => void | Promise<void> }
583
583
  ): Promise<EngramAccessWriteResponse> {
584
- // #2780: same alias funnel as memory_store — one shared coercion point.
585
- const { request, categoryCoercion } = coerceProjectCategoryAlias(rawRequest);
584
+ const request = rawRequest;
585
+ const { canonical, categoryCoercion } = splitCanonicalWriteRequest(request);
586
586
  let namespace: string;
587
587
  try {
588
- namespace = await this.deps.resolveCodingScopedWriteNamespace(request);
588
+ namespace = await this.deps.resolveCodingScopedWriteNamespace(canonical);
589
589
  } catch (err) {
590
590
  // A dry run never persists, and a replay re-submit sets suppressQuarantine
591
591
  // so a still-unwritable target propagates instead of re-parking (#1888).
592
+ // Park the FULL request (rawCategory included) so quarantine replay can
593
+ // re-report the alias coercion.
592
594
  if (request.dryRun !== true && request.suppressQuarantine !== true) {
593
595
  await this.parkRejectedWrite(err, "suggestion_submit", request);
594
596
  }
595
597
  throw err;
596
598
  }
597
- const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
599
+ const schemaVersion = canonical.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
598
600
  if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
599
601
  throw new EngramAccessInputError(`unsupported schemaVersion: ${schemaVersion}`);
600
602
  }
601
603
  const execute = async (): Promise<EngramAccessWriteResponse> => {
602
- const candidate = this.deps.validateWriteCandidate(request, namespace);
603
- if (request.dryRun === true) {
604
- return {
604
+ const candidate = this.deps.validateWriteCandidate(canonical, namespace);
605
+ if (canonical.dryRun === true) {
606
+ return reapplyCategoryCoercion<EngramAccessWriteResponse>({
605
607
  schemaVersion: ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
606
608
  operation: "suggestion_submit",
607
609
  namespace,
@@ -609,21 +611,20 @@ export class AccessObserveWriteSurface {
609
611
  accepted: true,
610
612
  queued: true,
611
613
  status: "validated",
612
- idempotencyKey: request.idempotencyKey?.trim() || undefined,
613
- ...(categoryCoercion ? { categoryCoercion } : {}),
614
- };
614
+ idempotencyKey: canonical.idempotencyKey?.trim() || undefined,
615
+ }, categoryCoercion);
615
616
  }
616
617
  const result = await queueExplicitCaptureForReview(
617
618
  this.deps.orchestrator,
618
619
  candidate,
619
620
  "suggestion_submit",
620
- new Error(request.sourceReason?.trim() || "submitted via engram suggestion_submit")
621
+ new Error(canonical.sourceReason?.trim() || "submitted via engram suggestion_submit")
621
622
  );
622
623
  // Seed the session binding only after a real, project-scoped submit commits
623
624
  // (mirrors memory_store / recall; skips dryRun, replay, quota-reject, and
624
625
  // explicit-namespace writes — Codex review).
625
- await this.deps.attachCodingContextAfterScopedWrite(request);
626
- const response: EngramAccessWriteResponse = {
626
+ await this.deps.attachCodingContextAfterScopedWrite(canonical);
627
+ const response = reapplyCategoryCoercion<EngramAccessWriteResponse>({
627
628
  schemaVersion: ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
628
629
  operation: "suggestion_submit",
629
630
  namespace,
@@ -633,37 +634,37 @@ export class AccessObserveWriteSurface {
633
634
  status: "queued_for_review",
634
635
  memoryId: result.id,
635
636
  duplicateOf: result.duplicateOf,
636
- idempotencyKey: request.idempotencyKey?.trim() || undefined,
637
- ...(categoryCoercion ? { categoryCoercion } : {}),
638
- };
637
+ idempotencyKey: canonical.idempotencyKey?.trim() || undefined,
638
+ }, categoryCoercion);
639
639
  log.info(
640
640
  `access-write op=suggestion_submit namespace=${namespace} dryRun=false status=${response.status} memoryId=${response.memoryId ?? "-"} idempotency=${response.idempotencyKey ? "yes" : "no"}`
641
641
  );
642
642
  return response;
643
643
  };
644
- const replayed = await this.deps.handleIdempotentWrite({
644
+ const response = await this.deps.handleIdempotentWrite({
645
645
  operation: "suggestion_submit",
646
- idempotencyKey: request.idempotencyKey,
646
+ idempotencyKey: canonical.idempotencyKey,
647
647
  // Shared builder (issue #1989 PR3): byte-parity with the historical
648
648
  // inline literal is asserted by access-fingerprint-parity.test.ts.
649
+ // Fingerprints the CANONICAL category (#2829).
649
650
  requestFingerprint: buildAccessWriteRequestFingerprint({
650
651
  schemaVersion,
651
652
  namespace,
652
- content: request.content,
653
- category: request.category,
654
- confidence: request.confidence,
655
- tags: request.tags,
656
- entityRef: request.entityRef,
657
- ttl: request.ttl,
658
- sourceReason: request.sourceReason,
659
- sourceConnector: request.sourceConnector,
653
+ content: canonical.content,
654
+ category: canonical.category,
655
+ confidence: canonical.confidence,
656
+ tags: canonical.tags,
657
+ entityRef: canonical.entityRef,
658
+ ttl: canonical.ttl,
659
+ sourceReason: canonical.sourceReason,
660
+ sourceConnector: canonical.sourceConnector,
660
661
  }),
661
- skip: request.dryRun === true,
662
+ skip: canonical.dryRun === true,
662
663
  beforeExecute: hooks?.enforceWriteQuota,
663
664
  execute,
664
665
  });
665
666
  // #2780 fix B: rewrite a replayed coercion note from THIS request's raw category.
666
- return reapplyCategoryCoercion(replayed, categoryCoercion);
667
+ return reapplyCategoryCoercion(response, categoryCoercion);
667
668
  }
668
669
 
669
670
  async runObserve(request: EngramAccessObserveRequest): Promise<EngramAccessObserveResponse> {
@@ -15,7 +15,14 @@ import type { DreamsPhase, RecallDisclosure, RecallPlanMode } from "./types.js";
15
15
  import type { RemnicChatGptMemoryInspectorInput } from "./mcp-memory-inspector-app.js";
16
16
  import { defineOperation } from "./access-boundary.js";
17
17
  import { EngramAccessForbiddenError } from "./access-errors.js";
18
- import { type ObserveRequest, observeRequestSchema, type RecallRequest, recallRequestSchema } from "./access-schema.js";
18
+ import {
19
+ type ObserveRequest,
20
+ observeRequestSchema,
21
+ type RecallRequest,
22
+ recallRequestSchema,
23
+ retainedCategoryAlias,
24
+ suggestionSubmitRequestSchema,
25
+ } from "./access-schema.js";
19
26
  import { EngramAccessInputError, type EngramAccessService } from "./access-service.js";
20
27
  import { enforceNamespaceAllowList, tokenCapabilityStore } from "./access-token-capabilities.js";
21
28
  import { projectTagProjectId } from "./coding/coding-namespace.js";
@@ -227,7 +234,26 @@ defineOperation({ name: "procedure_library_maintenance", description: "Run proce
227
234
 
228
235
  // === MEMORY/ENTITY/OBSERVE/LCM ===
229
236
  defineOperation({ name: "memory_timeline", description: "Memory timeline.", schema: strictSchema({ memoryId: S.str, namespace: S.str, limit: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.memoryTimeline(optStr(input.memoryId) ?? "", optStr(input.namespace), optNum(input.limit) ?? 200, ctx.authenticatedPrincipal) }) });
230
- defineOperation({ name: "suggestion_submit", description: "Submit suggestion.", schema: strictSchema({ schemaVersion: S.num, idempotencyKey: S.str, dryRun: S.bool, sessionKey: S.str, content: S.str, category: S.str, confidence: S.num, namespace: S.str, tags: S.strArr, entityRef: S.str, ttl: S.str, sourceReason: S.str, cwd: S.str, projectTag: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.suggestionSubmit({ schemaVersion: optNum(input.schemaVersion), idempotencyKey: optStr(input.idempotencyKey), dryRun: input.dryRun === true, sessionKey: optStr(input.sessionKey), authenticatedPrincipal: ctx.authenticatedPrincipal, ...(ctx.sourceConnector ? { sourceConnector: ctx.sourceConnector } : {}), content: optStr(input.content) ?? "", category: optStr(input.category), confidence: optNum(input.confidence), namespace: optStr(input.namespace), tags: optStrArr(input.tags), entityRef: optStr(input.entityRef), ttl: optStr(input.ttl), sourceReason: optStr(input.sourceReason), cwd: optStr(input.cwd), projectTag: optStr(input.projectTag) }) }) });
237
+ // Issue #2482/#2829: suggestion_submit validates through the canonical
238
+ // suggestionSubmitRequestSchema — the SAME schema the HTTP transport and the
239
+ // MCP wire parse use, category alias transform included. The raw spelling
240
+ // survives on `ctx.rawInput` for the coercion note.
241
+ defineOperation({
242
+ name: "suggestion_submit",
243
+ description: "Submit suggestion.",
244
+ schema: z.preprocess((data) => stripNullsExcept(data, ["codingContext"]), suggestionSubmitRequestSchema),
245
+ handler: async (input, ctx) => {
246
+ const rawCategory = retainedCategoryAlias(ctx.rawInput);
247
+ return {
248
+ result: await ctx.service.suggestionSubmit({
249
+ ...input,
250
+ authenticatedPrincipal: ctx.authenticatedPrincipal,
251
+ ...(ctx.sourceConnector ? { sourceConnector: ctx.sourceConnector } : {}),
252
+ ...(rawCategory ? { rawCategory } : {}),
253
+ }),
254
+ };
255
+ },
256
+ });
231
257
  defineOperation({ name: "entity_get", description: "Get entity.", schema: strictSchema({ name: S.str, namespace: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.entityGet(optStr(input.name) ?? "", optStr(input.namespace)) }) });
232
258
  defineOperation({ name: "review_queue_list", description: "List review queue.", schema: strictSchema({ runId: S.str, namespace: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.reviewQueue(optStr(input.runId) ?? "", optStr(input.namespace), ctx.authenticatedPrincipal) }) });
233
259
  // Issue #2482: observe validates through the canonical observeRequestSchema
@@ -15,7 +15,7 @@
15
15
  import { z } from "zod";
16
16
 
17
17
  import { defineOperation } from "./access-boundary.js";
18
- import { memoryStoreRequestSchema, type MemoryStoreRequest } from "./access-schema.js";
18
+ import { memoryStoreRequestSchema, retainedCategoryAlias, type MemoryStoreRequest } from "./access-schema.js";
19
19
  import { EngramAccessInputError } from "./access-service.js";
20
20
  import { CorrectionContractError } from "./correction/correction-contract.js";
21
21
  import { externalWikiSearchOperation } from "./external-wiki-access.js";
@@ -154,16 +154,18 @@ export interface MemoryStoreOutput {
154
154
  export const memoryStoreOperation = defineOperation<MemoryStoreInput, MemoryStoreOutput>({
155
155
  name: "memory_store",
156
156
  description: "Store an explicit memory through the access layer.",
157
- // Reuse the existing schema verbatim the migration is behavior-preserving;
158
- // the schema's external contract is NOT changing in this PR (per the issue's
159
- // pitfall note).
157
+ // The canonical wire schema (issue #2482): its category transform already
158
+ // mapped compat aliases to "fact", so `input.category` is finite here. The
159
+ // raw spelling survives on `ctx.rawInput` for the coercion note (#2829).
160
160
  schema: memoryStoreRequestSchema,
161
161
  handler: async (input, ctx) => {
162
+ const rawCategory = retainedCategoryAlias(ctx.rawInput);
162
163
  const result = await ctx.service.memoryStore(
163
164
  {
164
165
  ...input,
165
166
  authenticatedPrincipal: ctx.authenticatedPrincipal,
166
167
  ...(ctx.sourceConnector ? { sourceConnector: ctx.sourceConnector } : {}),
168
+ ...(rawCategory ? { rawCategory } : {}),
167
169
  },
168
170
  // Forward transport-level hooks (e.g. HTTP's atomic write-quota gate)
169
171
  // so the hook still fires inside the service's idempotent-write lock —