@remnic/core 9.69.42 → 9.69.43

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 (556) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +33 -25
  3. package/dist/access-authorization-probe.d.ts +16 -14
  4. package/dist/access-authorization-probe.js +34 -26
  5. package/dist/access-boundary.d.ts +16 -14
  6. package/dist/access-boundary.js +33 -25
  7. package/dist/access-cli.js +92 -82
  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 +16 -14
  11. package/dist/access-extraction-force-flush.js +33 -25
  12. package/dist/access-health-types.d.ts +2 -1
  13. package/dist/access-http-briefing.d.ts +16 -14
  14. package/dist/access-http-briefing.js +34 -26
  15. package/dist/access-http-lcm-compaction.d.ts +16 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  17. package/dist/access-http-offline-stream.d.ts +16 -14
  18. package/dist/access-http-query.d.ts +3 -2
  19. package/dist/access-http-query.js +35 -27
  20. package/dist/access-http.d.ts +17 -15
  21. package/dist/access-http.js +55 -45
  22. package/dist/access-identity-continuity-surface.d.ts +12 -11
  23. package/dist/access-identity-continuity-surface.js +33 -25
  24. package/dist/access-lcm-surface.d.ts +16 -14
  25. package/dist/access-lcm-surface.js +33 -25
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp-shared-context-tools.d.ts +16 -14
  28. package/dist/access-mcp.d.ts +16 -14
  29. package/dist/access-mcp.js +45 -36
  30. package/dist/access-memory-search-fanout.d.ts +3 -2
  31. package/dist/{access-namespace-preflight-ShnAJ9uL.d.ts → access-namespace-preflight-CE-RrXKu.d.ts} +1 -1
  32. package/dist/access-namespace-preflight.d.ts +4 -3
  33. package/dist/access-namespace-preflight.js +33 -25
  34. package/dist/access-observe-transcript.d.ts +12 -11
  35. package/dist/access-observe-write-category.d.ts +4 -3
  36. package/dist/access-observe-write-category.js +4 -4
  37. package/dist/access-observe-write-surface.d.ts +16 -14
  38. package/dist/access-observe-write-surface.js +33 -25
  39. package/dist/access-offline-manifest.d.ts +12 -11
  40. package/dist/access-operations-batch.js +35 -28
  41. package/dist/access-operations.d.ts +17 -15
  42. package/dist/access-operations.js +41 -33
  43. package/dist/access-recall-concurrency.d.ts +16 -14
  44. package/dist/access-recall-concurrency.js +33 -25
  45. package/dist/access-recall-response.d.ts +16 -14
  46. package/dist/access-recall-response.js +33 -25
  47. package/dist/access-recall-surface.d.ts +16 -14
  48. package/dist/access-recall-surface.js +33 -25
  49. package/dist/access-schema.d.ts +115 -114
  50. package/dist/access-schema.js +3 -3
  51. package/dist/{access-service-DjG_e2cM.d.ts → access-service-DxTTTg9O.d.ts} +77 -74
  52. package/dist/access-service-helpers.d.ts +16 -14
  53. package/dist/access-service.d.ts +16 -14
  54. package/dist/access-service.js +33 -25
  55. package/dist/access-surface-catalog.d.ts +16 -14
  56. package/dist/access-surface-catalog.js +39 -27
  57. package/dist/access-surface-catalog.js.map +1 -1
  58. package/dist/access-wearables-meetings-surface.d.ts +5 -4
  59. package/dist/action-confidence.d.ts +2 -1
  60. package/dist/active-memory-bridge.d.ts +2 -1
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +4 -2
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +2 -1
  65. package/dist/ambient-provenance.d.ts +2 -1
  66. package/dist/artifact-search.d.ts +2 -1
  67. package/dist/background-generation.d.ts +2 -1
  68. package/dist/behavior-learner.d.ts +2 -1
  69. package/dist/behavior-signals.d.ts +2 -1
  70. package/dist/bootstrap.d.ts +12 -11
  71. package/dist/briefing-window.d.ts +3 -2
  72. package/dist/briefing.d.ts +3 -2
  73. package/dist/briefing.js +8 -8
  74. package/dist/buffer-surprise-report.d.ts +2 -1
  75. package/dist/buffer-turn-helpers.d.ts +2 -1
  76. package/dist/buffer.d.ts +3 -2
  77. package/dist/bulk-import/index.d.ts +4 -3
  78. package/dist/calibration.d.ts +2 -1
  79. package/dist/capabilities.d.ts +2 -1
  80. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  81. package/dist/{catalog-BhuXaQHx.d.ts → catalog-Ya3DDn_T.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +2 -1
  83. package/dist/causal-consolidation.d.ts +2 -1
  84. package/dist/causal-consolidation.js +9 -9
  85. package/dist/causal-trajectory-graph.d.ts +2 -1
  86. package/dist/{chunk-QVSRE355.js → chunk-2AV75BJW.js} +29 -1
  87. package/dist/chunk-2AV75BJW.js.map +1 -0
  88. package/dist/{chunk-WNPRRBOE.js → chunk-2HDLDBJW.js} +2 -2
  89. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  90. package/dist/{chunk-LWF6GOII.js → chunk-2PIC6CEN.js} +2 -2
  91. package/dist/chunk-2WFOVXVJ.js +95 -0
  92. package/dist/chunk-2WFOVXVJ.js.map +1 -0
  93. package/dist/{chunk-FSUFKIFS.js → chunk-2YIUUXNK.js} +2 -2
  94. package/dist/{chunk-2PDMIPMP.js → chunk-324HBGS4.js} +6 -6
  95. package/dist/chunk-324HBGS4.js.map +1 -0
  96. package/dist/{chunk-OP722LOG.js → chunk-3254BYQV.js} +1 -1
  97. package/dist/{chunk-CQ4BTPX6.js → chunk-3YQ7VLP3.js} +2 -2
  98. package/dist/{chunk-ZFU6QNRN.js → chunk-4WMGRLTV.js} +2 -2
  99. package/dist/{chunk-U26LB4WA.js → chunk-5AJZ7EUW.js} +2 -2
  100. package/dist/chunk-5KVT6G5U.js +31 -0
  101. package/dist/chunk-5KVT6G5U.js.map +1 -0
  102. package/dist/{chunk-WN2OXGGH.js → chunk-66YUOI53.js} +1 -1
  103. package/dist/chunk-66YUOI53.js.map +1 -0
  104. package/dist/{chunk-R45VFSEV.js → chunk-7F47R4H4.js} +2 -2
  105. package/dist/{chunk-2EYZ32LH.js → chunk-7RGX7BMF.js} +24 -2
  106. package/dist/{chunk-2EYZ32LH.js.map → chunk-7RGX7BMF.js.map} +1 -1
  107. package/dist/{chunk-LVFI5LG7.js → chunk-A7GQBJP5.js} +7 -7
  108. package/dist/{chunk-KJQ4Y2PY.js → chunk-AKB44K3D.js} +8 -8
  109. package/dist/chunk-AS2NOPDM.js +30 -0
  110. package/dist/chunk-AS2NOPDM.js.map +1 -0
  111. package/dist/{chunk-CTETTVDN.js → chunk-BZDK5EOD.js} +2 -2
  112. package/dist/{chunk-PLJ2MQFT.js → chunk-C3YEB7CR.js} +7 -7
  113. package/dist/{chunk-ZOGKZ2XT.js → chunk-CRK6F6N3.js} +2 -2
  114. package/dist/{chunk-XJLTQTAO.js → chunk-D7UUB33A.js} +2 -2
  115. package/dist/{chunk-DMTSKY4W.js → chunk-DABSYX7V.js} +3 -3
  116. package/dist/{chunk-3RLWUW7G.js → chunk-DDGQDNQW.js} +2 -2
  117. package/dist/{chunk-EAARGPWI.js → chunk-F3TURDFG.js} +3 -1
  118. package/dist/chunk-F3TURDFG.js.map +1 -0
  119. package/dist/{chunk-DLPMOSNH.js → chunk-GKKLI23D.js} +2 -2
  120. package/dist/{chunk-I65KB36L.js → chunk-GMU7MAHS.js} +9 -9
  121. package/dist/{chunk-JC2OBYYD.js → chunk-HKQAI6XI.js} +2 -2
  122. package/dist/{chunk-7PSRCGWT.js → chunk-IB7FDRRC.js} +2 -2
  123. package/dist/{chunk-GIM2AGFL.js → chunk-IWHNT35B.js} +3 -3
  124. package/dist/{chunk-AHHFBJX7.js → chunk-JDL5BYYF.js} +3 -3
  125. package/dist/{chunk-HSJU6JFT.js → chunk-JWBDHA4F.js} +12 -6
  126. package/dist/chunk-JWBDHA4F.js.map +1 -0
  127. package/dist/{chunk-JMAP6L6Q.js → chunk-KDLOKVX7.js} +2 -2
  128. package/dist/chunk-KIW3OOZE.js +39 -0
  129. package/dist/chunk-KIW3OOZE.js.map +1 -0
  130. package/dist/{chunk-HO2P3FAX.js → chunk-KOM36ILJ.js} +19 -15
  131. package/dist/chunk-KOM36ILJ.js.map +1 -0
  132. package/dist/{chunk-HK44SV6K.js → chunk-KORQWGUA.js} +2 -2
  133. package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
  134. package/dist/{chunk-GWEZNCGA.js → chunk-KY75VZKG.js} +2 -2
  135. package/dist/{chunk-4IGOLIWM.js → chunk-L63M2PE4.js} +2 -2
  136. package/dist/{chunk-BIANISES.js → chunk-LD22AAJI.js} +2 -2
  137. package/dist/{chunk-L732NBPR.js → chunk-LT4H7SL5.js} +96 -42
  138. package/dist/chunk-LT4H7SL5.js.map +1 -0
  139. package/dist/{chunk-K27INAPR.js → chunk-LUAQHDUI.js} +2 -2
  140. package/dist/chunk-LVTT5AUG.js +79 -0
  141. package/dist/chunk-LVTT5AUG.js.map +1 -0
  142. package/dist/{chunk-IUTYNDFS.js → chunk-LXMZM7LM.js} +293 -43
  143. package/dist/chunk-LXMZM7LM.js.map +1 -0
  144. package/dist/{chunk-RXYO6NA6.js → chunk-M6FKXOYV.js} +2 -2
  145. package/dist/{chunk-AAX22E4K.js → chunk-M7H56FOQ.js} +2 -2
  146. package/dist/{chunk-LCVYO3ON.js → chunk-MOL7JK4F.js} +2 -2
  147. package/dist/{chunk-ADARR5KF.js → chunk-NHFXGNGC.js} +42 -39
  148. package/dist/chunk-NHFXGNGC.js.map +1 -0
  149. package/dist/{chunk-HPMCKAET.js → chunk-OGAKUA7I.js} +2 -2
  150. package/dist/{chunk-AOGICQMH.js → chunk-PF7LQ22G.js} +3 -3
  151. package/dist/{chunk-OCWFKD5Q.js → chunk-PPDZSJXB.js} +2 -2
  152. package/dist/{chunk-AUSRUOMQ.js → chunk-PW4HTWXL.js} +2 -2
  153. package/dist/{chunk-ZYRAY5FL.js → chunk-QCTXQ2HW.js} +2 -2
  154. package/dist/{chunk-ETE3SGAH.js → chunk-QUBPZQED.js} +2 -2
  155. package/dist/chunk-QZ4U67KO.js +98 -0
  156. package/dist/chunk-QZ4U67KO.js.map +1 -0
  157. package/dist/{chunk-G3NTZZWT.js → chunk-R3H2AXO2.js} +2 -2
  158. package/dist/{chunk-AIVRD66I.js → chunk-T3F2HWIG.js} +2 -2
  159. package/dist/chunk-TE6S7KDF.js +47 -0
  160. package/dist/chunk-TE6S7KDF.js.map +1 -0
  161. package/dist/{chunk-ZGXHTV5Y.js → chunk-UCLWIMVW.js} +2 -2
  162. package/dist/{chunk-N7B6V7SG.js → chunk-VHANUT45.js} +5 -5
  163. package/dist/{chunk-E4FRR4MA.js → chunk-VJXMFBVR.js} +2 -2
  164. package/dist/{chunk-KCKXOS4Y.js → chunk-VKDXYEA6.js} +3 -3
  165. package/dist/{chunk-Q62GA5U2.js → chunk-VW5TGNJN.js} +2 -2
  166. package/dist/{chunk-Q62GA5U2.js.map → chunk-VW5TGNJN.js.map} +1 -1
  167. package/dist/chunk-VYDGHJIN.js +17 -0
  168. package/dist/chunk-VYDGHJIN.js.map +1 -0
  169. package/dist/{chunk-GWNSKQDA.js → chunk-W44T2KHG.js} +3 -3
  170. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  171. package/dist/{chunk-2UINSKQC.js → chunk-XIJHRQ4A.js} +11 -5
  172. package/dist/chunk-XIJHRQ4A.js.map +1 -0
  173. package/dist/{chunk-VBK6SRNE.js → chunk-XOCGC3FJ.js} +2 -2
  174. package/dist/chunk-YE4JBZO5.js +44 -0
  175. package/dist/chunk-YE4JBZO5.js.map +1 -0
  176. package/dist/{chunk-RTXHUVOD.js → chunk-YPB3Y57U.js} +10 -10
  177. package/dist/{chunk-RSSLDMFX.js → chunk-YTV6J4T6.js} +2 -2
  178. package/dist/{chunk-AAAFZW3U.js → chunk-ZBSP4BSN.js} +2 -2
  179. package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
  180. package/dist/{cli-Cx9s_VRn.d.ts → cli-BfCl5kWD.d.ts} +5 -5
  181. package/dist/cli.d.ts +18 -16
  182. package/dist/cli.js +76 -66
  183. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  184. package/dist/coding/export-okf-codegraph.js +7 -7
  185. package/dist/coding/pre-action-gate.d.ts +2 -1
  186. package/dist/compounding/engine.d.ts +3 -2
  187. package/dist/compounding/engine.js +8 -8
  188. package/dist/compounding/preference-consolidator.d.ts +2 -1
  189. package/dist/compression-optimizer.d.ts +2 -1
  190. package/dist/config.d.ts +2 -1
  191. package/dist/config.js +4 -2
  192. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  193. package/dist/connectors/codex-materialize-runner.js +8 -8
  194. package/dist/connectors/codex-materialize.d.ts +2 -1
  195. package/dist/connectors/index.d.ts +2 -1
  196. package/dist/connectors/index.js +8 -8
  197. package/dist/consolidation-provenance-check.d.ts +3 -2
  198. package/dist/consolidation-undo.d.ts +3 -2
  199. package/dist/contradiction/index.d.ts +5 -4
  200. package/dist/converge-config.d.ts +2 -1
  201. package/dist/convergence-refresh.d.ts +3 -2
  202. package/dist/convergence-refresh.js +10 -10
  203. package/dist/conversation-index/backend.d.ts +2 -1
  204. package/dist/conversation-index/chunker.d.ts +2 -1
  205. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  206. package/dist/conversation-index/indexer.d.ts +2 -1
  207. package/dist/conversation-index/search.d.ts +2 -1
  208. package/dist/corpus-watermark.d.ts +2 -1
  209. package/dist/corpus-watermark.js +10 -10
  210. package/dist/cross-lingual-recall.d.ts +2 -1
  211. package/dist/day-summary.d.ts +2 -1
  212. package/dist/deep-recall-config.d.ts +11 -1
  213. package/dist/deep-recall-config.js +6 -3
  214. package/dist/deep-recall-http-glue.d.ts +16 -14
  215. package/dist/deep-recall-http-glue.js +5 -5
  216. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  217. package/dist/deep-recall-policy-llm.d.ts +3 -2
  218. package/dist/deep-recall-seeds.d.ts +2 -1
  219. package/dist/delinearize.d.ts +2 -1
  220. package/dist/dependency-propagation-config.d.ts +2 -1
  221. package/dist/{dependency-propagation-delivery-C2QFQ97b.d.ts → dependency-propagation-delivery-CggS9BFT.d.ts} +1 -1
  222. package/dist/direct-answer-wiring.d.ts +2 -1
  223. package/dist/direct-answer.d.ts +2 -1
  224. package/dist/embedding-fallback.d.ts +2 -1
  225. package/dist/enrichment/index.d.ts +2 -1
  226. package/dist/entity-origin-fields.d.ts +2 -1
  227. package/dist/entity-retrieval.d.ts +3 -2
  228. package/dist/entity-retrieval.js +8 -8
  229. package/dist/entity-schema.d.ts +2 -1
  230. package/dist/episodic-context.d.ts +2 -1
  231. package/dist/eval-trajectory-contracts.d.ts +2 -1
  232. package/dist/eval-trajectory-store.d.ts +2 -1
  233. package/dist/eval-trajectory.d.ts +2 -1
  234. package/dist/explicit-capture.d.ts +12 -11
  235. package/dist/external-wiki-access.d.ts +16 -14
  236. package/dist/external-wiki-access.js +34 -26
  237. package/dist/external-wiki-collection-registration.d.ts +2 -1
  238. package/dist/external-wiki-collection.d.ts +2 -1
  239. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  240. package/dist/extraction-error-classification.d.ts +2 -1
  241. package/dist/extraction-faithfulness.d.ts +3 -2
  242. package/dist/extraction-judge-telemetry.d.ts +3 -2
  243. package/dist/extraction-judge-training.d.ts +3 -2
  244. package/dist/extraction-judge.d.ts +3 -2
  245. package/dist/extraction-liveness.d.ts +2 -1
  246. package/dist/extraction-normalization.d.ts +2 -1
  247. package/dist/extraction-prompt.d.ts +2 -1
  248. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  249. package/dist/extraction-source-grounding.d.ts +2 -1
  250. package/dist/extraction-span-config.d.ts +2 -1
  251. package/dist/extraction-span-materialize.d.ts +2 -1
  252. package/dist/extraction.d.ts +3 -2
  253. package/dist/extraction.js +8 -8
  254. package/dist/fallback-llm-codex-subscription.d.ts +2 -1
  255. package/dist/fallback-llm.d.ts +2 -1
  256. package/dist/{generic-recall-paths-CeKQsQEn.d.ts → generic-recall-paths-CoXPSnCw.d.ts} +1 -1
  257. package/dist/graph-append-error.d.ts +2 -1
  258. package/dist/graph-dashboard-diff.d.ts +2 -1
  259. package/dist/graph-dashboard-key.d.ts +2 -1
  260. package/dist/graph-dashboard-parser.d.ts +2 -1
  261. package/dist/graph-edge-reinforcement.d.ts +2 -1
  262. package/dist/graph-jsonl.d.ts +2 -1
  263. package/dist/graph-path-reconstruction.d.ts +2 -1
  264. package/dist/graph-path-scoring.d.ts +2 -1
  265. package/dist/graph-snapshot.d.ts +2 -1
  266. package/dist/graph.d.ts +2 -1
  267. package/dist/harmonic-retrieval.js +1 -1
  268. package/dist/importance.d.ts +2 -1
  269. package/dist/importers/index.d.ts +2 -1
  270. package/dist/importers/test-utils.d.ts +2 -1
  271. package/dist/in-flight-reads.d.ts +2 -1
  272. package/dist/{index-Bau-Wl0H.d.ts → index-fdw_oK5a.d.ts} +3 -3
  273. package/dist/index.d.ts +704 -702
  274. package/dist/index.js +106 -85
  275. package/dist/intent.d.ts +2 -1
  276. package/dist/lcm/engine.d.ts +2 -1
  277. package/dist/lcm/engine.js +3 -3
  278. package/dist/lcm/index.d.ts +2 -1
  279. package/dist/lcm/index.js +11 -11
  280. package/dist/lcm/tools.d.ts +2 -1
  281. package/dist/lifecycle.d.ts +2 -1
  282. package/dist/live-connectors-runner.d.ts +2 -1
  283. package/dist/{local-llm-Bj-m01Ro.d.ts → local-llm-3-jtw52a.d.ts} +1 -1
  284. package/dist/local-llm-helpers.d.ts +3 -2
  285. package/dist/local-llm.d.ts +3 -2
  286. package/dist/local-model-endpoint.d.ts +2 -1
  287. package/dist/location/index.d.ts +6 -5
  288. package/dist/location/index.js +10 -10
  289. package/dist/maintenance/memory-governance.d.ts +2 -1
  290. package/dist/maintenance/memory-governance.js +8 -8
  291. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  292. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  293. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  294. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  295. package/dist/{maintenance-Ye-y-c7f.d.ts → maintenance-DgeeH0a1.d.ts} +3 -3
  296. package/dist/mcp-memory-inspector-app.d.ts +18 -16
  297. package/dist/mcp-read-only-tools.js +1 -1
  298. package/dist/memory-action-policy.d.ts +2 -1
  299. package/dist/memory-cache.d.ts +2 -1
  300. package/dist/memory-controller.d.ts +2 -1
  301. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  302. package/dist/memory-projection-store.d.ts +2 -1
  303. package/dist/memory-provenance.d.ts +2 -1
  304. package/dist/memory-snapshot.d.ts +2 -1
  305. package/dist/memory-subject-cli.d.ts +16 -14
  306. package/dist/memory-subject.d.ts +16 -14
  307. package/dist/memory-worth-outcomes.d.ts +3 -2
  308. package/dist/models-json.d.ts +2 -1
  309. package/dist/namespaces/migrate.d.ts +4 -3
  310. package/dist/namespaces/migrate.js +9 -9
  311. package/dist/namespaces/principal.d.ts +2 -1
  312. package/dist/namespaces/search.d.ts +2 -1
  313. package/dist/namespaces/search.js +4 -4
  314. package/dist/namespaces/storage.d.ts +4 -3
  315. package/dist/namespaces/storage.js +8 -8
  316. package/dist/native-knowledge.d.ts +2 -1
  317. package/dist/offline-sync-impression-drain.d.ts +2 -1
  318. package/dist/operator-doctor-corpus.d.ts +2 -1
  319. package/dist/operator-doctor-corpus.js +11 -11
  320. package/dist/operator-doctor-replica.d.ts +2 -1
  321. package/dist/operator-toolkit.d.ts +4 -3
  322. package/dist/operator-toolkit.js +19 -18
  323. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  324. package/dist/orchestration/maintenance.d.ts +5 -4
  325. package/dist/orchestration/maintenance.js +16 -16
  326. package/dist/{orchestrator-fFDDYUUV.d.ts → orchestrator-VXWKdatm.d.ts} +10 -10
  327. package/dist/orchestrator.d.ts +12 -11
  328. package/dist/orchestrator.js +92 -82
  329. package/dist/patterns-cli.d.ts +2 -1
  330. package/dist/{pipeline-D_j5n_Ih.d.ts → pipeline-CwXZBKR5.d.ts} +1 -1
  331. package/dist/policy-runtime.d.ts +2 -1
  332. package/dist/proactive-contention.d.ts +3 -2
  333. package/dist/provenance.d.ts +2 -1
  334. package/dist/{public-http-CjiSqxUx.d.ts → public-http-B55s59aR.d.ts} +1 -1
  335. package/dist/{qmd-CnxVjKrv.d.ts → qmd-DOLTPIQg.d.ts} +1 -1
  336. package/dist/qmd-preflight.d.ts +3 -2
  337. package/dist/qmd-recall-cache.d.ts +2 -1
  338. package/dist/qmd.d.ts +3 -2
  339. package/dist/recall-concurrency-config.d.ts +2 -1
  340. package/dist/recall-disclosure-escalation.d.ts +2 -1
  341. package/dist/recall-explain-renderer.d.ts +2 -1
  342. package/dist/recall-explain-renderer.js +3 -3
  343. package/dist/recall-memory-map.d.ts +2 -1
  344. package/dist/recall-navigate-access.d.ts +2 -1
  345. package/dist/recall-navigate-access.js +2 -2
  346. package/dist/recall-navigate-budget.js +3 -13
  347. package/dist/recall-navigate-budget.js.map +1 -1
  348. package/dist/recall-navigate-disclosure.d.ts +2 -1
  349. package/dist/recall-navigate-disclosure.js +4 -23
  350. package/dist/recall-navigate-disclosure.js.map +1 -1
  351. package/dist/recall-navigate-traverse.js +4 -37
  352. package/dist/recall-navigate-traverse.js.map +1 -1
  353. package/dist/recall-navigate-window.js +4 -26
  354. package/dist/recall-navigate-window.js.map +1 -1
  355. package/dist/recall-navigate.d.ts +2 -1
  356. package/dist/recall-navigate.js +2 -2
  357. package/dist/recall-navigation-config.d.ts +34 -0
  358. package/dist/recall-navigation-config.js +16 -0
  359. package/dist/recall-navigation-config.js.map +1 -0
  360. package/dist/recall-navigation-http-glue.d.ts +171 -0
  361. package/dist/recall-navigation-http-glue.js +9 -0
  362. package/dist/recall-navigation-http-glue.js.map +1 -0
  363. package/dist/recall-navigation-mcp-tools.d.ts +162 -0
  364. package/dist/recall-navigation-mcp-tools.js +8 -0
  365. package/dist/recall-navigation-mcp-tools.js.map +1 -0
  366. package/dist/recall-navigation-operations.d.ts +2 -0
  367. package/dist/recall-navigation-operations.js +245 -0
  368. package/dist/recall-navigation-operations.js.map +1 -0
  369. package/dist/recall-navigation-renderer.d.ts +36 -0
  370. package/dist/recall-navigation-renderer.js +8 -0
  371. package/dist/recall-navigation-renderer.js.map +1 -0
  372. package/dist/recall-navigation.d.ts +121 -0
  373. package/dist/recall-navigation.js +249 -0
  374. package/dist/recall-navigation.js.map +1 -0
  375. package/dist/recall-planner-llm.d.ts +2 -1
  376. package/dist/recall-state-view-admission.d.ts +3 -2
  377. package/dist/recall-state-view-anchors.d.ts +2 -1
  378. package/dist/recall-state.d.ts +2 -1
  379. package/dist/recall-tag-filter.d.ts +2 -1
  380. package/dist/recall-timings.d.ts +2 -1
  381. package/dist/recall-xray-cli.d.ts +2 -1
  382. package/dist/recall-xray-cli.js +4 -4
  383. package/dist/recall-xray-renderer.d.ts +2 -1
  384. package/dist/recall-xray-renderer.js +3 -3
  385. package/dist/recall-xray.d.ts +3 -2
  386. package/dist/recall-xray.js +2 -2
  387. package/dist/reconcile/cursor.d.ts +2 -1
  388. package/dist/reconcile/manifest.d.ts +2 -1
  389. package/dist/reconcile/plan.d.ts +2 -1
  390. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  391. package/dist/replay/normalizers/claude.d.ts +2 -1
  392. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  393. package/dist/replay/normalizers/shared.d.ts +2 -1
  394. package/dist/replay/runner.d.ts +2 -1
  395. package/dist/replay/types.d.ts +2 -1
  396. package/dist/replica-divergence.d.ts +2 -1
  397. package/dist/replica-peers-config.d.ts +2 -1
  398. package/dist/resolve-auth-token.d.ts +2 -1
  399. package/dist/resume-bundles.js +5 -3
  400. package/dist/retrieval-agents.d.ts +3 -2
  401. package/dist/retrieval-tiers.d.ts +2 -1
  402. package/dist/routing/engine.d.ts +2 -1
  403. package/dist/routing/store.d.ts +2 -1
  404. package/dist/salvage-envelope.d.ts +2 -1
  405. package/dist/schemas.d.ts +160 -160
  406. package/dist/{scope-profiles-BajH5zAT.d.ts → scope-profiles-C564-hrv.d.ts} +1 -1
  407. package/dist/search/embed-helper.d.ts +2 -1
  408. package/dist/search/factory.d.ts +2 -1
  409. package/dist/search/factory.js +3 -3
  410. package/dist/search/index.d.ts +2 -1
  411. package/dist/search/index.js +7 -7
  412. package/dist/search/lancedb-backend.d.ts +2 -1
  413. package/dist/search/meilisearch-backend.d.ts +2 -1
  414. package/dist/search/noop-backend.d.ts +2 -1
  415. package/dist/search/orama-backend.d.ts +2 -1
  416. package/dist/search/port.d.ts +2 -1
  417. package/dist/search/remote-backend.d.ts +2 -1
  418. package/dist/{semantic-consolidation-Bu6d3O7R.d.ts → semantic-consolidation-g6x-ShY8.d.ts} +1 -1
  419. package/dist/semantic-consolidation.d.ts +3 -2
  420. package/dist/semantic-consolidation.js +9 -9
  421. package/dist/semantic-rule-promotion.js +8 -8
  422. package/dist/semantic-rule-verifier.d.ts +2 -1
  423. package/dist/semantic-rule-verifier.js +8 -8
  424. package/dist/{service-ChFwWtLS.d.ts → service-CaCOk0rd.d.ts} +2 -2
  425. package/dist/session-observer-bands.d.ts +2 -1
  426. package/dist/session-observer-state.d.ts +2 -1
  427. package/dist/shared-context/manager.d.ts +8 -7
  428. package/dist/signal.d.ts +2 -1
  429. package/dist/source-agent-qualifier.d.ts +2 -1
  430. package/dist/source-agent-qualifier.js +8 -8
  431. package/dist/standup/build.js +8 -8
  432. package/dist/{storage-BDKQdsmB.d.ts → storage-C9nsZX5Q.d.ts} +1 -1
  433. package/dist/storage.d.ts +3 -2
  434. package/dist/storage.js +7 -7
  435. package/dist/subject-config.d.ts +2 -1
  436. package/dist/summarizer.d.ts +2 -1
  437. package/dist/summary-snapshot.d.ts +2 -1
  438. package/dist/support-passport/index.d.ts +19 -17
  439. package/dist/support-passport/index.js +36 -28
  440. package/dist/{tagging-CwK6um2q.d.ts → tagging-BA4RFdH3.d.ts} +2 -2
  441. package/dist/temporal-supersession.d.ts +3 -2
  442. package/dist/temporal-timeline-recall.d.ts +2 -1
  443. package/dist/temporal-validity.d.ts +2 -1
  444. package/dist/threading.d.ts +2 -1
  445. package/dist/tier-migration.d.ts +3 -2
  446. package/dist/tier-routing.d.ts +2 -1
  447. package/dist/topics.d.ts +2 -1
  448. package/dist/transcript.d.ts +2 -1
  449. package/dist/transfer/backup.js +2 -2
  450. package/dist/transfer/capsule-export.js +2 -2
  451. package/dist/transfer/capsule-import.js +2 -2
  452. package/dist/transfer/export-okf.d.ts +2 -1
  453. package/dist/transfer/export-okf.js +8 -8
  454. package/dist/transfer/types.d.ts +78 -78
  455. package/dist/trust-score-stage.d.ts +2 -1
  456. package/dist/trust-score.d.ts +2 -1
  457. package/dist/{types-B65IoepH.d.ts → types-Sps-lg5I.d.ts} +2 -1
  458. package/dist/types.d.ts +2 -1
  459. package/dist/types.js +1 -1
  460. package/dist/utility-runtime.d.ts +2 -1
  461. package/dist/verified-recall.js +8 -8
  462. package/dist/who-knows-cli.d.ts +16 -14
  463. package/dist/who-knows-cli.js +9 -9
  464. package/dist/who-knows.d.ts +16 -14
  465. package/dist/who-knows.js +8 -8
  466. package/dist/write-envelope.d.ts +2 -1
  467. package/package.json +2 -2
  468. package/src/access-boundary.ts +2 -0
  469. package/src/access-http.ts +3 -3
  470. package/src/access-mcp-output-schemas.ts +30 -0
  471. package/src/access-mcp.ts +3 -3
  472. package/src/access-operations.ts +2 -0
  473. package/src/access-service.ts +13 -23
  474. package/src/access-surface-catalog.test.ts +30 -2
  475. package/src/access-surface-catalog.ts +4 -0
  476. package/src/cli/recall-navigation-commands.ts +85 -0
  477. package/src/cli.ts +2 -2
  478. package/src/config.ts +4 -0
  479. package/src/deep-recall-config.ts +32 -0
  480. package/src/index.ts +1 -2
  481. package/src/mcp-read-only-tools.ts +2 -0
  482. package/src/orchestration/recall-internal.ts +4 -4
  483. package/src/recall-navigation-config.test.ts +56 -0
  484. package/src/recall-navigation-config.ts +107 -0
  485. package/src/recall-navigation-http-glue.ts +141 -0
  486. package/src/recall-navigation-mcp-tools.ts +60 -0
  487. package/src/recall-navigation-operations.ts +111 -0
  488. package/src/recall-navigation-renderer.ts +49 -0
  489. package/src/recall-navigation-surface.test.ts +474 -0
  490. package/src/recall-navigation.test.ts +405 -0
  491. package/src/recall-navigation.ts +429 -0
  492. package/src/recall-xray.ts +1 -1
  493. package/src/types.ts +2 -0
  494. package/dist/chunk-2PDMIPMP.js.map +0 -1
  495. package/dist/chunk-2UINSKQC.js.map +0 -1
  496. package/dist/chunk-ADARR5KF.js.map +0 -1
  497. package/dist/chunk-EAARGPWI.js.map +0 -1
  498. package/dist/chunk-HO2P3FAX.js.map +0 -1
  499. package/dist/chunk-HSJU6JFT.js.map +0 -1
  500. package/dist/chunk-IUTYNDFS.js.map +0 -1
  501. package/dist/chunk-L732NBPR.js.map +0 -1
  502. package/dist/chunk-QVSRE355.js.map +0 -1
  503. package/dist/chunk-WN2OXGGH.js.map +0 -1
  504. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  505. /package/dist/{chunk-WNPRRBOE.js.map → chunk-2HDLDBJW.js.map} +0 -0
  506. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  507. /package/dist/{chunk-LWF6GOII.js.map → chunk-2PIC6CEN.js.map} +0 -0
  508. /package/dist/{chunk-FSUFKIFS.js.map → chunk-2YIUUXNK.js.map} +0 -0
  509. /package/dist/{chunk-OP722LOG.js.map → chunk-3254BYQV.js.map} +0 -0
  510. /package/dist/{chunk-CQ4BTPX6.js.map → chunk-3YQ7VLP3.js.map} +0 -0
  511. /package/dist/{chunk-ZFU6QNRN.js.map → chunk-4WMGRLTV.js.map} +0 -0
  512. /package/dist/{chunk-U26LB4WA.js.map → chunk-5AJZ7EUW.js.map} +0 -0
  513. /package/dist/{chunk-R45VFSEV.js.map → chunk-7F47R4H4.js.map} +0 -0
  514. /package/dist/{chunk-LVFI5LG7.js.map → chunk-A7GQBJP5.js.map} +0 -0
  515. /package/dist/{chunk-KJQ4Y2PY.js.map → chunk-AKB44K3D.js.map} +0 -0
  516. /package/dist/{chunk-CTETTVDN.js.map → chunk-BZDK5EOD.js.map} +0 -0
  517. /package/dist/{chunk-PLJ2MQFT.js.map → chunk-C3YEB7CR.js.map} +0 -0
  518. /package/dist/{chunk-ZOGKZ2XT.js.map → chunk-CRK6F6N3.js.map} +0 -0
  519. /package/dist/{chunk-XJLTQTAO.js.map → chunk-D7UUB33A.js.map} +0 -0
  520. /package/dist/{chunk-DMTSKY4W.js.map → chunk-DABSYX7V.js.map} +0 -0
  521. /package/dist/{chunk-3RLWUW7G.js.map → chunk-DDGQDNQW.js.map} +0 -0
  522. /package/dist/{chunk-DLPMOSNH.js.map → chunk-GKKLI23D.js.map} +0 -0
  523. /package/dist/{chunk-I65KB36L.js.map → chunk-GMU7MAHS.js.map} +0 -0
  524. /package/dist/{chunk-JC2OBYYD.js.map → chunk-HKQAI6XI.js.map} +0 -0
  525. /package/dist/{chunk-7PSRCGWT.js.map → chunk-IB7FDRRC.js.map} +0 -0
  526. /package/dist/{chunk-GIM2AGFL.js.map → chunk-IWHNT35B.js.map} +0 -0
  527. /package/dist/{chunk-AHHFBJX7.js.map → chunk-JDL5BYYF.js.map} +0 -0
  528. /package/dist/{chunk-JMAP6L6Q.js.map → chunk-KDLOKVX7.js.map} +0 -0
  529. /package/dist/{chunk-HK44SV6K.js.map → chunk-KORQWGUA.js.map} +0 -0
  530. /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
  531. /package/dist/{chunk-GWEZNCGA.js.map → chunk-KY75VZKG.js.map} +0 -0
  532. /package/dist/{chunk-4IGOLIWM.js.map → chunk-L63M2PE4.js.map} +0 -0
  533. /package/dist/{chunk-BIANISES.js.map → chunk-LD22AAJI.js.map} +0 -0
  534. /package/dist/{chunk-K27INAPR.js.map → chunk-LUAQHDUI.js.map} +0 -0
  535. /package/dist/{chunk-RXYO6NA6.js.map → chunk-M6FKXOYV.js.map} +0 -0
  536. /package/dist/{chunk-AAX22E4K.js.map → chunk-M7H56FOQ.js.map} +0 -0
  537. /package/dist/{chunk-LCVYO3ON.js.map → chunk-MOL7JK4F.js.map} +0 -0
  538. /package/dist/{chunk-HPMCKAET.js.map → chunk-OGAKUA7I.js.map} +0 -0
  539. /package/dist/{chunk-AOGICQMH.js.map → chunk-PF7LQ22G.js.map} +0 -0
  540. /package/dist/{chunk-OCWFKD5Q.js.map → chunk-PPDZSJXB.js.map} +0 -0
  541. /package/dist/{chunk-AUSRUOMQ.js.map → chunk-PW4HTWXL.js.map} +0 -0
  542. /package/dist/{chunk-ZYRAY5FL.js.map → chunk-QCTXQ2HW.js.map} +0 -0
  543. /package/dist/{chunk-ETE3SGAH.js.map → chunk-QUBPZQED.js.map} +0 -0
  544. /package/dist/{chunk-G3NTZZWT.js.map → chunk-R3H2AXO2.js.map} +0 -0
  545. /package/dist/{chunk-AIVRD66I.js.map → chunk-T3F2HWIG.js.map} +0 -0
  546. /package/dist/{chunk-ZGXHTV5Y.js.map → chunk-UCLWIMVW.js.map} +0 -0
  547. /package/dist/{chunk-N7B6V7SG.js.map → chunk-VHANUT45.js.map} +0 -0
  548. /package/dist/{chunk-E4FRR4MA.js.map → chunk-VJXMFBVR.js.map} +0 -0
  549. /package/dist/{chunk-KCKXOS4Y.js.map → chunk-VKDXYEA6.js.map} +0 -0
  550. /package/dist/{chunk-GWNSKQDA.js.map → chunk-W44T2KHG.js.map} +0 -0
  551. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  552. /package/dist/{chunk-VBK6SRNE.js.map → chunk-XOCGC3FJ.js.map} +0 -0
  553. /package/dist/{chunk-RTXHUVOD.js.map → chunk-YPB3Y57U.js.map} +0 -0
  554. /package/dist/{chunk-RSSLDMFX.js.map → chunk-YTV6J4T6.js.map} +0 -0
  555. /package/dist/{chunk-AAAFZW3U.js.map → chunk-ZBSP4BSN.js.map} +0 -0
  556. /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Recall-navigation boundary operations (issue #1956).
3
+ *
4
+ * `memory_expand` / `memory_traverse` route MCP, HTTP, and CLI dispatch
5
+ * through the shared validation + error-mapping layer (access-boundary.ts)
6
+ * to the single `EngramAccessService.recallNavigate` implementation.
7
+ * Sibling module so access-operations-batch.ts stays at its ceiling seam
8
+ * (same layout as deep-recall's extraction).
9
+ */
10
+
11
+ import { z } from "zod";
12
+
13
+ import { defineOperation } from "./access-boundary.js";
14
+ import { EngramAccessInputError } from "./access-errors.js";
15
+
16
+ function stripNulls(data: unknown): unknown {
17
+ if (data !== null && typeof data === "object" && !Array.isArray(data)) {
18
+ const obj = data as Record<string, unknown>;
19
+ const cleaned: Record<string, unknown> = {};
20
+ for (const [key, value] of Object.entries(obj)) {
21
+ if (value !== null) cleaned[key] = value;
22
+ }
23
+ return cleaned;
24
+ }
25
+ return data;
26
+ }
27
+
28
+ function strictSchema<T extends z.ZodRawShape>(shape: T): z.ZodType<Record<string, unknown>> {
29
+ return z.preprocess(stripNulls, z.object(shape).passthrough()) as unknown as z.ZodType<Record<string, unknown>>;
30
+ }
31
+
32
+ const str = z.string().optional();
33
+
34
+ function optStr(value: unknown): string | undefined {
35
+ return typeof value === "string" ? value : undefined;
36
+ }
37
+
38
+ function optInt(value: unknown): number | undefined {
39
+ if (typeof value === "number") return value;
40
+ if (typeof value === "string" && Number.isFinite(Number(value))) return Number(value);
41
+ return undefined;
42
+ }
43
+
44
+ function reqStr(value: unknown, field: string): string {
45
+ if (typeof value !== "string" || value.trim().length === 0) {
46
+ throw new EngramAccessInputError(`${field} is required`);
47
+ }
48
+ return value;
49
+ }
50
+
51
+ const baseShape = {
52
+ memoryId: z.string(),
53
+ sessionKey: z.string(),
54
+ namespace: str,
55
+ };
56
+
57
+ defineOperation({
58
+ name: "memory_expand",
59
+ description: "Re-render one already-served recall result at a deeper disclosure level (chunk → section → raw).",
60
+ schema: strictSchema({ ...baseShape, disclosure: z.enum(["chunk", "section", "raw"]).optional() }),
61
+ handler: async (input, ctx) => {
62
+ const disclosure = optStr(input.disclosure);
63
+ return {
64
+ result: await ctx.service.recallNavigate({
65
+ action: "expand",
66
+ memoryId: reqStr(input.memoryId, "memoryId"),
67
+ sessionKey: reqStr(input.sessionKey, "sessionKey"),
68
+ ...(disclosure === "chunk" || disclosure === "section" || disclosure === "raw" ? { disclosure } : {}),
69
+ namespace: optStr(input.namespace),
70
+ authenticatedPrincipal: ctx.authenticatedPrincipal,
71
+ }),
72
+ };
73
+ },
74
+ });
75
+
76
+ defineOperation({
77
+ name: "memory_traverse",
78
+ description:
79
+ "Follow typed frontmatter links from an already-served recall result; neighbors return as chunk-level summaries.",
80
+ schema: strictSchema({
81
+ ...baseShape,
82
+ relation: z
83
+ .enum([
84
+ "supports",
85
+ "contradicts",
86
+ "elaborates",
87
+ "causes",
88
+ "caused_by",
89
+ "supersedes",
90
+ "follows",
91
+ "references",
92
+ "related",
93
+ ])
94
+ .optional(),
95
+ limit: z.union([z.number(), z.string()]).optional(),
96
+ }),
97
+ handler: async (input, ctx) => {
98
+ const relation = optStr(input.relation);
99
+ return {
100
+ result: await ctx.service.recallNavigate({
101
+ action: "traverse",
102
+ memoryId: reqStr(input.memoryId, "memoryId"),
103
+ sessionKey: reqStr(input.sessionKey, "sessionKey"),
104
+ ...(relation !== undefined ? { relation } : {}),
105
+ limit: optInt(input.limit),
106
+ namespace: optStr(input.namespace),
107
+ authenticatedPrincipal: ctx.authenticatedPrincipal,
108
+ }),
109
+ };
110
+ },
111
+ });
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Shared markdown renderer for recall navigation (issue #1956).
3
+ *
4
+ * Rule 22: CLI text output, MCP `rendered`, and HTTP human output all
5
+ * render through this one module — never forked per surface.
6
+ * Deterministic: items in result order, budget and disclosure spend last.
7
+ */
8
+
9
+ import type { RecallNavigationResult } from "./recall-navigation.js";
10
+
11
+ type NavigationRenderInput = RecallNavigationResult extends infer Result
12
+ ? Result extends { rendered: string }
13
+ ? Omit<Result, "rendered">
14
+ : never
15
+ : never;
16
+
17
+ export function renderNavigationResult(result: NavigationRenderInput): string {
18
+ if (!result.ok) {
19
+ return ["# Memory navigation", "", `- error: ${result.error}`, `- ${result.message}`, ""].join("\n");
20
+ }
21
+ const lines = ["# Memory navigation", ""];
22
+ lines.push(`- action: ${result.action}`);
23
+ lines.push(`- memory: ${result.memoryId}`);
24
+ lines.push(`- namespace: ${result.namespace}`);
25
+ if (result.items.length === 0) {
26
+ lines.push("- neighbors: (none)");
27
+ } else {
28
+ lines.push("");
29
+ for (const [index, item] of result.items.entries()) {
30
+ const via = item.linkType !== undefined ? ` via ${item.linkType}` : "";
31
+ lines.push(`${index + 1}. **${item.memoryId}** (${item.disclosure}${via})`);
32
+ if (item.content !== undefined) {
33
+ lines.push(item.content);
34
+ } else {
35
+ lines.push(` ${item.preview.replace(/\s+/g, " ").trim()}`);
36
+ }
37
+ }
38
+ }
39
+ lines.push("");
40
+ lines.push(
41
+ `- budget: ${result.budget.used}/${result.budget.chars} chars${result.truncated ? " (truncated)" : ""}`,
42
+ );
43
+ const spend = result.disclosureSpend;
44
+ lines.push(
45
+ `- disclosure spend: chunk=${spend.chunk.estimatedTokens}t, section=${spend.section.estimatedTokens}t, raw=${spend.raw.estimatedTokens}t`,
46
+ );
47
+ lines.push("");
48
+ return lines.join("\n");
49
+ }
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Recall-navigation surface tests (issue #1956): MCP three-step flow
3
+ * (recall-served id → expand → traverse), disabled-tool listing removal,
4
+ * HTTP parity, and namespace isolation over a two-namespace fixture.
5
+ *
6
+ * Service is built the way deep-recall-surface.test.ts builds it:
7
+ * Object.create(EngramAccessService.prototype) with a stub orchestrator
8
+ * carrying a REAL RecallHandleHistoryStore (the same ring recall writes)
9
+ * and REAL StorageManager instances.
10
+ */
11
+
12
+ import assert from "node:assert/strict";
13
+ import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises";
14
+ import { tmpdir } from "node:os";
15
+ import path from "node:path";
16
+ import test from "node:test";
17
+
18
+ import { EngramAccessHttpServer } from "./access-http.js";
19
+ import { EngramAccessService } from "./access-service.js";
20
+ import { EngramMcpServer } from "./access-mcp.js";
21
+ import type { CliCommand } from "./cli.js";
22
+ import { registerRecallNavigationCommands } from "./cli/recall-navigation-commands.js";
23
+ import { parseConfig } from "./config.js";
24
+ import { renderHandle } from "./recall-handles.js";
25
+ import { RecallHandleHistoryStore } from "./recall-state.js";
26
+ import { StorageManager } from "./storage.js";
27
+ import type { PluginConfig } from "./types.js";
28
+ import type { Orchestrator } from "./orchestrator.js";
29
+
30
+ const SESSION = "project/nav-surface/1";
31
+
32
+ interface SurfaceFixture {
33
+ service: EngramAccessService;
34
+ history: RecallHandleHistoryStore;
35
+ storages: Record<string, StorageManager>;
36
+ config: PluginConfig;
37
+ cleanup: () => Promise<void>;
38
+ }
39
+
40
+ async function surfaceFixture(options: { namespaces?: boolean } = {}): Promise<SurfaceFixture> {
41
+ const base = await mkdtemp(path.join(tmpdir(), "remnic-nav-surface-"));
42
+ const nsRoot = path.join(base, "namespaces");
43
+ if (options.namespaces) {
44
+ await mkdir(path.join(nsRoot, "ns_alice"), { recursive: true });
45
+ await mkdir(path.join(nsRoot, "ns_bob"), { recursive: true });
46
+ }
47
+ const config = parseConfig({
48
+ memoryDir: base,
49
+ qmdCollection: "remnic-nav-test",
50
+ ...(options.namespaces
51
+ ? {
52
+ namespacesEnabled: true,
53
+ defaultNamespace: "default",
54
+ principalFromSessionKeyMode: "map" as const,
55
+ principalFromSessionKeyRules: [{ match: "alice-session", principal: "alice" }],
56
+ namespacePolicies: [
57
+ { name: "ns_alice", readPrincipals: ["alice"], writePrincipals: ["alice"] },
58
+ { name: "ns_bob", readPrincipals: ["bob"], writePrincipals: ["bob"] },
59
+ ],
60
+ }
61
+ : {}),
62
+ });
63
+ const storages: Record<string, StorageManager> = options.namespaces
64
+ ? {
65
+ ns_alice: makeStorage(path.join(nsRoot, "ns_alice")),
66
+ ns_bob: makeStorage(path.join(nsRoot, "ns_bob")),
67
+ }
68
+ : { default: makeStorage(path.join(base, "default")) };
69
+ const history = new RecallHandleHistoryStore(base, { maxDepth: 10 });
70
+ await history.load();
71
+ const service = Object.create(EngramAccessService.prototype) as EngramAccessService;
72
+ const host = service as unknown as { orchestrator: unknown };
73
+ host.orchestrator = {
74
+ config,
75
+ handleHistory: history,
76
+ async getStorage(namespace: string) {
77
+ return storages[namespace] ?? storages.default!;
78
+ },
79
+ };
80
+ return {
81
+ service,
82
+ history,
83
+ storages,
84
+ config,
85
+ cleanup: async () => {
86
+ StorageManager.clearAllStaticCaches();
87
+ await rm(base, { recursive: true, force: true });
88
+ },
89
+ };
90
+ }
91
+
92
+ function makeStorage(dir: string): StorageManager {
93
+ const storage = new StorageManager(dir);
94
+ void storage.ensureDirectories();
95
+ return storage;
96
+ }
97
+
98
+ async function writeMemory(
99
+ storage: StorageManager,
100
+ content: string,
101
+ links: Array<{ targetId: string; linkType: "supports" | "contradicts" | "follows"; strength: number }> = [],
102
+ ): Promise<string> {
103
+ const result = await storage.writeMemory("fact", content, links.length > 0 ? { links } : {});
104
+ return result.id;
105
+ }
106
+
107
+ test("MCP three-step: expand a served id to raw, then traverse contradicts", async () => {
108
+ const f = await surfaceFixture();
109
+ try {
110
+ const storage = f.storages.default!;
111
+ const neighbor = await writeMemory(storage, "The limit was raised to 2000 in the October rollout.");
112
+ const source = await writeMemory(storage, "The API rate limit is 1000 requests per minute.", [
113
+ { targetId: neighbor, linkType: "contradicts", strength: 0.9 },
114
+ ]);
115
+ // The recall step's role in the flow: register the served ids. This is
116
+ // the same write path orchestrator recall uses (handle history record).
117
+ await f.history.record(SESSION, [source, neighbor]);
118
+
119
+ const server = new EngramMcpServer(f.service, { emitLegacyTools: true });
120
+ const call = (name: string, arguments_: Record<string, unknown>) =>
121
+ server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name, arguments: arguments_ } });
122
+
123
+ const expand = (await call("engram.memory_expand", {
124
+ memoryId: source,
125
+ sessionKey: SESSION,
126
+ disclosure: "raw",
127
+ })) as { result?: { content?: Array<{ text?: string }> }; isError?: boolean };
128
+ const expandText = expand.result?.content?.[0]?.text ?? "";
129
+ const expandPayload = JSON.parse(extractJson(expandText)) as {
130
+ ok: boolean;
131
+ items?: Array<{ content?: string; disclosure?: string }>;
132
+ };
133
+ assert.equal(expandPayload.ok, true);
134
+ assert.equal(expandPayload.items?.[0]?.disclosure, "raw");
135
+ assert.match(expandPayload.items?.[0]?.content ?? "", /1000 requests per minute/);
136
+
137
+ const traverse = (await call("engram.memory_traverse", {
138
+ memoryId: source,
139
+ sessionKey: SESSION,
140
+ relation: "contradicts",
141
+ })) as { result?: { content?: Array<{ text?: string }> } };
142
+ const traverseText = traverse.result?.content?.[0]?.text ?? "";
143
+ const traversePayload = JSON.parse(extractJson(traverseText)) as {
144
+ ok: boolean;
145
+ items?: Array<{ memoryId?: string; linkType?: string }>;
146
+ };
147
+ assert.equal(traversePayload.ok, true);
148
+ assert.equal(traversePayload.items?.length, 1);
149
+ assert.equal(traversePayload.items?.[0]?.memoryId, neighbor);
150
+ assert.equal(traversePayload.items?.[0]?.linkType, "contradicts");
151
+
152
+ // An id the session never saw is refused with the constraint named.
153
+ const stranger = await writeMemory(storage, "Never served to this session.");
154
+ const unserved = (await call("remnic.memory_expand", {
155
+ memoryId: stranger,
156
+ sessionKey: SESSION,
157
+ })) as { result?: { content?: Array<{ text?: string }> } };
158
+ const unservedPayload = JSON.parse(
159
+ extractJson(unserved.result?.content?.[0]?.text ?? ""),
160
+ ) as { ok: boolean; error?: string; message?: string };
161
+ assert.equal(unservedPayload.ok, false);
162
+ assert.equal(unservedPayload.error, "not_served");
163
+ assert.match(unservedPayload.message ?? "", /recall snapshots/);
164
+ } finally {
165
+ await f.cleanup();
166
+ }
167
+ });
168
+
169
+ test("disabled config removes navigation tools from tools/list; default keeps them", async () => {
170
+ const f = await surfaceFixture();
171
+ try {
172
+ const shortNames = async (service: unknown): Promise<ReadonlySet<string>> => {
173
+ const server = new EngramMcpServer(service as EngramAccessService, { emitLegacyTools: true });
174
+ const response = (await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" })) as {
175
+ result?: { tools?: Array<{ name: string }> };
176
+ };
177
+ const names = new Set<string>();
178
+ for (const tool of response.result?.tools ?? []) {
179
+ names.add(
180
+ tool.name.replace(/^engram\./, "").replace(/^remnic_/, ""),
181
+ );
182
+ }
183
+ return names;
184
+ };
185
+
186
+ const withFields = (fields: Record<string, unknown>): EngramAccessService =>
187
+ // Plain object, not prototype-based: supportPassportEnabled is a
188
+ // getter on the base class and cannot be assigned per instance. The
189
+ // MCP constructor only READS these flags while building the tool list.
190
+ ({
191
+ supportPassportEnabled: false,
192
+ briefingEnabled: false,
193
+ ...fields,
194
+ }) as unknown as EngramAccessService;
195
+
196
+ const enabled = await shortNames(withFields({ recallNavigationEnabled: undefined }));
197
+ assert.ok(enabled.has("memory_expand"), "default (flag absent) keeps memory_expand listed");
198
+ assert.ok(enabled.has("memory_traverse"));
199
+
200
+ const disabled = await shortNames(withFields({ recallNavigationEnabled: false }));
201
+ assert.ok(!disabled.has("memory_expand"), "disabled removes memory_expand from listing");
202
+ assert.ok(!disabled.has("memory_traverse"), "disabled removes memory_traverse from listing");
203
+
204
+ // The live service shape: enabled by the default config.
205
+ const live = await shortNames(f.service);
206
+ assert.ok(live.has("memory_expand") && live.has("memory_traverse"));
207
+ } finally {
208
+ await f.cleanup();
209
+ }
210
+ });
211
+
212
+ test("HTTP parity: POST /memory/expand and /memory/traverse share the service result", async () => {
213
+ const f = await surfaceFixture();
214
+ const server = new EngramAccessHttpServer({
215
+ service: f.service,
216
+ port: 0,
217
+ trustPrincipalHeader: true,
218
+ adminConsoleEnabled: false,
219
+ authTokenEntriesGetter: () => [{ token: "operator-token", capabilities: { version: 1 } }],
220
+ });
221
+ try {
222
+ const storage = f.storages.default!;
223
+ const neighbor = await writeMemory(storage, "Supporting rollout note.");
224
+ const source = await writeMemory(storage, "Rate limit decision.", [
225
+ { targetId: neighbor, linkType: "supports", strength: 0.9 },
226
+ ]);
227
+ await f.history.record(SESSION, [source, neighbor]);
228
+ const status = await server.start();
229
+ const post = (pathname: string, body: Record<string, unknown>) =>
230
+ fetch(`http://127.0.0.1:${status.port}${pathname}`, {
231
+ method: "POST",
232
+ headers: { "content-type": "application/json", authorization: "Bearer operator-token" },
233
+ body: JSON.stringify(body),
234
+ });
235
+
236
+ const expand = await post("/engram/v1/memory/expand", {
237
+ memoryId: source,
238
+ sessionKey: SESSION,
239
+ disclosure: "section",
240
+ });
241
+ assert.equal(expand.status, 200);
242
+ const expandBody = (await expand.json()) as { ok: boolean; items?: Array<{ content?: string }> };
243
+ assert.equal(expandBody.ok, true);
244
+ assert.match(expandBody.items?.[0]?.content ?? "", /Rate limit decision/);
245
+
246
+ const remnicAlias = await post("/remnic/v1/memory/traverse", {
247
+ memoryId: source,
248
+ sessionKey: SESSION,
249
+ relation: "supports",
250
+ });
251
+ assert.equal(remnicAlias.status, 200);
252
+ const traverseBody = (await remnicAlias.json()) as { ok: boolean; items?: Array<{ memoryId?: string }> };
253
+ assert.equal(traverseBody.ok, true);
254
+ assert.equal(traverseBody.items?.[0]?.memoryId, neighbor);
255
+
256
+ const badRequest = await post("/engram/v1/memory/expand", { memoryId: source });
257
+ assert.equal(badRequest.status, 400, "missing sessionKey is a 400 input error");
258
+ } finally {
259
+ await server.stop();
260
+ await f.cleanup();
261
+ }
262
+ });
263
+
264
+ test("namespace isolation: navigation never crosses the resolved namespace", async () => {
265
+ const f = await surfaceFixture({ namespaces: true });
266
+ const server = new EngramAccessHttpServer({
267
+ service: f.service,
268
+ port: 0,
269
+ trustPrincipalHeader: true,
270
+ adminConsoleEnabled: false,
271
+ authTokenEntriesGetter: () => [{ token: "operator-token", capabilities: { version: 1 } }],
272
+ });
273
+ try {
274
+ const aliceMemory = await writeMemory(
275
+ f.storages.ns_alice!,
276
+ "Alice-private: the merger closes on Friday.",
277
+ [],
278
+ );
279
+ const bobMemory = await writeMemory(f.storages.ns_bob!, "Bob-private: the merger closes never.");
280
+ // Alice's memory links at Bob's id (stale/foreign edge): traversal must
281
+ // not resolve it inside alice's namespace.
282
+ const aliceLinked = await writeMemory(f.storages.ns_alice!, "Alice decision with a foreign edge.", [
283
+ { targetId: bobMemory, linkType: "follows", strength: 0.5 },
284
+ ]);
285
+ // The recall step served alice's ids to alice's session.
286
+ await f.history.record("alice-session", [aliceMemory, aliceLinked]);
287
+
288
+ const status = await server.start();
289
+ const post = (body: Record<string, unknown>) =>
290
+ fetch(`http://127.0.0.1:${status.port}/engram/v1/memory/expand`, {
291
+ method: "POST",
292
+ headers: { "content-type": "application/json", authorization: "Bearer operator-token" },
293
+ body: JSON.stringify(body),
294
+ });
295
+
296
+ // Bob asks for alice's id inside his own namespace: the id resolves
297
+ // against bob's storage and is simply absent — zero content leakage.
298
+ const bobProbe = await post({
299
+ memoryId: aliceMemory,
300
+ sessionKey: "bob-session",
301
+ namespace: "ns_bob",
302
+ });
303
+ assert.equal(bobProbe.status, 200);
304
+ const bobBody = (await bobProbe.json()) as { ok: boolean; error?: string };
305
+ assert.equal(bobBody.ok, false);
306
+ assert.equal(bobBody.error, "not_served", "bob's session never served alice's id");
307
+
308
+ // Alice expands her linked memory; the foreign edge must yield no
309
+ // neighbor content from bob's namespace.
310
+ const aliceTraverse = await fetch(`http://127.0.0.1:${status.port}/engram/v1/memory/traverse`, {
311
+ method: "POST",
312
+ headers: { "content-type": "application/json", authorization: "Bearer operator-token" },
313
+ body: JSON.stringify({
314
+ memoryId: aliceLinked,
315
+ sessionKey: "alice-session",
316
+ namespace: "ns_alice",
317
+ }),
318
+ });
319
+ assert.equal(aliceTraverse.status, 200);
320
+ const traverseBody = (await aliceTraverse.json()) as { ok: boolean; items?: Array<{ content?: string }> };
321
+ assert.equal(traverseBody.ok, true);
322
+ assert.equal(traverseBody.items?.length, 0, "foreign-namespace link target must not resolve");
323
+ const rendered = JSON.stringify(traverseBody);
324
+ assert.ok(!rendered.includes("Bob-private"), "no bob-namespace content may appear in alice's traverse");
325
+
326
+ // Alice CAN expand her own served memory.
327
+ const aliceExpand = await post({
328
+ memoryId: aliceMemory,
329
+ sessionKey: "alice-session",
330
+ namespace: "ns_alice",
331
+ });
332
+ const aliceBody = (await aliceExpand.json()) as { ok: boolean; items?: Array<{ content?: string }> };
333
+ assert.equal(aliceBody.ok, true);
334
+ assert.match(aliceBody.items?.[0]?.content ?? "", /merger closes on Friday/);
335
+ } finally {
336
+ await server.stop();
337
+ await f.cleanup();
338
+ }
339
+ });
340
+
341
+ /** MCP text content embeds the JSON payload; pull it out for assertions. */
342
+ function extractJson(text: string): string {
343
+ const start = text.indexOf("{");
344
+ const end = text.lastIndexOf("}");
345
+ if (start < 0 || end <= start) return "{}";
346
+ return text.slice(start, end + 1);
347
+ }
348
+
349
+ test("MCP and HTTP resolve a documented [m:xxxx] handle", async () => {
350
+ const f = await surfaceFixture();
351
+ const server = new EngramAccessHttpServer({
352
+ service: f.service,
353
+ port: 0,
354
+ trustPrincipalHeader: true,
355
+ adminConsoleEnabled: false,
356
+ authTokenEntriesGetter: () => [{ token: "operator-token", capabilities: { version: 1 } }],
357
+ });
358
+ try {
359
+ const storage = f.storages.default!;
360
+ const id = await writeMemory(storage, "Surface handle target.");
361
+ await f.history.record(SESSION, [id]);
362
+ const handle = renderHandle(id);
363
+
364
+ const mcp = new EngramMcpServer(f.service, { emitLegacyTools: true });
365
+ const mcpRes = (await mcp.handleRequest({
366
+ jsonrpc: "2.0",
367
+ id: 1,
368
+ method: "tools/call",
369
+ params: { name: "engram.memory_expand", arguments: { memoryId: handle, sessionKey: SESSION, disclosure: "raw" } },
370
+ })) as { result?: { content?: Array<{ text?: string }> } };
371
+ const mcpPayload = JSON.parse(extractJson(mcpRes.result?.content?.[0]?.text ?? "")) as {
372
+ ok: boolean;
373
+ memoryId?: string;
374
+ };
375
+ assert.equal(mcpPayload.ok, true);
376
+ assert.equal(mcpPayload.memoryId, id);
377
+
378
+ const status = await server.start();
379
+ const httpRes = await fetch(`http://127.0.0.1:${status.port}/engram/v1/memory/expand`, {
380
+ method: "POST",
381
+ headers: { "content-type": "application/json", authorization: "Bearer operator-token" },
382
+ body: JSON.stringify({ memoryId: handle, sessionKey: SESSION, disclosure: "raw" }),
383
+ });
384
+ assert.equal(httpRes.status, 200);
385
+ const httpBody = (await httpRes.json()) as { ok: boolean; memoryId?: string; rendered?: string };
386
+ assert.equal(httpBody.ok, true);
387
+ assert.equal(httpBody.memoryId, id);
388
+ assert.equal(httpBody.rendered, undefined, "HTTP must not double-count rendered in the returned payload");
389
+ } finally {
390
+ await server.stop();
391
+ await f.cleanup();
392
+ }
393
+ });
394
+
395
+ test("CLI navigate expand uses the shared service and accepts a handle", async () => {
396
+ const f = await surfaceFixture();
397
+ try {
398
+ const storage = f.storages.default!;
399
+ const id = await writeMemory(storage, "CLI handle target.");
400
+ await f.history.record(SESSION, [id]);
401
+ const actions = new Map<string, (...args: unknown[]) => Promise<void> | void>();
402
+ const cmd: CliCommand = {
403
+ command(name: string) {
404
+ const child: CliCommand = {
405
+ command: cmd.command,
406
+ description() {
407
+ return child;
408
+ },
409
+ option() {
410
+ return child;
411
+ },
412
+ requiredOption() {
413
+ return child;
414
+ },
415
+ argument() {
416
+ return child;
417
+ },
418
+ action(fn) {
419
+ actions.set(name, fn);
420
+ return child;
421
+ },
422
+ };
423
+ return child;
424
+ },
425
+ description() {
426
+ return cmd;
427
+ },
428
+ option() {
429
+ return cmd;
430
+ },
431
+ requiredOption() {
432
+ return cmd;
433
+ },
434
+ argument() {
435
+ return cmd;
436
+ },
437
+ action() {
438
+ return cmd;
439
+ },
440
+ };
441
+ registerRecallNavigationCommands(cmd, f.service["orchestrator"] as Orchestrator);
442
+ const expand = actions.get("navigate expand <memoryId>");
443
+ assert.ok(expand, "CLI must register navigate expand");
444
+ const lines: string[] = [];
445
+ const originalLog = console.log;
446
+ console.log = (value?: unknown) => {
447
+ lines.push(String(value ?? ""));
448
+ };
449
+ try {
450
+ await expand(renderHandle(id), { sessionKey: SESSION, disclosure: "raw", json: true });
451
+ } finally {
452
+ console.log = originalLog;
453
+ }
454
+ const payload = JSON.parse(lines.join("\n")) as { ok: boolean; memoryId?: string };
455
+ assert.equal(payload.ok, true);
456
+ assert.equal(payload.memoryId, id);
457
+ } finally {
458
+ await f.cleanup();
459
+ }
460
+ });
461
+
462
+ test("god files stay under ratchet caps after navigation review fixes", async () => {
463
+ const caps: Record<string, number> = {
464
+ "access-service.ts": 5910,
465
+ "config.ts": 4568,
466
+ "cli.ts": 9428,
467
+ "orchestration/recall-internal.ts": 5344,
468
+ };
469
+ for (const [rel, cap] of Object.entries(caps)) {
470
+ const text = await readFile(path.join(import.meta.dirname, rel), "utf8");
471
+ const lines = text.endsWith("\n") ? text.slice(0, -1).split("\n").length : text.split("\n").length;
472
+ assert.ok(lines <= cap, `${rel} is ${lines} lines; cap is ${cap}`);
473
+ }
474
+ });