@remnic/core 9.65.7 → 9.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (713) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -14
  2. package/dist/access-admin-ops-surface.js +65 -62
  3. package/dist/access-authorization-probe.d.ts +15 -14
  4. package/dist/access-authorization-probe.js +66 -63
  5. package/dist/access-boundary.d.ts +15 -14
  6. package/dist/access-boundary.js +65 -62
  7. package/dist/access-citation-namespace.js +3 -3
  8. package/dist/access-cli.js +182 -174
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +2 -2
  11. package/dist/access-coding-context-resolution.js +2 -2
  12. package/dist/access-extraction-force-flush.d.ts +15 -14
  13. package/dist/access-extraction-force-flush.js +65 -62
  14. package/dist/access-health-types.d.ts +2 -2
  15. package/dist/access-http-lcm-compaction.d.ts +15 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +15 -14
  17. package/dist/access-http-offline-stream.d.ts +15 -14
  18. package/dist/access-http-query.d.ts +3 -3
  19. package/dist/access-http-query.js +67 -64
  20. package/dist/access-http.d.ts +16 -15
  21. package/dist/access-http.js +87 -84
  22. package/dist/access-identity-continuity-surface.d.ts +13 -12
  23. package/dist/access-identity-continuity-surface.js +65 -62
  24. package/dist/access-lcm-surface.d.ts +15 -14
  25. package/dist/access-lcm-surface.js +65 -62
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +15 -14
  28. package/dist/access-mcp.js +77 -74
  29. package/dist/access-memory-search-fanout.d.ts +3 -3
  30. package/dist/{access-namespace-preflight-8VYKmRX0.d.ts → access-namespace-preflight-CLWUoMyW.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +4 -4
  32. package/dist/access-namespace-preflight.js +65 -62
  33. package/dist/access-observe-write-surface.d.ts +15 -14
  34. package/dist/access-observe-write-surface.js +65 -62
  35. package/dist/access-offline-manifest.d.ts +13 -12
  36. package/dist/access-offline-manifest.js +16 -16
  37. package/dist/access-operations-batch.js +69 -66
  38. package/dist/access-operations.d.ts +16 -15
  39. package/dist/access-operations.js +74 -71
  40. package/dist/access-recall-concurrency.d.ts +15 -14
  41. package/dist/access-recall-concurrency.js +65 -62
  42. package/dist/access-recall-response.d.ts +15 -14
  43. package/dist/access-recall-response.js +65 -62
  44. package/dist/access-recall-surface.d.ts +15 -14
  45. package/dist/access-recall-surface.js +65 -62
  46. package/dist/access-schema.js +7 -7
  47. package/dist/{access-service-Crk__Git.d.ts → access-service-CEUE1Isj.d.ts} +14 -14
  48. package/dist/access-service-helpers.d.ts +15 -14
  49. package/dist/access-service.d.ts +15 -14
  50. package/dist/access-service.js +65 -62
  51. package/dist/access-surface-catalog.d.ts +15 -14
  52. package/dist/access-surface-catalog.js +69 -64
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +6 -4
  55. package/dist/action-confidence.d.ts +2 -2
  56. package/dist/active-context-config.d.ts +27 -0
  57. package/dist/active-context-config.js +14 -0
  58. package/dist/active-context-transform.d.ts +267 -0
  59. package/dist/active-context-transform.js +31 -0
  60. package/dist/active-memory-bridge.d.ts +2 -2
  61. package/dist/active-memory-bridge.js +2 -2
  62. package/dist/active-recall.d.ts +2 -2
  63. package/dist/active-recall.js +17 -16
  64. package/dist/active-recall.js.map +1 -1
  65. package/dist/adapters/index.js +7 -7
  66. package/dist/adapters/registry.js +3 -3
  67. package/dist/ambient-provenance.d.ts +2 -2
  68. package/dist/artifact-search.d.ts +2 -2
  69. package/dist/{auto-sync-XVMLL2RH.js → auto-sync-Q6Q2FVSC.js} +10 -10
  70. package/dist/behavior-learner.d.ts +2 -2
  71. package/dist/behavior-signals.d.ts +2 -2
  72. package/dist/bootstrap.d.ts +13 -12
  73. package/dist/briefing-window.d.ts +5 -3
  74. package/dist/briefing.d.ts +5 -3
  75. package/dist/briefing.js +33 -33
  76. package/dist/buffer-surprise-report.d.ts +2 -2
  77. package/dist/buffer-turn-helpers.d.ts +2 -2
  78. package/dist/buffer.d.ts +5 -3
  79. package/dist/buffer.js +24 -8
  80. package/dist/bulk-import/index.d.ts +4 -4
  81. package/dist/calibration.d.ts +2 -2
  82. package/dist/calibration.js +1 -1
  83. package/dist/capabilities.d.ts +2 -2
  84. package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
  85. package/dist/{catalog-DybwVNW3.d.ts → catalog-D1HgugTA.d.ts} +1 -1
  86. package/dist/causal-behavior.d.ts +4 -4
  87. package/dist/causal-consolidation.d.ts +2 -2
  88. package/dist/causal-consolidation.js +34 -34
  89. package/dist/causal-trajectory-graph.d.ts +2 -2
  90. package/dist/{chunk-CFGU52XJ.js → chunk-23CVL7HS.js} +2 -2
  91. package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
  92. package/dist/{chunk-6CPUQ5D6.js → chunk-2LBAFHOQ.js} +15 -15
  93. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  94. package/dist/{chunk-IP4ZNT4U.js → chunk-33MFRY25.js} +2 -2
  95. package/dist/{chunk-VFYRYFLL.js → chunk-3TSU662L.js} +3 -3
  96. package/dist/chunk-43HUVDTD.js +114 -0
  97. package/dist/chunk-43HUVDTD.js.map +1 -0
  98. package/dist/{chunk-VXVZ2GM3.js → chunk-4FHRZD5T.js} +2 -2
  99. package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
  100. package/dist/chunk-4OFKZAJG.js.map +1 -0
  101. package/dist/{chunk-5VPQSRQO.js → chunk-4STAANV7.js} +3 -3
  102. package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
  103. package/dist/{chunk-LLQCM2U2.js → chunk-56IV4J5W.js} +617 -167
  104. package/dist/chunk-56IV4J5W.js.map +1 -0
  105. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  106. package/dist/{chunk-YKWFK7XA.js → chunk-6CEGSTBD.js} +7 -7
  107. package/dist/{chunk-I7EX6KSH.js → chunk-6QDXA26G.js} +264 -210
  108. package/dist/chunk-6QDXA26G.js.map +1 -0
  109. package/dist/{chunk-GEPACVWN.js → chunk-6RUHELWR.js} +3 -3
  110. package/dist/{chunk-ZAOHJDKH.js → chunk-72OIT7KS.js} +4 -4
  111. package/dist/{chunk-KQAFEZQX.js → chunk-7LCGFUMB.js} +4 -4
  112. package/dist/{chunk-7TCGNUVP.js → chunk-7UTDHQZ5.js} +3 -3
  113. package/dist/{chunk-5HK3CJAR.js → chunk-7XOG75AU.js} +3 -3
  114. package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
  115. package/dist/chunk-AJTG3CP7.js.map +1 -0
  116. package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
  117. package/dist/chunk-AL3UYZ5N.js.map +1 -0
  118. package/dist/chunk-B32WYRXX.js +77 -0
  119. package/dist/chunk-B32WYRXX.js.map +1 -0
  120. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  121. package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
  122. package/dist/{chunk-ACOC27BB.js → chunk-CN4VKV3S.js} +2 -2
  123. package/dist/{chunk-PMVPCZJZ.js → chunk-CTCGHNWN.js} +6 -6
  124. package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
  125. package/dist/{chunk-T42L3S6A.js → chunk-DDX6KIXF.js} +2 -2
  126. package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
  127. package/dist/{chunk-WTOZBZNN.js → chunk-DMEHOEC7.js} +6 -6
  128. package/dist/{chunk-OPPBTPUU.js → chunk-DUAJKRR2.js} +4 -4
  129. package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
  130. package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
  131. package/dist/{chunk-SVVIASVX.js → chunk-EFQCDJZ2.js} +7 -7
  132. package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
  133. package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
  134. package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
  135. package/dist/{chunk-Z4U3UN56.js → chunk-EZSCW4EM.js} +6 -6
  136. package/dist/{chunk-F6QHHRWP.js → chunk-FESUGFIL.js} +3 -3
  137. package/dist/{chunk-S3K2CIK5.js → chunk-FKKGCGYL.js} +3 -3
  138. package/dist/{chunk-BWGCOLEL.js → chunk-FTTJRVB7.js} +2 -2
  139. package/dist/{chunk-JAQXUGLN.js → chunk-FYWLSFFS.js} +2 -2
  140. package/dist/{chunk-BJTHRFFC.js → chunk-GEJKYA7D.js} +77 -36
  141. package/dist/chunk-GEJKYA7D.js.map +1 -0
  142. package/dist/chunk-GSKINLAK.js +267 -0
  143. package/dist/chunk-GSKINLAK.js.map +1 -0
  144. package/dist/{chunk-OPGL46PX.js → chunk-GX6FTSYH.js} +2 -2
  145. package/dist/{chunk-A32YEQAM.js → chunk-H7VDIF2V.js} +2 -2
  146. package/dist/{chunk-PDDSFELN.js → chunk-HJXA6ZM7.js} +2 -2
  147. package/dist/{chunk-RGCF4XNH.js → chunk-HNPE66LB.js} +8 -8
  148. package/dist/{chunk-SEA6M7SS.js → chunk-I5VB44ZK.js} +2 -2
  149. package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
  150. package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
  151. package/dist/{chunk-RQE4TITU.js → chunk-IHGMRDEE.js} +431 -1834
  152. package/dist/chunk-IHGMRDEE.js.map +1 -0
  153. package/dist/{chunk-3RI5Y7KU.js → chunk-IVIAHQBR.js} +2 -2
  154. package/dist/{chunk-7WR462EM.js → chunk-J3OND5QT.js} +4 -4
  155. package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
  156. package/dist/chunk-JALOAKSZ.js.map +1 -0
  157. package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
  158. package/dist/{chunk-DVYRD4HY.js → chunk-JRRQ747T.js} +36 -7
  159. package/dist/chunk-JRRQ747T.js.map +1 -0
  160. package/dist/{chunk-I32NKXE2.js → chunk-JTWZKNUH.js} +5 -5
  161. package/dist/chunk-K66OY4EI.js +202 -0
  162. package/dist/chunk-K66OY4EI.js.map +1 -0
  163. package/dist/{chunk-XAB6STPO.js → chunk-KODXCHXJ.js} +17 -3
  164. package/dist/chunk-KODXCHXJ.js.map +1 -0
  165. package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
  166. package/dist/chunk-KOLJJN5G.js.map +1 -0
  167. package/dist/{chunk-FMQ4MOQO.js → chunk-KXIXO76C.js} +32 -19
  168. package/dist/chunk-KXIXO76C.js.map +1 -0
  169. package/dist/{chunk-VKCAHCBI.js → chunk-L4X4PJYK.js} +2 -2
  170. package/dist/chunk-LB7WCZHY.js +553 -0
  171. package/dist/chunk-LB7WCZHY.js.map +1 -0
  172. package/dist/{chunk-W4BMEGQA.js → chunk-LUDBXTBJ.js} +8 -8
  173. package/dist/{chunk-I4343FIA.js → chunk-MAH64N55.js} +28 -10
  174. package/dist/chunk-MAH64N55.js.map +1 -0
  175. package/dist/{chunk-RIAM7DND.js → chunk-ME35HVDJ.js} +2 -2
  176. package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
  177. package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
  178. package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
  179. package/dist/chunk-MINHJ55X.js.map +1 -0
  180. package/dist/{chunk-NG3MBQV4.js → chunk-MJRGVXPQ.js} +2 -2
  181. package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
  182. package/dist/{chunk-7F27PCSN.js → chunk-MN5NOOI7.js} +2 -2
  183. package/dist/{chunk-JCWY73FK.js → chunk-N4F7ZSSG.js} +2 -2
  184. package/dist/{chunk-TR7DGXGI.js → chunk-NACLNNFQ.js} +5 -5
  185. package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
  186. package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
  187. package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
  188. package/dist/{chunk-IY7UXD3J.js → chunk-O57GM3FR.js} +2 -2
  189. package/dist/{chunk-I2HTKOOP.js → chunk-O7ERGZDA.js} +5 -5
  190. package/dist/{chunk-GTSVEEP3.js → chunk-OAJMQKQR.js} +3 -3
  191. package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
  192. package/dist/{chunk-D4QVPP3G.js → chunk-PEBH5DCK.js} +18 -11
  193. package/dist/chunk-PEBH5DCK.js.map +1 -0
  194. package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
  195. package/dist/{chunk-EOHKUWXW.js → chunk-QCRJMU5V.js} +2 -2
  196. package/dist/chunk-QJCWK2A7.js +1466 -0
  197. package/dist/chunk-QJCWK2A7.js.map +1 -0
  198. package/dist/{chunk-THG4GYIE.js → chunk-RDGKVH6T.js} +11 -7
  199. package/dist/{chunk-THG4GYIE.js.map → chunk-RDGKVH6T.js.map} +1 -1
  200. package/dist/{chunk-5DH6PG4B.js → chunk-RZ3IZIJG.js} +3 -3
  201. package/dist/{chunk-AAXJNINV.js → chunk-SN4JXNLL.js} +2 -2
  202. package/dist/chunk-TB2MJRI6.js +866 -0
  203. package/dist/chunk-TB2MJRI6.js.map +1 -0
  204. package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
  205. package/dist/chunk-TEZ2HTC7.js.map +1 -0
  206. package/dist/{chunk-SVSRPG6M.js → chunk-TNGH4ZYI.js} +2 -2
  207. package/dist/{chunk-HZNYJN77.js → chunk-TNXNECAN.js} +6 -6
  208. package/dist/{chunk-JOEJG4SD.js → chunk-TVW4C7PV.js} +5 -5
  209. package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
  210. package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
  211. package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
  212. package/dist/chunk-UYA36DQ7.js.map +1 -0
  213. package/dist/{chunk-AFR6AIM4.js → chunk-VCKWULAK.js} +112 -87
  214. package/dist/chunk-VCKWULAK.js.map +1 -0
  215. package/dist/chunk-VOSWUO3K.js +100 -0
  216. package/dist/chunk-VOSWUO3K.js.map +1 -0
  217. package/dist/{chunk-YRVAKONL.js → chunk-VQ4AMTGZ.js} +1 -1
  218. package/dist/{chunk-3BCULS4U.js → chunk-VQNRICAQ.js} +145 -507
  219. package/dist/chunk-VQNRICAQ.js.map +1 -0
  220. package/dist/{chunk-RAIUTAZZ.js → chunk-WKAXBXVA.js} +2 -2
  221. package/dist/{chunk-ZIJDI4CP.js → chunk-WKJFIMVN.js} +2 -2
  222. package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
  223. package/dist/{chunk-7BEPVIH3.js → chunk-X5YYSAZX.js} +4 -4
  224. package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
  225. package/dist/{chunk-F635GAL7.js → chunk-XKNHFDTT.js} +33 -13
  226. package/dist/chunk-XKNHFDTT.js.map +1 -0
  227. package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
  228. package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
  229. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  230. package/dist/{chunk-ANJXPFRS.js → chunk-YXFCALVT.js} +14 -14
  231. package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
  232. package/dist/{chunk-5HERQ5FX.js → chunk-Z3YEGSR4.js} +10 -10
  233. package/dist/{chunk-YWSQD2IB.js → chunk-ZJPM7GZ3.js} +2 -2
  234. package/dist/{chunk-5S4LQOPE.js → chunk-ZW4VXELZ.js} +2 -2
  235. package/dist/{cli-B322UMvB.d.ts → cli-BEkm2MEf.d.ts} +5 -5
  236. package/dist/cli.d.ts +17 -16
  237. package/dist/cli.js +126 -120
  238. package/dist/coding/export-okf-codegraph.d.ts +56 -0
  239. package/dist/coding/export-okf-codegraph.js +526 -0
  240. package/dist/coding/export-okf-codegraph.js.map +1 -0
  241. package/dist/coding/pre-action-gate.d.ts +2 -2
  242. package/dist/compounding/engine.d.ts +5 -3
  243. package/dist/compounding/engine.js +34 -34
  244. package/dist/compounding/preference-consolidator.d.ts +4 -4
  245. package/dist/compression-optimizer.d.ts +2 -2
  246. package/dist/config-security.js +2 -2
  247. package/dist/config.d.ts +2 -2
  248. package/dist/config.js +17 -16
  249. package/dist/connectors/codex-materialize-runner.d.ts +2 -2
  250. package/dist/connectors/codex-materialize-runner.js +33 -33
  251. package/dist/connectors/codex-materialize.d.ts +2 -2
  252. package/dist/connectors/index.d.ts +2 -2
  253. package/dist/connectors/index.js +33 -33
  254. package/dist/consolidation-provenance-check.d.ts +5 -3
  255. package/dist/consolidation-provenance-check.js +5 -5
  256. package/dist/consolidation-undo.d.ts +5 -3
  257. package/dist/consolidation-undo.js +3 -3
  258. package/dist/context-summary.d.ts +43 -0
  259. package/dist/context-summary.js +14 -0
  260. package/dist/context-summary.js.map +1 -0
  261. package/dist/contradiction/index.d.ts +6 -4
  262. package/dist/contradiction/index.js +10 -10
  263. package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
  264. package/dist/contradiction-scan-NOYMFG66.js.map +1 -0
  265. package/dist/converge-config.d.ts +2 -2
  266. package/dist/convergence-refresh.d.ts +5 -3
  267. package/dist/convergence-refresh.js +36 -36
  268. package/dist/conversation-index/backend.d.ts +2 -2
  269. package/dist/conversation-index/chunker.d.ts +2 -2
  270. package/dist/conversation-index/faiss-adapter.d.ts +2 -2
  271. package/dist/conversation-index/indexer.d.ts +2 -2
  272. package/dist/conversation-index/search.d.ts +2 -2
  273. package/dist/corpus-watermark.d.ts +2 -2
  274. package/dist/corpus-watermark.js +35 -35
  275. package/dist/cross-lingual-recall.d.ts +2 -2
  276. package/dist/dashboard-runtime.js +2 -2
  277. package/dist/day-summary.d.ts +2 -2
  278. package/dist/delinearize.d.ts +2 -2
  279. package/dist/dependency-propagation-config.d.ts +2 -2
  280. package/dist/{dependency-propagation-delivery-BGcNairQ.d.ts → dependency-propagation-delivery-BCpeo14F.d.ts} +1 -1
  281. package/dist/direct-answer-wiring.d.ts +2 -2
  282. package/dist/direct-answer.d.ts +2 -2
  283. package/dist/embedding-fallback.d.ts +2 -2
  284. package/dist/enrichment/index.d.ts +2 -2
  285. package/dist/entity-origin-fields.d.ts +2 -2
  286. package/dist/entity-retrieval.d.ts +5 -3
  287. package/dist/entity-retrieval.js +34 -34
  288. package/dist/entity-schema.d.ts +2 -2
  289. package/dist/episodic-context.d.ts +2 -2
  290. package/dist/eval-trajectory-contracts.d.ts +2 -2
  291. package/dist/eval-trajectory-store.d.ts +2 -2
  292. package/dist/eval-trajectory.d.ts +2 -2
  293. package/dist/event-order-recall.js +3 -3
  294. package/dist/explicit-capture.d.ts +13 -12
  295. package/dist/explicit-capture.js +12 -12
  296. package/dist/external-wiki-access.d.ts +15 -14
  297. package/dist/external-wiki-access.js +66 -63
  298. package/dist/external-wiki-collection-registration.d.ts +2 -2
  299. package/dist/external-wiki-collection.d.ts +2 -2
  300. package/dist/external-wiki-mcp-tools.d.ts +15 -14
  301. package/dist/extraction-error-classification.d.ts +2 -2
  302. package/dist/extraction-faithfulness.d.ts +2 -2
  303. package/dist/extraction-faithfulness.js +2 -2
  304. package/dist/extraction-judge-telemetry.d.ts +2 -2
  305. package/dist/extraction-judge-training.d.ts +2 -2
  306. package/dist/extraction-judge.d.ts +2 -2
  307. package/dist/extraction-judge.js +2 -2
  308. package/dist/extraction-liveness.d.ts +2 -2
  309. package/dist/extraction-normalization.d.ts +2 -2
  310. package/dist/extraction-prompt.d.ts +2 -2
  311. package/dist/extraction-source-grounding-rules.d.ts +2 -2
  312. package/dist/extraction-source-grounding.d.ts +2 -2
  313. package/dist/extraction.d.ts +2 -2
  314. package/dist/extraction.js +47 -44
  315. package/dist/fallback-llm.d.ts +8 -2
  316. package/dist/fallback-llm.js +1 -1
  317. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
  318. package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
  319. package/dist/graph-dashboard-diff.d.ts +2 -2
  320. package/dist/graph-dashboard-key.d.ts +2 -2
  321. package/dist/graph-dashboard-parser.d.ts +2 -2
  322. package/dist/graph-edge-reinforcement.d.ts +2 -2
  323. package/dist/graph-path-reconstruction.d.ts +2 -2
  324. package/dist/graph-path-scoring.d.ts +2 -2
  325. package/dist/graph-snapshot.d.ts +2 -2
  326. package/dist/graph.d.ts +2 -2
  327. package/dist/harmonic-retrieval.js +1 -1
  328. package/dist/importance.d.ts +2 -2
  329. package/dist/importers/index.d.ts +2 -2
  330. package/dist/in-flight-reads.d.ts +2 -2
  331. package/dist/{index-By2QUAMh.d.ts → index-D_pyMUaP.d.ts} +2 -2
  332. package/dist/index.d.ts +261 -30
  333. package/dist/index.js +321 -257
  334. package/dist/intent.d.ts +2 -2
  335. package/dist/lcm/engine.d.ts +3 -3
  336. package/dist/lcm/engine.js +5 -4
  337. package/dist/lcm/index.d.ts +4 -3
  338. package/dist/lcm/index.js +12 -11
  339. package/dist/lcm/summarizer.d.ts +4 -6
  340. package/dist/lcm/summarizer.js +2 -1
  341. package/dist/lcm/tools.d.ts +4 -4
  342. package/dist/lifecycle.d.ts +2 -2
  343. package/dist/live-connectors-runner.d.ts +2 -2
  344. package/dist/local-llm.d.ts +2 -2
  345. package/dist/local-model-endpoint.d.ts +2 -2
  346. package/dist/location/index.d.ts +315 -6
  347. package/dist/location/index.js +151 -19
  348. package/dist/maintenance/memory-governance.d.ts +2 -2
  349. package/dist/maintenance/memory-governance.js +34 -34
  350. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -3
  351. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -33
  352. package/dist/maintenance/rebuild-memory-projection.d.ts +5 -3
  353. package/dist/maintenance/rebuild-memory-projection.js +35 -35
  354. package/dist/{maintenance-Dm2McrIx.d.ts → maintenance-DDUX9d6D.d.ts} +3 -3
  355. package/dist/mcp-memory-inspector-app.d.ts +15 -14
  356. package/dist/mcp-read-only-tools.js +1 -1
  357. package/dist/memory-action-policy.d.ts +18 -3
  358. package/dist/memory-action-policy.js +3 -1
  359. package/dist/memory-cache.d.ts +2 -2
  360. package/dist/memory-controller.d.ts +2 -2
  361. package/dist/memory-controller.js +2 -2
  362. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -2
  363. package/dist/memory-projection-mutations.js +3 -3
  364. package/dist/memory-projection-store.d.ts +2 -2
  365. package/dist/memory-projection-store.js +1 -1
  366. package/dist/memory-provenance.d.ts +2 -2
  367. package/dist/memory-snapshot.d.ts +2 -2
  368. package/dist/memory-subject-cli.d.ts +15 -14
  369. package/dist/memory-subject.d.ts +15 -14
  370. package/dist/memory-subject.js +5 -5
  371. package/dist/memory-worth-outcomes.d.ts +5 -3
  372. package/dist/models-json.d.ts +2 -2
  373. package/dist/namespaces/migrate.d.ts +6 -4
  374. package/dist/namespaces/migrate.js +34 -34
  375. package/dist/namespaces/principal.d.ts +2 -2
  376. package/dist/namespaces/search.d.ts +2 -2
  377. package/dist/namespaces/search.js +8 -8
  378. package/dist/namespaces/storage.d.ts +6 -4
  379. package/dist/namespaces/storage.js +33 -33
  380. package/dist/native-knowledge.d.ts +2 -2
  381. package/dist/offline-sync-file-io.js +3 -3
  382. package/dist/offline-sync-impression-drain.d.ts +2 -2
  383. package/dist/offline-sync-impression-drain.js +9 -9
  384. package/dist/offline-sync.js +4 -4
  385. package/dist/operator-doctor-corpus.d.ts +2 -2
  386. package/dist/operator-doctor-corpus.js +36 -36
  387. package/dist/operator-doctor-replica.d.ts +2 -2
  388. package/dist/operator-toolkit.d.ts +6 -4
  389. package/dist/operator-toolkit.js +56 -55
  390. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -3
  391. package/dist/orchestration/maintenance.d.ts +7 -5
  392. package/dist/orchestration/maintenance.js +48 -47
  393. package/dist/{orchestrator-Co1DyfuP.d.ts → orchestrator-3F4jihCo.d.ts} +8 -8
  394. package/dist/orchestrator.d.ts +13 -12
  395. package/dist/orchestrator.js +182 -174
  396. package/dist/page-versioning.js +3 -3
  397. package/dist/patterns-cli.d.ts +2 -2
  398. package/dist/{pipeline-DotMnb6y.d.ts → pipeline-CB1dj6Uh.d.ts} +1 -1
  399. package/dist/policy-runtime.d.ts +2 -2
  400. package/dist/proactive-contention.d.ts +2 -2
  401. package/dist/provenance.d.ts +2 -2
  402. package/dist/{public-http-PJRtnSi-.d.ts → public-http-34-JIAGQ.d.ts} +1 -1
  403. package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
  404. package/dist/{qmd-BP0n11fR.d.ts → qmd-edLLZXc5.d.ts} +1 -1
  405. package/dist/qmd-preflight.d.ts +3 -3
  406. package/dist/qmd-recall-cache.d.ts +2 -2
  407. package/dist/qmd.d.ts +3 -3
  408. package/dist/qmd.js +4 -4
  409. package/dist/recall-concurrency-config.d.ts +2 -2
  410. package/dist/recall-disclosure-escalation.d.ts +2 -2
  411. package/dist/recall-explain-renderer.d.ts +2 -2
  412. package/dist/recall-explain-renderer.js +3 -3
  413. package/dist/recall-memory-map.d.ts +2 -2
  414. package/dist/recall-planner-llm.d.ts +2 -2
  415. package/dist/recall-planner-llm.js +1 -1
  416. package/dist/recall-state.d.ts +2 -2
  417. package/dist/recall-tag-filter.d.ts +2 -2
  418. package/dist/recall-timings.d.ts +2 -2
  419. package/dist/recall-xray-cli.d.ts +2 -2
  420. package/dist/recall-xray-cli.js +4 -4
  421. package/dist/recall-xray-renderer.d.ts +2 -2
  422. package/dist/recall-xray-renderer.js +3 -3
  423. package/dist/recall-xray.d.ts +2 -2
  424. package/dist/recall-xray.js +2 -2
  425. package/dist/reconcile/cursor.d.ts +2 -2
  426. package/dist/reconcile/manifest.d.ts +2 -2
  427. package/dist/reconcile/manifest.js +5 -5
  428. package/dist/reconcile/plan.d.ts +2 -2
  429. package/dist/replay/normalizers/chatgpt.d.ts +2 -2
  430. package/dist/replay/normalizers/claude.d.ts +2 -2
  431. package/dist/replay/normalizers/openclaw.d.ts +2 -2
  432. package/dist/replay/normalizers/shared.d.ts +2 -2
  433. package/dist/replay/runner.d.ts +2 -2
  434. package/dist/replay/types.d.ts +2 -2
  435. package/dist/replica-divergence.d.ts +2 -2
  436. package/dist/replica-peers-config.d.ts +2 -2
  437. package/dist/{resolution-4552BNRV.js → resolution-4DLI3IOR.js} +11 -11
  438. package/dist/resolution-4DLI3IOR.js.map +1 -0
  439. package/dist/resolve-auth-token.d.ts +2 -2
  440. package/dist/resume-bundles.js +18 -17
  441. package/dist/retrieval-agents.d.ts +3 -3
  442. package/dist/retrieval-tiers.d.ts +2 -2
  443. package/dist/routing/engine.d.ts +2 -2
  444. package/dist/routing/store.d.ts +2 -2
  445. package/dist/salvage-envelope.d.ts +2 -2
  446. package/dist/salvage-envelope.js +7 -7
  447. package/dist/schemas.d.ts +572 -107
  448. package/dist/schemas.js +3 -1
  449. package/dist/{scope-profiles-6ChZKTy-.d.ts → scope-profiles-BF2lu81V.d.ts} +1 -1
  450. package/dist/search/document-scanner.js +1 -1
  451. package/dist/search/embed-helper.d.ts +2 -2
  452. package/dist/search/factory.d.ts +2 -2
  453. package/dist/search/factory.js +7 -7
  454. package/dist/search/index.d.ts +2 -2
  455. package/dist/search/index.js +13 -13
  456. package/dist/search/lancedb-backend.d.ts +2 -2
  457. package/dist/search/lancedb-backend.js +1 -1
  458. package/dist/search/meilisearch-backend.d.ts +2 -2
  459. package/dist/search/meilisearch-backend.js +1 -1
  460. package/dist/search/noop-backend.d.ts +2 -2
  461. package/dist/search/orama-backend.d.ts +2 -2
  462. package/dist/search/orama-backend.js +1 -1
  463. package/dist/search/port.d.ts +2 -2
  464. package/dist/search/remote-backend.d.ts +2 -2
  465. package/dist/secure-store/index.js +3 -3
  466. package/dist/{semantic-consolidation-DziYcW5J.d.ts → semantic-consolidation-5OuWXBRt.d.ts} +1 -1
  467. package/dist/semantic-consolidation.d.ts +3 -3
  468. package/dist/semantic-consolidation.js +37 -37
  469. package/dist/semantic-rule-promotion.js +33 -33
  470. package/dist/semantic-rule-verifier.d.ts +2 -2
  471. package/dist/semantic-rule-verifier.js +33 -33
  472. package/dist/{service-C7rIBuK_.d.ts → service-CrqEhLXD.d.ts} +2 -2
  473. package/dist/session-observer-bands.d.ts +2 -2
  474. package/dist/session-observer-state.d.ts +2 -2
  475. package/dist/shared-context/manager.d.ts +2 -2
  476. package/dist/signal.d.ts +2 -2
  477. package/dist/source-agent-qualifier.d.ts +2 -2
  478. package/dist/source-agent-qualifier.js +42 -39
  479. package/dist/standup/build.d.ts +16 -0
  480. package/dist/standup/build.js +17 -0
  481. package/dist/standup/build.js.map +1 -0
  482. package/dist/{storage-B1hEx8Xg.d.ts → storage-BQn-xnxm.d.ts} +4 -1
  483. package/dist/storage.d.ts +5 -3
  484. package/dist/storage.js +32 -32
  485. package/dist/subject-config.d.ts +2 -2
  486. package/dist/subject-config.js +6 -6
  487. package/dist/summarizer.d.ts +2 -2
  488. package/dist/summarizer.js +2 -2
  489. package/dist/summary-snapshot.d.ts +2 -2
  490. package/dist/support-passport/index.d.ts +20 -19
  491. package/dist/support-passport/index.js +68 -65
  492. package/dist/temporal-supersession.d.ts +3 -3
  493. package/dist/temporal-timeline-recall.d.ts +2 -2
  494. package/dist/temporal-validity.d.ts +2 -2
  495. package/dist/threading.d.ts +2 -2
  496. package/dist/tier-migration.d.ts +5 -3
  497. package/dist/tier-routing.d.ts +2 -2
  498. package/dist/tier-routing.js +2 -2
  499. package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
  500. package/dist/topics.d.ts +2 -2
  501. package/dist/transcript.d.ts +2 -2
  502. package/dist/transfer/capsule-export.js +2 -2
  503. package/dist/transfer/capsule-import.js +5 -5
  504. package/dist/transfer/export-okf.d.ts +39 -0
  505. package/dist/transfer/export-okf.js +112 -0
  506. package/dist/transfer/export-okf.js.map +1 -0
  507. package/dist/transfer/types.d.ts +12 -12
  508. package/dist/trust-score-stage.d.ts +2 -2
  509. package/dist/trust-score.d.ts +2 -2
  510. package/dist/{types-BHDNxGTT.d.ts → types-BRpcNjHZ.d.ts} +119 -3
  511. package/dist/types.d.ts +2 -2
  512. package/dist/types.js +1 -1
  513. package/dist/utility-runtime.d.ts +2 -2
  514. package/dist/verified-recall.js +33 -33
  515. package/dist/who-knows-cli.d.ts +15 -14
  516. package/dist/who-knows-cli.js +34 -34
  517. package/dist/who-knows.d.ts +15 -14
  518. package/dist/who-knows.js +33 -33
  519. package/dist/write-envelope.d.ts +2 -2
  520. package/dist/write-envelope.js +6 -6
  521. package/package.json +54 -3
  522. package/src/access-admin-ops-surface.ts +6 -1
  523. package/src/access-boundary.ts +1 -0
  524. package/src/access-http.ts +3 -1
  525. package/src/access-mcp-output-schemas.ts +1 -0
  526. package/src/access-mcp.ts +3 -3
  527. package/src/access-operations.ts +1 -0
  528. package/src/access-service-offline-file-content.test.ts +63 -0
  529. package/src/access-surface-catalog.ts +2 -0
  530. package/src/active-context-config.ts +98 -0
  531. package/src/active-context-transform.test.ts +533 -0
  532. package/src/active-context-transform.ts +981 -0
  533. package/src/activity/config.test.ts +1 -0
  534. package/src/activity/config.ts +21 -1
  535. package/src/activity/index.ts +1 -0
  536. package/src/activity/timeline/build.ts +279 -0
  537. package/src/activity/timeline/categories.ts +111 -0
  538. package/src/activity/timeline/classify.ts +110 -0
  539. package/src/activity/timeline/corrections.ts +145 -0
  540. package/src/activity/timeline/index.ts +6 -0
  541. package/src/activity/timeline/timeline.test.ts +277 -0
  542. package/src/activity/timeline/types.ts +106 -0
  543. package/src/activity/types.ts +6 -0
  544. package/src/cli/okf-commands.ts +45 -0
  545. package/src/cli.ts +2 -2
  546. package/src/coding/export-okf-codegraph.test.ts +381 -0
  547. package/src/coding/export-okf-codegraph.ts +565 -0
  548. package/src/config.test.ts +1 -0
  549. package/src/config.ts +3 -5
  550. package/src/context-summary.ts +182 -0
  551. package/src/extraction-prompt-safety.test.ts +14 -2
  552. package/src/extraction.ts +21 -1
  553. package/src/fallback-llm.test.ts +134 -0
  554. package/src/fallback-llm.ts +77 -5
  555. package/src/index.ts +4 -11
  556. package/src/lcm/summarizer.ts +14 -93
  557. package/src/location/access-operations.ts +17 -8
  558. package/src/location/backfill.ts +137 -0
  559. package/src/location/config.test.ts +3 -0
  560. package/src/location/config.ts +46 -2
  561. package/src/location/http-glue.ts +1 -1
  562. package/src/location/index.ts +3 -0
  563. package/src/location/intervals.ts +1 -0
  564. package/src/location/matching.test.ts +65 -0
  565. package/src/location/matching.ts +354 -0
  566. package/src/location/mcp-tools.ts +2 -1
  567. package/src/location/surfaces.test.ts +15 -2
  568. package/src/location/surfaces.ts +95 -18
  569. package/src/location/tagging.test.ts +119 -0
  570. package/src/location/tagging.ts +277 -0
  571. package/src/location/types.ts +23 -1
  572. package/src/mcp-read-only-tools.ts +1 -0
  573. package/src/memory-action-policy.ts +28 -0
  574. package/src/memory-projection-store.ts +3 -1
  575. package/src/okf/cli.ts +18 -5
  576. package/src/okf/config.ts +5 -0
  577. package/src/okf/index-files.test.ts +60 -0
  578. package/src/okf/index-files.ts +114 -0
  579. package/src/okf/render.ts +133 -0
  580. package/src/okf/type-mapping.test.ts +3 -0
  581. package/src/okf/type-mapping.ts +2 -0
  582. package/src/orchestration/extraction-run.ts +2 -1
  583. package/src/orchestration/generic-recall-paths.ts +4 -3
  584. package/src/schemas.ts +17 -1
  585. package/src/standup/access-operations.ts +14 -0
  586. package/src/standup/build.test.ts +34 -0
  587. package/src/standup/build.ts +115 -0
  588. package/src/standup/http-glue.ts +15 -0
  589. package/src/standup/mcp-tools.ts +16 -0
  590. package/src/storage/context-transform-ledger.ts +39 -0
  591. package/src/storage/secure-line-reader.ts +50 -1
  592. package/src/storage.ts +4 -1
  593. package/src/support-passport/card-projection.ts +1 -0
  594. package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
  595. package/src/support-passport/card-service.test.ts +75 -1
  596. package/src/support-passport/card-service.ts +6 -3
  597. package/src/support-passport/card-state.ts +5 -1
  598. package/src/support-passport/offline-sync-guard.ts +14 -1
  599. package/src/transfer/export-okf.test.ts +164 -0
  600. package/src/transfer/export-okf.ts +286 -0
  601. package/src/types.ts +2 -3
  602. package/dist/chunk-2LWQSV6A.js.map +0 -1
  603. package/dist/chunk-3BCULS4U.js.map +0 -1
  604. package/dist/chunk-7BDZTALN.js.map +0 -1
  605. package/dist/chunk-7PHI6GUI.js.map +0 -1
  606. package/dist/chunk-AFR6AIM4.js.map +0 -1
  607. package/dist/chunk-AX7UXCHJ.js.map +0 -1
  608. package/dist/chunk-BJTHRFFC.js.map +0 -1
  609. package/dist/chunk-D4QVPP3G.js.map +0 -1
  610. package/dist/chunk-DVYRD4HY.js.map +0 -1
  611. package/dist/chunk-F635GAL7.js.map +0 -1
  612. package/dist/chunk-FMQ4MOQO.js.map +0 -1
  613. package/dist/chunk-FP7YTTVO.js.map +0 -1
  614. package/dist/chunk-I4343FIA.js.map +0 -1
  615. package/dist/chunk-I7EX6KSH.js.map +0 -1
  616. package/dist/chunk-LBFFNDFM.js.map +0 -1
  617. package/dist/chunk-LLQCM2U2.js.map +0 -1
  618. package/dist/chunk-RQE4TITU.js.map +0 -1
  619. package/dist/chunk-UW5NPZJ2.js.map +0 -1
  620. package/dist/chunk-XAB6STPO.js.map +0 -1
  621. package/dist/chunk-ZPUIRTIZ.js.map +0 -1
  622. package/dist/types-CM86alG1.d.ts +0 -89
  623. /package/dist/{contradiction-scan-AKUWPX5N.js.map → active-context-config.js.map} +0 -0
  624. /package/dist/{resolution-4552BNRV.js.map → active-context-transform.js.map} +0 -0
  625. /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
  626. /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
  627. /package/dist/{chunk-CFGU52XJ.js.map → chunk-23CVL7HS.js.map} +0 -0
  628. /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
  629. /package/dist/{chunk-6CPUQ5D6.js.map → chunk-2LBAFHOQ.js.map} +0 -0
  630. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  631. /package/dist/{chunk-IP4ZNT4U.js.map → chunk-33MFRY25.js.map} +0 -0
  632. /package/dist/{chunk-VFYRYFLL.js.map → chunk-3TSU662L.js.map} +0 -0
  633. /package/dist/{chunk-VXVZ2GM3.js.map → chunk-4FHRZD5T.js.map} +0 -0
  634. /package/dist/{chunk-5VPQSRQO.js.map → chunk-4STAANV7.js.map} +0 -0
  635. /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
  636. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  637. /package/dist/{chunk-YKWFK7XA.js.map → chunk-6CEGSTBD.js.map} +0 -0
  638. /package/dist/{chunk-GEPACVWN.js.map → chunk-6RUHELWR.js.map} +0 -0
  639. /package/dist/{chunk-ZAOHJDKH.js.map → chunk-72OIT7KS.js.map} +0 -0
  640. /package/dist/{chunk-KQAFEZQX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  641. /package/dist/{chunk-7TCGNUVP.js.map → chunk-7UTDHQZ5.js.map} +0 -0
  642. /package/dist/{chunk-5HK3CJAR.js.map → chunk-7XOG75AU.js.map} +0 -0
  643. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  644. /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
  645. /package/dist/{chunk-ACOC27BB.js.map → chunk-CN4VKV3S.js.map} +0 -0
  646. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-CTCGHNWN.js.map} +0 -0
  647. /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
  648. /package/dist/{chunk-T42L3S6A.js.map → chunk-DDX6KIXF.js.map} +0 -0
  649. /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
  650. /package/dist/{chunk-WTOZBZNN.js.map → chunk-DMEHOEC7.js.map} +0 -0
  651. /package/dist/{chunk-OPPBTPUU.js.map → chunk-DUAJKRR2.js.map} +0 -0
  652. /package/dist/{chunk-SVVIASVX.js.map → chunk-EFQCDJZ2.js.map} +0 -0
  653. /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
  654. /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
  655. /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
  656. /package/dist/{chunk-Z4U3UN56.js.map → chunk-EZSCW4EM.js.map} +0 -0
  657. /package/dist/{chunk-F6QHHRWP.js.map → chunk-FESUGFIL.js.map} +0 -0
  658. /package/dist/{chunk-S3K2CIK5.js.map → chunk-FKKGCGYL.js.map} +0 -0
  659. /package/dist/{chunk-BWGCOLEL.js.map → chunk-FTTJRVB7.js.map} +0 -0
  660. /package/dist/{chunk-JAQXUGLN.js.map → chunk-FYWLSFFS.js.map} +0 -0
  661. /package/dist/{chunk-OPGL46PX.js.map → chunk-GX6FTSYH.js.map} +0 -0
  662. /package/dist/{chunk-A32YEQAM.js.map → chunk-H7VDIF2V.js.map} +0 -0
  663. /package/dist/{chunk-PDDSFELN.js.map → chunk-HJXA6ZM7.js.map} +0 -0
  664. /package/dist/{chunk-RGCF4XNH.js.map → chunk-HNPE66LB.js.map} +0 -0
  665. /package/dist/{chunk-SEA6M7SS.js.map → chunk-I5VB44ZK.js.map} +0 -0
  666. /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
  667. /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
  668. /package/dist/{chunk-3RI5Y7KU.js.map → chunk-IVIAHQBR.js.map} +0 -0
  669. /package/dist/{chunk-7WR462EM.js.map → chunk-J3OND5QT.js.map} +0 -0
  670. /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
  671. /package/dist/{chunk-I32NKXE2.js.map → chunk-JTWZKNUH.js.map} +0 -0
  672. /package/dist/{chunk-VKCAHCBI.js.map → chunk-L4X4PJYK.js.map} +0 -0
  673. /package/dist/{chunk-W4BMEGQA.js.map → chunk-LUDBXTBJ.js.map} +0 -0
  674. /package/dist/{chunk-RIAM7DND.js.map → chunk-ME35HVDJ.js.map} +0 -0
  675. /package/dist/{chunk-NG3MBQV4.js.map → chunk-MJRGVXPQ.js.map} +0 -0
  676. /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
  677. /package/dist/{chunk-7F27PCSN.js.map → chunk-MN5NOOI7.js.map} +0 -0
  678. /package/dist/{chunk-JCWY73FK.js.map → chunk-N4F7ZSSG.js.map} +0 -0
  679. /package/dist/{chunk-TR7DGXGI.js.map → chunk-NACLNNFQ.js.map} +0 -0
  680. /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
  681. /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
  682. /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
  683. /package/dist/{chunk-IY7UXD3J.js.map → chunk-O57GM3FR.js.map} +0 -0
  684. /package/dist/{chunk-I2HTKOOP.js.map → chunk-O7ERGZDA.js.map} +0 -0
  685. /package/dist/{chunk-GTSVEEP3.js.map → chunk-OAJMQKQR.js.map} +0 -0
  686. /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
  687. /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
  688. /package/dist/{chunk-EOHKUWXW.js.map → chunk-QCRJMU5V.js.map} +0 -0
  689. /package/dist/{chunk-5DH6PG4B.js.map → chunk-RZ3IZIJG.js.map} +0 -0
  690. /package/dist/{chunk-AAXJNINV.js.map → chunk-SN4JXNLL.js.map} +0 -0
  691. /package/dist/{chunk-SVSRPG6M.js.map → chunk-TNGH4ZYI.js.map} +0 -0
  692. /package/dist/{chunk-HZNYJN77.js.map → chunk-TNXNECAN.js.map} +0 -0
  693. /package/dist/{chunk-JOEJG4SD.js.map → chunk-TVW4C7PV.js.map} +0 -0
  694. /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
  695. /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
  696. /package/dist/{chunk-YRVAKONL.js.map → chunk-VQ4AMTGZ.js.map} +0 -0
  697. /package/dist/{chunk-RAIUTAZZ.js.map → chunk-WKAXBXVA.js.map} +0 -0
  698. /package/dist/{chunk-ZIJDI4CP.js.map → chunk-WKJFIMVN.js.map} +0 -0
  699. /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
  700. /package/dist/{chunk-7BEPVIH3.js.map → chunk-X5YYSAZX.js.map} +0 -0
  701. /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
  702. /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
  703. /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
  704. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  705. /package/dist/{chunk-ANJXPFRS.js.map → chunk-YXFCALVT.js.map} +0 -0
  706. /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
  707. /package/dist/{chunk-5HERQ5FX.js.map → chunk-Z3YEGSR4.js.map} +0 -0
  708. /package/dist/{chunk-YWSQD2IB.js.map → chunk-ZJPM7GZ3.js.map} +0 -0
  709. /package/dist/{chunk-5S4LQOPE.js.map → chunk-ZW4VXELZ.js.map} +0 -0
  710. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
  711. /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
  712. /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
  713. /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Write-time location tagging regression (issue #2046): the post-write
3
+ * enrichment path the extraction coordinator calls after a batch is durable.
4
+ * Pins the gates, the provider-owned patch contract (StorageManager
5
+ * chokepoint, actor "location-tagging"), and per-memory failure isolation.
6
+ */
7
+
8
+ import assert from "node:assert/strict";
9
+ import test from "node:test";
10
+
11
+ import type { MemoryFile } from "../types.js";
12
+ import type { StorageManager } from "../index.js";
13
+ import { parseLocationConfig } from "./config.js";
14
+ import type { LocationSourceSegments } from "./matching.js";
15
+ import { enrichMemoriesWithLocation } from "./tagging.js";
16
+
17
+ function memory(id: string, frontmatter: Record<string, unknown> = {}): MemoryFile {
18
+ return { path: `facts/${id}.md`, content: "body", frontmatter: { id, ...frontmatter } } as MemoryFile;
19
+ }
20
+
21
+ function taggedConfig() {
22
+ return parseLocationConfig({
23
+ enabled: true,
24
+ timezone: "UTC",
25
+ sources: [{ id: "reitti" }],
26
+ tagging: { enabled: true },
27
+ });
28
+ }
29
+
30
+ const HOME: LocationSourceSegments = {
31
+ sourceId: "reitti",
32
+ segments: [
33
+ {
34
+ startUtc: "2026-08-01T12:00:00.000Z",
35
+ endUtc: "2026-08-01T14:00:00.000Z",
36
+ place: { id: "reitti:place:home-1", label: "Home", kind: "home" },
37
+ confidence: 0.9,
38
+ },
39
+ ],
40
+ };
41
+
42
+ const index = new Map([["2026-08-01", [HOME]]]);
43
+
44
+ function storageFor(memories: MemoryFile[], failWriteFor?: string) {
45
+ const byId = new Map(memories.map((m) => [m.frontmatter.id, m]));
46
+ const writes: Array<{ id: string; patch: Record<string, unknown>; actor: string }> = [];
47
+ const storage: Pick<StorageManager, "getMemoryById" | "writeMemoryFrontmatter"> = {
48
+ getMemoryById: (id) => Promise.resolve(byId.get(id) ?? null),
49
+ writeMemoryFrontmatter: (file, patch, lifecycle) => {
50
+ if (file.frontmatter.id === failWriteFor) return Promise.reject(new Error("disk full"));
51
+ writes.push({ id: file.frontmatter.id, patch: patch as Record<string, unknown>, actor: lifecycle?.actor ?? "" });
52
+ return Promise.resolve(true);
53
+ },
54
+ };
55
+ return { storage, writes };
56
+ }
57
+
58
+ test("write-time enrichment tags matched memories through the storage chokepoint", async () => {
59
+ const { storage, writes } = storageFor([
60
+ memory("matched", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
61
+ memory("untimed", { tags: [] }),
62
+ memory("elsewhere", { valid_at: "2026-08-02T12:30:00.000Z", invalid_at: "2026-08-02T13:30:00.000Z", tags: [] }),
63
+ ]);
64
+ const counts = await enrichMemoriesWithLocation({
65
+ storage,
66
+ memoryIds: ["matched", "untimed", "elsewhere"],
67
+ memoryDir: "/unused-when-index-passed",
68
+ config: taggedConfig(),
69
+ index,
70
+ });
71
+
72
+ assert.equal(counts.tagged, 1);
73
+ assert.equal(counts.untimed, 1);
74
+ assert.equal(counts.unmatched, 1);
75
+ assert.equal(counts.failed, 0);
76
+ assert.equal(writes.length, 1, "only the matched memory is patched");
77
+ assert.equal(writes[0]?.id, "matched");
78
+ assert.equal(writes[0]?.actor, "location-tagging");
79
+ const tags = (writes[0]?.patch.tags as string[] | undefined) ?? [];
80
+ assert.ok(tags.some((tag) => tag.startsWith("location:")), `provider tag written: ${JSON.stringify(tags)}`);
81
+ const attributes = (writes[0]?.patch.structuredAttributes as Record<string, string> | undefined) ?? {};
82
+ assert.equal(attributes.locationSource, "reitti");
83
+ assert.equal(attributes.locationPlaceId, "reitti:place:home-1");
84
+ });
85
+
86
+ test("tagging gates off inside the shared core: no reads, no writes", async () => {
87
+ const { storage, writes } = storageFor([
88
+ memory("matched", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
89
+ ]);
90
+ const counts = await enrichMemoriesWithLocation({
91
+ storage,
92
+ memoryIds: ["matched"],
93
+ memoryDir: "/unused-when-index-passed",
94
+ config: parseLocationConfig({ enabled: true, timezone: "UTC", sources: [{ id: "reitti" }] }),
95
+ index,
96
+ });
97
+ assert.equal(counts.tagged, 0);
98
+ assert.equal(writes.length, 0);
99
+ });
100
+
101
+ test("a failing memory write is counted and never blocks the others", async () => {
102
+ const { storage, writes } = storageFor(
103
+ [
104
+ memory("boom", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
105
+ memory("fine", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
106
+ ],
107
+ "boom",
108
+ );
109
+ const counts = await enrichMemoriesWithLocation({
110
+ storage,
111
+ memoryIds: ["boom", "fine"],
112
+ memoryDir: "/unused-when-index-passed",
113
+ config: taggedConfig(),
114
+ index,
115
+ });
116
+ assert.equal(counts.failed, 1);
117
+ assert.equal(counts.tagged, 1);
118
+ assert.deepEqual(writes.map((w) => w.id), ["fine"]);
119
+ });
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Location tagging service (issue #2046) — the IO half around the pure
3
+ * matcher in `matching.ts`. Three consumers share it so the policy can never
4
+ * fork:
5
+ *
6
+ * 1. Write-time enrichment: after an extraction batch has cleared the
7
+ * trust/importance/content-hash gates and persisted, the caller tags the
8
+ * new memories (post-write, best-effort, never fails the extraction).
9
+ * 2. Historical backfill (`location/backfill.ts`): the same plan/apply core
10
+ * over a bounded date range, idempotent by construction.
11
+ * 3. Wearable conversation fill: `WearableConversation.location` is filled
12
+ * ONLY when the source did not provide one and the match passes policy.
13
+ *
14
+ * Segment data comes from the machine-global location sync state
15
+ * (`state/locations/sync.json`, ≤ 90 tracked days — matching the bounded
16
+ * backfill range). Reads are plain file loads; every memory mutation goes
17
+ * through `StorageManager.writeMemoryFrontmatter`, the atomic frontmatter
18
+ * chokepoint that preserves content (and therefore the content hash),
19
+ * lifecycle, and versioning invariants.
20
+ */
21
+
22
+ import type { StorageManager } from "../index.js";
23
+ import { log } from "../logger.js";
24
+ import type { MemoryFile } from "../types.js";
25
+ import type { WearableConversation } from "../wearables/types.js";
26
+ import { localDayKey, placeDurations } from "./intervals.js";
27
+ import {
28
+ matchDominantPlace,
29
+ memoryLocationWindow,
30
+ planLocationUpdate,
31
+ type LocationSourceSegments,
32
+ type LocationTagPolicy,
33
+ type LocationUpdatePlan,
34
+ } from "./matching.js";
35
+ import { loadLocationSyncState } from "./store.js";
36
+ import type { LocationConfig } from "./types.js";
37
+
38
+ /** Segments for one local day, per source id, from the sync state. */
39
+ export type DaySegmentIndex = Map<string, LocationSourceSegments[]>;
40
+
41
+ /** Load every tracked day's per-source segments (one file read). */
42
+ export async function loadDaySegmentIndex(memoryDir: string): Promise<DaySegmentIndex> {
43
+ const state = await loadLocationSyncState(memoryDir);
44
+ const index: DaySegmentIndex = new Map();
45
+ for (const [sourceId, source] of Object.entries(state.sources)) {
46
+ for (const [date, payload] of Object.entries(source.days ?? {})) {
47
+ const entry: LocationSourceSegments = { sourceId, segments: payload.segments ?? [] };
48
+ const existing = index.get(date);
49
+ if (existing === undefined) index.set(date, [entry]);
50
+ else existing.push(entry);
51
+ }
52
+ }
53
+ return index;
54
+ }
55
+
56
+ export function locationTagPolicy(config: LocationConfig): LocationTagPolicy {
57
+ return {
58
+ minimumOverlapSeconds: config.minimumOverlapSeconds,
59
+ minimumConfidence: config.minimumConfidence,
60
+ retainCoordinates: config.retainCoordinates,
61
+ };
62
+ }
63
+
64
+ /** Every tagging path is off unless BOTH gates are on. */
65
+ export function locationTaggingEnabled(config: LocationConfig): boolean {
66
+ return config.enabled && config.tagging.enabled;
67
+ }
68
+
69
+ /**
70
+ * Write-time post-persist hook (issue #2046): tag the memories an extraction
71
+ * batch just made durable. Best-effort by contract — gated on both location
72
+ * gates, and a location failure must never fail the extraction that already
73
+ * persisted.
74
+ */
75
+ export async function tagPersistedMemories(
76
+ storage: StorageManager,
77
+ memoryIds: string[],
78
+ config: { memoryDir: string; location?: LocationConfig },
79
+ ): Promise<void> {
80
+ if (memoryIds.length === 0 || !config.location || !locationTaggingEnabled(config.location)) return;
81
+ try {
82
+ await enrichMemoriesWithLocation({
83
+ storage,
84
+ memoryIds,
85
+ memoryDir: config.memoryDir,
86
+ config: config.location,
87
+ });
88
+ } catch (locationError) {
89
+ log.warn("[location] post-write tagging failed (non-fatal)", locationError);
90
+ }
91
+ }
92
+
93
+ function segmentsForDays(index: DaySegmentIndex, days: readonly string[]): LocationSourceSegments[] {
94
+ const merged = new Map<string, LocationSourceSegments>();
95
+ for (const day of days) {
96
+ for (const entry of index.get(day) ?? []) {
97
+ const existing = merged.get(entry.sourceId);
98
+ if (existing === undefined) {
99
+ merged.set(entry.sourceId, { sourceId: entry.sourceId, segments: [...entry.segments] });
100
+ continue;
101
+ }
102
+ existing.segments.push(...entry.segments);
103
+ }
104
+ }
105
+ return [...merged.values()];
106
+ }
107
+
108
+ /** The full plan for one memory: window → segments → match → provider-owned diff. */
109
+ function planForMemory(
110
+ frontmatter: Pick<MemoryFile["frontmatter"], "valid_at" | "observedAt" | "invalid_at" | "tags" | "structuredAttributes">,
111
+ index: DaySegmentIndex,
112
+ config: LocationConfig,
113
+ ): LocationUpdatePlan {
114
+ const policy = locationTagPolicy(config);
115
+ const result = memoryLocationWindow(frontmatter, (instant) => localDayKey(instant, config.timezone));
116
+ if (result.rejected === "span-too-long") return { outcome: "span-too-long" };
117
+ if (result.rejected === "untimed" || result.window === undefined || result.days === undefined) {
118
+ return { outcome: "untimed" };
119
+ }
120
+ const sources = segmentsForDays(index, result.days);
121
+ return planLocationUpdate(frontmatter, matchDominantPlace(result.window, sources, policy), policy);
122
+ }
123
+
124
+ export interface LocationEnrichmentCounts {
125
+ tagged: number;
126
+ updated: number;
127
+ removed: number;
128
+ unchanged: number;
129
+ unmatched: number;
130
+ manual: number;
131
+ untimed: number;
132
+ spanTooLong: number;
133
+ failed: number;
134
+ }
135
+
136
+ export function emptyEnrichmentCounts(): LocationEnrichmentCounts {
137
+ return {
138
+ tagged: 0,
139
+ updated: 0,
140
+ removed: 0,
141
+ unchanged: 0,
142
+ unmatched: 0,
143
+ manual: 0,
144
+ untimed: 0,
145
+ spanTooLong: 0,
146
+ failed: 0,
147
+ };
148
+ }
149
+
150
+ function countOutcome(counts: LocationEnrichmentCounts, outcome: LocationUpdatePlan["outcome"]): void {
151
+ if (outcome === "tagged") counts.tagged += 1;
152
+ else if (outcome === "updated") counts.updated += 1;
153
+ else if (outcome === "removed") counts.removed += 1;
154
+ else if (outcome === "unchanged") counts.unchanged += 1;
155
+ else if (outcome === "manual-metadata") counts.manual += 1;
156
+ else if (outcome === "unmatched") counts.unmatched += 1;
157
+ else if (outcome === "untimed") counts.untimed += 1;
158
+ else if (outcome === "span-too-long") counts.spanTooLong += 1;
159
+ }
160
+
161
+ export interface EnrichMemoriesOptions {
162
+ storage: Pick<StorageManager, "getMemoryById" | "writeMemoryFrontmatter">;
163
+ memoryDir: string;
164
+ config: LocationConfig;
165
+ /** Enrich exactly these memory ids (write-time path). */
166
+ memoryIds?: string[];
167
+ /** Pre-loaded memories (backfill path — one readAllMemories per run). */
168
+ memories?: MemoryFile[];
169
+ /** Reuse a caller-loaded segment index (backfill). */
170
+ index?: DaySegmentIndex;
171
+ /** Skip every mutation and only report (dry-run). */
172
+ dryRun?: boolean;
173
+ }
174
+
175
+ /**
176
+ * Apply the matcher to a set of memories and patch provider-owned location
177
+ * metadata. A failure on ONE memory is counted and skipped — it never blocks
178
+ * the others (failure isolation, issue #2046).
179
+ */
180
+ export async function enrichMemoriesWithLocation(
181
+ options: EnrichMemoriesOptions,
182
+ ): Promise<LocationEnrichmentCounts> {
183
+ if (!locationTaggingEnabled(options.config)) return emptyEnrichmentCounts();
184
+ const counts = emptyEnrichmentCounts();
185
+ const index = options.index ?? (await loadDaySegmentIndex(options.memoryDir));
186
+
187
+ let memories = options.memories;
188
+ if (memories === undefined && options.memoryIds !== undefined) {
189
+ memories = [];
190
+ for (const id of options.memoryIds) {
191
+ const memory = await options.storage.getMemoryById(id);
192
+ if (memory !== null) memories.push(memory);
193
+ }
194
+ }
195
+ if (memories === undefined) return counts;
196
+
197
+ for (const memory of memories) {
198
+ try {
199
+ const plan = planForMemory(memory.frontmatter, index, options.config);
200
+ // Count patch outcomes (tagged/updated/removed) only after the write
201
+ // lands — a rejected write is `failed`, never also `tagged`.
202
+ if (plan.patch === undefined || options.dryRun === true) {
203
+ countOutcome(counts, plan.outcome);
204
+ continue;
205
+ }
206
+ await options.storage.writeMemoryFrontmatter(memory, plan.patch, { actor: "location-tagging" });
207
+ countOutcome(counts, plan.outcome);
208
+ } catch {
209
+ counts.failed += 1;
210
+ }
211
+ }
212
+ return counts;
213
+ }
214
+
215
+ /**
216
+ * Fill `WearableConversation.location` for conversations whose source did not
217
+ * provide one. Missing-only and source-aware: a provider-supplied value is
218
+ * never overwritten, and a failing conversation never blocks the others.
219
+ */
220
+ export async function fillWearableConversationLocations(
221
+ conversations: WearableConversation[],
222
+ deps: { memoryDir: string; config: LocationConfig },
223
+ ): Promise<void> {
224
+ if (!locationTaggingEnabled(deps.config) || conversations.length === 0) return;
225
+ let index: DaySegmentIndex;
226
+ try {
227
+ index = await loadDaySegmentIndex(deps.memoryDir);
228
+ } catch {
229
+ return;
230
+ }
231
+ const policy = locationTagPolicy(deps.config);
232
+ for (const conversation of conversations) {
233
+ if (conversation.location !== undefined && conversation.location.length > 0) continue;
234
+ try {
235
+ const startMs = Date.parse(conversation.startIso);
236
+ const endMs = conversation.endIso !== undefined ? Date.parse(conversation.endIso) : Number.NaN;
237
+ const window =
238
+ Number.isFinite(startMs) && Number.isFinite(endMs) && endMs > startMs
239
+ ? { kind: "interval" as const, startUtc: conversation.startIso, endUtc: conversation.endIso as string }
240
+ : { kind: "instant" as const, atUtc: conversation.startIso };
241
+ const anchor = window.kind === "interval" ? new Date(Date.parse(window.endUtc) - 1).toISOString() : window.atUtc;
242
+ const days = [...new Set([localDayKey(anchor, deps.config.timezone), localDayKey(conversation.startIso, deps.config.timezone)])];
243
+ const outcome = matchDominantPlace(window, segmentsForDays(index, days), policy);
244
+ if (outcome.status === "matched") {
245
+ conversation.location = outcome.match.place.label;
246
+ }
247
+ } catch {
248
+ // One bad conversation never blocks the rest of the day's fill.
249
+ }
250
+ }
251
+ }
252
+
253
+ /** Render an opt-in, labels-only location context section for a day summary. */
254
+ export async function renderDayLocationContext(
255
+ memoryDir: string,
256
+ date: string,
257
+ config: LocationConfig,
258
+ ): Promise<string | null> {
259
+ if (!locationTaggingEnabled(config)) return null;
260
+ const state = await loadLocationSyncState(memoryDir);
261
+ const segments = [];
262
+ for (const source of Object.values(state.sources)) {
263
+ for (const segment of source.days?.[date]?.segments ?? []) segments.push(segment);
264
+ }
265
+ if (segments.length === 0) return null;
266
+ const durations = placeDurations(segments)
267
+ .filter((duration) => ["home", "work", "poi"].includes(duration.place.kind ?? "poi"))
268
+ .sort((a, b) => (a.totalMs !== b.totalMs ? b.totalMs - a.totalMs : a.place.id < b.place.id ? -1 : 1));
269
+ if (durations.length === 0) return null;
270
+ const lines = durations.map((duration) => {
271
+ const minutes = Math.round(duration.totalMs / 60_000);
272
+ const hours = Math.floor(minutes / 60);
273
+ const rendered = hours <= 0 ? `${minutes}m` : `${hours}h ${String(minutes % 60).padStart(2, "0")}m`;
274
+ return `- ${duration.place.label.replace(/\s+/g, " ").replace(/[`*_]/g, "").trim()}: ${rendered}`;
275
+ });
276
+ return `## Location context\n\n${lines.join("\n")}`;
277
+ }
@@ -21,7 +21,6 @@ export interface LocationPlace {
21
21
  longitude?: number;
22
22
  }
23
23
 
24
- /** One place observation at a single instant, from a single provider. */
25
24
  export interface LocationObservation {
26
25
  /** UTC ISO-8601 observation instant. */
27
26
  observedAtUtc: string;
@@ -85,6 +84,27 @@ export interface LocationConfig {
85
84
  */
86
85
  retainCoordinates: boolean;
87
86
  sources: LocationSourceConfig[];
87
+ /**
88
+ * Minimum dominant-place overlap (seconds) required to tag a memory.
89
+ * `0` disables the overlap floor. Integer ≥ 0; default 300.
90
+ */
91
+ minimumOverlapSeconds: number;
92
+ /**
93
+ * Minimum provider-reported place confidence in [0,1] for a tagging
94
+ * match. Providers that report no confidence pass this gate (there is
95
+ * nothing to doubt), reported values below it fail. Default 0.7.
96
+ */
97
+ minimumConfidence: number;
98
+ /** Provider-owned location tagging gates (issue #2046). */
99
+ tagging: LocationTaggingConfig;
100
+ }
101
+
102
+ /** Opt-in gates for attaching provider location context to memories. */
103
+ export interface LocationTaggingConfig {
104
+ /** `false` (default) disables every memory-tagging path. */
105
+ enabled: boolean;
106
+ /** Extra gate for the historical backfill command; default `false`. */
107
+ backfillEnabled: boolean;
88
108
  }
89
109
 
90
110
  /** A time-resolved place visit derived from consecutive observations. */
@@ -92,4 +112,6 @@ export interface LocationSegment {
92
112
  startUtc: string;
93
113
  endUtc: string;
94
114
  place: LocationPlace;
115
+ /** Minimum contributing observation confidence, when any was reported. */
116
+ confidence?: number;
95
117
  }
@@ -27,6 +27,7 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
27
27
  location_day: true,
28
28
  meetings_list: true,
29
29
  meetings_get: true,
30
+ standup: true,
30
31
  action_confidence: true,
31
32
  capsule_list: true,
32
33
  procedural_stats: true,
@@ -78,3 +78,31 @@ export function evaluateMemoryActionPolicy(input: {
78
78
  eligibility,
79
79
  };
80
80
  }
81
+
82
+ /**
83
+ * Gate for active-context SUMMARY/FILTER plans (issue #2347). The single
84
+ * deny rule is the shared `contextCompressionActionsEnabled` gate — a closed
85
+ * gate returns `feature_disabled` before any selection or model work. LLM
86
+ * summaries carry their own cap gate (`activeContextTransformLlmEnabled`)
87
+ * resolved at plan time, not here.
88
+ */
89
+ export interface ActiveContextTransformPolicyResult {
90
+ decision: "allow" | "deny";
91
+ rationale: string;
92
+ }
93
+
94
+ export function evaluateActiveContextTransformPolicy(options: {
95
+ actionsEnabled: boolean;
96
+ operation: "SUMMARY" | "FILTER";
97
+ }): ActiveContextTransformPolicyResult {
98
+ if (!options.actionsEnabled) {
99
+ return {
100
+ decision: "deny",
101
+ rationale: "contextCompressionActionsEnabled=false",
102
+ };
103
+ }
104
+ return {
105
+ decision: "allow",
106
+ rationale: `${options.operation.toLowerCase()}_eligible`,
107
+ };
108
+ }
@@ -130,11 +130,13 @@ function migrateMemoryCurrentTable(db: BetterSqlite3Database): void {
130
130
  if (!columns.has("preview_text")) {
131
131
  db.exec(`ALTER TABLE memory_current ADD COLUMN preview_text TEXT NOT NULL DEFAULT ''`);
132
132
  }
133
+ if (!columns.has("private_record")) db.exec(`ALTER TABLE memory_current ADD COLUMN private_record INTEGER NOT NULL DEFAULT 0; UPDATE memory_current SET private_record = 1 WHERE tags_json LIKE '%support-passport-%'`);
133
134
  }
134
135
 
135
136
  function memoryCurrentRequiresMigration(db: BetterSqlite3Database): boolean {
136
137
  const columns = listTableColumns(db, "memory_current");
137
- return columns.size > 0 && (!columns.has("tags_json") || !columns.has("preview_text"));
138
+ return columns.size > 0 &&
139
+ (!columns.has("tags_json") || !columns.has("preview_text") || !columns.has("private_record"));
138
140
  }
139
141
 
140
142
  function migrateProjectionSchemaIfNeeded(memoryDir: string): void {
package/src/okf/cli.ts CHANGED
@@ -1,29 +1,42 @@
1
1
  import { lintOkfDir } from "./lint.js";
2
2
  import { runOkfConformanceSweep } from "./sweep.js";
3
+ import { runOkfIndexMaintenance } from "./index-files.js";
3
4
 
4
5
  export async function runOkfCliCommand(
5
6
  argv: string[],
6
7
  io: { stdout: NodeJS.WritableStream; stderr: NodeJS.WritableStream },
7
- ctx: { memoryDir: string; conformanceEnabled: boolean; sweepEnabled: boolean },
8
+ ctx: {
9
+ memoryDir: string;
10
+ conformanceEnabled: boolean;
11
+ sweepEnabled: boolean;
12
+ indexFilesEnabled: boolean;
13
+ },
8
14
  ): Promise<number> {
9
15
  const [subcommand, ...rest] = argv;
10
16
  if (subcommand === "help" || subcommand === "--help" || subcommand === "-h") {
11
- io.stdout.write(`usage: remnic okf <lint|sweep> [--json]
17
+ io.stdout.write(`usage: remnic okf <lint|sweep|index> [--json]
12
18
  lint report OKF conformance findings (exit 1 when findings remain)
13
19
  sweep backfill missing type values (requires okf.sweepEnabled)
20
+ index generate or remove index.md files (okf.indexFilesEnabled)
14
21
  `);
15
22
  return 0;
16
23
  }
17
- if (subcommand !== "lint" && subcommand !== "sweep") {
18
- io.stderr.write("okf: expected lint or sweep\n");
24
+ if (subcommand !== "lint" && subcommand !== "sweep" && subcommand !== "index") {
25
+ io.stderr.write("okf: expected lint, sweep, or index\n");
19
26
  return 1;
20
27
  }
21
28
  for (const token of rest) {
22
29
  if (token === "--json") continue;
23
- io.stderr.write(`okf: unexpected argument '${token}' — usage: remnic okf <lint|sweep> [--json]\n`);
30
+ io.stderr.write(`okf: unexpected argument '${token}' — usage: remnic okf <lint|sweep|index> [--json]\n`);
24
31
  return 1;
25
32
  }
26
33
  const json = rest.includes("--json");
34
+ if (subcommand === "index") {
35
+ const result = await runOkfIndexMaintenance(ctx.memoryDir, ctx.indexFilesEnabled);
36
+ if (json) io.stdout.write(`${JSON.stringify(result)}\n`);
37
+ else io.stdout.write(`okf index: wrote ${result.written.length}, removed ${result.removed.length}\n`);
38
+ return 0;
39
+ }
27
40
  if (subcommand === "sweep") {
28
41
  const result = runOkfConformanceSweep(ctx.memoryDir, ctx);
29
42
  if (json) io.stdout.write(`${JSON.stringify(result)}\n`);
package/src/okf/config.ts CHANGED
@@ -10,11 +10,14 @@ export interface OkfConfig {
10
10
  conformanceEnabled: boolean;
11
11
  /** Opt-in governance sweep that backfills `type` on legacy files (default false). */
12
12
  sweepEnabled: boolean;
13
+ /** Generate OKF index.md files in the live store (default false). */
14
+ indexFilesEnabled: boolean;
13
15
  }
14
16
 
15
17
  export const DEFAULT_OKF_CONFIG: OkfConfig = Object.freeze({
16
18
  conformanceEnabled: true,
17
19
  sweepEnabled: false,
20
+ indexFilesEnabled: false,
18
21
  });
19
22
 
20
23
  export function parseOkfConfig(raw: unknown): OkfConfig {
@@ -27,8 +30,10 @@ export function parseOkfConfig(raw: unknown): OkfConfig {
27
30
  const record = raw as Record<string, unknown>;
28
31
  const conformance = coerceBooleanLike(record.conformanceEnabled, "okf.conformanceEnabled");
29
32
  const sweep = coerceBooleanLike(record.sweepEnabled, "okf.sweepEnabled");
33
+ const indexFiles = coerceBooleanLike(record.indexFilesEnabled, "okf.indexFilesEnabled");
30
34
  return {
31
35
  conformanceEnabled: conformance ?? DEFAULT_OKF_CONFIG.conformanceEnabled,
32
36
  sweepEnabled: sweep ?? DEFAULT_OKF_CONFIG.sweepEnabled,
37
+ indexFilesEnabled: indexFiles ?? DEFAULT_OKF_CONFIG.indexFilesEnabled,
33
38
  };
34
39
  }
@@ -0,0 +1,60 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import test from "node:test";
6
+
7
+ import { isGenericRecallExcludedPath } from "../orchestration/generic-recall-paths.js";
8
+ import { parseOkfConfig } from "./config.js";
9
+ import { OKF_INDEX_MARKER, runOkfIndexMaintenance } from "./index-files.js";
10
+
11
+ function store(): string {
12
+ const root = mkdtempSync(path.join(tmpdir(), "okf-index-"));
13
+ mkdirSync(path.join(root, "facts", "2026-01-02"), { recursive: true });
14
+ writeFileSync(
15
+ path.join(root, "facts", "2026-01-02", "fact-1.md"),
16
+ "---\nid: fact-1\ncategory: fact\n---\nPostgres is the store.\n",
17
+ );
18
+ return root;
19
+ }
20
+
21
+ test("parseOkfConfig defaults indexFilesEnabled off", () => {
22
+ assert.equal(parseOkfConfig(undefined).indexFilesEnabled, false);
23
+ assert.equal(parseOkfConfig({ indexFilesEnabled: "false" }).indexFilesEnabled, false);
24
+ assert.equal(parseOkfConfig({ indexFilesEnabled: true }).indexFilesEnabled, true);
25
+ });
26
+
27
+ test("flag off writes nothing", async () => {
28
+ const root = store();
29
+ const report = await runOkfIndexMaintenance(root, false);
30
+ assert.deepEqual(report.written, []);
31
+ assert.throws(() => readFileSync(path.join(root, "facts", "2026-01-02", "index.md")));
32
+ });
33
+
34
+ test("flag on writes a deterministic generated index", async () => {
35
+ const root = store();
36
+ const first = await runOkfIndexMaintenance(root, true);
37
+ const second = await runOkfIndexMaintenance(root, true);
38
+ const file = path.join(root, "facts", "2026-01-02", "index.md");
39
+ assert.equal(first.written.length, 1);
40
+ assert.equal(second.written.length, 0);
41
+ const body = readFileSync(file, "utf8");
42
+ assert.match(body, new RegExp(OKF_INDEX_MARKER));
43
+ assert.match(body, /fact-1\.md/);
44
+ });
45
+
46
+ test("disable removes generated indexes and keeps user files", async () => {
47
+ const root = store();
48
+ await runOkfIndexMaintenance(root, true);
49
+ const user = path.join(root, "facts", "index.md");
50
+ writeFileSync(user, "# mine\n");
51
+ const report = await runOkfIndexMaintenance(root, false);
52
+ assert.ok(report.removed.some((item) => item.endsWith(`${path.sep}2026-01-02${path.sep}index.md`)));
53
+ assert.equal(readFileSync(user, "utf8"), "# mine\n");
54
+ });
55
+
56
+ test("reserved OKF basenames are excluded from generic recall", () => {
57
+ assert.equal(isGenericRecallExcludedPath("facts/2026-01-02/index.md"), true);
58
+ assert.equal(isGenericRecallExcludedPath("log.md"), true);
59
+ assert.equal(isGenericRecallExcludedPath("facts/2026-01-02/fact-1.md"), false);
60
+ });