@remnic/core 9.65.8 → 9.66.1

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 (702) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -12
  2. package/dist/access-admin-ops-surface.js +54 -51
  3. package/dist/access-authorization-probe.d.ts +11 -12
  4. package/dist/access-authorization-probe.js +55 -52
  5. package/dist/access-boundary.d.ts +11 -12
  6. package/dist/access-boundary.js +54 -51
  7. package/dist/access-citation-namespace.js +3 -3
  8. package/dist/access-cli.js +132 -125
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -2
  11. package/dist/access-coding-context-resolution.js +2 -2
  12. package/dist/access-extraction-force-flush.d.ts +11 -12
  13. package/dist/access-extraction-force-flush.js +54 -51
  14. package/dist/access-health-types.d.ts +1 -2
  15. package/dist/access-http-lcm-compaction.d.ts +11 -12
  16. package/dist/access-http-lifecycle-flush.d.ts +11 -12
  17. package/dist/access-http-offline-stream.d.ts +11 -12
  18. package/dist/access-http-query.d.ts +2 -3
  19. package/dist/access-http-query.js +56 -53
  20. package/dist/access-http.d.ts +12 -13
  21. package/dist/access-http.js +77 -74
  22. package/dist/access-identity-continuity-surface.d.ts +9 -10
  23. package/dist/access-identity-continuity-surface.js +54 -51
  24. package/dist/access-lcm-surface.d.ts +11 -12
  25. package/dist/access-lcm-surface.js +54 -51
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +11 -12
  28. package/dist/access-mcp.js +67 -64
  29. package/dist/access-memory-search-fanout.d.ts +2 -3
  30. package/dist/{access-namespace-preflight-CpAOrS-9.d.ts → access-namespace-preflight-50VIkPhB.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +3 -4
  32. package/dist/access-namespace-preflight.js +54 -51
  33. package/dist/access-observe-write-surface.d.ts +11 -12
  34. package/dist/access-observe-write-surface.js +54 -51
  35. package/dist/access-offline-manifest.d.ts +9 -10
  36. package/dist/access-offline-manifest.js +15 -15
  37. package/dist/access-operations-batch.js +59 -56
  38. package/dist/access-operations.d.ts +12 -13
  39. package/dist/access-operations.js +64 -61
  40. package/dist/access-recall-concurrency.d.ts +11 -12
  41. package/dist/access-recall-concurrency.js +54 -51
  42. package/dist/access-recall-response.d.ts +11 -12
  43. package/dist/access-recall-response.js +54 -51
  44. package/dist/access-recall-surface.d.ts +11 -12
  45. package/dist/access-recall-surface.js +54 -51
  46. package/dist/access-schema.d.ts +12 -12
  47. package/dist/access-schema.js +5 -5
  48. package/dist/{access-service-Diu61Cfv.d.ts → access-service-C2tV2-uL.d.ts} +8 -8
  49. package/dist/access-service-helpers.d.ts +11 -12
  50. package/dist/access-service.d.ts +11 -12
  51. package/dist/access-service.js +54 -51
  52. package/dist/access-surface-catalog.d.ts +11 -12
  53. package/dist/access-surface-catalog.js +58 -53
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +3 -4
  56. package/dist/action-confidence.d.ts +1 -2
  57. package/dist/active-memory-bridge.d.ts +1 -2
  58. package/dist/active-memory-bridge.js +2 -2
  59. package/dist/active-recall.d.ts +1 -2
  60. package/dist/active-recall.js +11 -11
  61. package/dist/adapters/index.js +7 -7
  62. package/dist/adapters/registry.js +3 -3
  63. package/dist/ambient-provenance.d.ts +1 -2
  64. package/dist/artifact-search.d.ts +1 -2
  65. package/dist/{auto-sync-2YPITIWN.js → auto-sync-Q6Q2FVSC.js} +9 -9
  66. package/dist/behavior-learner.d.ts +1 -2
  67. package/dist/behavior-signals.d.ts +1 -2
  68. package/dist/bootstrap.d.ts +9 -10
  69. package/dist/briefing-window.d.ts +2 -3
  70. package/dist/briefing.d.ts +2 -3
  71. package/dist/briefing.js +28 -28
  72. package/dist/buffer-surprise-report.d.ts +1 -2
  73. package/dist/buffer-turn-helpers.d.ts +1 -2
  74. package/dist/buffer.d.ts +2 -3
  75. package/dist/buffer.js +20 -4
  76. package/dist/bulk-import/index.d.ts +3 -4
  77. package/dist/calibration.d.ts +1 -2
  78. package/dist/calibration.js +1 -1
  79. package/dist/capabilities.d.ts +1 -2
  80. package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
  81. package/dist/{catalog-9f-vEQLS.d.ts → catalog-C2jA-gLm.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -2
  83. package/dist/causal-consolidation.d.ts +1 -2
  84. package/dist/causal-consolidation.js +29 -29
  85. package/dist/causal-trajectory-graph.d.ts +1 -2
  86. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  87. package/dist/{chunk-TFR3HG4K.js → chunk-2FA7U5XY.js} +4 -4
  88. package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
  89. package/dist/{chunk-W2BAGGEW.js → chunk-2ITZ74A6.js} +40 -31
  90. package/dist/{chunk-W2BAGGEW.js.map → chunk-2ITZ74A6.js.map} +1 -1
  91. package/dist/{chunk-MY2BC6UE.js → chunk-2X6BGKQL.js} +11 -11
  92. package/dist/{chunk-UEBDCMOO.js → chunk-3TSU662L.js} +3 -3
  93. package/dist/{chunk-XAB6STPO.js → chunk-46XR5FNZ.js} +53 -3
  94. package/dist/chunk-46XR5FNZ.js.map +1 -0
  95. package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
  96. package/dist/chunk-4OFKZAJG.js.map +1 -0
  97. package/dist/{chunk-S5XOSTYM.js → chunk-4XLTUR6R.js} +3 -3
  98. package/dist/{chunk-BWGCOLEL.js → chunk-65JOGLIS.js} +2 -2
  99. package/dist/{chunk-HMZKGHMD.js → chunk-7UOXCCCI.js} +3 -3
  100. package/dist/{chunk-7WOWGRAU.js → chunk-AF5H7TKI.js} +108 -23
  101. package/dist/chunk-AF5H7TKI.js.map +1 -0
  102. package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
  103. package/dist/chunk-AJTG3CP7.js.map +1 -0
  104. package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
  105. package/dist/chunk-AL3UYZ5N.js.map +1 -0
  106. package/dist/{chunk-4F4AQFWL.js → chunk-B4AOWRYF.js} +10 -10
  107. package/dist/{chunk-ODU2CNNX.js → chunk-C5IUOBCN.js} +2 -2
  108. package/dist/{chunk-3A2NJP2U.js → chunk-CHGG74CY.js} +3 -3
  109. package/dist/{chunk-76DIF5KT.js → chunk-CX4OLNIH.js} +2 -2
  110. package/dist/{chunk-Z3YEGSR4.js → chunk-D3UXGE5D.js} +10 -10
  111. package/dist/{chunk-5HK3CJAR.js → chunk-D6Q5EPOV.js} +2 -2
  112. package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
  113. package/dist/{chunk-XBGHAAKR.js → chunk-DDX6KIXF.js} +2 -2
  114. package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
  115. package/dist/{chunk-7KQB4EBS.js → chunk-DUAJKRR2.js} +2 -2
  116. package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
  117. package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
  118. package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
  119. package/dist/{chunk-DPCXDG7G.js → chunk-EH65UV2Z.js} +2 -2
  120. package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
  121. package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
  122. package/dist/{chunk-TUHBYJXL.js → chunk-EWKVYCFP.js} +1 -1
  123. package/dist/{chunk-NPFUNWNX.js → chunk-FFUMTH27.js} +2 -2
  124. package/dist/{chunk-3PKAS6VL.js → chunk-GAJK3DQ5.js} +2 -2
  125. package/dist/{chunk-DA7ITC5Z.js → chunk-GBEOUCBB.js} +2 -2
  126. package/dist/{chunk-UENKPWCS.js → chunk-H2IRSXZN.js} +6 -6
  127. package/dist/{chunk-CFVTRUR3.js → chunk-H6RSANGQ.js} +2 -2
  128. package/dist/chunk-HVAEXYPL.js +98 -0
  129. package/dist/chunk-HVAEXYPL.js.map +1 -0
  130. package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
  131. package/dist/{chunk-3SZD4CYO.js → chunk-IGZCAHFL.js} +3 -3
  132. package/dist/{chunk-UPFNQJC7.js → chunk-INUBU6I5.js} +2 -2
  133. package/dist/{chunk-PMVPCZJZ.js → chunk-J2R275FN.js} +3 -3
  134. package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
  135. package/dist/chunk-JALOAKSZ.js.map +1 -0
  136. package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
  137. package/dist/{chunk-3BCULS4U.js → chunk-JKTV3JNX.js} +145 -507
  138. package/dist/chunk-JKTV3JNX.js.map +1 -0
  139. package/dist/{chunk-5ACCD4L7.js → chunk-JRRQ747T.js} +7 -7
  140. package/dist/{chunk-V4IDF3EZ.js → chunk-JTWZKNUH.js} +5 -5
  141. package/dist/{chunk-AZMLH5UT.js → chunk-KI64TTBL.js} +2 -2
  142. package/dist/{chunk-DEACDKE3.js → chunk-KJXCD7VR.js} +112 -87
  143. package/dist/chunk-KJXCD7VR.js.map +1 -0
  144. package/dist/chunk-LJABGXC4.js +267 -0
  145. package/dist/chunk-LJABGXC4.js.map +1 -0
  146. package/dist/{chunk-NPIBN2VL.js → chunk-LK4TOYPU.js} +2 -2
  147. package/dist/{chunk-UTQUEHC7.js → chunk-LUDBXTBJ.js} +8 -8
  148. package/dist/{chunk-PU56CXZA.js → chunk-LYUUA6QB.js} +2 -2
  149. package/dist/{chunk-P36Z4JRA.js → chunk-M5ERTI4I.js} +2 -2
  150. package/dist/{chunk-LDKPDODJ.js → chunk-ME35HVDJ.js} +2 -2
  151. package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
  152. package/dist/{chunk-OXRRJXPR.js → chunk-MUEGIKKY.js} +476 -1796
  153. package/dist/chunk-MUEGIKKY.js.map +1 -0
  154. package/dist/{chunk-AHPIFKNG.js → chunk-N4F7ZSSG.js} +2 -2
  155. package/dist/{chunk-JOZUBF4A.js → chunk-NACLNNFQ.js} +2 -2
  156. package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
  157. package/dist/{chunk-T7XP6IZE.js → chunk-NFP4KPTA.js} +2 -2
  158. package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
  159. package/dist/{chunk-LPNCR4QK.js → chunk-NSTNGMSS.js} +14 -14
  160. package/dist/{chunk-5RWZH6PH.js → chunk-NUF7VSEX.js} +2 -2
  161. package/dist/{chunk-7VZFRUQU.js → chunk-O7ERGZDA.js} +5 -5
  162. package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
  163. package/dist/{chunk-5DHKCO52.js → chunk-OJUEUQDJ.js} +2 -2
  164. package/dist/{chunk-LOXHYCVS.js → chunk-OMX6TKXH.js} +2 -2
  165. package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
  166. package/dist/{chunk-SEEJOGQX.js → chunk-QBNE55VA.js} +4 -4
  167. package/dist/chunk-QJCWK2A7.js +1466 -0
  168. package/dist/chunk-QJCWK2A7.js.map +1 -0
  169. package/dist/{chunk-YEUXERJ6.js → chunk-RDGKVH6T.js} +7 -3
  170. package/dist/{chunk-YEUXERJ6.js.map → chunk-RDGKVH6T.js.map} +1 -1
  171. package/dist/{chunk-JYSN42VN.js → chunk-RPIS5FQ7.js} +237 -183
  172. package/dist/chunk-RPIS5FQ7.js.map +1 -0
  173. package/dist/{chunk-F7XUD3PL.js → chunk-S4CDUXQY.js} +2 -2
  174. package/dist/{chunk-WNXYT4MK.js → chunk-S4Z2OBTX.js} +4 -4
  175. package/dist/{chunk-UL4MKZHI.js → chunk-SN4JXNLL.js} +2 -2
  176. package/dist/{chunk-CAMNRAJF.js → chunk-SZMYGDSM.js} +2 -2
  177. package/dist/chunk-TB2MJRI6.js +866 -0
  178. package/dist/chunk-TB2MJRI6.js.map +1 -0
  179. package/dist/{chunk-XNWXSGHS.js → chunk-TBCDF556.js} +28 -10
  180. package/dist/chunk-TBCDF556.js.map +1 -0
  181. package/dist/{chunk-LKYIOCWL.js → chunk-TCF4MU7L.js} +967 -132
  182. package/dist/chunk-TCF4MU7L.js.map +1 -0
  183. package/dist/chunk-TCQRIIIN.js +202 -0
  184. package/dist/chunk-TCQRIIIN.js.map +1 -0
  185. package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
  186. package/dist/chunk-TEZ2HTC7.js.map +1 -0
  187. package/dist/{chunk-CPA5NBHN.js → chunk-TNGH4ZYI.js} +2 -2
  188. package/dist/{chunk-F3NVYTTA.js → chunk-TNXNECAN.js} +6 -6
  189. package/dist/{chunk-BEC4YBNA.js → chunk-TVW4C7PV.js} +2 -2
  190. package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
  191. package/dist/{chunk-KZIF6XHX.js → chunk-U65VJSCJ.js} +32 -19
  192. package/dist/chunk-U65VJSCJ.js.map +1 -0
  193. package/dist/{chunk-4QEYREAV.js → chunk-U6NGKS32.js} +8 -8
  194. package/dist/{chunk-HRHO3ZNG.js → chunk-UW4RYPWC.js} +2 -2
  195. package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
  196. package/dist/chunk-UYA36DQ7.js.map +1 -0
  197. package/dist/{chunk-T6ILXUAH.js → chunk-VG4SSPAW.js} +2 -2
  198. package/dist/chunk-VOSWUO3K.js +100 -0
  199. package/dist/chunk-VOSWUO3K.js.map +1 -0
  200. package/dist/chunk-WFCWP4XU.js +17 -0
  201. package/dist/chunk-WFCWP4XU.js.map +1 -0
  202. package/dist/{chunk-H2YSH3DG.js → chunk-WKAXBXVA.js} +2 -2
  203. package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
  204. package/dist/{chunk-UNUMFURP.js → chunk-X5PIDJ3L.js} +3 -3
  205. package/dist/{chunk-CRML27CO.js → chunk-X5YYSAZX.js} +4 -4
  206. package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
  207. package/dist/{chunk-U7EW2W4W.js → chunk-XKNHFDTT.js} +26 -6
  208. package/dist/chunk-XKNHFDTT.js.map +1 -0
  209. package/dist/{chunk-OA2O2GJ4.js → chunk-XOHYGIWF.js} +3 -3
  210. package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
  211. package/dist/{chunk-MINHJ55X.js → chunk-XXW32OL7.js} +1 -1
  212. package/dist/{chunk-MINHJ55X.js.map → chunk-XXW32OL7.js.map} +1 -1
  213. package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
  214. package/dist/{chunk-MDD2RINF.js → chunk-YWPLOJ7T.js} +3 -3
  215. package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
  216. package/dist/{chunk-GTO56JY5.js → chunk-ZPS724LT.js} +2 -2
  217. package/dist/{chunk-SNOIKAHM.js → chunk-ZZZWEDF4.js} +3 -3
  218. package/dist/{cli-O3F-ht3i.d.ts → cli-CsfFMe6n.d.ts} +5 -5
  219. package/dist/cli.d.ts +13 -14
  220. package/dist/cli.js +101 -96
  221. package/dist/coding/export-okf-codegraph.d.ts +56 -0
  222. package/dist/coding/export-okf-codegraph.js +526 -0
  223. package/dist/coding/export-okf-codegraph.js.map +1 -0
  224. package/dist/coding/pre-action-gate.d.ts +1 -2
  225. package/dist/compounding/engine.d.ts +2 -3
  226. package/dist/compounding/engine.js +29 -29
  227. package/dist/compounding/preference-consolidator.d.ts +1 -2
  228. package/dist/compression-optimizer.d.ts +1 -2
  229. package/dist/config.d.ts +1 -2
  230. package/dist/config.js +11 -11
  231. package/dist/connectors/codex-materialize-runner.d.ts +1 -2
  232. package/dist/connectors/codex-materialize-runner.js +28 -28
  233. package/dist/connectors/codex-materialize.d.ts +1 -2
  234. package/dist/connectors/index.d.ts +1 -2
  235. package/dist/connectors/index.js +28 -28
  236. package/dist/consolidation-provenance-check.d.ts +2 -3
  237. package/dist/consolidation-provenance-check.js +4 -4
  238. package/dist/consolidation-undo.d.ts +2 -3
  239. package/dist/consolidation-undo.js +3 -3
  240. package/dist/contradiction/index.d.ts +3 -4
  241. package/dist/contradiction/index.js +9 -9
  242. package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
  243. package/dist/converge-config.d.ts +1 -2
  244. package/dist/convergence-refresh.d.ts +2 -3
  245. package/dist/convergence-refresh.js +30 -30
  246. package/dist/conversation-index/backend.d.ts +1 -2
  247. package/dist/conversation-index/backend.js +2 -2
  248. package/dist/conversation-index/chunker.d.ts +1 -2
  249. package/dist/conversation-index/faiss-adapter.d.ts +1 -2
  250. package/dist/conversation-index/indexer.d.ts +1 -2
  251. package/dist/conversation-index/search.d.ts +1 -2
  252. package/dist/corpus-watermark.d.ts +1 -2
  253. package/dist/corpus-watermark.js +30 -30
  254. package/dist/cross-lingual-recall.d.ts +1 -2
  255. package/dist/day-summary.d.ts +1 -2
  256. package/dist/delinearize.d.ts +1 -2
  257. package/dist/dependency-propagation-config.d.ts +1 -2
  258. package/dist/{dependency-propagation-delivery-CL6RWXTA.d.ts → dependency-propagation-delivery-D4WMbOwA.d.ts} +1 -1
  259. package/dist/direct-answer-wiring.d.ts +1 -2
  260. package/dist/direct-answer.d.ts +1 -2
  261. package/dist/embedding-fallback.d.ts +1 -2
  262. package/dist/enrichment/index.d.ts +1 -2
  263. package/dist/entity-origin-fields.d.ts +1 -2
  264. package/dist/entity-retrieval.d.ts +2 -3
  265. package/dist/entity-retrieval.js +28 -28
  266. package/dist/entity-schema.d.ts +1 -2
  267. package/dist/episodic-context.d.ts +1 -2
  268. package/dist/eval-trajectory-contracts.d.ts +1 -2
  269. package/dist/eval-trajectory-store.d.ts +1 -2
  270. package/dist/eval-trajectory.d.ts +1 -2
  271. package/dist/explicit-capture.d.ts +9 -10
  272. package/dist/explicit-capture.js +11 -11
  273. package/dist/external-wiki-access.d.ts +11 -12
  274. package/dist/external-wiki-access.js +55 -52
  275. package/dist/external-wiki-collection-registration.d.ts +1 -2
  276. package/dist/external-wiki-collection.d.ts +1 -2
  277. package/dist/external-wiki-mcp-tools.d.ts +11 -12
  278. package/dist/extraction-error-classification.d.ts +1 -2
  279. package/dist/extraction-faithfulness.d.ts +1 -2
  280. package/dist/extraction-faithfulness.js +2 -2
  281. package/dist/extraction-judge-telemetry.d.ts +1 -2
  282. package/dist/extraction-judge-training.d.ts +1 -2
  283. package/dist/extraction-judge.d.ts +1 -2
  284. package/dist/extraction-judge.js +2 -2
  285. package/dist/extraction-liveness.d.ts +1 -2
  286. package/dist/extraction-normalization.d.ts +1 -2
  287. package/dist/extraction-prompt.d.ts +1 -2
  288. package/dist/extraction-source-grounding-rules.d.ts +1 -2
  289. package/dist/extraction-source-grounding.d.ts +1 -2
  290. package/dist/extraction.d.ts +1 -2
  291. package/dist/extraction.js +37 -34
  292. package/dist/fallback-llm.d.ts +7 -2
  293. package/dist/fallback-llm.js +1 -1
  294. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
  295. package/dist/graph-dashboard-diff.d.ts +1 -2
  296. package/dist/graph-dashboard-key.d.ts +1 -2
  297. package/dist/graph-dashboard-parser.d.ts +1 -2
  298. package/dist/graph-edge-reinforcement.d.ts +1 -2
  299. package/dist/graph-path-reconstruction.d.ts +1 -2
  300. package/dist/graph-path-scoring.d.ts +1 -2
  301. package/dist/graph-snapshot.d.ts +1 -2
  302. package/dist/graph.d.ts +1 -2
  303. package/dist/harmonic-retrieval.js +1 -1
  304. package/dist/importance.d.ts +1 -2
  305. package/dist/importers/index.d.ts +1 -2
  306. package/dist/in-flight-reads.d.ts +1 -2
  307. package/dist/{index-C7Xep6S9.d.ts → index-DuJnzwHv.d.ts} +2 -2
  308. package/dist/index.d.ts +364 -26
  309. package/dist/index.js +232 -169
  310. package/dist/intent.d.ts +1 -2
  311. package/dist/lcm/engine.d.ts +1 -2
  312. package/dist/lcm/engine.js +4 -4
  313. package/dist/lcm/index.d.ts +1 -2
  314. package/dist/lcm/index.js +10 -10
  315. package/dist/lcm/tools.d.ts +1 -2
  316. package/dist/lifecycle.d.ts +1 -2
  317. package/dist/live-connectors-runner.d.ts +1 -2
  318. package/dist/local-llm.d.ts +1 -2
  319. package/dist/local-model-endpoint.d.ts +1 -2
  320. package/dist/location/index.d.ts +315 -6
  321. package/dist/location/index.js +151 -19
  322. package/dist/maintenance/memory-governance.d.ts +1 -2
  323. package/dist/maintenance/memory-governance.js +28 -28
  324. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -3
  325. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -28
  326. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -3
  327. package/dist/maintenance/rebuild-memory-projection.js +29 -29
  328. package/dist/{maintenance-CJ-xqFp0.d.ts → maintenance-BBeaeYRR.d.ts} +3 -3
  329. package/dist/mcp-memory-inspector-app.d.ts +11 -12
  330. package/dist/mcp-read-only-tools.js +1 -1
  331. package/dist/memory-action-policy.d.ts +1 -2
  332. package/dist/memory-cache.d.ts +1 -2
  333. package/dist/memory-controller.d.ts +1 -2
  334. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -2
  335. package/dist/memory-projection-mutations.js +3 -3
  336. package/dist/memory-projection-store.d.ts +1 -2
  337. package/dist/memory-projection-store.js +1 -1
  338. package/dist/memory-provenance.d.ts +1 -2
  339. package/dist/memory-snapshot.d.ts +1 -2
  340. package/dist/memory-subject-cli.d.ts +11 -12
  341. package/dist/memory-subject.d.ts +11 -12
  342. package/dist/memory-subject.js +4 -4
  343. package/dist/memory-worth-outcomes.d.ts +2 -3
  344. package/dist/models-json.d.ts +1 -2
  345. package/dist/namespaces/migrate.d.ts +3 -4
  346. package/dist/namespaces/migrate.js +29 -29
  347. package/dist/namespaces/principal.d.ts +1 -2
  348. package/dist/namespaces/search.d.ts +1 -2
  349. package/dist/namespaces/search.js +8 -8
  350. package/dist/namespaces/storage.d.ts +3 -4
  351. package/dist/namespaces/storage.js +28 -28
  352. package/dist/native-knowledge.d.ts +1 -2
  353. package/dist/offline-sync-file-io.js +3 -3
  354. package/dist/offline-sync-impression-drain.d.ts +1 -2
  355. package/dist/offline-sync-impression-drain.js +9 -9
  356. package/dist/offline-sync.js +4 -4
  357. package/dist/operator-doctor-corpus.d.ts +1 -2
  358. package/dist/operator-doctor-corpus.js +31 -31
  359. package/dist/operator-doctor-replica.d.ts +1 -2
  360. package/dist/operator-toolkit.d.ts +3 -4
  361. package/dist/operator-toolkit.js +47 -47
  362. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -3
  363. package/dist/orchestration/maintenance.d.ts +4 -5
  364. package/dist/orchestration/maintenance.js +42 -41
  365. package/dist/{orchestrator-BsntWxLy.d.ts → orchestrator-CaqnwNwM.d.ts} +8 -8
  366. package/dist/orchestrator.d.ts +9 -10
  367. package/dist/orchestrator.js +132 -125
  368. package/dist/page-versioning.js +3 -3
  369. package/dist/patterns-cli.d.ts +1 -2
  370. package/dist/{pipeline-CVoysPm2.d.ts → pipeline-CrxVjlJr.d.ts} +1 -1
  371. package/dist/policy-runtime.d.ts +1 -2
  372. package/dist/proactive-contention.d.ts +1 -2
  373. package/dist/provenance.d.ts +1 -2
  374. package/dist/{public-http-CuOxlTC2.d.ts → public-http-Cwvl4QZr.d.ts} +1 -1
  375. package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
  376. package/dist/{qmd-DWMAGA5l.d.ts → qmd-BZgbJm0g.d.ts} +1 -1
  377. package/dist/qmd-preflight.d.ts +2 -3
  378. package/dist/qmd-recall-cache.d.ts +1 -2
  379. package/dist/qmd.d.ts +2 -3
  380. package/dist/recall-concurrency-config.d.ts +1 -2
  381. package/dist/recall-deep.d.ts +37 -0
  382. package/dist/recall-deep.js +81 -0
  383. package/dist/recall-deep.js.map +1 -0
  384. package/dist/recall-disclosure-escalation.d.ts +1 -2
  385. package/dist/recall-explain-renderer.d.ts +1 -2
  386. package/dist/recall-explain-renderer.js +3 -3
  387. package/dist/recall-memory-map.d.ts +1 -2
  388. package/dist/recall-navigate.d.ts +70 -0
  389. package/dist/recall-navigate.js +51 -0
  390. package/dist/recall-navigate.js.map +1 -0
  391. package/dist/recall-planner-llm.d.ts +1 -2
  392. package/dist/recall-planner-llm.js +1 -1
  393. package/dist/recall-state-view-wire.d.ts +14 -0
  394. package/dist/recall-state-view-wire.js +11 -0
  395. package/dist/recall-state-view.d.ts +25 -0
  396. package/dist/recall-state-view.js +22 -0
  397. package/dist/recall-state-view.js.map +1 -0
  398. package/dist/recall-state.d.ts +1 -2
  399. package/dist/recall-tag-filter.d.ts +1 -2
  400. package/dist/recall-timings.d.ts +1 -2
  401. package/dist/recall-xray-cli.d.ts +1 -2
  402. package/dist/recall-xray-cli.js +4 -4
  403. package/dist/recall-xray-renderer.d.ts +1 -2
  404. package/dist/recall-xray-renderer.js +3 -3
  405. package/dist/recall-xray.d.ts +1 -2
  406. package/dist/recall-xray.js +2 -2
  407. package/dist/reconcile/cursor.d.ts +1 -2
  408. package/dist/reconcile/manifest.d.ts +1 -2
  409. package/dist/reconcile/manifest.js +4 -4
  410. package/dist/reconcile/plan.d.ts +1 -2
  411. package/dist/replay/normalizers/chatgpt.d.ts +1 -2
  412. package/dist/replay/normalizers/claude.d.ts +1 -2
  413. package/dist/replay/normalizers/openclaw.d.ts +1 -2
  414. package/dist/replay/normalizers/shared.d.ts +1 -2
  415. package/dist/replay/runner.d.ts +1 -2
  416. package/dist/replay/types.d.ts +1 -2
  417. package/dist/replica-divergence.d.ts +1 -2
  418. package/dist/replica-peers-config.d.ts +1 -2
  419. package/dist/{resolution-XWBPKYFB.js → resolution-4DLI3IOR.js} +10 -10
  420. package/dist/resolution-4DLI3IOR.js.map +1 -0
  421. package/dist/resolve-auth-token.d.ts +1 -2
  422. package/dist/resume-bundles.js +12 -12
  423. package/dist/retrieval-agents.d.ts +2 -3
  424. package/dist/retrieval-tiers.d.ts +1 -2
  425. package/dist/routing/engine.d.ts +1 -2
  426. package/dist/routing/store.d.ts +1 -2
  427. package/dist/salvage-envelope.d.ts +1 -2
  428. package/dist/salvage-envelope.js +6 -6
  429. package/dist/schemas.d.ts +570 -105
  430. package/dist/schemas.js +3 -1
  431. package/dist/{scope-profiles-CPWkW_dI.d.ts → scope-profiles-DFaojvoP.d.ts} +1 -1
  432. package/dist/search/document-scanner.js +1 -1
  433. package/dist/search/embed-helper.d.ts +1 -2
  434. package/dist/search/factory.d.ts +1 -2
  435. package/dist/search/factory.js +7 -7
  436. package/dist/search/index.d.ts +1 -2
  437. package/dist/search/index.js +13 -13
  438. package/dist/search/lancedb-backend.d.ts +1 -2
  439. package/dist/search/lancedb-backend.js +1 -1
  440. package/dist/search/meilisearch-backend.d.ts +1 -2
  441. package/dist/search/meilisearch-backend.js +1 -1
  442. package/dist/search/noop-backend.d.ts +1 -2
  443. package/dist/search/orama-backend.d.ts +1 -2
  444. package/dist/search/orama-backend.js +1 -1
  445. package/dist/search/port.d.ts +1 -2
  446. package/dist/search/remote-backend.d.ts +1 -2
  447. package/dist/secure-store/index.js +3 -3
  448. package/dist/{semantic-consolidation-CNFVBXFc.d.ts → semantic-consolidation-BiX68wZA.d.ts} +1 -1
  449. package/dist/semantic-consolidation.d.ts +2 -3
  450. package/dist/semantic-consolidation.js +29 -29
  451. package/dist/semantic-rule-promotion.js +28 -28
  452. package/dist/semantic-rule-verifier.d.ts +1 -2
  453. package/dist/semantic-rule-verifier.js +28 -28
  454. package/dist/{service-Bb-JIdQ0.d.ts → service-D5h2zZ0M.d.ts} +2 -2
  455. package/dist/session-observer-bands.d.ts +1 -2
  456. package/dist/session-observer-state.d.ts +1 -2
  457. package/dist/shared-context/manager.d.ts +1 -2
  458. package/dist/signal.d.ts +1 -2
  459. package/dist/source-agent-qualifier.d.ts +1 -2
  460. package/dist/source-agent-qualifier.js +35 -32
  461. package/dist/standup/build.d.ts +16 -0
  462. package/dist/standup/build.js +17 -0
  463. package/dist/standup/build.js.map +1 -0
  464. package/dist/{storage-CukrlNKk.d.ts → storage-CtsaojWD.d.ts} +1 -1
  465. package/dist/storage.d.ts +2 -3
  466. package/dist/storage.js +27 -27
  467. package/dist/subject-config.d.ts +1 -2
  468. package/dist/subject-config.js +5 -5
  469. package/dist/summarizer.d.ts +1 -2
  470. package/dist/summarizer.js +2 -2
  471. package/dist/summary-snapshot.d.ts +1 -2
  472. package/dist/support-passport/index.d.ts +16 -17
  473. package/dist/support-passport/index.js +57 -54
  474. package/dist/temporal-supersession.d.ts +2 -3
  475. package/dist/temporal-timeline-recall.d.ts +1 -2
  476. package/dist/temporal-validity.d.ts +1 -2
  477. package/dist/threading.d.ts +1 -2
  478. package/dist/tier-migration.d.ts +2 -3
  479. package/dist/tier-routing.d.ts +1 -2
  480. package/dist/tier-routing.js +2 -2
  481. package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
  482. package/dist/topics.d.ts +1 -2
  483. package/dist/transcript.d.ts +1 -2
  484. package/dist/transfer/capsule-import.js +4 -4
  485. package/dist/transfer/export-okf.d.ts +39 -0
  486. package/dist/transfer/export-okf.js +112 -0
  487. package/dist/transfer/export-okf.js.map +1 -0
  488. package/dist/trust-score-stage.d.ts +1 -2
  489. package/dist/trust-score.d.ts +1 -2
  490. package/dist/{types-djxQlxJ7.d.ts → types-CIpfYz1I.d.ts} +132 -12
  491. package/dist/types.d.ts +1 -2
  492. package/dist/types.js +1 -1
  493. package/dist/utility-runtime.d.ts +1 -2
  494. package/dist/verified-recall.js +28 -28
  495. package/dist/who-knows-cli.d.ts +11 -12
  496. package/dist/who-knows-cli.js +29 -29
  497. package/dist/who-knows.d.ts +11 -12
  498. package/dist/who-knows.js +28 -28
  499. package/dist/write-envelope.d.ts +1 -2
  500. package/dist/write-envelope.js +5 -5
  501. package/package.json +34 -3
  502. package/src/access-admin-ops-surface.ts +6 -1
  503. package/src/access-boundary.ts +1 -0
  504. package/src/access-http.ts +3 -1
  505. package/src/access-mcp-output-schemas.ts +1 -0
  506. package/src/access-mcp.ts +3 -3
  507. package/src/access-operations.ts +1 -0
  508. package/src/access-service-offline-file-content.test.ts +63 -0
  509. package/src/access-surface-catalog.ts +2 -0
  510. package/src/activity/config.test.ts +1 -0
  511. package/src/activity/config.ts +66 -1
  512. package/src/activity/index.ts +3 -0
  513. package/src/activity/journal.test.ts +97 -0
  514. package/src/activity/journal.ts +113 -0
  515. package/src/activity/privacy.test.ts +53 -0
  516. package/src/activity/privacy.ts +80 -0
  517. package/src/activity/timeline/build.ts +279 -0
  518. package/src/activity/timeline/categories.ts +111 -0
  519. package/src/activity/timeline/classify.ts +110 -0
  520. package/src/activity/timeline/corrections.ts +145 -0
  521. package/src/activity/timeline/index.ts +8 -0
  522. package/src/activity/timeline/journal-recap.test.ts +113 -0
  523. package/src/activity/timeline/journal-recap.ts +130 -0
  524. package/src/activity/timeline/query.test.ts +198 -0
  525. package/src/activity/timeline/query.ts +313 -0
  526. package/src/activity/timeline/timeline.test.ts +277 -0
  527. package/src/activity/timeline/types.ts +106 -0
  528. package/src/activity/timeline/weekly.test.ts +215 -0
  529. package/src/activity/timeline/weekly.ts +234 -0
  530. package/src/activity/types.ts +20 -0
  531. package/src/activity/vault-publish.test.ts +166 -0
  532. package/src/activity/vault-publish.ts +101 -0
  533. package/src/cli/okf-commands.ts +45 -0
  534. package/src/cli.ts +2 -2
  535. package/src/coding/export-okf-codegraph.test.ts +381 -0
  536. package/src/coding/export-okf-codegraph.ts +565 -0
  537. package/src/config.test.ts +1 -0
  538. package/src/config.ts +2 -22
  539. package/src/dedup/merge-on-write.test.ts +91 -0
  540. package/src/dedup/merge-on-write.ts +75 -0
  541. package/src/dedup/novelty-gate.test.ts +143 -0
  542. package/src/dedup/novelty-gate.ts +163 -0
  543. package/src/extraction-prompt-safety.test.ts +14 -2
  544. package/src/extraction.ts +21 -1
  545. package/src/fallback-llm.test.ts +134 -0
  546. package/src/fallback-llm.ts +77 -5
  547. package/src/location/access-operations.ts +17 -8
  548. package/src/location/backfill.ts +137 -0
  549. package/src/location/config.test.ts +3 -0
  550. package/src/location/config.ts +46 -2
  551. package/src/location/http-glue.ts +1 -1
  552. package/src/location/index.ts +3 -0
  553. package/src/location/intervals.ts +1 -0
  554. package/src/location/matching.test.ts +65 -0
  555. package/src/location/matching.ts +354 -0
  556. package/src/location/mcp-tools.ts +2 -1
  557. package/src/location/recall-exclusion.test.ts +1 -0
  558. package/src/location/surfaces.test.ts +15 -2
  559. package/src/location/surfaces.ts +95 -18
  560. package/src/location/tagging.test.ts +119 -0
  561. package/src/location/tagging.ts +277 -0
  562. package/src/location/types.ts +23 -1
  563. package/src/mcp-read-only-tools.ts +1 -0
  564. package/src/memory-projection-store.ts +3 -1
  565. package/src/okf/cli.ts +18 -5
  566. package/src/okf/config.ts +5 -0
  567. package/src/okf/index-files.test.ts +60 -0
  568. package/src/okf/index-files.ts +114 -0
  569. package/src/okf/render.ts +133 -0
  570. package/src/okf/type-mapping.test.ts +3 -0
  571. package/src/okf/type-mapping.ts +2 -0
  572. package/src/orchestration/extraction-persist.ts +22 -23
  573. package/src/orchestration/extraction-run.ts +2 -1
  574. package/src/orchestration/generic-recall-paths.ts +15 -3
  575. package/src/orchestration/recall-entry.ts +8 -3
  576. package/src/recall-deep.test.ts +72 -0
  577. package/src/recall-deep.ts +113 -0
  578. package/src/recall-navigate.test.ts +84 -0
  579. package/src/recall-navigate.ts +100 -0
  580. package/src/recall-state-view-wire.test.ts +35 -0
  581. package/src/recall-state-view-wire.ts +28 -0
  582. package/src/recall-state-view.test.ts +131 -0
  583. package/src/recall-state-view.ts +138 -0
  584. package/src/schemas.ts +17 -1
  585. package/src/shared-context/governance.test.ts +53 -0
  586. package/src/shared-context/governance.ts +86 -0
  587. package/src/standup/access-operations.ts +14 -0
  588. package/src/standup/build.test.ts +34 -0
  589. package/src/standup/build.ts +115 -0
  590. package/src/standup/http-glue.ts +15 -0
  591. package/src/standup/mcp-tools.ts +16 -0
  592. package/src/support-passport/card-projection.ts +1 -0
  593. package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
  594. package/src/support-passport/card-service.test.ts +75 -1
  595. package/src/support-passport/card-service.ts +6 -3
  596. package/src/support-passport/card-state.ts +5 -1
  597. package/src/support-passport/offline-sync-guard.ts +14 -1
  598. package/src/transfer/export-okf.test.ts +164 -0
  599. package/src/transfer/export-okf.ts +286 -0
  600. package/src/types.ts +3 -10
  601. package/dist/chunk-2LWQSV6A.js.map +0 -1
  602. package/dist/chunk-3BCULS4U.js.map +0 -1
  603. package/dist/chunk-7BDZTALN.js.map +0 -1
  604. package/dist/chunk-7PHI6GUI.js.map +0 -1
  605. package/dist/chunk-7WOWGRAU.js.map +0 -1
  606. package/dist/chunk-AX7UXCHJ.js.map +0 -1
  607. package/dist/chunk-DEACDKE3.js.map +0 -1
  608. package/dist/chunk-FP7YTTVO.js.map +0 -1
  609. package/dist/chunk-JYSN42VN.js.map +0 -1
  610. package/dist/chunk-KZIF6XHX.js.map +0 -1
  611. package/dist/chunk-LKYIOCWL.js.map +0 -1
  612. package/dist/chunk-OXRRJXPR.js.map +0 -1
  613. package/dist/chunk-U7EW2W4W.js.map +0 -1
  614. package/dist/chunk-UW5NPZJ2.js.map +0 -1
  615. package/dist/chunk-XAB6STPO.js.map +0 -1
  616. package/dist/chunk-XNWXSGHS.js.map +0 -1
  617. package/dist/types-CM86alG1.d.ts +0 -89
  618. /package/dist/{auto-sync-2YPITIWN.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
  619. /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
  620. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  621. /package/dist/{chunk-TFR3HG4K.js.map → chunk-2FA7U5XY.js.map} +0 -0
  622. /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
  623. /package/dist/{chunk-MY2BC6UE.js.map → chunk-2X6BGKQL.js.map} +0 -0
  624. /package/dist/{chunk-UEBDCMOO.js.map → chunk-3TSU662L.js.map} +0 -0
  625. /package/dist/{chunk-S5XOSTYM.js.map → chunk-4XLTUR6R.js.map} +0 -0
  626. /package/dist/{chunk-BWGCOLEL.js.map → chunk-65JOGLIS.js.map} +0 -0
  627. /package/dist/{chunk-HMZKGHMD.js.map → chunk-7UOXCCCI.js.map} +0 -0
  628. /package/dist/{chunk-4F4AQFWL.js.map → chunk-B4AOWRYF.js.map} +0 -0
  629. /package/dist/{chunk-ODU2CNNX.js.map → chunk-C5IUOBCN.js.map} +0 -0
  630. /package/dist/{chunk-3A2NJP2U.js.map → chunk-CHGG74CY.js.map} +0 -0
  631. /package/dist/{chunk-76DIF5KT.js.map → chunk-CX4OLNIH.js.map} +0 -0
  632. /package/dist/{chunk-Z3YEGSR4.js.map → chunk-D3UXGE5D.js.map} +0 -0
  633. /package/dist/{chunk-5HK3CJAR.js.map → chunk-D6Q5EPOV.js.map} +0 -0
  634. /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
  635. /package/dist/{chunk-XBGHAAKR.js.map → chunk-DDX6KIXF.js.map} +0 -0
  636. /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
  637. /package/dist/{chunk-7KQB4EBS.js.map → chunk-DUAJKRR2.js.map} +0 -0
  638. /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
  639. /package/dist/{chunk-DPCXDG7G.js.map → chunk-EH65UV2Z.js.map} +0 -0
  640. /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
  641. /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
  642. /package/dist/{chunk-TUHBYJXL.js.map → chunk-EWKVYCFP.js.map} +0 -0
  643. /package/dist/{chunk-NPFUNWNX.js.map → chunk-FFUMTH27.js.map} +0 -0
  644. /package/dist/{chunk-3PKAS6VL.js.map → chunk-GAJK3DQ5.js.map} +0 -0
  645. /package/dist/{chunk-DA7ITC5Z.js.map → chunk-GBEOUCBB.js.map} +0 -0
  646. /package/dist/{chunk-UENKPWCS.js.map → chunk-H2IRSXZN.js.map} +0 -0
  647. /package/dist/{chunk-CFVTRUR3.js.map → chunk-H6RSANGQ.js.map} +0 -0
  648. /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
  649. /package/dist/{chunk-3SZD4CYO.js.map → chunk-IGZCAHFL.js.map} +0 -0
  650. /package/dist/{chunk-UPFNQJC7.js.map → chunk-INUBU6I5.js.map} +0 -0
  651. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-J2R275FN.js.map} +0 -0
  652. /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
  653. /package/dist/{chunk-5ACCD4L7.js.map → chunk-JRRQ747T.js.map} +0 -0
  654. /package/dist/{chunk-V4IDF3EZ.js.map → chunk-JTWZKNUH.js.map} +0 -0
  655. /package/dist/{chunk-AZMLH5UT.js.map → chunk-KI64TTBL.js.map} +0 -0
  656. /package/dist/{chunk-NPIBN2VL.js.map → chunk-LK4TOYPU.js.map} +0 -0
  657. /package/dist/{chunk-UTQUEHC7.js.map → chunk-LUDBXTBJ.js.map} +0 -0
  658. /package/dist/{chunk-PU56CXZA.js.map → chunk-LYUUA6QB.js.map} +0 -0
  659. /package/dist/{chunk-P36Z4JRA.js.map → chunk-M5ERTI4I.js.map} +0 -0
  660. /package/dist/{chunk-LDKPDODJ.js.map → chunk-ME35HVDJ.js.map} +0 -0
  661. /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
  662. /package/dist/{chunk-AHPIFKNG.js.map → chunk-N4F7ZSSG.js.map} +0 -0
  663. /package/dist/{chunk-JOZUBF4A.js.map → chunk-NACLNNFQ.js.map} +0 -0
  664. /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
  665. /package/dist/{chunk-T7XP6IZE.js.map → chunk-NFP4KPTA.js.map} +0 -0
  666. /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
  667. /package/dist/{chunk-LPNCR4QK.js.map → chunk-NSTNGMSS.js.map} +0 -0
  668. /package/dist/{chunk-5RWZH6PH.js.map → chunk-NUF7VSEX.js.map} +0 -0
  669. /package/dist/{chunk-7VZFRUQU.js.map → chunk-O7ERGZDA.js.map} +0 -0
  670. /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
  671. /package/dist/{chunk-5DHKCO52.js.map → chunk-OJUEUQDJ.js.map} +0 -0
  672. /package/dist/{chunk-LOXHYCVS.js.map → chunk-OMX6TKXH.js.map} +0 -0
  673. /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
  674. /package/dist/{chunk-SEEJOGQX.js.map → chunk-QBNE55VA.js.map} +0 -0
  675. /package/dist/{chunk-F7XUD3PL.js.map → chunk-S4CDUXQY.js.map} +0 -0
  676. /package/dist/{chunk-WNXYT4MK.js.map → chunk-S4Z2OBTX.js.map} +0 -0
  677. /package/dist/{chunk-UL4MKZHI.js.map → chunk-SN4JXNLL.js.map} +0 -0
  678. /package/dist/{chunk-CAMNRAJF.js.map → chunk-SZMYGDSM.js.map} +0 -0
  679. /package/dist/{chunk-CPA5NBHN.js.map → chunk-TNGH4ZYI.js.map} +0 -0
  680. /package/dist/{chunk-F3NVYTTA.js.map → chunk-TNXNECAN.js.map} +0 -0
  681. /package/dist/{chunk-BEC4YBNA.js.map → chunk-TVW4C7PV.js.map} +0 -0
  682. /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
  683. /package/dist/{chunk-4QEYREAV.js.map → chunk-U6NGKS32.js.map} +0 -0
  684. /package/dist/{chunk-HRHO3ZNG.js.map → chunk-UW4RYPWC.js.map} +0 -0
  685. /package/dist/{chunk-T6ILXUAH.js.map → chunk-VG4SSPAW.js.map} +0 -0
  686. /package/dist/{chunk-H2YSH3DG.js.map → chunk-WKAXBXVA.js.map} +0 -0
  687. /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
  688. /package/dist/{chunk-UNUMFURP.js.map → chunk-X5PIDJ3L.js.map} +0 -0
  689. /package/dist/{chunk-CRML27CO.js.map → chunk-X5YYSAZX.js.map} +0 -0
  690. /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
  691. /package/dist/{chunk-OA2O2GJ4.js.map → chunk-XOHYGIWF.js.map} +0 -0
  692. /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
  693. /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
  694. /package/dist/{chunk-MDD2RINF.js.map → chunk-YWPLOJ7T.js.map} +0 -0
  695. /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
  696. /package/dist/{chunk-GTO56JY5.js.map → chunk-ZPS724LT.js.map} +0 -0
  697. /package/dist/{chunk-SNOIKAHM.js.map → chunk-ZZZWEDF4.js.map} +0 -0
  698. /package/dist/{contradiction-scan-AKUWPX5N.js.map → contradiction-scan-NOYMFG66.js.map} +0 -0
  699. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
  700. /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
  701. /package/dist/{resolution-XWBPKYFB.js.map → recall-state-view-wire.js.map} +0 -0
  702. /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Core location matcher (issue #2046) — the ONE place that decides whether a
3
+ * memory or wearable conversation gets provider location context.
4
+ *
5
+ * Pure and deterministic: no IO, no clocks, no randomness. Inputs are UTC
6
+ * ISO-8601 instants and half-open [start, end) intervals everywhere.
7
+ *
8
+ * Rules (issue #2046 / umbrella #2043 decision D):
9
+ * 1. A valid memory interval is required — derived ONLY from the memory's own
10
+ * bi-temporal frontmatter (`valid_at` / `observedAt` / `invalid_at`), never
11
+ * from wall-clock time or message order. Untimed memories stay untagged.
12
+ * 2. Intervals longer than 24h describe long-lived facts, not events at a
13
+ * place; they stay untagged.
14
+ * 3. A place is tagged only when it is DOMINANT (strictly the longest overlap
15
+ * among candidate places; ties are conflicts and leave the memory untagged)
16
+ * and meets `minimumOverlapSeconds` and `minimumConfidence`.
17
+ * 4. Only resolved named places participate (`kind` home/work/poi): transit
18
+ * legs and unnamed visits never tag a memory.
19
+ * 5. No address is ever inferred from text, coordinates, IP, or proximity —
20
+ * only provider-supplied place metadata is echoed, and coordinates only
21
+ * when `retainCoordinates` is enabled.
22
+ *
23
+ * Provider-owned metadata contract: the tag is `location:<stable-place-slug>`
24
+ * and the opaque provider place id lives in structured attributes. Every
25
+ * field the matcher writes is provider-owned; a memory that carries
26
+ * location-ish metadata WITHOUT the `locationSource` marker is treated as
27
+ * manual/user-authored and is never touched.
28
+ */
29
+
30
+ import { TAG_LIMITS, STRUCTURED_ATTRIBUTE_LIMITS } from "../write-envelope.js";
31
+ import type { LocationPlace, LocationSegment } from "./types.js";
32
+
33
+ /** Maximum memory span eligible for location tagging. */
34
+ export const LOCATION_MATCH_MAX_MEMORY_SPAN_MS = 24 * 60 * 60 * 1000;
35
+
36
+ /** Prefix of provider-owned location tags. */
37
+ export const LOCATION_TAG_PREFIX = "location:";
38
+
39
+ /** Structured-attribute keys owned by the tagging pipeline (never manual). */
40
+ export const LOCATION_ATTRIBUTE_KEYS = [
41
+ "locationSource",
42
+ "locationPlaceId",
43
+ "locationPlace",
44
+ "locationConfidence",
45
+ "locationVisitStart",
46
+ "locationVisitEnd",
47
+ "locationLatitude",
48
+ "locationLongitude",
49
+ ] as const;
50
+
51
+ /** Place kinds eligible for tagging: resolved, named places only. */
52
+ const TAGGABLE_PLACE_KINDS: Record<string, true> = { home: true, work: true, poi: true };
53
+
54
+ export interface LocationTagPolicy {
55
+ minimumOverlapSeconds: number;
56
+ minimumConfidence: number;
57
+ retainCoordinates: boolean;
58
+ }
59
+
60
+ /** The memory side of a match: a half-open interval, or a single instant. */
61
+ export type MemoryLocationWindow =
62
+ | { kind: "interval"; startUtc: string; endUtc: string }
63
+ | { kind: "instant"; atUtc: string };
64
+
65
+ /** Why a window was rejected before matching. */
66
+ export type WindowRejectReason = "untimed" | "span-too-long";
67
+
68
+ export interface WindowResult {
69
+ window?: MemoryLocationWindow;
70
+ /** Local days (YYYY-MM-DD in the tag policy timezone) the window touches. */
71
+ days?: string[];
72
+ rejected?: WindowRejectReason;
73
+ }
74
+
75
+ /**
76
+ * Derive the match window from a memory's own frontmatter. `validAt` (the
77
+ * event start; assumed copies carry the ingestion anchor) opens the window;
78
+ * `invalid_at` closes it. An end-only memory (no start bound) is untimed.
79
+ */
80
+ export function memoryLocationWindow(
81
+ frontmatter: { valid_at?: string; observedAt?: string; invalid_at?: string },
82
+ localDay: (instantUtc: string) => string,
83
+ ): WindowResult {
84
+ const start = frontmatter.valid_at ?? frontmatter.observedAt;
85
+ if (start === undefined || Number.isNaN(Date.parse(start))) {
86
+ return { rejected: "untimed" };
87
+ }
88
+ const end = frontmatter.invalid_at;
89
+ if (end === undefined || Number.isNaN(Date.parse(end)) || Date.parse(end) <= Date.parse(start)) {
90
+ return { window: { kind: "instant", atUtc: start }, days: [localDay(start)] };
91
+ }
92
+ if (Date.parse(end) - Date.parse(start) > LOCATION_MATCH_MAX_MEMORY_SPAN_MS) {
93
+ return { rejected: "span-too-long" };
94
+ }
95
+ // The interval is half-open [start, end): its last instant is end-1ms, so a
96
+ // memory ending exactly at local midnight never touches the next day.
97
+ const lastInstant = new Date(Date.parse(end) - 1).toISOString();
98
+ const days = [localDay(start)];
99
+ const endDay = localDay(lastInstant);
100
+ if (endDay !== days[0]) days.push(endDay);
101
+ return { window: { kind: "interval", startUtc: start, endUtc: end }, days };
102
+ }
103
+
104
+ /** One source's segments for a day, keyed by the configured source id. */
105
+ export interface LocationSourceSegments {
106
+ sourceId: string;
107
+ segments: LocationSegment[];
108
+ }
109
+
110
+ export interface LocationMatch {
111
+ sourceId: string;
112
+ place: LocationPlace;
113
+ /** Overlap (ms) with the window — interval mode; see `visitMs` otherwise. */
114
+ overlapMs: number;
115
+ /** Total dwell (ms) of the dominant place inside the window's day(s). */
116
+ visitMs: number;
117
+ /** Minimum contributing segment confidence, when any source reported one. */
118
+ confidence?: number;
119
+ /** Envelope [start, end) of the segments that produced the match. */
120
+ visitStartUtc: string;
121
+ visitEndUtc: string;
122
+ }
123
+
124
+ export type MatchOutcome =
125
+ | { status: "matched"; match: LocationMatch }
126
+ | { status: "unmatched"; reason: "no-overlap" | "ambiguous" | "below-minimum-overlap" | "below-minimum-confidence" };
127
+
128
+ interface PlaceAccumulator {
129
+ sourceId: string;
130
+ place: LocationPlace;
131
+ overlapMs: number;
132
+ visitMs: number;
133
+ confidence: number | undefined;
134
+ startUtc: string;
135
+ endUtc: string;
136
+ }
137
+
138
+ function overlapMsOf(
139
+ window: MemoryLocationWindow,
140
+ segment: { startUtc: string; endUtc: string },
141
+ ): number {
142
+ if (window.kind === "instant") {
143
+ const at = Date.parse(window.atUtc);
144
+ return at >= Date.parse(segment.startUtc) && at < Date.parse(segment.endUtc) ? 1 : 0;
145
+ }
146
+ return Math.max(
147
+ 0,
148
+ Math.min(Date.parse(window.endUtc), Date.parse(segment.endUtc)) -
149
+ Math.max(Date.parse(window.startUtc), Date.parse(segment.startUtc)),
150
+ );
151
+ }
152
+
153
+ /**
154
+ * The dominant qualifying place for a window, across every source's
155
+ * segments. Deterministic: strict overlap comparison, ties (conflicts) are
156
+ * rejected, and equal-place contributions merge across sources.
157
+ */
158
+ export function matchDominantPlace(
159
+ window: MemoryLocationWindow,
160
+ sources: readonly LocationSourceSegments[],
161
+ policy: LocationTagPolicy,
162
+ ): MatchOutcome {
163
+ const byPlace = new Map<string, PlaceAccumulator>();
164
+ for (const source of sources) {
165
+ for (const segment of source.segments) {
166
+ if (TAGGABLE_PLACE_KINDS[segment.place.kind ?? ""] !== true) continue;
167
+ const overlap = overlapMsOf(window, segment);
168
+ if (overlap <= 0) continue;
169
+ const duration = Date.parse(segment.endUtc) - Date.parse(segment.startUtc);
170
+ const existing = byPlace.get(segment.place.id);
171
+ if (existing === undefined) {
172
+ byPlace.set(segment.place.id, {
173
+ sourceId: source.sourceId,
174
+ place: segment.place,
175
+ overlapMs: overlap,
176
+ visitMs: duration,
177
+ confidence: segment.confidence,
178
+ startUtc: segment.startUtc,
179
+ endUtc: segment.endUtc,
180
+ });
181
+ continue;
182
+ }
183
+ // Same place from another source (or a revisit): accumulate.
184
+ existing.overlapMs += overlap;
185
+ existing.visitMs += duration;
186
+ existing.confidence =
187
+ existing.confidence === undefined
188
+ ? segment.confidence
189
+ : segment.confidence === undefined
190
+ ? existing.confidence
191
+ : Math.min(existing.confidence, segment.confidence);
192
+ if (segment.startUtc < existing.startUtc) existing.startUtc = segment.startUtc;
193
+ if (segment.endUtc > existing.endUtc) existing.endUtc = segment.endUtc;
194
+ }
195
+ }
196
+ if (byPlace.size === 0) return { status: "unmatched", reason: "no-overlap" };
197
+
198
+ let best: PlaceAccumulator | null = null;
199
+ let tie = false;
200
+ for (const candidate of byPlace.values()) {
201
+ if (best === null || candidate.overlapMs > best.overlapMs) {
202
+ best = candidate;
203
+ tie = false;
204
+ continue;
205
+ }
206
+ if (candidate.overlapMs === best.overlapMs) tie = true;
207
+ }
208
+ if (best === null || tie) return { status: "unmatched", reason: "ambiguous" };
209
+
210
+ const overlapForThreshold = window.kind === "instant" ? best.visitMs : best.overlapMs;
211
+ if (policy.minimumOverlapSeconds > 0 && overlapForThreshold < policy.minimumOverlapSeconds * 1000) {
212
+ return { status: "unmatched", reason: "below-minimum-overlap" };
213
+ }
214
+ if (best.confidence !== undefined && best.confidence < policy.minimumConfidence) {
215
+ return { status: "unmatched", reason: "below-minimum-confidence" };
216
+ }
217
+ return {
218
+ status: "matched",
219
+ match: {
220
+ sourceId: best.sourceId,
221
+ place: best.place,
222
+ overlapMs: best.overlapMs,
223
+ visitMs: best.visitMs,
224
+ ...(best.confidence !== undefined ? { confidence: best.confidence } : {}),
225
+ visitStartUtc: best.startUtc,
226
+ visitEndUtc: best.endUtc,
227
+ },
228
+ };
229
+ }
230
+
231
+ /** Deterministic tag slug for a provider place id (`reitti:place:7` → `reitti-place-7`). */
232
+ export function locationTagSlug(placeId: string): string {
233
+ const slug = placeId
234
+ .toLowerCase()
235
+ .replace(/[^a-z0-9]+/g, "-")
236
+ .replace(/^-+|-+$/g, "");
237
+ return slug.slice(0, TAG_LIMITS.maxTagLength - LOCATION_TAG_PREFIX.length);
238
+ }
239
+
240
+ /** The provider-owned tag for a matched place. */
241
+ export function locationTagForPlace(placeId: string): string {
242
+ return `${LOCATION_TAG_PREFIX}${locationTagSlug(placeId)}`;
243
+ }
244
+
245
+ function boundedAttributeValue(value: string): string {
246
+ return value.slice(0, STRUCTURED_ATTRIBUTE_LIMITS.maxValueLength);
247
+ }
248
+
249
+ /** Provider-owned structured attributes describing a match. */
250
+ export function locationAttributesForMatch(
251
+ match: LocationMatch,
252
+ policy: LocationTagPolicy,
253
+ ): Record<string, string> {
254
+ const attributes: Record<string, string> = {
255
+ locationSource: match.sourceId,
256
+ locationPlaceId: boundedAttributeValue(match.place.id),
257
+ locationPlace: boundedAttributeValue(match.place.label),
258
+ ...(match.confidence !== undefined ? { locationConfidence: match.confidence.toFixed(3) } : {}),
259
+ locationVisitStart: match.visitStartUtc,
260
+ locationVisitEnd: match.visitEndUtc,
261
+ };
262
+ if (policy.retainCoordinates && match.place.latitude !== undefined && match.place.longitude !== undefined) {
263
+ attributes.locationLatitude = String(match.place.latitude);
264
+ attributes.locationLongitude = String(match.place.longitude);
265
+ }
266
+ return attributes;
267
+ }
268
+
269
+ export interface LocationUpdatePlan {
270
+ /** Patch for `writeMemoryFrontmatter`; absent when nothing changes. */
271
+ patch?: { tags: string[]; structuredAttributes: Record<string, string> };
272
+ /** Outcome for reporting. */
273
+ outcome:
274
+ | "tagged"
275
+ | "updated"
276
+ | "removed"
277
+ | "unchanged"
278
+ | "manual-metadata"
279
+ | "unmatched"
280
+ | "untimed"
281
+ | "span-too-long";
282
+ }
283
+
284
+ function frontmatterHasLocationMetadata(
285
+ frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },
286
+ ): boolean {
287
+ if ((frontmatter.tags ?? []).some((tag) => tag.startsWith(LOCATION_TAG_PREFIX))) return true;
288
+ return Object.keys(frontmatter.structuredAttributes ?? {}).some((key) =>
289
+ (LOCATION_ATTRIBUTE_KEYS as readonly string[]).includes(key),
290
+ );
291
+ }
292
+
293
+ function isProviderOwned(frontmatter: { structuredAttributes?: Record<string, string> }): boolean {
294
+ const source = frontmatter.structuredAttributes?.locationSource;
295
+ return typeof source === "string" && source.length > 0;
296
+ }
297
+
298
+ /**
299
+ * Plan the provider-owned update for one memory: a match adds/replaces ONLY
300
+ * provider-owned fields; a lost match removes them (corrected observations);
301
+ * manual location metadata (no `locationSource` marker) always wins and is
302
+ * never touched. Unrelated tags and attributes survive every path.
303
+ */
304
+ export function planLocationUpdate(
305
+ frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },
306
+ outcome: MatchOutcome,
307
+ policy: LocationTagPolicy,
308
+ ): LocationUpdatePlan {
309
+ if (frontmatterHasLocationMetadata(frontmatter) && !isProviderOwned(frontmatter)) {
310
+ return { outcome: "manual-metadata" };
311
+ }
312
+ const tags = [...(frontmatter.tags ?? [])];
313
+ const attributes = { ...(frontmatter.structuredAttributes ?? {}) };
314
+ const providerTagIndex = tags.findIndex((tag) => tag.startsWith(LOCATION_TAG_PREFIX));
315
+ const stripProviderFields = (): void => {
316
+ if (providerTagIndex >= 0) tags.splice(providerTagIndex, 1);
317
+ for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];
318
+ };
319
+
320
+ if (outcome.status !== "matched") {
321
+ if (!isProviderOwned(frontmatter)) return { outcome: "unmatched" };
322
+ if (providerTagIndex < 0 && !("locationPlaceId" in attributes)) {
323
+ return { outcome: "unchanged" };
324
+ }
325
+ stripProviderFields();
326
+ return { patch: { tags, structuredAttributes: attributes }, outcome: "removed" };
327
+ }
328
+
329
+ const desiredTag = locationTagForPlace(outcome.match.place.id);
330
+ const desiredAttributes = locationAttributesForMatch(outcome.match, policy);
331
+ if (tags.length >= TAG_LIMITS.maxTags && providerTagIndex < 0) {
332
+ // Full tag budget with no provider slot to reuse — leave the memory alone.
333
+ return { outcome: "unchanged" };
334
+ }
335
+ const alreadyCurrent =
336
+ providerTagIndex >= 0 &&
337
+ tags[providerTagIndex] === desiredTag &&
338
+ LOCATION_ATTRIBUTE_KEYS.every((key) => {
339
+ const want = desiredAttributes[key];
340
+ const have = attributes[key];
341
+ return want === undefined ? have === undefined : have === want;
342
+ });
343
+ if (alreadyCurrent) return { outcome: "unchanged" };
344
+
345
+ if (providerTagIndex >= 0) tags[providerTagIndex] = desiredTag;
346
+ else tags.push(desiredTag);
347
+ for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];
348
+ Object.assign(attributes, desiredAttributes);
349
+ const wasProviderOwned = isProviderOwned(frontmatter);
350
+ return {
351
+ patch: { tags, structuredAttributes: attributes },
352
+ outcome: wasProviderOwned ? "updated" : "tagged",
353
+ };
354
+ }
@@ -55,12 +55,13 @@ export const LOCATION_MCP_TOOLS: McpTool[] = [
55
55
  {
56
56
  name: "engram.location_backfill",
57
57
  description:
58
- "Sync an explicit historical day range (inclusive, capped at 90 days) for every enabled location provider. Same shared sync runner as location_sync; never makes an unbounded scan.",
58
+ "Sync an explicit historical day range (inclusive, capped at 90 days) for every enabled location provider, then re-tag overlapping memories with provider-owned location metadata (issue #2046; requires location.tagging.backfillEnabled). dryRun reports the memory changes without persisting anything — no day files, no memory patches. Never makes an unbounded scan and never calls the LLM.",
59
59
  inputSchema: {
60
60
  type: "object",
61
61
  properties: {
62
62
  from: { type: "string", description: "Range start day (YYYY-MM-DD)." },
63
63
  to: { type: "string", description: "Range end day (YYYY-MM-DD, inclusive)." },
64
+ dryRun: { type: "boolean", description: "Report only; persist nothing." },
64
65
  },
65
66
  required: ["from", "to"],
66
67
  additionalProperties: false,
@@ -17,6 +17,7 @@ test("isLocationDayPath matches only the top-level day-file shape", () => {
17
17
 
18
18
  test("isSearchExcludedPath keeps location day documents out of generic search and recall", () => {
19
19
  assert.equal(isSearchExcludedPath("locations/2026-08-17.md"), true);
20
+ assert.equal(isSearchExcludedPath("journal/2026-08-17.md"), true);
20
21
  assert.equal(
21
22
  isSearchExcludedPath("qmd://collection/locations/2026-08-17.md", {}, "qmd"),
22
23
  true,
@@ -194,7 +194,11 @@ test("validation is strict and shared: unknown flags, bad dates, bad ranges", as
194
194
 
195
195
  // Backfill range cap: 91 days rejects; 90 passes.
196
196
  assert.throws(() => parseLocationBackfillRange("2026-05-01", "2026-07-30"), /capped at 90 days/);
197
- assert.deepEqual(parseLocationBackfillRange("2026-05-02", "2026-07-30"), { endDate: "2026-07-30", days: 90 });
197
+ assert.deepEqual(parseLocationBackfillRange("2026-05-02", "2026-07-30"), {
198
+ from: "2026-05-02",
199
+ endDate: "2026-07-30",
200
+ days: 90,
201
+ });
198
202
  } finally {
199
203
  await rm(memoryDir, { recursive: true, force: true });
200
204
  }
@@ -206,7 +210,16 @@ test("backfill syncs the explicit range oldest-first; empty days are synced, not
206
210
  try {
207
211
  const out = io();
208
212
  const code = await runLocationCliCommand(
209
- { config: enabledConfig(), memoryDir },
213
+ {
214
+ config: parseLocationConfig({
215
+ enabled: true,
216
+ timezone: "UTC",
217
+ syncDays: 1,
218
+ sources: [{ id: "reitti" }],
219
+ tagging: { enabled: true, backfillEnabled: true },
220
+ }),
221
+ memoryDir,
222
+ },
210
223
  ["backfill", "--from", "2026-08-14", "--to", "2026-08-16", "--json"],
211
224
  out.cliIo,
212
225
  );
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Location surface runners (issue #2047) — ONE implementation shared by the
3
- * CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the
2
+ * Location surface runners (issues #2047, #2046) — ONE implementation shared
3
+ * by the CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the
4
4
  * scheduler, so no surface can fork validation or disabled/empty/failure
5
5
  * semantics (same rule as the wearables runner). Parsing here is strict:
6
6
  * unknown flags reject with the valid list, invalid values reject loudly.
@@ -15,23 +15,24 @@ import {
15
15
  type LocationStatusReport,
16
16
  } from "./cli.js";
17
17
  import { isValidLocationDate } from "./intervals.js";
18
+ import { backfillLocationTags, type LocationBackfillReport } from "./backfill.js";
18
19
  import type { LocationSourceSyncResult } from "./pipeline.js";
19
20
  import { ensureConfiguredLocationProviders } from "./provider-setup.js";
20
21
  import { parseLocationDaySummary, readLocationDay } from "./store.js";
21
22
  import type { LocationConfig } from "./types.js";
23
+ import type { StorageManager } from "../index.js";
22
24
 
23
25
  export interface LocationSurfaceDeps {
24
26
  config: LocationConfig;
25
27
  memoryDir: string;
28
+ /**
29
+ * Memory storage for tag backfill (default-namespace store). Optional so
30
+ * pure day-sync surfaces (status/check/day) never construct one; hosts
31
+ * that expose backfill provide it (issue #2046).
32
+ */
33
+ getMemoryStorage?: () => Promise<StorageManager>;
26
34
  }
27
35
 
28
- export interface LocationSyncRun {
29
- date: string;
30
- results: LocationSourceSyncResult[];
31
- }
32
-
33
- export type LocationSyncRuns = LocationSyncRun[];
34
-
35
36
  export async function runLocationStatus(
36
37
  deps: LocationSurfaceDeps,
37
38
  ): Promise<LocationStatusReport> {
@@ -39,6 +40,12 @@ export async function runLocationStatus(
39
40
  return locationStatus(deps.config, deps.memoryDir);
40
41
  }
41
42
 
43
+ export interface LocationSyncRun {
44
+ date: string;
45
+ results: LocationSourceSyncResult[];
46
+ }
47
+
48
+ export type LocationSyncRuns = LocationSyncRun[];
42
49
  export async function runLocationCheck(
43
50
  deps: LocationSurfaceDeps,
44
51
  signal?: AbortSignal,
@@ -113,7 +120,7 @@ function validatedSyncWindow(request: { endDate?: string; days?: number }): {
113
120
  export function parseLocationBackfillRange(
114
121
  rawFrom: unknown,
115
122
  rawTo: unknown,
116
- ): { endDate: string; days: number } {
123
+ ): { from: string; endDate: string; days: number } {
117
124
  const from = requireLocationDate(rawFrom, "from");
118
125
  const to = requireLocationDate(rawTo, "to");
119
126
  const fromMs = Date.parse(`${from}T00:00:00Z`);
@@ -125,7 +132,48 @@ export function parseLocationBackfillRange(
125
132
  if (days > 90) {
126
133
  throw new EngramAccessInputError("location: backfill range is capped at 90 days");
127
134
  }
128
- return { endDate: to, days };
135
+ return { from, endDate: to, days };
136
+ }
137
+
138
+ export interface LocationBackfillResult {
139
+ /** Per-day provider sync results (empty under `dryRun`). */
140
+ days: LocationSyncRuns;
141
+ /** Memory re-tag report; absent when no memory storage was provided. */
142
+ memory?: LocationBackfillReport;
143
+ }
144
+
145
+ /**
146
+ * Backfill an explicit historical range (issue #2046): sync the days (unless
147
+ * `dryRun`, which persists NOTHING — not day files, not memory patches), then
148
+ * re-run the shared tagging core over the stored segments. Requires
149
+ * `location.enabled` + `location.tagging.enabled` +
150
+ * `location.tagging.backfillEnabled`.
151
+ */
152
+ export async function runLocationBackfill(
153
+ deps: LocationSurfaceDeps,
154
+ request: { from?: unknown; to?: unknown; dryRun?: boolean } = {},
155
+ ): Promise<LocationBackfillResult> {
156
+ const range = parseLocationBackfillRange(request.from, request.to);
157
+ if (!deps.config.enabled || !deps.config.tagging.enabled || !deps.config.tagging.backfillEnabled) {
158
+ throw new EngramAccessInputError(
159
+ "location: backfill requires location.enabled, location.tagging.enabled, and location.tagging.backfillEnabled",
160
+ );
161
+ }
162
+ await ensureConfiguredLocationProviders(deps.config);
163
+ const days =
164
+ request.dryRun === true ? [] : (await syncLocation({ ...deps, endDate: range.endDate, days: range.days })) as LocationSyncRuns;
165
+ let memory: LocationBackfillReport | undefined;
166
+ if (deps.getMemoryStorage !== undefined) {
167
+ memory = await backfillLocationTags({
168
+ storage: await deps.getMemoryStorage(),
169
+ memoryDir: deps.memoryDir,
170
+ config: deps.config,
171
+ from: range.from,
172
+ to: range.endDate,
173
+ dryRun: request.dryRun === true,
174
+ });
175
+ }
176
+ return { days, ...(memory !== undefined ? { memory } : {}) };
129
177
  }
130
178
 
131
179
  // ---------------------------------------------------------------------------
@@ -146,8 +194,12 @@ Commands:
146
194
  ending yesterday)
147
195
  --date <YYYY-MM-DD> End the window on this day (inclusive)
148
196
  --days <n> Window size, 1..90 (default: location.syncDays)
149
- backfill --from <date> --to <date>
197
+ backfill --from <date> --to <date> [--dry-run]
150
198
  Sync an explicit historical range (≤ 90 days)
199
+ and re-tag overlapping memories (requires
200
+ location.tagging.backfillEnabled). --dry-run
201
+ persists nothing: it only reports the memory
202
+ changes stored segments would produce.
151
203
  day <YYYY-MM-DD> Print one stored location day
152
204
 
153
205
  Add --json to status/sync/backfill/day for machine-readable output.
@@ -156,7 +208,7 @@ Credentials for built-in providers come from the environment:
156
208
  `;
157
209
 
158
210
  const VALUE_FLAGS = new Set(["--date", "--days", "--from", "--to"]);
159
- const BOOLEAN_FLAGS = new Set(["--json"]);
211
+ const BOOLEAN_FLAGS = new Set(["--json", "--dry-run"]);
160
212
 
161
213
  interface ParsedCliFlags {
162
214
  flags: Map<string, string | true>;
@@ -192,6 +244,26 @@ function parseCliFlags(args: string[]): ParsedCliFlags {
192
244
  return { flags, positional };
193
245
  }
194
246
 
247
+ function renderBackfillReport(io: LocationCliIo, report: LocationBackfillReport): void {
248
+ for (const day of report.days) {
249
+ if (day.emptyDay) {
250
+ io.stdout.write(`${day.date}: no stored location observations (empty day)\n`);
251
+ continue;
252
+ }
253
+ if (day.failed !== undefined) {
254
+ io.stdout.write(`${day.date}: FAILED — ${day.failed}\n`);
255
+ continue;
256
+ }
257
+ const c = day.counts;
258
+ io.stdout.write(
259
+ `${day.date}: ${c.tagged} tagged, ${c.updated} updated, ${c.removed} removed, ` +
260
+ `${c.unchanged} unchanged, ${c.unmatched} unmatched (incl. ambiguous), ` +
261
+ `${c.manual} manual, ${c.untimed} untimed, ${c.failed} failed, ` +
262
+ `${day.considered} considered${report.dryRun ? " (dry run)" : ""}\n`,
263
+ );
264
+ }
265
+ }
266
+
195
267
  function flagString(parsed: ParsedCliFlags, name: string): string | undefined {
196
268
  const value = parsed.flags.get(name);
197
269
  return typeof value === "string" ? value : undefined;
@@ -294,14 +366,19 @@ export async function runLocationCliCommand(
294
366
  }
295
367
  case "backfill": {
296
368
  const parsed = parseCliFlags(rest);
297
- const range = parseLocationBackfillRange(flagString(parsed, "--from"), flagString(parsed, "--to"));
298
- const runs = await runLocationSync(deps, range);
369
+ const result = await runLocationBackfill(deps, {
370
+ from: flagString(parsed, "--from"),
371
+ to: flagString(parsed, "--to"),
372
+ dryRun: parsed.flags.has("--dry-run"),
373
+ });
299
374
  if (parsed.flags.has("--json")) {
300
- io.stdout.write(`${JSON.stringify({ days: runs }, null, 2)}\n`);
375
+ io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
301
376
  } else {
302
- renderRuns(io, runs);
377
+ renderRuns(io, result.days);
378
+ if (result.memory !== undefined) renderBackfillReport(io, result.memory);
303
379
  }
304
- return anySourceFailed(runs) ? 1 : 0;
380
+ const memoryFailed = result.memory?.days.some((day) => day.failed !== undefined) === true;
381
+ return anySourceFailed(result.days) || memoryFailed ? 1 : 0;
305
382
  }
306
383
  case "day": {
307
384
  const parsed = parseCliFlags(rest);