@remnic/core 9.69.41 → 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 (611) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -13
  2. package/dist/access-admin-ops-surface.js +48 -40
  3. package/dist/access-authorization-probe.d.ts +16 -13
  4. package/dist/access-authorization-probe.js +49 -41
  5. package/dist/access-boundary.d.ts +16 -13
  6. package/dist/access-boundary.js +48 -40
  7. package/dist/access-cli.js +115 -105
  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 -13
  11. package/dist/access-extraction-force-flush.js +48 -40
  12. package/dist/access-health-types.d.ts +2 -1
  13. package/dist/access-http-briefing.d.ts +16 -13
  14. package/dist/access-http-briefing.js +49 -41
  15. package/dist/access-http-lcm-compaction.d.ts +16 -13
  16. package/dist/access-http-lifecycle-flush.d.ts +16 -13
  17. package/dist/access-http-offline-stream.d.ts +16 -13
  18. package/dist/access-http-query.d.ts +3 -2
  19. package/dist/access-http-query.js +50 -42
  20. package/dist/access-http.d.ts +17 -14
  21. package/dist/access-http.js +70 -60
  22. package/dist/access-identity-continuity-surface.d.ts +12 -11
  23. package/dist/access-identity-continuity-surface.js +48 -40
  24. package/dist/access-lcm-surface.d.ts +16 -13
  25. package/dist/access-lcm-surface.js +48 -40
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp-shared-context-tools.d.ts +16 -13
  28. package/dist/access-mcp.d.ts +16 -13
  29. package/dist/access-mcp.js +60 -51
  30. package/dist/access-memory-search-fanout.d.ts +3 -2
  31. package/dist/{access-namespace-preflight-DWsMc9Dh.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 +48 -40
  34. package/dist/access-observe-transcript.d.ts +12 -11
  35. package/dist/access-observe-write-category.d.ts +18 -1
  36. package/dist/access-observe-write-category.js +21 -4
  37. package/dist/access-observe-write-surface.d.ts +16 -13
  38. package/dist/access-observe-write-surface.js +48 -40
  39. package/dist/access-offline-manifest.d.ts +12 -11
  40. package/dist/access-offline-manifest.js +6 -6
  41. package/dist/access-operations-batch.js +50 -43
  42. package/dist/access-operations.d.ts +17 -14
  43. package/dist/access-operations.js +56 -48
  44. package/dist/access-recall-concurrency.d.ts +16 -13
  45. package/dist/access-recall-concurrency.js +48 -40
  46. package/dist/access-recall-response.d.ts +16 -13
  47. package/dist/access-recall-response.js +48 -40
  48. package/dist/access-recall-surface.d.ts +16 -13
  49. package/dist/access-recall-surface.js +48 -40
  50. package/dist/access-schema.d.ts +5 -1
  51. package/dist/access-schema.js +3 -3
  52. package/dist/{access-service-Cisy5YDq.d.ts → access-service-DxTTTg9O.d.ts} +15 -11
  53. package/dist/access-service-helpers.d.ts +16 -13
  54. package/dist/access-service.d.ts +16 -13
  55. package/dist/access-service.js +48 -40
  56. package/dist/access-surface-catalog.d.ts +16 -13
  57. package/dist/access-surface-catalog.js +54 -42
  58. package/dist/access-surface-catalog.js.map +1 -1
  59. package/dist/access-wearables-meetings-surface.d.ts +5 -4
  60. package/dist/action-confidence.d.ts +2 -1
  61. package/dist/active-memory-bridge.d.ts +2 -1
  62. package/dist/active-recall.d.ts +2 -1
  63. package/dist/active-recall.js +9 -7
  64. package/dist/active-recall.js.map +1 -1
  65. package/dist/activity/digest.d.ts +2 -1
  66. package/dist/ambient-provenance.d.ts +2 -1
  67. package/dist/artifact-search.d.ts +2 -1
  68. package/dist/{auto-sync-7PGUFY7U.js → auto-sync-QZD4RD6H.js} +9 -5
  69. package/dist/{auto-sync-7PGUFY7U.js.map → auto-sync-QZD4RD6H.js.map} +1 -1
  70. package/dist/background-generation.d.ts +2 -1
  71. package/dist/behavior-learner.d.ts +2 -1
  72. package/dist/behavior-signals.d.ts +2 -1
  73. package/dist/bootstrap.d.ts +12 -11
  74. package/dist/briefing-window.d.ts +3 -2
  75. package/dist/briefing.d.ts +3 -2
  76. package/dist/briefing.js +13 -13
  77. package/dist/buffer-surprise-report.d.ts +2 -1
  78. package/dist/buffer-turn-helpers.d.ts +2 -1
  79. package/dist/buffer.d.ts +3 -2
  80. package/dist/buffer.js +7 -7
  81. package/dist/bulk-import/index.d.ts +4 -3
  82. package/dist/calibration.d.ts +2 -1
  83. package/dist/capabilities.d.ts +2 -1
  84. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  85. package/dist/{catalog-wcX1QhtQ.d.ts → catalog-Ya3DDn_T.d.ts} +1 -1
  86. package/dist/causal-behavior.d.ts +2 -1
  87. package/dist/causal-consolidation.d.ts +2 -1
  88. package/dist/causal-consolidation.js +14 -14
  89. package/dist/causal-trajectory-graph.d.ts +2 -1
  90. package/dist/{chunk-QVSRE355.js → chunk-2AV75BJW.js} +29 -1
  91. package/dist/chunk-2AV75BJW.js.map +1 -0
  92. package/dist/{chunk-563X6JJX.js → chunk-2HDLDBJW.js} +2 -2
  93. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  94. package/dist/{chunk-WBQ4ONQJ.js → chunk-2PIC6CEN.js} +2 -2
  95. package/dist/chunk-2WFOVXVJ.js +95 -0
  96. package/dist/chunk-2WFOVXVJ.js.map +1 -0
  97. package/dist/{chunk-54QPOE45.js → chunk-2YIUUXNK.js} +2 -2
  98. package/dist/{chunk-XRS65T4O.js → chunk-324HBGS4.js} +6 -6
  99. package/dist/chunk-324HBGS4.js.map +1 -0
  100. package/dist/{chunk-AKABVXFS.js → chunk-3254BYQV.js} +1 -1
  101. package/dist/{chunk-XCPNH2MG.js → chunk-3KJTSCSX.js} +5 -5
  102. package/dist/{chunk-I33QYUAF.js → chunk-3YQ7VLP3.js} +2 -2
  103. package/dist/{chunk-JMWUPUE6.js → chunk-46FVFU7S.js} +2 -2
  104. package/dist/{chunk-PFKIOYJH.js → chunk-4WMGRLTV.js} +7 -7
  105. package/dist/{chunk-KLUC2GSG.js → chunk-5AJZ7EUW.js} +5 -5
  106. package/dist/chunk-5KVT6G5U.js +31 -0
  107. package/dist/chunk-5KVT6G5U.js.map +1 -0
  108. package/dist/{chunk-WN2OXGGH.js → chunk-66YUOI53.js} +1 -1
  109. package/dist/chunk-66YUOI53.js.map +1 -0
  110. package/dist/{chunk-Z7NBT6AK.js → chunk-6EGIQEKC.js} +2 -2
  111. package/dist/{chunk-6MQMYXSQ.js → chunk-7F47R4H4.js} +2 -2
  112. package/dist/{chunk-YFXAWGMR.js → chunk-7L54ARML.js} +2 -2
  113. package/dist/{chunk-2EYZ32LH.js → chunk-7RGX7BMF.js} +24 -2
  114. package/dist/{chunk-2EYZ32LH.js.map → chunk-7RGX7BMF.js.map} +1 -1
  115. package/dist/{chunk-LVFI5LG7.js → chunk-A7GQBJP5.js} +7 -7
  116. package/dist/{chunk-EMSYMYXO.js → chunk-AKB44K3D.js} +8 -8
  117. package/dist/chunk-AS2NOPDM.js +30 -0
  118. package/dist/chunk-AS2NOPDM.js.map +1 -0
  119. package/dist/{chunk-3BLHPQHT.js → chunk-BPXJINHW.js} +5 -5
  120. package/dist/{chunk-D6PY63OM.js → chunk-BZDK5EOD.js} +2 -2
  121. package/dist/{chunk-2J3V5QEO.js → chunk-C3QXITIP.js} +4 -4
  122. package/dist/{chunk-PLJ2MQFT.js → chunk-C3YEB7CR.js} +7 -7
  123. package/dist/{chunk-DM5CU5J7.js → chunk-CRK6F6N3.js} +3 -2
  124. package/dist/chunk-CRK6F6N3.js.map +1 -0
  125. package/dist/{chunk-2ZG2LLZT.js → chunk-D7UUB33A.js} +2 -2
  126. package/dist/{chunk-E3I3NDUP.js → chunk-DABSYX7V.js} +7 -7
  127. package/dist/{chunk-KJLLPG26.js → chunk-DDGQDNQW.js} +2 -2
  128. package/dist/{chunk-K5D2XVNN.js → chunk-F2FJTOV6.js} +2 -2
  129. package/dist/{chunk-EAARGPWI.js → chunk-F3TURDFG.js} +3 -1
  130. package/dist/chunk-F3TURDFG.js.map +1 -0
  131. package/dist/{chunk-7ZLC4DTZ.js → chunk-F6PTJLEM.js} +1 -1
  132. package/dist/chunk-F6PTJLEM.js.map +1 -0
  133. package/dist/{chunk-P66QH6R6.js → chunk-GKKLI23D.js} +2 -2
  134. package/dist/{chunk-ICN37XHG.js → chunk-GMU7MAHS.js} +19 -19
  135. package/dist/{chunk-RQQO3ORQ.js → chunk-GR76OKET.js} +13 -4
  136. package/dist/{chunk-RQQO3ORQ.js.map → chunk-GR76OKET.js.map} +1 -1
  137. package/dist/{chunk-PQ42DJNG.js → chunk-H2N6SLTR.js} +2 -2
  138. package/dist/{chunk-ND7MAIJC.js → chunk-HKQAI6XI.js} +2 -2
  139. package/dist/{chunk-C3G6MW4W.js → chunk-IB7FDRRC.js} +2 -2
  140. package/dist/{chunk-WFMQN7JE.js → chunk-IWHNT35B.js} +3 -3
  141. package/dist/{chunk-W7UV2ZCA.js → chunk-JDL5BYYF.js} +3 -3
  142. package/dist/{chunk-N6XTC56E.js → chunk-JWBDHA4F.js} +15 -11
  143. package/dist/chunk-JWBDHA4F.js.map +1 -0
  144. package/dist/{chunk-5EQT62HH.js → chunk-KDLOKVX7.js} +2 -2
  145. package/dist/chunk-KIW3OOZE.js +39 -0
  146. package/dist/chunk-KIW3OOZE.js.map +1 -0
  147. package/dist/{chunk-GMH5QPUU.js → chunk-KOM36ILJ.js} +19 -15
  148. package/dist/chunk-KOM36ILJ.js.map +1 -0
  149. package/dist/{chunk-V62YYBBY.js → chunk-KORQWGUA.js} +2 -2
  150. package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
  151. package/dist/{chunk-WZIO3TW6.js → chunk-KY75VZKG.js} +2 -2
  152. package/dist/{chunk-4IGOLIWM.js → chunk-L63M2PE4.js} +2 -2
  153. package/dist/{chunk-PGGPRF6J.js → chunk-LD22AAJI.js} +2 -2
  154. package/dist/{chunk-NYWCFC3K.js → chunk-LT4H7SL5.js} +113 -59
  155. package/dist/chunk-LT4H7SL5.js.map +1 -0
  156. package/dist/{chunk-A4OIJYCV.js → chunk-LUAQHDUI.js} +2 -2
  157. package/dist/chunk-LVTT5AUG.js +79 -0
  158. package/dist/chunk-LVTT5AUG.js.map +1 -0
  159. package/dist/{chunk-S4MJTIPG.js → chunk-LXMZM7LM.js} +330 -78
  160. package/dist/chunk-LXMZM7LM.js.map +1 -0
  161. package/dist/{chunk-DIXZQTGY.js → chunk-M6FKXOYV.js} +2 -2
  162. package/dist/{chunk-Z535ADTC.js → chunk-M7H56FOQ.js} +2 -2
  163. package/dist/{chunk-JSD7Q7LD.js → chunk-MOL7JK4F.js} +2 -2
  164. package/dist/{chunk-I46BYY7U.js → chunk-NHFXGNGC.js} +92 -71
  165. package/dist/chunk-NHFXGNGC.js.map +1 -0
  166. package/dist/{chunk-ZX6NNFSY.js → chunk-OGAKUA7I.js} +2 -2
  167. package/dist/{chunk-KZJM7R4F.js → chunk-PF7LQ22G.js} +6 -6
  168. package/dist/{chunk-UZGHKD3T.js → chunk-PPDZSJXB.js} +2 -2
  169. package/dist/{chunk-AUSRUOMQ.js → chunk-PW4HTWXL.js} +2 -2
  170. package/dist/{chunk-LE2KZ72G.js → chunk-QCTXQ2HW.js} +2 -2
  171. package/dist/{chunk-I3H5LFOI.js → chunk-QNJQCLI6.js} +4 -4
  172. package/dist/{chunk-46RII65S.js → chunk-QUBPZQED.js} +2 -2
  173. package/dist/chunk-QZ4U67KO.js +98 -0
  174. package/dist/chunk-QZ4U67KO.js.map +1 -0
  175. package/dist/{chunk-E4LMQTST.js → chunk-R3H2AXO2.js} +2 -2
  176. package/dist/{chunk-XVDZFTN5.js → chunk-RFIJH2OE.js} +5 -5
  177. package/dist/{chunk-BTPCP535.js → chunk-RJ7Z7YXK.js} +5 -5
  178. package/dist/{chunk-TBXAY2SS.js → chunk-SGHGCFVV.js} +5 -5
  179. package/dist/{chunk-AIVRD66I.js → chunk-T3F2HWIG.js} +2 -2
  180. package/dist/chunk-TE6S7KDF.js +47 -0
  181. package/dist/chunk-TE6S7KDF.js.map +1 -0
  182. package/dist/{chunk-WPGA4RYI.js → chunk-UCLWIMVW.js} +2 -2
  183. package/dist/{chunk-6P4REYKL.js → chunk-UDAUULK2.js} +28 -2
  184. package/dist/{chunk-6P4REYKL.js.map → chunk-UDAUULK2.js.map} +1 -1
  185. package/dist/{chunk-V2EXYQEQ.js → chunk-VHANUT45.js} +7 -7
  186. package/dist/{chunk-AFJHNHAM.js → chunk-VJXMFBVR.js} +2 -2
  187. package/dist/{chunk-FGFC2EFR.js → chunk-VKDXYEA6.js} +3 -3
  188. package/dist/{chunk-Q62GA5U2.js → chunk-VW5TGNJN.js} +2 -2
  189. package/dist/{chunk-Q62GA5U2.js.map → chunk-VW5TGNJN.js.map} +1 -1
  190. package/dist/chunk-VYDGHJIN.js +17 -0
  191. package/dist/chunk-VYDGHJIN.js.map +1 -0
  192. package/dist/{chunk-GWNSKQDA.js → chunk-W44T2KHG.js} +3 -3
  193. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  194. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  195. package/dist/{chunk-MCMS4VUK.js → chunk-XIJHRQ4A.js} +14 -8
  196. package/dist/chunk-XIJHRQ4A.js.map +1 -0
  197. package/dist/{chunk-2HQPE2NM.js → chunk-XOCGC3FJ.js} +2 -2
  198. package/dist/chunk-YE4JBZO5.js +44 -0
  199. package/dist/chunk-YE4JBZO5.js.map +1 -0
  200. package/dist/{chunk-V2TOGJPM.js → chunk-YPB3Y57U.js} +14 -13
  201. package/dist/chunk-YPB3Y57U.js.map +1 -0
  202. package/dist/{chunk-ZZEIL3MI.js → chunk-YTV6J4T6.js} +2 -2
  203. package/dist/{chunk-ZZEIL3MI.js.map → chunk-YTV6J4T6.js.map} +1 -1
  204. package/dist/{chunk-IYIPXAIJ.js → chunk-ZBSP4BSN.js} +2 -2
  205. package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
  206. package/dist/{cli-CUlMlS2N.d.ts → cli-BfCl5kWD.d.ts} +5 -5
  207. package/dist/cli.d.ts +18 -15
  208. package/dist/cli.js +94 -84
  209. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  210. package/dist/coding/export-okf-codegraph.js +13 -13
  211. package/dist/coding/pre-action-gate.d.ts +2 -1
  212. package/dist/compounding/engine.d.ts +3 -2
  213. package/dist/compounding/engine.js +13 -13
  214. package/dist/compounding/preference-consolidator.d.ts +2 -1
  215. package/dist/compression-optimizer.d.ts +2 -1
  216. package/dist/config.d.ts +2 -1
  217. package/dist/config.js +9 -7
  218. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  219. package/dist/connectors/codex-materialize-runner.js +13 -13
  220. package/dist/connectors/codex-materialize.d.ts +2 -1
  221. package/dist/connectors/index.d.ts +2 -1
  222. package/dist/connectors/index.js +14 -14
  223. package/dist/consolidation-provenance-check.d.ts +3 -2
  224. package/dist/consolidation-undo.d.ts +3 -2
  225. package/dist/contradiction/index.d.ts +5 -4
  226. package/dist/contradiction/index.js +3 -3
  227. package/dist/converge-config.d.ts +2 -1
  228. package/dist/convergence-refresh.d.ts +3 -2
  229. package/dist/convergence-refresh.js +16 -16
  230. package/dist/conversation-index/backend.d.ts +2 -1
  231. package/dist/conversation-index/chunker.d.ts +2 -1
  232. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  233. package/dist/conversation-index/indexer.d.ts +2 -1
  234. package/dist/conversation-index/search.d.ts +2 -1
  235. package/dist/corpus-watermark.d.ts +2 -1
  236. package/dist/corpus-watermark.js +16 -16
  237. package/dist/cross-lingual-recall.d.ts +2 -1
  238. package/dist/day-summary.d.ts +2 -1
  239. package/dist/deep-recall-config.d.ts +11 -1
  240. package/dist/deep-recall-config.js +6 -3
  241. package/dist/deep-recall-http-glue.d.ts +16 -13
  242. package/dist/deep-recall-http-glue.js +5 -5
  243. package/dist/deep-recall-mcp-tools.d.ts +16 -13
  244. package/dist/deep-recall-policy-llm.d.ts +3 -2
  245. package/dist/deep-recall-seeds.d.ts +2 -1
  246. package/dist/delinearize.d.ts +2 -1
  247. package/dist/dependency-propagation-config.d.ts +2 -1
  248. package/dist/{dependency-propagation-delivery-BDDjImQn.d.ts → dependency-propagation-delivery-CggS9BFT.d.ts} +1 -1
  249. package/dist/direct-answer-wiring.d.ts +2 -1
  250. package/dist/direct-answer.d.ts +2 -1
  251. package/dist/embedding-fallback.d.ts +2 -1
  252. package/dist/enrichment/index.d.ts +2 -1
  253. package/dist/entity-origin-fields.d.ts +2 -1
  254. package/dist/entity-retrieval.d.ts +3 -2
  255. package/dist/entity-retrieval.js +13 -13
  256. package/dist/entity-schema.d.ts +2 -1
  257. package/dist/episodic-context.d.ts +2 -1
  258. package/dist/eval-trajectory-contracts.d.ts +2 -1
  259. package/dist/eval-trajectory-store.d.ts +2 -1
  260. package/dist/eval-trajectory.d.ts +2 -1
  261. package/dist/explicit-capture.d.ts +12 -11
  262. package/dist/explicit-capture.js +3 -3
  263. package/dist/external-wiki-access.d.ts +16 -13
  264. package/dist/external-wiki-access.js +49 -41
  265. package/dist/external-wiki-collection-registration.d.ts +2 -1
  266. package/dist/external-wiki-collection.d.ts +2 -1
  267. package/dist/external-wiki-mcp-tools.d.ts +16 -13
  268. package/dist/extraction-error-classification.d.ts +2 -1
  269. package/dist/extraction-faithfulness.d.ts +3 -2
  270. package/dist/extraction-judge-telemetry.d.ts +3 -2
  271. package/dist/extraction-judge-training.d.ts +3 -2
  272. package/dist/extraction-judge.d.ts +3 -2
  273. package/dist/extraction-liveness.d.ts +2 -1
  274. package/dist/extraction-normalization.d.ts +2 -1
  275. package/dist/extraction-prompt.d.ts +2 -1
  276. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  277. package/dist/extraction-source-grounding.d.ts +2 -1
  278. package/dist/extraction-span-config.d.ts +2 -1
  279. package/dist/extraction-span-materialize.d.ts +2 -1
  280. package/dist/extraction.d.ts +3 -2
  281. package/dist/extraction.js +21 -21
  282. package/dist/fallback-llm-codex-subscription.d.ts +2 -1
  283. package/dist/fallback-llm.d.ts +2 -1
  284. package/dist/{generic-recall-paths-CpDzNO_I.d.ts → generic-recall-paths-CoXPSnCw.d.ts} +1 -1
  285. package/dist/graph-append-error.d.ts +2 -1
  286. package/dist/graph-dashboard-diff.d.ts +2 -1
  287. package/dist/graph-dashboard-key.d.ts +2 -1
  288. package/dist/graph-dashboard-parser.d.ts +2 -1
  289. package/dist/graph-edge-reinforcement.d.ts +2 -1
  290. package/dist/graph-jsonl.d.ts +2 -1
  291. package/dist/graph-path-reconstruction.d.ts +2 -1
  292. package/dist/graph-path-scoring.d.ts +2 -1
  293. package/dist/graph-snapshot.d.ts +2 -1
  294. package/dist/graph.d.ts +2 -1
  295. package/dist/harmonic-retrieval.js +1 -1
  296. package/dist/importance.d.ts +2 -1
  297. package/dist/importers/index.d.ts +2 -1
  298. package/dist/importers/test-utils.d.ts +2 -1
  299. package/dist/in-flight-reads.d.ts +2 -1
  300. package/dist/{index-CtmmCJoo.d.ts → index-fdw_oK5a.d.ts} +3 -3
  301. package/dist/index.d.ts +28 -25
  302. package/dist/index.js +183 -162
  303. package/dist/intent.d.ts +2 -1
  304. package/dist/lcm/engine.d.ts +2 -1
  305. package/dist/lcm/engine.js +3 -3
  306. package/dist/lcm/index.d.ts +2 -1
  307. package/dist/lcm/index.js +11 -11
  308. package/dist/lcm/tools.d.ts +2 -1
  309. package/dist/lifecycle.d.ts +2 -1
  310. package/dist/live-connectors-runner.d.ts +2 -1
  311. package/dist/{local-llm-DpXIvm6F.d.ts → local-llm-3-jtw52a.d.ts} +1 -1
  312. package/dist/local-llm-helpers.d.ts +3 -2
  313. package/dist/local-llm.d.ts +3 -2
  314. package/dist/local-model-endpoint.d.ts +2 -1
  315. package/dist/location/index.d.ts +7 -209
  316. package/dist/location/index.js +68 -62
  317. package/dist/maintenance/memory-governance.d.ts +2 -1
  318. package/dist/maintenance/memory-governance.js +13 -13
  319. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  320. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  321. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  322. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  323. package/dist/{maintenance-CNgoLsoM.d.ts → maintenance-DgeeH0a1.d.ts} +3 -3
  324. package/dist/mcp-memory-inspector-app.d.ts +18 -15
  325. package/dist/mcp-read-only-tools.js +1 -1
  326. package/dist/memory-action-policy.d.ts +2 -1
  327. package/dist/memory-cache.d.ts +2 -1
  328. package/dist/memory-controller.d.ts +2 -1
  329. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  330. package/dist/memory-projection-store.d.ts +2 -1
  331. package/dist/memory-provenance.d.ts +2 -1
  332. package/dist/memory-snapshot.d.ts +2 -1
  333. package/dist/memory-subject-cli.d.ts +16 -13
  334. package/dist/memory-subject.d.ts +16 -13
  335. package/dist/memory-worth-outcomes.d.ts +3 -2
  336. package/dist/models-json.d.ts +2 -1
  337. package/dist/namespaces/migrate.d.ts +4 -3
  338. package/dist/namespaces/migrate.js +14 -14
  339. package/dist/namespaces/principal.d.ts +2 -1
  340. package/dist/namespaces/search.d.ts +2 -1
  341. package/dist/namespaces/search.js +4 -4
  342. package/dist/namespaces/storage.d.ts +4 -3
  343. package/dist/namespaces/storage.js +13 -13
  344. package/dist/native-knowledge.d.ts +2 -1
  345. package/dist/offline-sync-impression-drain.d.ts +2 -1
  346. package/dist/offline-sync-impression-drain.js +5 -5
  347. package/dist/operator-doctor-corpus.d.ts +2 -1
  348. package/dist/operator-doctor-corpus.js +17 -17
  349. package/dist/operator-doctor-replica.d.ts +2 -1
  350. package/dist/operator-toolkit.d.ts +4 -3
  351. package/dist/operator-toolkit.js +29 -28
  352. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  353. package/dist/orchestration/maintenance.d.ts +5 -4
  354. package/dist/orchestration/maintenance.js +26 -26
  355. package/dist/{orchestrator-DT7ybIFz.d.ts → orchestrator-VXWKdatm.d.ts} +12 -10
  356. package/dist/orchestrator.d.ts +12 -11
  357. package/dist/orchestrator.js +115 -105
  358. package/dist/patterns-cli.d.ts +2 -1
  359. package/dist/{pipeline-CgBEmHcz.d.ts → pipeline-CwXZBKR5.d.ts} +1 -1
  360. package/dist/policy-runtime.d.ts +2 -1
  361. package/dist/proactive-contention.d.ts +3 -2
  362. package/dist/provenance.d.ts +2 -1
  363. package/dist/{public-http-C8P8fyiO.d.ts → public-http-B55s59aR.d.ts} +1 -1
  364. package/dist/{qmd-BkY8KpCh.d.ts → qmd-DOLTPIQg.d.ts} +1 -1
  365. package/dist/qmd-preflight.d.ts +3 -2
  366. package/dist/qmd-recall-cache.d.ts +2 -1
  367. package/dist/qmd.d.ts +3 -2
  368. package/dist/recall-concurrency-config.d.ts +2 -1
  369. package/dist/recall-disclosure-escalation.d.ts +2 -1
  370. package/dist/recall-explain-renderer.d.ts +2 -1
  371. package/dist/recall-explain-renderer.js +3 -3
  372. package/dist/recall-memory-map.d.ts +2 -1
  373. package/dist/recall-navigate-access.d.ts +2 -1
  374. package/dist/recall-navigate-access.js +2 -2
  375. package/dist/recall-navigate-budget.js +3 -13
  376. package/dist/recall-navigate-budget.js.map +1 -1
  377. package/dist/recall-navigate-disclosure.d.ts +2 -1
  378. package/dist/recall-navigate-disclosure.js +4 -23
  379. package/dist/recall-navigate-disclosure.js.map +1 -1
  380. package/dist/recall-navigate-traverse.js +4 -37
  381. package/dist/recall-navigate-traverse.js.map +1 -1
  382. package/dist/recall-navigate-window.js +4 -26
  383. package/dist/recall-navigate-window.js.map +1 -1
  384. package/dist/recall-navigate.d.ts +2 -1
  385. package/dist/recall-navigate.js +2 -2
  386. package/dist/recall-navigation-config.d.ts +34 -0
  387. package/dist/recall-navigation-config.js +16 -0
  388. package/dist/recall-navigation-config.js.map +1 -0
  389. package/dist/recall-navigation-http-glue.d.ts +171 -0
  390. package/dist/recall-navigation-http-glue.js +9 -0
  391. package/dist/recall-navigation-http-glue.js.map +1 -0
  392. package/dist/recall-navigation-mcp-tools.d.ts +162 -0
  393. package/dist/recall-navigation-mcp-tools.js +8 -0
  394. package/dist/recall-navigation-mcp-tools.js.map +1 -0
  395. package/dist/recall-navigation-operations.d.ts +2 -0
  396. package/dist/recall-navigation-operations.js +245 -0
  397. package/dist/recall-navigation-operations.js.map +1 -0
  398. package/dist/recall-navigation-renderer.d.ts +36 -0
  399. package/dist/recall-navigation-renderer.js +8 -0
  400. package/dist/recall-navigation-renderer.js.map +1 -0
  401. package/dist/recall-navigation.d.ts +121 -0
  402. package/dist/recall-navigation.js +249 -0
  403. package/dist/recall-navigation.js.map +1 -0
  404. package/dist/recall-planner-llm.d.ts +2 -1
  405. package/dist/recall-state-view-admission.d.ts +3 -2
  406. package/dist/recall-state-view-admission.js +4 -4
  407. package/dist/recall-state-view-anchors.d.ts +2 -1
  408. package/dist/recall-state.d.ts +2 -1
  409. package/dist/recall-tag-filter.d.ts +2 -1
  410. package/dist/recall-timings.d.ts +2 -1
  411. package/dist/recall-xray-cli.d.ts +2 -1
  412. package/dist/recall-xray-cli.js +4 -4
  413. package/dist/recall-xray-renderer.d.ts +2 -1
  414. package/dist/recall-xray-renderer.js +3 -3
  415. package/dist/recall-xray.d.ts +3 -2
  416. package/dist/recall-xray.js +2 -2
  417. package/dist/reconcile/cursor.d.ts +2 -1
  418. package/dist/reconcile/manifest.d.ts +2 -1
  419. package/dist/reconcile/plan.d.ts +2 -1
  420. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  421. package/dist/replay/normalizers/claude.d.ts +2 -1
  422. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  423. package/dist/replay/normalizers/shared.d.ts +2 -1
  424. package/dist/replay/runner.d.ts +2 -1
  425. package/dist/replay/types.d.ts +2 -1
  426. package/dist/replica-divergence.d.ts +2 -1
  427. package/dist/replica-peers-config.d.ts +2 -1
  428. package/dist/resolution-LXFQQ4AE.js +3 -3
  429. package/dist/resolve-auth-token.d.ts +2 -1
  430. package/dist/resume-bundles.js +10 -8
  431. package/dist/retrieval-agents.d.ts +3 -2
  432. package/dist/retrieval-tiers.d.ts +2 -1
  433. package/dist/routing/engine.d.ts +2 -1
  434. package/dist/routing/store.d.ts +2 -1
  435. package/dist/salvage-envelope.d.ts +2 -1
  436. package/dist/schemas.d.ts +2 -2
  437. package/dist/{scope-profiles-BBPjZ9jb.d.ts → scope-profiles-C564-hrv.d.ts} +1 -1
  438. package/dist/search/embed-helper.d.ts +2 -1
  439. package/dist/search/factory.d.ts +2 -1
  440. package/dist/search/factory.js +3 -3
  441. package/dist/search/index.d.ts +2 -1
  442. package/dist/search/index.js +7 -7
  443. package/dist/search/lancedb-backend.d.ts +2 -1
  444. package/dist/search/meilisearch-backend.d.ts +2 -1
  445. package/dist/search/noop-backend.d.ts +2 -1
  446. package/dist/search/orama-backend.d.ts +2 -1
  447. package/dist/search/port.d.ts +2 -1
  448. package/dist/search/remote-backend.d.ts +2 -1
  449. package/dist/{semantic-consolidation-BPFFVO84.d.ts → semantic-consolidation-g6x-ShY8.d.ts} +1 -1
  450. package/dist/semantic-consolidation.d.ts +3 -2
  451. package/dist/semantic-consolidation.js +14 -14
  452. package/dist/semantic-rule-promotion.js +13 -13
  453. package/dist/semantic-rule-verifier.d.ts +2 -1
  454. package/dist/semantic-rule-verifier.js +13 -13
  455. package/dist/{service-jKcr6Jvr.d.ts → service-CaCOk0rd.d.ts} +13 -2
  456. package/dist/session-observer-bands.d.ts +2 -1
  457. package/dist/session-observer-state.d.ts +2 -1
  458. package/dist/shared-context/manager.d.ts +2 -1
  459. package/dist/signal.d.ts +2 -1
  460. package/dist/source-agent-qualifier.d.ts +2 -1
  461. package/dist/source-agent-qualifier.js +20 -20
  462. package/dist/standup/build.js +14 -14
  463. package/dist/{storage-C-0Ah5OY.d.ts → storage-C9nsZX5Q.d.ts} +1 -1
  464. package/dist/storage.d.ts +3 -2
  465. package/dist/storage.js +12 -12
  466. package/dist/subject-config.d.ts +2 -1
  467. package/dist/subject-config.js +2 -2
  468. package/dist/summarizer.d.ts +2 -1
  469. package/dist/summary-snapshot.d.ts +2 -1
  470. package/dist/support-passport/index.d.ts +19 -16
  471. package/dist/support-passport/index.js +51 -43
  472. package/dist/tagging-BA4RFdH3.d.ts +240 -0
  473. package/dist/temporal-supersession.d.ts +3 -2
  474. package/dist/temporal-timeline-recall.d.ts +2 -1
  475. package/dist/temporal-validity.d.ts +2 -1
  476. package/dist/threading.d.ts +2 -1
  477. package/dist/tier-migration.d.ts +3 -2
  478. package/dist/tier-routing.d.ts +2 -1
  479. package/dist/topics.d.ts +2 -1
  480. package/dist/transcript.d.ts +2 -1
  481. package/dist/transfer/backup.js +2 -2
  482. package/dist/transfer/capsule-export.js +2 -2
  483. package/dist/transfer/capsule-import.js +2 -2
  484. package/dist/transfer/export-okf.d.ts +2 -1
  485. package/dist/transfer/export-okf.js +13 -13
  486. package/dist/trust-score-stage.d.ts +2 -1
  487. package/dist/trust-score.d.ts +2 -1
  488. package/dist/{types-cK5LydjL.d.ts → types-Sps-lg5I.d.ts} +3 -2
  489. package/dist/types.d.ts +2 -1
  490. package/dist/types.js +1 -1
  491. package/dist/utility-runtime.d.ts +2 -1
  492. package/dist/verified-recall.js +13 -13
  493. package/dist/who-knows-cli.d.ts +16 -13
  494. package/dist/who-knows-cli.js +14 -14
  495. package/dist/who-knows.d.ts +16 -13
  496. package/dist/who-knows.js +13 -13
  497. package/dist/write-envelope.d.ts +2 -1
  498. package/package.json +2 -2
  499. package/src/access-boundary.ts +2 -0
  500. package/src/access-http.test.ts +1 -0
  501. package/src/access-http.ts +3 -3
  502. package/src/access-mcp-output-schemas.ts +30 -0
  503. package/src/access-mcp.ts +6 -9
  504. package/src/access-observe-write-category.ts +1 -0
  505. package/src/access-observe-write-surface.ts +3 -3
  506. package/src/access-operations-batch.ts +2 -2
  507. package/src/access-operations.ts +2 -0
  508. package/src/access-schema.ts +1 -0
  509. package/src/access-service.ts +17 -28
  510. package/src/access-surface-catalog.test.ts +30 -2
  511. package/src/access-surface-catalog.ts +4 -0
  512. package/src/cli/recall-navigation-commands.ts +85 -0
  513. package/src/cli.ts +2 -2
  514. package/src/config.ts +4 -0
  515. package/src/deep-recall-config.ts +32 -0
  516. package/src/index.ts +1 -2
  517. package/src/location/phase5-wiring.test.ts +408 -0
  518. package/src/location/tagging.ts +58 -0
  519. package/src/mcp-read-only-tools.ts +2 -0
  520. package/src/orchestration/orchestrator-helpers.ts +2 -0
  521. package/src/orchestration/recall-internal.ts +4 -4
  522. package/src/orchestration/workspace-ops.ts +14 -0
  523. package/src/recall-navigation-config.test.ts +56 -0
  524. package/src/recall-navigation-config.ts +107 -0
  525. package/src/recall-navigation-http-glue.ts +141 -0
  526. package/src/recall-navigation-mcp-tools.ts +60 -0
  527. package/src/recall-navigation-operations.ts +111 -0
  528. package/src/recall-navigation-renderer.ts +49 -0
  529. package/src/recall-navigation-surface.test.ts +474 -0
  530. package/src/recall-navigation.test.ts +405 -0
  531. package/src/recall-navigation.ts +429 -0
  532. package/src/recall-xray.ts +1 -1
  533. package/src/types.ts +2 -0
  534. package/src/wearables/pipeline.ts +19 -0
  535. package/src/wearables/service.ts +8 -0
  536. package/dist/chunk-7ZLC4DTZ.js.map +0 -1
  537. package/dist/chunk-DM5CU5J7.js.map +0 -1
  538. package/dist/chunk-EAARGPWI.js.map +0 -1
  539. package/dist/chunk-GMH5QPUU.js.map +0 -1
  540. package/dist/chunk-I46BYY7U.js.map +0 -1
  541. package/dist/chunk-MCMS4VUK.js.map +0 -1
  542. package/dist/chunk-N6XTC56E.js.map +0 -1
  543. package/dist/chunk-NYWCFC3K.js.map +0 -1
  544. package/dist/chunk-QVSRE355.js.map +0 -1
  545. package/dist/chunk-S4MJTIPG.js.map +0 -1
  546. package/dist/chunk-V2TOGJPM.js.map +0 -1
  547. package/dist/chunk-WN2OXGGH.js.map +0 -1
  548. package/dist/chunk-XRS65T4O.js.map +0 -1
  549. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  550. /package/dist/{chunk-563X6JJX.js.map → chunk-2HDLDBJW.js.map} +0 -0
  551. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  552. /package/dist/{chunk-WBQ4ONQJ.js.map → chunk-2PIC6CEN.js.map} +0 -0
  553. /package/dist/{chunk-54QPOE45.js.map → chunk-2YIUUXNK.js.map} +0 -0
  554. /package/dist/{chunk-AKABVXFS.js.map → chunk-3254BYQV.js.map} +0 -0
  555. /package/dist/{chunk-XCPNH2MG.js.map → chunk-3KJTSCSX.js.map} +0 -0
  556. /package/dist/{chunk-I33QYUAF.js.map → chunk-3YQ7VLP3.js.map} +0 -0
  557. /package/dist/{chunk-JMWUPUE6.js.map → chunk-46FVFU7S.js.map} +0 -0
  558. /package/dist/{chunk-PFKIOYJH.js.map → chunk-4WMGRLTV.js.map} +0 -0
  559. /package/dist/{chunk-KLUC2GSG.js.map → chunk-5AJZ7EUW.js.map} +0 -0
  560. /package/dist/{chunk-Z7NBT6AK.js.map → chunk-6EGIQEKC.js.map} +0 -0
  561. /package/dist/{chunk-6MQMYXSQ.js.map → chunk-7F47R4H4.js.map} +0 -0
  562. /package/dist/{chunk-YFXAWGMR.js.map → chunk-7L54ARML.js.map} +0 -0
  563. /package/dist/{chunk-LVFI5LG7.js.map → chunk-A7GQBJP5.js.map} +0 -0
  564. /package/dist/{chunk-EMSYMYXO.js.map → chunk-AKB44K3D.js.map} +0 -0
  565. /package/dist/{chunk-3BLHPQHT.js.map → chunk-BPXJINHW.js.map} +0 -0
  566. /package/dist/{chunk-D6PY63OM.js.map → chunk-BZDK5EOD.js.map} +0 -0
  567. /package/dist/{chunk-2J3V5QEO.js.map → chunk-C3QXITIP.js.map} +0 -0
  568. /package/dist/{chunk-PLJ2MQFT.js.map → chunk-C3YEB7CR.js.map} +0 -0
  569. /package/dist/{chunk-2ZG2LLZT.js.map → chunk-D7UUB33A.js.map} +0 -0
  570. /package/dist/{chunk-E3I3NDUP.js.map → chunk-DABSYX7V.js.map} +0 -0
  571. /package/dist/{chunk-KJLLPG26.js.map → chunk-DDGQDNQW.js.map} +0 -0
  572. /package/dist/{chunk-K5D2XVNN.js.map → chunk-F2FJTOV6.js.map} +0 -0
  573. /package/dist/{chunk-P66QH6R6.js.map → chunk-GKKLI23D.js.map} +0 -0
  574. /package/dist/{chunk-ICN37XHG.js.map → chunk-GMU7MAHS.js.map} +0 -0
  575. /package/dist/{chunk-PQ42DJNG.js.map → chunk-H2N6SLTR.js.map} +0 -0
  576. /package/dist/{chunk-ND7MAIJC.js.map → chunk-HKQAI6XI.js.map} +0 -0
  577. /package/dist/{chunk-C3G6MW4W.js.map → chunk-IB7FDRRC.js.map} +0 -0
  578. /package/dist/{chunk-WFMQN7JE.js.map → chunk-IWHNT35B.js.map} +0 -0
  579. /package/dist/{chunk-W7UV2ZCA.js.map → chunk-JDL5BYYF.js.map} +0 -0
  580. /package/dist/{chunk-5EQT62HH.js.map → chunk-KDLOKVX7.js.map} +0 -0
  581. /package/dist/{chunk-V62YYBBY.js.map → chunk-KORQWGUA.js.map} +0 -0
  582. /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
  583. /package/dist/{chunk-WZIO3TW6.js.map → chunk-KY75VZKG.js.map} +0 -0
  584. /package/dist/{chunk-4IGOLIWM.js.map → chunk-L63M2PE4.js.map} +0 -0
  585. /package/dist/{chunk-PGGPRF6J.js.map → chunk-LD22AAJI.js.map} +0 -0
  586. /package/dist/{chunk-A4OIJYCV.js.map → chunk-LUAQHDUI.js.map} +0 -0
  587. /package/dist/{chunk-DIXZQTGY.js.map → chunk-M6FKXOYV.js.map} +0 -0
  588. /package/dist/{chunk-Z535ADTC.js.map → chunk-M7H56FOQ.js.map} +0 -0
  589. /package/dist/{chunk-JSD7Q7LD.js.map → chunk-MOL7JK4F.js.map} +0 -0
  590. /package/dist/{chunk-ZX6NNFSY.js.map → chunk-OGAKUA7I.js.map} +0 -0
  591. /package/dist/{chunk-KZJM7R4F.js.map → chunk-PF7LQ22G.js.map} +0 -0
  592. /package/dist/{chunk-UZGHKD3T.js.map → chunk-PPDZSJXB.js.map} +0 -0
  593. /package/dist/{chunk-AUSRUOMQ.js.map → chunk-PW4HTWXL.js.map} +0 -0
  594. /package/dist/{chunk-LE2KZ72G.js.map → chunk-QCTXQ2HW.js.map} +0 -0
  595. /package/dist/{chunk-I3H5LFOI.js.map → chunk-QNJQCLI6.js.map} +0 -0
  596. /package/dist/{chunk-46RII65S.js.map → chunk-QUBPZQED.js.map} +0 -0
  597. /package/dist/{chunk-E4LMQTST.js.map → chunk-R3H2AXO2.js.map} +0 -0
  598. /package/dist/{chunk-XVDZFTN5.js.map → chunk-RFIJH2OE.js.map} +0 -0
  599. /package/dist/{chunk-BTPCP535.js.map → chunk-RJ7Z7YXK.js.map} +0 -0
  600. /package/dist/{chunk-TBXAY2SS.js.map → chunk-SGHGCFVV.js.map} +0 -0
  601. /package/dist/{chunk-AIVRD66I.js.map → chunk-T3F2HWIG.js.map} +0 -0
  602. /package/dist/{chunk-WPGA4RYI.js.map → chunk-UCLWIMVW.js.map} +0 -0
  603. /package/dist/{chunk-V2EXYQEQ.js.map → chunk-VHANUT45.js.map} +0 -0
  604. /package/dist/{chunk-AFJHNHAM.js.map → chunk-VJXMFBVR.js.map} +0 -0
  605. /package/dist/{chunk-FGFC2EFR.js.map → chunk-VKDXYEA6.js.map} +0 -0
  606. /package/dist/{chunk-GWNSKQDA.js.map → chunk-W44T2KHG.js.map} +0 -0
  607. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  608. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  609. /package/dist/{chunk-2HQPE2NM.js.map → chunk-XOCGC3FJ.js.map} +0 -0
  610. /package/dist/{chunk-IYIPXAIJ.js.map → chunk-ZBSP4BSN.js.map} +0 -0
  611. /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Recall-navigation command group (issue #1956) — extracted from cli.ts so
3
+ * the surface file stays at its structural ceiling (same seam as
4
+ * deep-recall-commands.ts). `remnic navigate expand|traverse <memoryId>`
5
+ * runs through EngramAccessService.recallNavigate — the same single
6
+ * implementation MCP and HTTP call, sharing one renderer.
7
+ */
8
+
9
+ import type { Orchestrator } from "../orchestrator.js";
10
+ import type { CliCommand } from "../cli.js";
11
+ import { EngramAccessService } from "../access-service.js";
12
+
13
+ function parseLimit(raw: unknown): number | undefined {
14
+ if (raw === undefined || raw === null) return undefined;
15
+ const value = typeof raw === "string" ? Number(raw) : raw;
16
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 1) {
17
+ throw new Error(`--limit must be a positive integer; got ${JSON.stringify(raw)}`);
18
+ }
19
+ return value;
20
+ }
21
+
22
+ export function registerRecallNavigationCommands(cmd: CliCommand, orchestrator: Orchestrator): void {
23
+ const run = async (args: unknown[], action: "expand" | "traverse") => {
24
+ const memoryId = String(args[0] ?? "");
25
+ const options = (args[args.length - 1] ?? {}) as Record<string, unknown>;
26
+ const sessionKey = typeof options.sessionKey === "string" ? options.sessionKey : "";
27
+ if (memoryId.length === 0 || sessionKey.length === 0) {
28
+ console.error("usage: navigate <expand|traverse> <memoryId> --session-key <key> [--namespace <ns>]");
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ let limit: number | undefined;
33
+ try {
34
+ limit = action === "traverse" ? parseLimit(options.limit) : undefined;
35
+ } catch (err) {
36
+ console.error(err instanceof Error ? err.message : String(err));
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ const service = new EngramAccessService(orchestrator);
41
+ try {
42
+ const result = await service.recallNavigate({
43
+ action,
44
+ memoryId,
45
+ sessionKey,
46
+ ...(action === "expand" && typeof options.disclosure === "string"
47
+ ? { disclosure: options.disclosure as "chunk" | "section" | "raw" }
48
+ : {}),
49
+ ...(action === "traverse" && typeof options.relation === "string" ? { relation: options.relation } : {}),
50
+ ...(limit !== undefined ? { limit } : {}),
51
+ ...(typeof options.namespace === "string" && options.namespace.length > 0
52
+ ? { namespace: options.namespace }
53
+ : {}),
54
+ });
55
+ if (options.json === true) {
56
+ console.log(JSON.stringify(result, null, 2));
57
+ } else {
58
+ console.log(result.rendered);
59
+ }
60
+ if (!result.ok) process.exitCode = 1;
61
+ } catch (err) {
62
+ console.error(err instanceof Error ? err.message : String(err));
63
+ process.exitCode = 1;
64
+ }
65
+ };
66
+
67
+ cmd
68
+ .command("navigate expand <memoryId>")
69
+ .description("Re-render a served memory at deeper disclosure (issue #1956)")
70
+ .option("--session-key <key>", "Session key whose recent recalls authorize the id (required)")
71
+ .option("--disclosure <level>", "Target depth: section or raw (default raw)")
72
+ .option("--namespace <ns>", "Namespace to scope the read to")
73
+ .option("--json", "JSON output (items + budget + disclosure spend)")
74
+ .action(async (...args: unknown[]) => run(args, "expand"));
75
+
76
+ cmd
77
+ .command("navigate traverse <memoryId>")
78
+ .description("Follow typed links from a served memory; neighbors as chunk summaries (issue #1956)")
79
+ .option("--session-key <key>", "Session key whose recent recalls authorize the id (required)")
80
+ .option("--relation <type>", "Optional relation filter (supports, contradicts, elaborates, ...)")
81
+ .option("--limit <n>", "Optional cap on returned neighbors")
82
+ .option("--namespace <ns>", "Namespace to scope the read to")
83
+ .option("--json", "JSON output (items + budget + disclosure spend)")
84
+ .action(async (...args: unknown[]) => run(args, "traverse"));
85
+ }
package/src/cli.ts CHANGED
@@ -14,7 +14,7 @@ import { bumpMemoryCorpusVersionForDir } from "./memory-corpus-version.js";
14
14
  import { utcDayRange } from "./transcript.js";
15
15
  import { padEndDisplay, truncateGraphemeSafe } from "./whitespace.js";
16
16
  import { runWearablesCliCommand } from "./wearables/cli.js";
17
- import { registerMeetingsCommands } from "./cli/meetings-commands.js"; import { registerDeepRecallCommands } from "./cli/deep-recall-commands.js";
17
+ import { registerMeetingsCommands } from "./cli/meetings-commands.js"; import { registerDeepRecallCommands } from "./cli/deep-recall-commands.js"; import { registerRecallNavigationCommands } from "./cli/recall-navigation-commands.js";
18
18
  import { registerExportOkfCommand, registerOkfCommands } from "./cli/okf-commands.js";
19
19
  import { registerSkillsCommands } from "./cli/skills-commands.js";
20
20
  import { registerResearchStatusCommands } from "./cli/research-status-commands.js";
@@ -6230,7 +6230,7 @@ export function registerCli(
6230
6230
 
6231
6231
  registerResearchStatusCommands(cmd, orchestrator);
6232
6232
 
6233
- registerCreationLedgerCommands(cmd, orchestrator); registerMeetingsCommands(cmd, orchestrator); registerOkfCommands(cmd, orchestrator); registerDeepRecallCommands(cmd, orchestrator); registerTimelineCommands(cmd, orchestrator);
6233
+ registerCreationLedgerCommands(cmd, orchestrator); registerMeetingsCommands(cmd, orchestrator); registerOkfCommands(cmd, orchestrator); registerDeepRecallCommands(cmd, orchestrator); registerTimelineCommands(cmd, orchestrator); registerRecallNavigationCommands(cmd, orchestrator);
6234
6234
 
6235
6235
  cmd
6236
6236
  .command("trust-zone-promote")
package/src/config.ts CHANGED
@@ -50,6 +50,7 @@ import { parseActiveContextFields } from "./active-context-config.js";
50
50
  import { parseSkillProjectionConfig } from "./procedural/skill-projection.js";
51
51
  import { parseDriftDetectionConfig } from "./preferences/drift-config.js";
52
52
  import { parseDeepRecallConfig } from "./deep-recall-config.js";
53
+ import { parseRecallNavigationConfig } from "./recall-navigation-config.js";
53
54
  import { parseContradictionLocalizationConfig, parseContradictionScanConfig } from "./contradiction-config.js";
54
55
  import { parseGraphPathScoringConfig } from "./graph-path-scoring-config.js";
55
56
  import { parseWritePathDedupConfig } from "./dedup/novelty-gate.js";
@@ -630,6 +631,7 @@ const MEMORY_OS_PRESETS: Record<MemoryOsPresetName, Record<string, unknown>> = {
630
631
  // memory on a conservative preset must set `procedural.enabled: true`
631
632
  // explicitly.
632
633
  procedural: { enabled: false },
634
+ recallNavigation: { enabled: false },
633
635
  },
634
636
  balanced: {
635
637
  maxMemoryTokens: 2000,
@@ -1820,6 +1822,8 @@ export function parseConfig(
1820
1822
  driftDetection: parseDriftDetectionConfig(cfg.driftDetection),
1821
1823
  // Budgeted deep-recall surface (issue #2332)
1822
1824
  deepRecall: parseDeepRecallConfig(cfg.deepRecall),
1825
+ // Session-scoped recall navigation (issue #1956)
1826
+ recallNavigation: parseRecallNavigationConfig(cfg.recallNavigation),
1823
1827
  dependencyPropagation: parseDependencyPropagationConfig(cfg),
1824
1828
  // Temporal Supersession (issue #375)
1825
1829
  temporalSupersessionEnabled: cfg.temporalSupersessionEnabled !== false, // On by default
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { coerceBool, coerceNumber } from "./connectors/coerce.js";
14
+ import { EngramAccessInputError } from "./access-errors.js";
14
15
 
15
16
  export interface DeepRecallConfig {
16
17
  /** Master switch for the deep-recall surface. Default false. */
@@ -113,3 +114,34 @@ export function parseDeepRecallMaxSteps(raw: unknown): number | undefined {
113
114
  }
114
115
  throw new Error(`maxSteps must be a non-negative integer; got ${JSON.stringify(raw)}`);
115
116
  }
117
+
118
+ /**
119
+ * Resolve the effective per-invocation config from a caller-requested
120
+ * `maxSteps` override (§33 semantics, extracted from the access service so
121
+ * the god file stays under its ratchet cap):
122
+ * - undefined request keeps the parsed config untouched;
123
+ * - `deepRecall.maxSteps: 0` is a documented disable value — any positive
124
+ * override is a refusal, not a ceiling comparison;
125
+ * - otherwise the override must not exceed the configured ceiling.
126
+ */
127
+ export function resolveEffectiveDeepRecallConfig(
128
+ cfg: DeepRecallConfig,
129
+ requestedSteps: number | undefined,
130
+ ): DeepRecallConfig {
131
+ if (requestedSteps === undefined) return cfg;
132
+ if (typeof requestedSteps !== "number" || !Number.isInteger(requestedSteps) || requestedSteps < 0) {
133
+ throw new EngramAccessInputError("deepRecall: maxSteps must be a non-negative integer");
134
+ }
135
+ if (cfg.maxSteps <= 0) {
136
+ if (requestedSteps > 0) {
137
+ throw new EngramAccessInputError(
138
+ "deepRecall: the policy loop is disabled (deepRecall.maxSteps=0); maxSteps must be 0"
139
+ );
140
+ }
141
+ } else if (requestedSteps > cfg.maxSteps) {
142
+ throw new EngramAccessInputError(
143
+ `deepRecall: maxSteps ${requestedSteps} exceeds the configured ceiling ${cfg.maxSteps}`
144
+ );
145
+ }
146
+ return { ...cfg, maxSteps: requestedSteps };
147
+ }
package/src/index.ts CHANGED
@@ -1451,5 +1451,4 @@ export * from "./maintenance/atomic-file.js";
1451
1451
  // Privacy-safe action-to-outcome trajectory eval (issue #2345)
1452
1452
  export * from "./eval-trajectory.js";
1453
1453
  export { MemoryControllerCoordinator, chooseAction, computeEvidenceReportHash, controllerConfigHash, evaluateActiveGates, hashControllerState, verifyEvidenceReport } from "./memory-controller.js";
1454
- export type { ActiveContextAdapter, ActiveContextMessage, ActiveContextPlan, MemoryControllerActionFamily, MemoryControllerChoice, MemoryControllerConfig, MemoryControllerDeps, MemoryControllerEvent, MemoryControllerEvidence, MemoryControllerEvidenceReport, MemoryControllerExecutors, MemoryControllerMode, MemoryControllerPairedSeedEvidence, MemoryControllerReceipt, MemoryControllerRecorder, MemoryControllerReportReader, MemoryControllerRunResult, MemoryControllerState } from "./memory-controller.js";
1455
- export * from "./recall-navigate.js";
1454
+ export type { ActiveContextAdapter, ActiveContextMessage, ActiveContextPlan, MemoryControllerActionFamily, MemoryControllerChoice, MemoryControllerConfig, MemoryControllerDeps, MemoryControllerEvent, MemoryControllerEvidence, MemoryControllerEvidenceReport, MemoryControllerExecutors, MemoryControllerMode, MemoryControllerPairedSeedEvidence, MemoryControllerReceipt, MemoryControllerRecorder, MemoryControllerReportReader, MemoryControllerRunResult, MemoryControllerState } from "./memory-controller.js"; export * from "./recall-navigate.js"; export * from "./recall-navigation.js"; export * from "./recall-navigation-config.js";
@@ -0,0 +1,408 @@
1
+ /**
2
+ * Phase-5 wiring regression (issue #2925): the existing location subsystem
3
+ * feeding wearables, day summaries, and briefings — conservatively.
4
+ *
5
+ * Pins the contract the umbrella issue (#2043) requires:
6
+ * - wearable location fill is missing-only and never overwrites a
7
+ * source-provided value;
8
+ * - conflicting / below-threshold overlaps stay untagged;
9
+ * - absent, disabled, or unrequested location changes NOTHING (the
10
+ * stored transcript body and gathered day summary are byte-identical);
11
+ * - day summaries and briefings expose place names only behind the
12
+ * explicit includeLocation request flag plus both location gates;
13
+ * - labels only — coordinates never reach any phase-5 output.
14
+ */
15
+
16
+ import assert from "node:assert/strict";
17
+ import { mkdtempSync, rmSync } from "node:fs";
18
+ import { tmpdir } from "node:os";
19
+ import * as path from "node:path";
20
+ import { test } from "node:test";
21
+
22
+ import { StorageManager } from "../storage.js";
23
+ import { WorkspaceOpsCoordinator, type WorkspaceOpsDeps } from "../orchestration/workspace-ops.js";
24
+ import type { PluginConfig } from "../types.js";
25
+ import type {
26
+ WearableConversation,
27
+ WearableSourceConnector,
28
+ WearableSourceSettings,
29
+ WearablesConfig,
30
+ } from "../wearables/types.js";
31
+ import { defaultWearableSourceSettings, defaultWearablesConfig } from "../wearables/config.js";
32
+ import { parseDayTranscript } from "../wearables/day-store.js";
33
+ import { syncWearableSource, type WearableSyncDeps } from "../wearables/pipeline.js";
34
+ import { parseLocationConfig } from "./config.js";
35
+ import { saveLocationSyncState } from "./store.js";
36
+ import type { LocationConfig, LocationSegment } from "./types.js";
37
+ import { briefingLocationSection } from "./tagging.js";
38
+
39
+ const NOW = new Date("2026-06-11T03:00:00.000Z");
40
+
41
+ function locationConfig(overrides: Record<string, unknown> = {}): LocationConfig {
42
+ return parseLocationConfig({
43
+ enabled: true,
44
+ timezone: "UTC",
45
+ sources: [{ id: "reitti" }],
46
+ tagging: { enabled: true },
47
+ ...overrides,
48
+ });
49
+ }
50
+
51
+ function segment(
52
+ startUtc: string,
53
+ endUtc: string,
54
+ label: string,
55
+ kind: LocationSegment["place"]["kind"] = "poi",
56
+ ): LocationSegment {
57
+ return {
58
+ startUtc,
59
+ endUtc,
60
+ place: {
61
+ id: `reitti:place:${label.toLowerCase().replace(/\s+/g, "-")}`,
62
+ label,
63
+ kind,
64
+ latitude: 60.1699,
65
+ longitude: 24.9384,
66
+ },
67
+ confidence: 0.9,
68
+ };
69
+ }
70
+
71
+ async function seedLocationDays(memoryDir: string, days: Record<string, LocationSegment[]>) {
72
+ await saveLocationSyncState(memoryDir, {
73
+ version: 1,
74
+ sources: {
75
+ reitti: {
76
+ days: Object.fromEntries(
77
+ Object.entries(days).map(([date, segments]) => [
78
+ date,
79
+ { observationCount: segments.length, segments },
80
+ ]),
81
+ ),
82
+ },
83
+ },
84
+ });
85
+ }
86
+ function wearableSettings(): WearableSourceSettings {
87
+ return { ...defaultWearableSourceSettings(), enabled: true };
88
+ }
89
+
90
+ function wearablesConfig(timezone = "UTC"): WearablesConfig {
91
+ return {
92
+ ...defaultWearablesConfig(),
93
+ enabled: true,
94
+ timezone,
95
+ digestEnabled: false,
96
+ offTheRecordEnabled: false,
97
+ };
98
+ }
99
+
100
+ function conversation(
101
+ id: string,
102
+ startIso: string,
103
+ endIso: string,
104
+ overrides: Partial<WearableConversation> = {},
105
+ ): WearableConversation {
106
+ return {
107
+ id,
108
+ source: "testsource",
109
+ title: `Conversation ${id}`,
110
+ startIso,
111
+ endIso,
112
+ segments: [{ speakerKey: "user", speakerName: "user", isWearer: true, text: "Synthetic wearable text." }],
113
+ ...overrides,
114
+ };
115
+ }
116
+
117
+ function fakeConnector(byDate: Record<string, WearableConversation[]>): WearableSourceConnector {
118
+ return {
119
+ id: "testsource",
120
+ displayName: "Test Source",
121
+ async verifyAuth() {
122
+ return { ok: true };
123
+ },
124
+ async fetchConversations(opts: { date: string }) {
125
+ return { conversations: byDate[opts.date] ?? [], nextCursor: null };
126
+ },
127
+ };
128
+ }
129
+
130
+ function makeSyncDeps(
131
+ memoryDir: string,
132
+ now: Date,
133
+ locationConfigValue?: LocationConfig,
134
+ ): { deps: WearableSyncDeps; written: Array<{ source: string; date: string; serialized: string }> } {
135
+ const written: Array<{ source: string; date: string; serialized: string }> = [];
136
+ const deps: WearableSyncDeps = {
137
+ memoryDir,
138
+ async readDayContentHash() {
139
+ return null;
140
+ },
141
+ writeDayTranscript(source, date, serialized) {
142
+ written.push({ source, date, serialized });
143
+ return Promise.resolve();
144
+ },
145
+ memoryGen: null,
146
+ now: () => now,
147
+ ...(locationConfigValue !== undefined ? { locationConfig: locationConfigValue } : {}),
148
+ };
149
+ return { deps, written };
150
+ }
151
+
152
+ function bodyOf(serialized: string): string {
153
+ const parsed = parseDayTranscript(serialized);
154
+ assert.ok(parsed, "day transcript parses");
155
+ return parsed.body;
156
+ }
157
+
158
+ // ── Wearable fill ───────────────────────────────────────────────────────────
159
+
160
+ test("wearable sync fills only missing conversation locations from a dominant overlap", async () => {
161
+ const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-phase5-fill-"));
162
+ try {
163
+ await seedLocationDays(memoryDir, {
164
+ "2026-06-11": [segment("2026-06-11T14:30:00.000Z", "2026-06-11T16:00:00.000Z", "Coffee shop")],
165
+ });
166
+ const { deps, written } = makeSyncDeps(memoryDir, NOW, locationConfig());
167
+ const connector = fakeConnector({
168
+ "2026-06-11": [
169
+ conversation("c-missing", "2026-06-11T15:00:00.000Z", "2026-06-11T15:30:00.000Z"),
170
+ conversation("c-source", "2026-06-11T15:00:00.000Z", "2026-06-11T15:30:00.000Z", {
171
+ location: "Office rooftop",
172
+ }),
173
+ ],
174
+ });
175
+
176
+ await syncWearableSource(connector, wearableSettings(), wearablesConfig(), { days: 1 }, deps);
177
+
178
+ assert.equal(written.length, 1, "day transcript written");
179
+ const body = bodyOf(written[0].serialized);
180
+ assert.ok(body.includes("*Location: Coffee shop*"), "missing location filled from the dominant match");
181
+ const sourceSection = body.slice(body.indexOf("Conversation c-source"));
182
+ assert.ok(sourceSection.includes("*Location: Office rooftop*"), "source-provided location kept");
183
+ assert.ok(!sourceSection.includes("Coffee shop"), "source-provided value not overwritten");
184
+ } finally {
185
+ rmSync(memoryDir, { recursive: true, force: true });
186
+ }
187
+ });
188
+
189
+ test("conflicting and below-threshold overlaps leave wearable locations unfilled", async () => {
190
+ const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-phase5-threshold-"));
191
+ try {
192
+ await seedLocationDays(memoryDir, {
193
+ // Two equal-overlap places → ambiguous (conflict).
194
+ "2026-06-11": [
195
+ segment("2026-06-11T15:00:00.000Z", "2026-06-11T15:15:00.000Z", "Diner"),
196
+ segment("2026-06-11T15:15:00.000Z", "2026-06-11T15:30:00.000Z", "Gym"),
197
+ ],
198
+ // A 2-minute overlap only → below the 300s floor.
199
+ "2026-06-12": [segment("2026-06-12T15:28:00.000Z", "2026-06-12T16:30:00.000Z", "Library")],
200
+ });
201
+ const { deps, written } = makeSyncDeps(memoryDir, new Date("2026-06-12T03:00:00.000Z"), locationConfig());
202
+ const connector = fakeConnector({
203
+ "2026-06-11": [conversation("c-ambiguous", "2026-06-11T15:00:00.000Z", "2026-06-11T15:30:00.000Z")],
204
+ "2026-06-12": [conversation("c-short", "2026-06-12T15:00:00.000Z", "2026-06-12T15:30:00.000Z")],
205
+ });
206
+
207
+ await syncWearableSource(connector, wearableSettings(), wearablesConfig(), { days: 2 }, deps);
208
+
209
+ assert.equal(written.length, 2, "both days written");
210
+ const bodies = written.map((entry) => bodyOf(entry.serialized));
211
+ assert.ok(
212
+ !bodies.some((body) => body.includes("*Location:")),
213
+ `no location line written: ${bodies.join("\n---\n")}`,
214
+ );
215
+ } finally {
216
+ rmSync(memoryDir, { recursive: true, force: true });
217
+ }
218
+ });
219
+
220
+ test("wearable sync output is byte-identical without location config or with tagging disabled", async () => {
221
+ const run = async (locationConfigValue?: LocationConfig) => {
222
+ const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-phase5-zerodiff-"));
223
+ try {
224
+ if (locationConfigValue) {
225
+ await seedLocationDays(memoryDir, {
226
+ "2026-06-11": [segment("2026-06-11T14:30:00.000Z", "2026-06-11T16:00:00.000Z", "Coffee shop")],
227
+ });
228
+ }
229
+ const { deps, written } = makeSyncDeps(memoryDir, NOW, locationConfigValue);
230
+ const connector = fakeConnector({
231
+ "2026-06-11": [conversation("c1", "2026-06-11T15:00:00.000Z", "2026-06-11T15:30:00.000Z")],
232
+ });
233
+ await syncWearableSource(connector, wearableSettings(), wearablesConfig(), { days: 1 }, deps);
234
+ assert.equal(written.length, 1);
235
+ return bodyOf(written[0].serialized);
236
+ } finally {
237
+ rmSync(memoryDir, { recursive: true, force: true });
238
+ }
239
+ };
240
+
241
+ const baseline = await run(undefined);
242
+ const disabled = await run(locationConfig({ tagging: { enabled: false } }));
243
+ assert.equal(disabled, baseline, "tagging disabled → identical transcript body");
244
+ assert.ok(!baseline.includes("*Location:"), "no location line by default");
245
+ });
246
+
247
+ test("wearable fill resolves the day bucket across a midnight boundary in the location timezone", async () => {
248
+ const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-phase5-midnight-"));
249
+ try {
250
+ // America/New_York: conversation 2026-06-30T03:30Z–04:30Z is
251
+ // 23:30–00:30 local, spanning the June-29 / June-30 midnight. The only
252
+ // qualifying segment (00:00–01:00 local) lives on the June-30 bucket —
253
+ // the conversation's END-anchored day, not its start day. The fill must
254
+ // consult both day keys, not just the start day.
255
+ const nyConfig = locationConfig({ timezone: "America/New_York" });
256
+ await seedLocationDays(memoryDir, {
257
+ "2026-06-30": [segment("2026-06-30T04:00:00.000Z", "2026-06-30T05:00:00.000Z", "Late diner")],
258
+ });
259
+ const { deps, written } = makeSyncDeps(memoryDir, new Date("2026-07-01T03:00:00.000Z"), nyConfig);
260
+ const connector = fakeConnector({
261
+ "2026-06-30": [conversation("c-span", "2026-06-30T03:30:00.000Z", "2026-06-30T04:30:00.000Z")],
262
+ });
263
+
264
+ await syncWearableSource(
265
+ connector,
266
+ wearableSettings(),
267
+ wearablesConfig("America/New_York"),
268
+ { date: "2026-06-30" },
269
+ deps,
270
+ );
271
+
272
+ assert.equal(written.length, 1);
273
+ const body = bodyOf(written[0].serialized);
274
+ assert.ok(body.includes("*Location: Late diner*"), `cross-midnight segment matched: ${body}`);
275
+ } finally {
276
+ rmSync(memoryDir, { recursive: true, force: true });
277
+ }
278
+ });
279
+
280
+ // ── Day summary opt-in ──────────────────────────────────────────────────────
281
+
282
+ function opsCoordinator(storage: StorageManager, configOverrides: Partial<PluginConfig>) {
283
+ return new WorkspaceOpsCoordinator({
284
+ config: {
285
+ defaultNamespace: "default",
286
+ daySummaryTimezone: "UTC",
287
+ ...configOverrides,
288
+ } as unknown as PluginConfig,
289
+ storageRouter: {
290
+ storageFor: async () => storage,
291
+ },
292
+ } as unknown as WorkspaceOpsDeps);
293
+ }
294
+
295
+ test("gatherTodayFacts appends location context only when requested and gated", async () => {
296
+ const gather = async (options: { includeLocation?: boolean; location?: LocationConfig }) => {
297
+ const root = mkdtempSync(path.join(tmpdir(), "remnic-phase5-summary-"));
298
+ try {
299
+ const storage = new StorageManager(root);
300
+ await storage.writeMemory("fact", "Shipped the location wiring.", { source: "test" });
301
+ if (options.location) {
302
+ const day = new Date().toISOString().slice(0, 10);
303
+ await seedLocationDays(root, {
304
+ [day]: [segment(`${day}T09:00:00.000Z`, `${day}T17:00:00.000Z`, "Office", "work")],
305
+ });
306
+ }
307
+ const coordinator = opsCoordinator(storage, options.location ? { location: options.location } : {});
308
+ return await coordinator.gatherTodayFacts(undefined, {
309
+ now: new Date(),
310
+ timeZone: "UTC",
311
+ ...(options.includeLocation !== undefined ? { includeLocation: options.includeLocation } : {}),
312
+ });
313
+ } finally {
314
+ rmSync(root, { recursive: true, force: true });
315
+ }
316
+ };
317
+
318
+ // Each gather run writes a fresh fact id/timestamp header; normalize it
319
+ // away so byte-comparisons isolate the location delta.
320
+ const normalized = (gathered: string) => gathered.replace(/^\[fact-[^\]]*\] \([^)]*\)/gm, "[fact]");
321
+
322
+ const enabled = locationConfig();
323
+ const baseline = await gather({});
324
+ const withStateNoFlag = await gather({ location: enabled });
325
+ assert.equal(normalized(withStateNoFlag), normalized(baseline), "no request flag → byte-identical gathered summary");
326
+
327
+ const withFlagNoState = await gather({ includeLocation: true });
328
+ assert.equal(normalized(withFlagNoState), normalized(baseline), "flag without location state → byte-identical");
329
+
330
+ const withFlag = await gather({ includeLocation: true, location: enabled });
331
+ assert.ok(withFlag.includes("## Location context"), "opt-in adds the location section");
332
+ assert.ok(withFlag.includes("- Office: 8h 00m"), "labels and durations only");
333
+
334
+ const flagButTaggingOff = await gather({
335
+ includeLocation: true,
336
+ location: locationConfig({ tagging: { enabled: false } }),
337
+ });
338
+ assert.equal(normalized(flagButTaggingOff), normalized(baseline), "flag with tagging disabled → byte-identical");
339
+ });
340
+
341
+ // ── Briefing opt-in ─────────────────────────────────────────────────────────
342
+
343
+ test("briefingLocationSection is opt-in, start-day anchored, and labels-only", async () => {
344
+ const root = mkdtempSync(path.join(tmpdir(), "remnic-phase5-briefing-"));
345
+ try {
346
+ const day = new Date().toISOString().slice(0, 10);
347
+ await seedLocationDays(root, {
348
+ [day]: [
349
+ segment(`${day}T08:00:00.000Z`, `${day}T18:00:00.000Z`, "HQ", "work"),
350
+ segment(`${day}T18:00:00.000Z`, `${day}T19:00:00.000Z`, "Commuter rail", "transit"),
351
+ ],
352
+ });
353
+
354
+ const gatedOff = await briefingLocationSection(
355
+ root,
356
+ new Date().toISOString(),
357
+ locationConfig({ tagging: { enabled: false } }),
358
+ );
359
+ assert.equal(gatedOff, null, "tagging disabled → no section");
360
+
361
+ const section = await briefingLocationSection(root, new Date().toISOString(), locationConfig());
362
+ assert.ok(section, "gated on → section rendered");
363
+ assert.ok(section.includes("## Location context"));
364
+ assert.ok(section.includes("- HQ: 10h 00m"), "work place rendered with duration");
365
+ assert.ok(!section.includes("Commuter rail"), "transit-only place excluded");
366
+
367
+ const none = await briefingLocationSection(
368
+ root,
369
+ new Date(Date.now() - 90 * 24 * 3600 * 1000).toISOString(),
370
+ locationConfig(),
371
+ );
372
+ assert.equal(none, null, "window start on a day without segments → no section");
373
+ } finally {
374
+ rmSync(root, { recursive: true, force: true });
375
+ }
376
+ });
377
+
378
+ // ── Privacy ─────────────────────────────────────────────────────────────────
379
+
380
+ test("phase-5 outputs never contain coordinates or raw location records", async () => {
381
+ const root = mkdtempSync(path.join(tmpdir(), "remnic-phase5-privacy-"));
382
+ try {
383
+ const day = new Date().toISOString().slice(0, 10);
384
+ // Segment places carry coordinates (as if retainCoordinates had been on
385
+ // at ingestion) — every phase-5 surface must still render labels only.
386
+ await seedLocationDays(root, {
387
+ [day]: [segment(`${day}T08:00:00.000Z`, `${day}T18:00:00.000Z`, "HQ", "work")],
388
+ });
389
+
390
+ const section = await briefingLocationSection(root, new Date().toISOString(), locationConfig());
391
+ assert.ok(section);
392
+ assert.ok(!/\d+\.\d{3,}/.test(section), `no coordinate-like numbers: ${section}`);
393
+ assert.ok(!section.includes("startUtc") && !section.includes("observationCount"), "no raw record fields");
394
+
395
+ const storage = new StorageManager(root);
396
+ await storage.writeMemory("fact", "Privacy probe fact.", { source: "test" });
397
+ const coordinator = opsCoordinator(storage, { location: locationConfig() });
398
+ const gathered = await coordinator.gatherTodayFacts(undefined, {
399
+ now: new Date(),
400
+ timeZone: "UTC",
401
+ includeLocation: true,
402
+ });
403
+ assert.ok(!gathered.includes("60.1699") && !gathered.includes("24.9384"), "no coordinates in day-summary input");
404
+ assert.ok(!gathered.includes("latitude") && !gathered.includes("longitude"), "no coordinate field names");
405
+ } finally {
406
+ rmSync(root, { recursive: true, force: true });
407
+ }
408
+ });
@@ -275,3 +275,61 @@ export async function renderDayLocationContext(
275
275
  });
276
276
  return `## Location context\n\n${lines.join("\n")}`;
277
277
  }
278
+
279
+ /**
280
+ * Location context for a briefing (issue #2925): the place names of the
281
+ * local day containing the briefing window's start, bucketed in the
282
+ * location config's own timezone (the store's bucketing zone). Opt-in and
283
+ * labels-only — the caller decides whether to include it.
284
+ */
285
+ export async function briefingLocationSection(
286
+ memoryDir: string,
287
+ windowStartUtc: string,
288
+ config: LocationConfig,
289
+ ): Promise<string | null> {
290
+ return renderDayLocationContext(
291
+ memoryDir,
292
+ localDayKey(windowStartUtc, config.timezone),
293
+ config,
294
+ );
295
+ }
296
+
297
+ export async function applyBriefingLocationContext<
298
+ T extends { markdown: string; json: Record<string, unknown> },
299
+ >(
300
+ result: T,
301
+ includeLocation: boolean | undefined,
302
+ memoryDir: string,
303
+ windowStartUtc: string,
304
+ location: LocationConfig,
305
+ ): Promise<T> {
306
+ if (includeLocation !== true || !locationTaggingEnabled(location)) return result;
307
+ const section = await briefingLocationSection(memoryDir, windowStartUtc, location);
308
+ if (!section) return result;
309
+ return {
310
+ ...result,
311
+ markdown: `${result.markdown}\n\n${section}\n`,
312
+ json: { ...result.json, locationContext: section },
313
+ };
314
+ }
315
+
316
+ /**
317
+ * Opt-in matched-place-name context (issue #2925), shared by the access
318
+ * request surfaces (day summary and briefing). Absent or false keeps the
319
+ * output byte-identical.
320
+ */
321
+ export interface LocationContextRequestOptions {
322
+ /** Opt-in matched-place-name context appended to the summary or briefing output. */
323
+ includeLocation?: boolean;
324
+ }
325
+
326
+ /**
327
+ * Auto-gather options for the day summary (issue #2925): the caller's
328
+ * timezone plus the strictly-opt-in location flag. Only the literal
329
+ * `true` opts in, matching the transport schemas' boolean contract.
330
+ */
331
+ export function daySummaryAutoOptions(
332
+ request: LocationContextRequestOptions & { timeZone?: string },
333
+ ): { timeZone?: string; includeLocation: boolean } {
334
+ return { timeZone: request.timeZone, includeLocation: request.includeLocation === true };
335
+ }
@@ -28,6 +28,8 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
28
28
  meetings_list: true,
29
29
  meetings_get: true,
30
30
  deep_recall: true,
31
+ memory_expand: true,
32
+ memory_traverse: true,
31
33
  standup: true,
32
34
  action_confidence: true,
33
35
  capsule_list: true,
@@ -325,6 +325,8 @@ export const DEFAULT_QMD_STARTUP_COLLECTION_CHECK_TIMEOUT_MS = 10_000;
325
325
  export type DaySummaryGatherOptions = {
326
326
  timeZone?: string;
327
327
  now?: Date;
328
+ /** Opt-in location context (issue #2925); false/absent keeps output byte-identical. */
329
+ includeLocation?: boolean;
328
330
  };
329
331
 
330
332
  export function normalizeIanaTimeZone(value: unknown): string | undefined {